From da8d9e685477a5dccb4a3a0b082dd32284bd5365 Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Fri, 4 Jun 2021 08:27:58 -0400 Subject: [PATCH] Renderer: add version information (#34964) (#35245) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Renderer: add version information * fix alerting test (cherry picked from commit 5f6c172b5aa039708463a8b666afa84bf904eae1) Co-authored-by: Agnès Toulet <35176601+AgnesToulet@users.noreply.github.com> --- packages/grafana-runtime/src/config.ts | 1 + pkg/api/frontendsettings.go | 1 + pkg/services/alerting/notifier_test.go | 4 ++++ pkg/services/rendering/http_mode.go | 33 ++++++++++++++++++++++++++ pkg/services/rendering/interface.go | 1 + pkg/services/rendering/rendering.go | 15 +++++++++++- 6 files changed, 54 insertions(+), 1 deletion(-) diff --git a/packages/grafana-runtime/src/config.ts b/packages/grafana-runtime/src/config.ts index 712b7961710..63767c95638 100644 --- a/packages/grafana-runtime/src/config.ts +++ b/packages/grafana-runtime/src/config.ts @@ -67,6 +67,7 @@ export class GrafanaBootConfig implements GrafanaConfig { }; licenseInfo: LicenseInfo = {} as LicenseInfo; rendererAvailable = false; + rendererVersion = ''; http2Enabled = false; dateFormats?: SystemDateFormatSettings; sentry = { diff --git a/pkg/api/frontendsettings.go b/pkg/api/frontendsettings.go index 5db3d272550..39affbd1279 100644 --- a/pkg/api/frontendsettings.go +++ b/pkg/api/frontendsettings.go @@ -241,6 +241,7 @@ func (hs *HTTPServer) getFrontendSettingsMap(c *models.ReqContext) (map[string]i }, "featureToggles": hs.Cfg.FeatureToggles, "rendererAvailable": hs.RenderService.IsAvailable(), + "rendererVersion": hs.RenderService.Version(), "http2Enabled": hs.Cfg.Protocol == setting.HTTP2Scheme, "sentry": hs.Cfg.Sentry, "pluginCatalogURL": hs.Cfg.PluginCatalogURL, diff --git a/pkg/services/alerting/notifier_test.go b/pkg/services/alerting/notifier_test.go index 11fe8c61228..b1d460fec3c 100644 --- a/pkg/services/alerting/notifier_test.go +++ b/pkg/services/alerting/notifier_test.go @@ -377,6 +377,10 @@ func (s *testRenderService) GetRenderUser(key string) (*rendering.RenderUser, bo return nil, false } +func (s *testRenderService) Version() string { + return "" +} + var _ rendering.Service = &testRenderService{} type testImageUploader struct { diff --git a/pkg/services/rendering/http_mode.go b/pkg/services/rendering/http_mode.go index 8102ace59a0..2dca4749b04 100644 --- a/pkg/services/rendering/http_mode.go +++ b/pkg/services/rendering/http_mode.go @@ -2,6 +2,7 @@ package rendering import ( "context" + "encoding/json" "errors" "fmt" "io" @@ -192,3 +193,35 @@ func (rs *RenderingService) readFileResponse(ctx context.Context, resp *http.Res return nil } + +func (rs *RenderingService) getRemotePluginVersion() (string, error) { + rendererURL, err := url.Parse(rs.Cfg.RendererUrl + "/version") + if err != nil { + return "", err + } + + headers := make(map[string][]string) + resp, err := rs.doRequest(context.Background(), rendererURL, headers) + if err != nil { + return "", err + } + + defer func() { + if err := resp.Body.Close(); err != nil { + rs.log.Warn("Failed to close response body", "err", err) + } + }() + + if resp.StatusCode != http.StatusOK { + return "", fmt.Errorf("remote rendering request to get version failed, status code: %d, status: %s", resp.StatusCode, + resp.Status) + } + + var info struct { + Version string + } + if err := json.NewDecoder(resp.Body).Decode(&info); err != nil { + return "", err + } + return info.Version, nil +} diff --git a/pkg/services/rendering/interface.go b/pkg/services/rendering/interface.go index e9125f106b3..637cf2c23f5 100644 --- a/pkg/services/rendering/interface.go +++ b/pkg/services/rendering/interface.go @@ -60,6 +60,7 @@ type renderCSVFunc func(ctx context.Context, renderKey string, options CSVOpts) type Service interface { IsAvailable() bool + Version() string Render(ctx context.Context, opts Opts) (*RenderResult, error) RenderCSV(ctx context.Context, opts CSVOpts) (*RenderCSVResult, error) RenderErrorImage(error error) (*RenderResult, error) diff --git a/pkg/services/rendering/rendering.go b/pkg/services/rendering/rendering.go index cc4b9d56ede..aa2788af1b9 100644 --- a/pkg/services/rendering/rendering.go +++ b/pkg/services/rendering/rendering.go @@ -47,6 +47,7 @@ type RenderingService struct { renderCSVAction renderCSVFunc domain string inProgressCount int + version string Cfg *setting.Cfg `inject:""` RemoteCacheService *remotecache.RemoteCache `inject:""` @@ -86,7 +87,14 @@ func (rs *RenderingService) Init() error { func (rs *RenderingService) Run(ctx context.Context) error { if rs.remoteAvailable() { rs.log = rs.log.New("renderer", "http") - rs.log.Info("Backend rendering via external http server") + + version, err := rs.getRemotePluginVersion() + if err != nil { + rs.log.Info("Couldn't get remote renderer version", "err", err) + } + + rs.log.Info("Backend rendering via external http server", "version", version) + rs.version = version rs.renderAction = rs.renderViaHTTP rs.renderCSVAction = rs.renderCSVViaHTTP <-ctx.Done() @@ -101,6 +109,7 @@ func (rs *RenderingService) Run(ctx context.Context) error { return err } + rs.version = rs.pluginInfo.Info.Version rs.renderAction = rs.renderViaPlugin rs.renderCSVAction = rs.renderCSVViaPlugin <-ctx.Done() @@ -127,6 +136,10 @@ func (rs *RenderingService) IsAvailable() bool { return rs.remoteAvailable() || rs.pluginAvailable() } +func (rs *RenderingService) Version() string { + return rs.version +} + func (rs *RenderingService) RenderErrorImage(err error) (*RenderResult, error) { imgUrl := "public/img/rendering_error.png"