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 }