From 664aa795c1c1299ea3cff8d075cc650182c7d216 Mon Sep 17 00:00:00 2001 From: owensmallwood Date: Tue, 27 Sep 2022 12:25:56 -0600 Subject: [PATCH] PublicDashboards: Add metric for public dashboard datasource query success (#55701) Adds metric for which datasource queries are successful or not with pubdash. --- pkg/infra/metrics/metrics.go | 11 ++++++ .../publicdashboards/models/models.go | 5 +++ .../publicdashboards/service/logging.go | 36 +++++++++++++++++++ .../publicdashboards/service/service.go | 6 ++-- 4 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 pkg/services/publicdashboards/service/logging.go diff --git a/pkg/infra/metrics/metrics.go b/pkg/infra/metrics/metrics.go index c3dfce10fcc..952c4bf112e 100644 --- a/pkg/infra/metrics/metrics.go +++ b/pkg/infra/metrics/metrics.go @@ -4,6 +4,7 @@ import ( "runtime" "github.com/grafana/grafana/pkg/infra/metrics/metricutil" + pubdash "github.com/grafana/grafana/pkg/services/publicdashboards/models" "github.com/grafana/grafana/pkg/setting" "github.com/prometheus/client_golang/prometheus" ) @@ -104,6 +105,9 @@ var ( // MPublicDashboardRequestCount is a metric counter for public dashboards requests MPublicDashboardRequestCount prometheus.Counter + + // MPublicDashboardDatasourceQuerySuccess is a metric counter for successful queries labelled by datasource + MPublicDashboardDatasourceQuerySuccess *prometheus.CounterVec ) // Timers @@ -419,6 +423,12 @@ func init() { Namespace: ExporterName, }) + MPublicDashboardDatasourceQuerySuccess = metricutil.NewCounterVecStartingAtZero(prometheus.CounterOpts{ + Name: "public_dashboard_datasource_query_success", + Help: "counter for queries to public dashboard datasources labelled by datasource type and success status success/failed", + Namespace: ExporterName, + }, []string{"datasource", "status"}, map[string][]string{"status": pubdash.QueryResultStatuses}) + MStatTotalDashboards = prometheus.NewGauge(prometheus.GaugeOpts{ Name: "stat_totals_dashboard", Help: "total amount of dashboards", @@ -664,5 +674,6 @@ func initMetricVars() { StatsTotalDataKeys, MStatTotalPublicDashboards, MPublicDashboardRequestCount, + MPublicDashboardDatasourceQuerySuccess, ) } diff --git a/pkg/services/publicdashboards/models/models.go b/pkg/services/publicdashboards/models/models.go index fed864bd974..0ba668f2727 100644 --- a/pkg/services/publicdashboards/models/models.go +++ b/pkg/services/publicdashboards/models/models.go @@ -24,6 +24,11 @@ func (e PublicDashboardErr) Error() string { return "Dashboard Error" } +const QuerySuccess = "success" +const QueryFailure = "failure" + +var QueryResultStatuses = []string{QuerySuccess, QueryFailure} + var ( ErrPublicDashboardFailedGenerateUniqueUid = PublicDashboardErr{ Reason: "failed to generate unique public dashboard id", diff --git a/pkg/services/publicdashboards/service/logging.go b/pkg/services/publicdashboards/service/logging.go new file mode 100644 index 00000000000..80f787ff123 --- /dev/null +++ b/pkg/services/publicdashboards/service/logging.go @@ -0,0 +1,36 @@ +package service + +import ( + "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/infra/metrics" + "github.com/grafana/grafana/pkg/services/publicdashboards/models" +) + +/** +A place to record relevant logs and metrics within the service layer of public dashboards +*/ + +func LogQuerySuccess(datasources []string, log log.Logger) { + log.Info("Successfully queried datasources for public dashboard", "datasources", datasources) + label := getLabelName(datasources) + metrics.MPublicDashboardDatasourceQuerySuccess.WithLabelValues(label, models.QuerySuccess).Inc() +} + +func LogQueryFailure(datasources []string, log log.Logger, err error) { + log.Error("Error querying datasources for public dashboard", "error", err.Error(), "datasources", datasources) + label := getLabelName(datasources) + metrics.MPublicDashboardDatasourceQuerySuccess.WithLabelValues(label, models.QueryFailure).Inc() +} + +func getLabelName(datasources []string) string { + size := len(datasources) + + switch size { + case 0: + return "none" + case 1: + return datasources[0] + default: + return "mixed" + } +} diff --git a/pkg/services/publicdashboards/service/service.go b/pkg/services/publicdashboards/service/service.go index 6862fe87f74..377489f1247 100644 --- a/pkg/services/publicdashboards/service/service.go +++ b/pkg/services/publicdashboards/service/service.go @@ -207,15 +207,15 @@ func (pd *PublicDashboardServiceImpl) GetQueryDataResponse(ctx context.Context, res, err := pd.QueryDataService.QueryDataMultipleSources(ctx, anonymousUser, skipCache, metricReq, true) - // We want to track which datasources were successful and which were not reqDatasources := metricReq.GetUniqueDatasourceTypes() if err != nil { - pd.log.Error("Error querying datasources for public dashboard", "error", err.Error(), "datasources", reqDatasources) + LogQueryFailure(reqDatasources, pd.log, err) return nil, err } + LogQuerySuccess(reqDatasources, pd.log) - pd.log.Info("Successfully queried datasources for public dashboard", "datasources", reqDatasources) queries.SanitizeMetadataFromQueryData(res) + return res, nil }