diff --git a/pkger/service_metrics.go b/pkger/service_metrics.go index 43f834291c..c4f5ae289d 100644 --- a/pkger/service_metrics.go +++ b/pkger/service_metrics.go @@ -4,6 +4,7 @@ import ( "context" "net/url" "path" + "strconv" "strings" "github.com/influxdata/influxdb/v2" @@ -25,7 +26,7 @@ var _ SVC = (*mwMetrics)(nil) func MWMetrics(reg *prom.Registry) SVCMiddleware { return func(svc SVC) SVC { return &mwMetrics{ - rec: metric.New(reg, "pkger", metric.WithVec(templateVec())), + rec: metric.New(reg, "pkger", metric.WithVec(templateVec()), metric.WithVec(exportVec())), next: svc, } } @@ -62,8 +63,21 @@ func (s *mwMetrics) UpdateStack(ctx context.Context, upd StackUpdate) (Stack, er func (s *mwMetrics) Export(ctx context.Context, opts ...ExportOptFn) (*Pkg, error) { rec := s.rec.Record("create_pkg") + opt, err := exportOptFromOptFns(opts) + if err != nil { + return nil, rec(err) + } + pkg, err := s.next.Export(ctx, opts...) - return pkg, rec(err) + if err != nil { + return nil, err + } + + return pkg, rec(err, metric.RecordAdditional(map[string]interface{}{ + "num_org_ids": len(opt.OrgIDs), + "summary": pkg.Summary(), + "by_stack": opt.StackID != 0, + })) } func (s *mwMetrics) DryRun(ctx context.Context, orgID, userID influxdb.ID, opts ...ApplyOptFn) (ImpactSummary, error) { @@ -86,6 +100,70 @@ func applyMetricAdditions(orgID, userID influxdb.ID, sources []string) func(*met }) } +func exportVec() metric.VecOpts { + const ( + byStack = "by_stack" + numOrgIDs = "num_org_ids" + bkts = "buckets" + checks = "checks" + dashes = "dashboards" + endpoints = "endpoints" + labels = "labels" + labelMappings = "label_mappings" + rules = "rules" + tasks = "tasks" + telegrafConfigs = "telegraf_configs" + variables = "variables" + ) + return metric.VecOpts{ + Name: "template_export", + Help: "Metrics for resources being exported", + LabelNames: []string{ + "method", + byStack, + numOrgIDs, + bkts, + checks, + dashes, + endpoints, + labels, + labelMappings, + rules, + tasks, + telegrafConfigs, + variables, + }, + CounterFn: func(vec *prometheus.CounterVec, o metric.CollectFnOpts) { + if o.Err != nil { + return + } + + orgID, _ := o.AdditionalProps[numOrgIDs].(int) + sum, _ := o.AdditionalProps["sum"].(Summary) + st, _ := o.AdditionalProps[byStack].(bool) + + vec. + With(prometheus.Labels{ + "method": o.Method, + byStack: strconv.FormatBool(st), + numOrgIDs: strconv.Itoa(orgID), + bkts: strconv.Itoa(len(sum.Buckets)), + checks: strconv.Itoa(len(sum.Checks)), + dashes: strconv.Itoa(len(sum.Dashboards)), + endpoints: strconv.Itoa(len(sum.NotificationEndpoints)), + labels: strconv.Itoa(len(sum.Labels)), + labelMappings: strconv.Itoa(len(sum.LabelMappings)), + rules: strconv.Itoa(len(sum.NotificationRules)), + tasks: strconv.Itoa(len(sum.Tasks)), + telegrafConfigs: strconv.Itoa(len(sum.TelegrafConfigs)), + variables: strconv.Itoa(len(sum.TelegrafConfigs)), + }). + Inc() + }, + HistogramFn: nil, + } +} + func templateVec() metric.VecOpts { return metric.VecOpts{ Name: "template_count",