Skip to content

Commit 2733799

Browse files
craig[bot]dhartunian
andcommitted
Merge #143511
143511: metric: add static labels to metric metadata r=angles-n-daemons a=dhartunian Previously, it was not possible to emit metrics with static labels that were known at startup. Labels would need to be dynamically added after `Metadata` was constructed. This made it difficult to define groups of metrics with the same name but different labels. This commit adds two new fields to the `metric.Metadata` struct, which are meant to enable a backwards-compatible transition to labeled metrics from today's definitions which reify the label values into the metric name. The Prometheus export code is modified to accept a flag that governs whether static labels are requested. If so, the labeled name of the metric be used if available. A future PR will add a `/metrics` endpoint that is like `/_status/ vars` except that it will emit the static label version of metrics when they have those definitions available. Part of: #142570 Release note: None Co-authored-by: David Hartunian <[email protected]>
2 parents c7ac78c + e2edfc6 commit 2733799

File tree

20 files changed

+349
-52
lines changed

20 files changed

+349
-52
lines changed

pkg/ccl/multitenantccl/tenantcostclient/tenant_side_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ func (ts *testState) metrics(*testing.T, *datadriven.TestData, cmdArgs) string {
647647
if !ok {
648648
return
649649
}
650-
promIter.Each(it.GetLabels(), func(m *prometheusgo.Metric) {
650+
promIter.Each(it.GetLabels(false /* useStaticLabels */), func(m *prometheusgo.Metric) {
651651
childMetrics += fmt.Sprintf("%s{", typ.GetName())
652652
for i, l := range m.Label {
653653
if i > 0 {

pkg/ccl/sqlproxyccl/server.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ func (s *Server) handleVars(w http.ResponseWriter, r *http.Request) {
149149
contentType := expfmt.Negotiate(r.Header)
150150
w.Header().Set(httputil.ContentTypeHeader, string(contentType))
151151
scrape := func(pm *metric.PrometheusExporter) {
152-
pm.ScrapeRegistry(s.metricsRegistry, true /* includeChildMetrics*/, true /* includeAggregateMetrics */)
152+
pm.ScrapeRegistry(s.metricsRegistry, metric.WithIncludeChildMetrics(true), metric.WithIncludeAggregateMetrics(true))
153153
}
154154
if err := s.prometheusExporter.ScrapeAndPrintAsText(w, contentType, scrape); err != nil {
155155
log.Errorf(r.Context(), "%v", err)

pkg/kv/kvserver/client_tenant_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ func TestTenantsStorageMetricsOnSplit(t *testing.T) {
9999
})
100100
ex := metric.MakePrometheusExporter()
101101
scrape := func(ex *metric.PrometheusExporter) {
102-
ex.ScrapeRegistry(store.Registry(), true /* includeChildMetrics */, true)
102+
ex.ScrapeRegistry(store.Registry(), metric.WithIncludeChildMetrics(true), metric.WithIncludeAggregateMetrics(true))
103103
}
104104
var in bytes.Buffer
105105
if err := ex.ScrapeAndPrintAsText(&in, expfmt.FmtText, scrape); err != nil {

pkg/server/load_endpoint.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func newLoadEndpoint(
8989

9090
// Exporter for the load vars that are provided only by the load handler.
9191
func (le *loadEndpoint) scrapeLoadVarsIntoPrometheus(pm *metric.PrometheusExporter) {
92-
pm.ScrapeRegistry(le.registry, true, true)
92+
pm.ScrapeRegistry(le.registry, metric.WithIncludeChildMetrics(true), metric.WithIncludeAggregateMetrics(true))
9393
}
9494

9595
// Handler responsible for serving the instant values of selected

pkg/server/status/recorder.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -346,15 +346,15 @@ func (mr *MetricsRecorder) ScrapeIntoPrometheus(pm *metric.PrometheusExporter) {
346346
}
347347
includeChildMetrics := ChildMetricsEnabled.Get(&mr.settings.SV)
348348
includeAggregateMetrics := includeAggregateMetricsEnabled.Get(&mr.settings.SV)
349-
pm.ScrapeRegistry(mr.mu.nodeRegistry, includeChildMetrics, includeAggregateMetrics)
350-
pm.ScrapeRegistry(mr.mu.appRegistry, includeChildMetrics, includeAggregateMetrics)
351-
pm.ScrapeRegistry(mr.mu.logRegistry, includeChildMetrics, includeAggregateMetrics)
352-
pm.ScrapeRegistry(mr.mu.sysRegistry, includeChildMetrics, includeAggregateMetrics)
349+
pm.ScrapeRegistry(mr.mu.nodeRegistry, metric.WithIncludeChildMetrics(includeChildMetrics), metric.WithIncludeAggregateMetrics(includeAggregateMetrics))
350+
pm.ScrapeRegistry(mr.mu.appRegistry, metric.WithIncludeChildMetrics(includeChildMetrics), metric.WithIncludeAggregateMetrics(includeAggregateMetrics))
351+
pm.ScrapeRegistry(mr.mu.logRegistry, metric.WithIncludeChildMetrics(includeChildMetrics), metric.WithIncludeAggregateMetrics(includeAggregateMetrics))
352+
pm.ScrapeRegistry(mr.mu.sysRegistry, metric.WithIncludeChildMetrics(includeChildMetrics), metric.WithIncludeAggregateMetrics(includeAggregateMetrics))
353353
for _, reg := range mr.mu.storeRegistries {
354-
pm.ScrapeRegistry(reg, includeChildMetrics, includeAggregateMetrics)
354+
pm.ScrapeRegistry(reg, metric.WithIncludeChildMetrics(includeChildMetrics), metric.WithIncludeAggregateMetrics(includeAggregateMetrics))
355355
}
356356
for _, tenantRegistry := range mr.mu.tenantRegistries {
357-
pm.ScrapeRegistry(tenantRegistry, includeChildMetrics, includeAggregateMetrics)
357+
pm.ScrapeRegistry(tenantRegistry, metric.WithIncludeChildMetrics(includeChildMetrics), metric.WithIncludeAggregateMetrics(includeAggregateMetrics))
358358
}
359359
}
360360

@@ -808,7 +808,7 @@ func (rr registryRecorder) recordChild(
808808
return
809809
}
810810
m := prom.ToPrometheusMetric()
811-
m.Label = append(labels, prom.GetLabels()...)
811+
m.Label = append(labels, prom.GetLabels(false /* useStaticLabels */)...)
812812

813813
processChildMetric := func(metric *prometheusgo.Metric) {
814814
found := false

pkg/sql/mvcc_statistics_update_job_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func TestTenantGlobalAggregatedLivebytes(t *testing.T) {
127127
&in,
128128
expfmt.FmtText,
129129
func(ex *metric.PrometheusExporter) {
130-
ex.ScrapeRegistry(r, true /* includeChildMetrics */, true)
130+
ex.ScrapeRegistry(r, metric.WithIncludeChildMetrics(true), metric.WithIncludeAggregateMetrics(true))
131131
},
132132
)
133133
require.NoError(t, err)

pkg/testutils/metrictestutils/metrics_text.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
func GetMetricsText(registry *metric.Registry, re *regexp.Regexp) (string, error) {
2222
ex := metric.MakePrometheusExporter()
2323
scrape := func(ex *metric.PrometheusExporter) {
24-
ex.ScrapeRegistry(registry, true /* includeChildMetrics */, true)
24+
ex.ScrapeRegistry(registry, metric.WithIncludeChildMetrics(true), metric.WithIncludeAggregateMetrics(true))
2525
}
2626
var in bytes.Buffer
2727
if err := ex.ScrapeAndPrintAsText(&in, expfmt.FmtText, scrape); err != nil {

pkg/util/metric/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,14 @@ go_test(
6262
"//pkg/util/buildutil",
6363
"//pkg/util/log",
6464
"//pkg/util/randutil",
65+
"@com_github_gogo_protobuf//proto",
6566
"@com_github_kr_pretty//:pretty",
6667
"@com_github_prometheus_client_golang//prometheus",
6768
"@com_github_prometheus_client_model//go",
6869
"@com_github_prometheus_common//expfmt",
6970
"@com_github_stretchr_testify//assert",
7071
"@com_github_stretchr_testify//require",
72+
"@org_golang_google_protobuf//proto",
7173
],
7274
)
7375

pkg/util/metric/aggmetric/agg_metric_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func TestExcludeAggregateMetrics(t *testing.T) {
3535
// Flipping the includeAggregateMetrics flag should have no effect.
3636
testutils.RunTrueAndFalse(t, "includeChildMetrics=false,includeAggregateMetrics", func(t *testing.T, includeAggregateMetrics bool) {
3737
pe := metric.MakePrometheusExporter()
38-
pe.ScrapeRegistry(r, false, includeAggregateMetrics)
38+
pe.ScrapeRegistry(r, metric.WithIncludeChildMetrics(false), metric.WithIncludeAggregateMetrics(includeAggregateMetrics))
3939
families, err := pe.Gather()
4040
require.NoError(t, err)
4141
require.Equal(t, 1, len(families))
@@ -46,7 +46,7 @@ func TestExcludeAggregateMetrics(t *testing.T) {
4646

4747
testutils.RunTrueAndFalse(t, "includeChildMetrics=true,includeAggregateMetrics", func(t *testing.T, includeAggregateMetrics bool) {
4848
pe := metric.MakePrometheusExporter()
49-
pe.ScrapeRegistry(r, true, includeAggregateMetrics)
49+
pe.ScrapeRegistry(r, metric.WithIncludeChildMetrics(true), metric.WithIncludeAggregateMetrics(includeAggregateMetrics))
5050
families, err := pe.Gather()
5151
require.NoError(t, err)
5252
require.Equal(t, 1, len(families))
@@ -355,7 +355,7 @@ func WritePrometheusMetricsFunc(r *metric.Registry) func(t *testing.T) string {
355355
var in bytes.Buffer
356356
ex := metric.MakePrometheusExporter()
357357
scrape := func(ex *metric.PrometheusExporter) {
358-
ex.ScrapeRegistry(r, true /* includeChildMetrics */, true)
358+
ex.ScrapeRegistry(r, metric.WithIncludeChildMetrics(true), metric.WithIncludeAggregateMetrics(true))
359359
}
360360
require.NoError(t, ex.ScrapeAndPrintAsText(&in, expfmt.FmtText, scrape))
361361
var lines []string

pkg/util/metric/aggmetric/counter.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ func NewCounter(metadata metric.Metadata, childLabels ...string) *AggCounter {
3737
// GetName is part of the metric.Iterable interface.
3838
func (c *AggCounter) GetName() string { return c.g.GetName() }
3939

40+
// GetLabeledName is part of the metric.Iterable interface.
41+
func (c *AggCounter) GetLabeledName() string { return c.g.GetLabeledName() }
42+
4043
// GetHelp is part of the metric.Iterable interface.
4144
func (c *AggCounter) GetHelp() string { return c.g.GetHelp() }
4245

@@ -58,8 +61,8 @@ func (c *AggCounter) GetType() *io_prometheus_client.MetricType {
5861
}
5962

6063
// GetLabels is part of the metric.PrometheusExportable interface.
61-
func (c *AggCounter) GetLabels() []*io_prometheus_client.LabelPair {
62-
return c.g.GetLabels()
64+
func (c *AggCounter) GetLabels(useStaticLabels bool) []*io_prometheus_client.LabelPair {
65+
return c.g.GetLabels(useStaticLabels)
6366
}
6467

6568
// ToPrometheusMetric is part of the metric.PrometheusExportable interface.
@@ -176,6 +179,9 @@ func NewCounterFloat64(metadata metric.Metadata, childLabels ...string) *AggCoun
176179
// GetName is part of the metric.Iterable interface.
177180
func (c *AggCounterFloat64) GetName() string { return c.g.GetName() }
178181

182+
// GetLabeledName is part of the metric.Iterable interface.
183+
func (c *AggCounterFloat64) GetLabeledName() string { return c.g.GetLabeledName() }
184+
179185
// GetHelp is part of the metric.Iterable interface.
180186
func (c *AggCounterFloat64) GetHelp() string { return c.g.GetHelp() }
181187

@@ -197,8 +203,8 @@ func (c *AggCounterFloat64) GetType() *io_prometheus_client.MetricType {
197203
}
198204

199205
// GetLabels is part of the metric.PrometheusExportable interface.
200-
func (c *AggCounterFloat64) GetLabels() []*io_prometheus_client.LabelPair {
201-
return c.g.GetLabels()
206+
func (c *AggCounterFloat64) GetLabels(useStaticLabels bool) []*io_prometheus_client.LabelPair {
207+
return c.g.GetLabels(useStaticLabels)
202208
}
203209

204210
// ToPrometheusMetric is part of the metric.PrometheusExportable interface.

0 commit comments

Comments
 (0)