From 393c96d4cb922e235a32ccd29186e06d3e00354e Mon Sep 17 00:00:00 2001 From: "gustavo.paiva" Date: Mon, 17 Oct 2022 18:55:52 -0300 Subject: [PATCH 1/4] converts `Resource` into a `target_info` metric on the prometheus exporter --- CHANGELOG.md | 1 + exporters/prometheus/confg_test.go | 16 +++- exporters/prometheus/config.go | 13 ++- exporters/prometheus/exporter.go | 45 +++++++-- exporters/prometheus/exporter_test.go | 96 ++++++++++++++++++- exporters/prometheus/go.mod | 2 +- exporters/prometheus/testdata/counter.txt | 3 + .../prometheus/testdata/custom_resource.txt | 6 ++ .../prometheus/testdata/empty_resource.txt | 6 ++ exporters/prometheus/testdata/gauge.txt | 3 + exporters/prometheus/testdata/histogram.txt | 3 + .../prometheus/testdata/sanitized_labels.txt | 3 + .../prometheus/testdata/sanitized_names.txt | 3 + .../testdata/without_target_info.txt | 3 + 14 files changed, 187 insertions(+), 16 deletions(-) create mode 100755 exporters/prometheus/testdata/custom_resource.txt create mode 100755 exporters/prometheus/testdata/empty_resource.txt create mode 100755 exporters/prometheus/testdata/without_target_info.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index e81ccaf4f46..59ddc3a8550 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Added - Prometheus exporter will register with a prometheus registerer on creation, there are options to control this. (#3239) +- Prometheus exporter will convert metrics `Resource` into a `target_info` metric. (#3285) ### Changed diff --git a/exporters/prometheus/confg_test.go b/exporters/prometheus/confg_test.go index 91893d40f3a..f4d82c73f55 100644 --- a/exporters/prometheus/confg_test.go +++ b/exporters/prometheus/confg_test.go @@ -25,9 +25,10 @@ func TestNewConfig(t *testing.T) { registry := prometheus.NewRegistry() testCases := []struct { - name string - options []Option - wantRegisterer prometheus.Registerer + name string + options []Option + wantRegisterer prometheus.Registerer + wantDisableTargetInfo bool }{ { name: "Default", @@ -49,12 +50,21 @@ func TestNewConfig(t *testing.T) { }, wantRegisterer: prometheus.DefaultRegisterer, }, + { + name: "without target_info metric", + options: []Option{ + WithoutTargetInfo(), + }, + wantRegisterer: prometheus.DefaultRegisterer, + wantDisableTargetInfo: true, + }, } for _, tt := range testCases { t.Run(tt.name, func(t *testing.T) { cfg := newConfig(tt.options...) assert.Equal(t, tt.wantRegisterer, cfg.registerer) + assert.Equal(t, tt.wantDisableTargetInfo, cfg.disableTargetInfo) }) } } diff --git a/exporters/prometheus/config.go b/exporters/prometheus/config.go index 6ee84732556..f3d1ca0f4ef 100644 --- a/exporters/prometheus/config.go +++ b/exporters/prometheus/config.go @@ -20,7 +20,8 @@ import ( // config contains options for the exporter. type config struct { - registerer prometheus.Registerer + registerer prometheus.Registerer + disableTargetInfo bool } // newConfig creates a validated config configured with options. @@ -57,3 +58,13 @@ func WithRegisterer(reg prometheus.Registerer) Option { return cfg }) } + +// WithoutTargetInfo configures the Exporter to not export the resource target_info metric. +// If not specified, the Exporter will create a target_info metric containing +// the metrics' resource.Resource attributes. +func WithoutTargetInfo() Option { + return optionFunc(func(cfg config) config { + cfg.disableTargetInfo = true + return cfg + }) +} diff --git a/exporters/prometheus/exporter.go b/exporters/prometheus/exporter.go index e14fa3638c6..48c1cdff114 100644 --- a/exporters/prometheus/exporter.go +++ b/exporters/prometheus/exporter.go @@ -28,6 +28,12 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/metric/metricdata" + "go.opentelemetry.io/otel/sdk/resource" +) + +const ( + targetInfoMetricName = "target_info" + targetInfoDescription = "Target metadata" ) // Exporter is a Prometheus Exporter that embeds the OTel metric.Reader @@ -40,7 +46,9 @@ var _ metric.Reader = &Exporter{} // collector is used to implement prometheus.Collector. type collector struct { - reader metric.Reader + reader metric.Reader + disableTargetInfo bool + targetInfo *metricData } // New returns a Prometheus Exporter. @@ -53,7 +61,8 @@ func New(opts ...Option) (*Exporter, error) { reader := metric.NewManualReader() collector := &collector{ - reader: reader, + reader: reader, + disableTargetInfo: cfg.disableTargetInfo, } if err := cfg.registerer.Register(collector); err != nil { @@ -81,11 +90,12 @@ func (c *collector) Collect(ch chan<- prometheus.Metric) { metrics, err := c.reader.Collect(context.TODO()) if err != nil { otel.Handle(err) + if err == metric.ErrReaderNotRegistered { + return + } } - // TODO(#3166): convert otel resource to target_info - // see https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/metrics/data-model.md#resource-attributes-1 - for _, metricData := range getMetricData(metrics) { + for _, metricData := range c.getMetricData(metrics) { if metricData.valueType == prometheus.UntypedValue { m, err := prometheus.NewConstHistogram(metricData.description, metricData.histogramCount, metricData.histogramSum, metricData.histogramBuckets, metricData.attributeValues...) if err != nil { @@ -118,8 +128,18 @@ type metricData struct { histogramBuckets map[float64]uint64 } -func getMetricData(metrics metricdata.ResourceMetrics) []*metricData { +func (c *collector) getMetricData(metrics metricdata.ResourceMetrics) []*metricData { allMetrics := make([]*metricData, 0) + + if !c.disableTargetInfo { + if c.targetInfo == nil { + // Resource should be immutable, we don't need to compute again + c.targetInfo = createInfoMetricData(targetInfoMetricName, targetInfoDescription, metrics.Resource) + } + + allMetrics = append(allMetrics, c.targetInfo) + } + for _, scopeMetrics := range metrics.ScopeMetrics { for _, m := range scopeMetrics.Metrics { switch v := m.Data.(type) { @@ -230,6 +250,19 @@ func getAttrs(attrs attribute.Set) ([]string, []string) { return keys, values } +func createInfoMetricData(name, description string, res *resource.Resource) *metricData { + keys, values := getAttrs(*res.Set()) + + desc := prometheus.NewDesc(name, description, keys, nil) + return &metricData{ + name: name, + description: desc, + attributeValues: values, + valueType: prometheus.GaugeValue, + value: float64(1), + } +} + func sanitizeRune(r rune) rune { if unicode.IsLetter(r) || unicode.IsDigit(r) || r == ':' || r == '_' { return r diff --git a/exporters/prometheus/exporter_test.go b/exporters/prometheus/exporter_test.go index 5a1a65ce58d..a24a39ff045 100644 --- a/exporters/prometheus/exporter_test.go +++ b/exporters/prometheus/exporter_test.go @@ -29,13 +29,18 @@ import ( "go.opentelemetry.io/otel/sdk/metric" "go.opentelemetry.io/otel/sdk/metric/aggregation" "go.opentelemetry.io/otel/sdk/metric/view" + "go.opentelemetry.io/otel/sdk/resource" + semconv "go.opentelemetry.io/otel/semconv/v1.12.0" ) func TestPrometheusExporter(t *testing.T) { testCases := []struct { - name string - recordMetrics func(ctx context.Context, meter otelmetric.Meter) - expectedFile string + name string + emptyResource bool + customResouceAttrs []attribute.KeyValue + recordMetrics func(ctx context.Context, meter otelmetric.Meter) + withoutTargetInfo bool + expectedFile string }{ { name: "counter", @@ -132,6 +137,63 @@ func TestPrometheusExporter(t *testing.T) { histogram.Record(ctx, 23, attrs...) }, }, + { + name: "empty resource", + emptyResource: true, + expectedFile: "testdata/empty_resource.txt", + recordMetrics: func(ctx context.Context, meter otelmetric.Meter) { + attrs := []attribute.KeyValue{ + attribute.Key("A").String("B"), + attribute.Key("C").String("D"), + attribute.Key("E").Bool(true), + attribute.Key("F").Int(42), + } + counter, err := meter.SyncFloat64().Counter("foo", instrument.WithDescription("a simple counter")) + require.NoError(t, err) + counter.Add(ctx, 5, attrs...) + counter.Add(ctx, 10.3, attrs...) + counter.Add(ctx, 9, attrs...) + }, + }, + { + name: "custom resource", + customResouceAttrs: []attribute.KeyValue{ + attribute.Key("A").String("B"), + attribute.Key("C").String("D"), + }, + expectedFile: "testdata/custom_resource.txt", + recordMetrics: func(ctx context.Context, meter otelmetric.Meter) { + attrs := []attribute.KeyValue{ + attribute.Key("A").String("B"), + attribute.Key("C").String("D"), + attribute.Key("E").Bool(true), + attribute.Key("F").Int(42), + } + counter, err := meter.SyncFloat64().Counter("foo", instrument.WithDescription("a simple counter")) + require.NoError(t, err) + counter.Add(ctx, 5, attrs...) + counter.Add(ctx, 10.3, attrs...) + counter.Add(ctx, 9, attrs...) + }, + }, + { + name: "without target_info", + withoutTargetInfo: true, + expectedFile: "testdata/without_target_info.txt", + recordMetrics: func(ctx context.Context, meter otelmetric.Meter) { + attrs := []attribute.KeyValue{ + attribute.Key("A").String("B"), + attribute.Key("C").String("D"), + attribute.Key("E").Bool(true), + attribute.Key("F").Int(42), + } + counter, err := meter.SyncFloat64().Counter("foo", instrument.WithDescription("a simple counter")) + require.NoError(t, err) + counter.Add(ctx, 5, attrs...) + counter.Add(ctx, 10.3, attrs...) + counter.Add(ctx, 9, attrs...) + }, + }, } for _, tc := range testCases { @@ -139,7 +201,12 @@ func TestPrometheusExporter(t *testing.T) { ctx := context.Background() registry := prometheus.NewRegistry() - exporter, err := New(WithRegisterer(registry)) + opts := []Option{WithRegisterer(registry)} + if tc.withoutTargetInfo { + opts = append(opts, WithoutTargetInfo()) + } + + exporter, err := New(opts...) require.NoError(t, err) customBucketsView, err := view.New( @@ -152,7 +219,26 @@ func TestPrometheusExporter(t *testing.T) { defaultView, err := view.New(view.MatchInstrumentName("*")) require.NoError(t, err) - provider := metric.NewMeterProvider(metric.WithReader(exporter, customBucketsView, defaultView)) + var res *resource.Resource + + if tc.emptyResource { + res = resource.Empty() + } else { + res, err = resource.New(ctx, + // always specify service.name because the default depends on the running OS + resource.WithAttributes(semconv.ServiceNameKey.String("prometheus_test")), + resource.WithAttributes(tc.customResouceAttrs...), + ) + require.NoError(t, err) + + res, err = resource.Merge(resource.Default(), res) + require.NoError(t, err) + } + + provider := metric.NewMeterProvider( + metric.WithResource(res), + metric.WithReader(exporter, customBucketsView, defaultView), + ) meter := provider.Meter("testmeter") tc.recordMetrics(ctx, meter) diff --git a/exporters/prometheus/go.mod b/exporters/prometheus/go.mod index 47c71ce24d3..c0935ba262a 100644 --- a/exporters/prometheus/go.mod +++ b/exporters/prometheus/go.mod @@ -7,6 +7,7 @@ require ( github.com/stretchr/testify v1.8.0 go.opentelemetry.io/otel v1.11.0 go.opentelemetry.io/otel/metric v0.32.3 + go.opentelemetry.io/otel/sdk v1.11.0 go.opentelemetry.io/otel/sdk/metric v0.32.3 ) @@ -22,7 +23,6 @@ require ( github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.37.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect - go.opentelemetry.io/otel/sdk v1.11.0 // indirect go.opentelemetry.io/otel/trace v1.11.0 // indirect golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect google.golang.org/protobuf v1.28.1 // indirect diff --git a/exporters/prometheus/testdata/counter.txt b/exporters/prometheus/testdata/counter.txt index 93776d2372b..de59e860adf 100755 --- a/exporters/prometheus/testdata/counter.txt +++ b/exporters/prometheus/testdata/counter.txt @@ -1,3 +1,6 @@ # HELP foo a simple counter # TYPE foo counter foo{A="B",C="D",E="true",F="42"} 24.3 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.11.0"} 1 diff --git a/exporters/prometheus/testdata/custom_resource.txt b/exporters/prometheus/testdata/custom_resource.txt new file mode 100755 index 00000000000..8666a8e1bbe --- /dev/null +++ b/exporters/prometheus/testdata/custom_resource.txt @@ -0,0 +1,6 @@ +# HELP foo a simple counter +# TYPE foo counter +foo{A="B",C="D",E="true",F="42"} 24.3 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{A="B",C="D",service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.11.0"} 1 diff --git a/exporters/prometheus/testdata/empty_resource.txt b/exporters/prometheus/testdata/empty_resource.txt new file mode 100755 index 00000000000..ed9d29f3312 --- /dev/null +++ b/exporters/prometheus/testdata/empty_resource.txt @@ -0,0 +1,6 @@ +# HELP foo a simple counter +# TYPE foo counter +foo{A="B",C="D",E="true",F="42"} 24.3 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info 1 diff --git a/exporters/prometheus/testdata/gauge.txt b/exporters/prometheus/testdata/gauge.txt index 889295d74e1..030138c3132 100644 --- a/exporters/prometheus/testdata/gauge.txt +++ b/exporters/prometheus/testdata/gauge.txt @@ -1,3 +1,6 @@ # HELP bar a fun little gauge # TYPE bar counter bar{A="B",C="D"} 75 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.11.0"} 1 diff --git a/exporters/prometheus/testdata/histogram.txt b/exporters/prometheus/testdata/histogram.txt index 95f202154a4..0c7c5aa9b92 100644 --- a/exporters/prometheus/testdata/histogram.txt +++ b/exporters/prometheus/testdata/histogram.txt @@ -13,3 +13,6 @@ histogram_baz_bucket{A="B",C="D",le="1000"} 4 histogram_baz_bucket{A="B",C="D",le="+Inf"} 4 histogram_baz_sum{A="B",C="D"} 236 histogram_baz_count{A="B",C="D"} 4 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.11.0"} 1 diff --git a/exporters/prometheus/testdata/sanitized_labels.txt b/exporters/prometheus/testdata/sanitized_labels.txt index cd686cff97e..022480795ae 100755 --- a/exporters/prometheus/testdata/sanitized_labels.txt +++ b/exporters/prometheus/testdata/sanitized_labels.txt @@ -1,3 +1,6 @@ # HELP foo a sanitary counter # TYPE foo counter foo{A_B="Q",C_D="Y;Z"} 24.3 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.11.0"} 1 diff --git a/exporters/prometheus/testdata/sanitized_names.txt b/exporters/prometheus/testdata/sanitized_names.txt index 509055705a3..c280ac62991 100644 --- a/exporters/prometheus/testdata/sanitized_names.txt +++ b/exporters/prometheus/testdata/sanitized_names.txt @@ -27,3 +27,6 @@ invalid_hist_name_bucket{A="B",C="D",le="10000"} 1 invalid_hist_name_bucket{A="B",C="D",le="+Inf"} 1 invalid_hist_name_sum{A="B",C="D"} 23 invalid_hist_name_count{A="B",C="D"} 1 +# HELP target_info Target metadata +# TYPE target_info gauge +target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.11.0"} 1 diff --git a/exporters/prometheus/testdata/without_target_info.txt b/exporters/prometheus/testdata/without_target_info.txt new file mode 100755 index 00000000000..93776d2372b --- /dev/null +++ b/exporters/prometheus/testdata/without_target_info.txt @@ -0,0 +1,3 @@ +# HELP foo a simple counter +# TYPE foo counter +foo{A="B",C="D",E="true",F="42"} 24.3 From bd74fb56e004d4caec7beca7c1b15af71be020dd Mon Sep 17 00:00:00 2001 From: "gustavo.paiva" Date: Tue, 18 Oct 2022 16:55:44 -0300 Subject: [PATCH 2/4] use sync.Once; don't add nil targetInfo; assert config --- exporters/prometheus/confg_test.go | 32 ++++++++++++++++++------------ exporters/prometheus/exporter.go | 25 ++++++++++++++--------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/exporters/prometheus/confg_test.go b/exporters/prometheus/confg_test.go index f4d82c73f55..ff88f7a32dd 100644 --- a/exporters/prometheus/confg_test.go +++ b/exporters/prometheus/confg_test.go @@ -25,15 +25,16 @@ func TestNewConfig(t *testing.T) { registry := prometheus.NewRegistry() testCases := []struct { - name string - options []Option - wantRegisterer prometheus.Registerer - wantDisableTargetInfo bool + name string + options []Option + wantConfig config }{ { - name: "Default", - options: nil, - wantRegisterer: prometheus.DefaultRegisterer, + name: "Default", + options: nil, + wantConfig: config{ + registerer: prometheus.DefaultRegisterer, + }, }, { @@ -41,30 +42,35 @@ func TestNewConfig(t *testing.T) { options: []Option{ WithRegisterer(registry), }, - wantRegisterer: registry, + wantConfig: config{ + registerer: registry, + }, }, { name: "nil options do nothing", options: []Option{ WithRegisterer(nil), }, - wantRegisterer: prometheus.DefaultRegisterer, + wantConfig: config{ + registerer: prometheus.DefaultRegisterer, + }, }, { name: "without target_info metric", options: []Option{ WithoutTargetInfo(), }, - wantRegisterer: prometheus.DefaultRegisterer, - wantDisableTargetInfo: true, + wantConfig: config{ + registerer: prometheus.DefaultRegisterer, + disableTargetInfo: true, + }, }, } for _, tt := range testCases { t.Run(tt.name, func(t *testing.T) { cfg := newConfig(tt.options...) - assert.Equal(t, tt.wantRegisterer, cfg.registerer) - assert.Equal(t, tt.wantDisableTargetInfo, cfg.disableTargetInfo) + assert.Equal(t, tt.wantConfig, cfg) }) } } diff --git a/exporters/prometheus/exporter.go b/exporters/prometheus/exporter.go index 48c1cdff114..5cc169b567b 100644 --- a/exporters/prometheus/exporter.go +++ b/exporters/prometheus/exporter.go @@ -19,6 +19,7 @@ import ( "fmt" "sort" "strings" + "sync" "unicode" "unicode/utf8" @@ -46,9 +47,11 @@ var _ metric.Reader = &Exporter{} // collector is used to implement prometheus.Collector. type collector struct { - reader metric.Reader - disableTargetInfo bool - targetInfo *metricData + reader metric.Reader + + disableTargetInfo bool + targetInfo *metricData + createTargetInfoOnce sync.Once } // New returns a Prometheus Exporter. @@ -131,12 +134,12 @@ type metricData struct { func (c *collector) getMetricData(metrics metricdata.ResourceMetrics) []*metricData { allMetrics := make([]*metricData, 0) - if !c.disableTargetInfo { - if c.targetInfo == nil { - // Resource should be immutable, we don't need to compute again - c.targetInfo = createInfoMetricData(targetInfoMetricName, targetInfoDescription, metrics.Resource) - } + c.createTargetInfoOnce.Do(func() { + // Resource should be immutable, we don't need to compute again + c.targetInfo = c.createInfoMetricData(targetInfoMetricName, targetInfoDescription, metrics.Resource) + }) + if c.targetInfo != nil { allMetrics = append(allMetrics, c.targetInfo) } @@ -250,7 +253,11 @@ func getAttrs(attrs attribute.Set) ([]string, []string) { return keys, values } -func createInfoMetricData(name, description string, res *resource.Resource) *metricData { +func (c *collector) createInfoMetricData(name, description string, res *resource.Resource) *metricData { + if c.disableTargetInfo { + return nil + } + keys, values := getAttrs(*res.Set()) desc := prometheus.NewDesc(name, description, keys, nil) From c17a8270e1fcfed55acd624017480e8f9311a275 Mon Sep 17 00:00:00 2001 From: "gustavo.paiva" Date: Tue, 18 Oct 2022 18:12:01 -0300 Subject: [PATCH 3/4] overwrite telemetry sdk version attribute --- exporters/prometheus/exporter_test.go | 2 ++ exporters/prometheus/testdata/counter.txt | 2 +- exporters/prometheus/testdata/custom_resource.txt | 2 +- exporters/prometheus/testdata/gauge.txt | 2 +- exporters/prometheus/testdata/histogram.txt | 2 +- exporters/prometheus/testdata/sanitized_labels.txt | 2 +- exporters/prometheus/testdata/sanitized_names.txt | 2 +- 7 files changed, 8 insertions(+), 6 deletions(-) diff --git a/exporters/prometheus/exporter_test.go b/exporters/prometheus/exporter_test.go index a24a39ff045..4c8594038fc 100644 --- a/exporters/prometheus/exporter_test.go +++ b/exporters/prometheus/exporter_test.go @@ -227,6 +227,8 @@ func TestPrometheusExporter(t *testing.T) { res, err = resource.New(ctx, // always specify service.name because the default depends on the running OS resource.WithAttributes(semconv.ServiceNameKey.String("prometheus_test")), + // Overwrite the semconv.TelemetrySDKVersionKey value so we don't need to update every version + resource.WithAttributes(semconv.TelemetrySDKVersionKey.String("latest")), resource.WithAttributes(tc.customResouceAttrs...), ) require.NoError(t, err) diff --git a/exporters/prometheus/testdata/counter.txt b/exporters/prometheus/testdata/counter.txt index de59e860adf..1165eb67cd6 100755 --- a/exporters/prometheus/testdata/counter.txt +++ b/exporters/prometheus/testdata/counter.txt @@ -3,4 +3,4 @@ foo{A="B",C="D",E="true",F="42"} 24.3 # HELP target_info Target metadata # TYPE target_info gauge -target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.11.0"} 1 +target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff --git a/exporters/prometheus/testdata/custom_resource.txt b/exporters/prometheus/testdata/custom_resource.txt index 8666a8e1bbe..4a394fe9fec 100755 --- a/exporters/prometheus/testdata/custom_resource.txt +++ b/exporters/prometheus/testdata/custom_resource.txt @@ -3,4 +3,4 @@ foo{A="B",C="D",E="true",F="42"} 24.3 # HELP target_info Target metadata # TYPE target_info gauge -target_info{A="B",C="D",service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.11.0"} 1 +target_info{A="B",C="D",service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff --git a/exporters/prometheus/testdata/gauge.txt b/exporters/prometheus/testdata/gauge.txt index 030138c3132..b7e88c7f4aa 100644 --- a/exporters/prometheus/testdata/gauge.txt +++ b/exporters/prometheus/testdata/gauge.txt @@ -3,4 +3,4 @@ bar{A="B",C="D"} 75 # HELP target_info Target metadata # TYPE target_info gauge -target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.11.0"} 1 +target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff --git a/exporters/prometheus/testdata/histogram.txt b/exporters/prometheus/testdata/histogram.txt index 0c7c5aa9b92..495aa6f5160 100644 --- a/exporters/prometheus/testdata/histogram.txt +++ b/exporters/prometheus/testdata/histogram.txt @@ -15,4 +15,4 @@ histogram_baz_sum{A="B",C="D"} 236 histogram_baz_count{A="B",C="D"} 4 # HELP target_info Target metadata # TYPE target_info gauge -target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.11.0"} 1 +target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff --git a/exporters/prometheus/testdata/sanitized_labels.txt b/exporters/prometheus/testdata/sanitized_labels.txt index 022480795ae..176d437e000 100755 --- a/exporters/prometheus/testdata/sanitized_labels.txt +++ b/exporters/prometheus/testdata/sanitized_labels.txt @@ -3,4 +3,4 @@ foo{A_B="Q",C_D="Y;Z"} 24.3 # HELP target_info Target metadata # TYPE target_info gauge -target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.11.0"} 1 +target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 diff --git a/exporters/prometheus/testdata/sanitized_names.txt b/exporters/prometheus/testdata/sanitized_names.txt index c280ac62991..7b21948fce6 100644 --- a/exporters/prometheus/testdata/sanitized_names.txt +++ b/exporters/prometheus/testdata/sanitized_names.txt @@ -29,4 +29,4 @@ invalid_hist_name_sum{A="B",C="D"} 23 invalid_hist_name_count{A="B",C="D"} 1 # HELP target_info Target metadata # TYPE target_info gauge -target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="1.11.0"} 1 +target_info{service_name="prometheus_test",telemetry_sdk_language="go",telemetry_sdk_name="opentelemetry",telemetry_sdk_version="latest"} 1 From 1db809cbf44c28fbb6a2625d2191644b97e35389 Mon Sep 17 00:00:00 2001 From: "gustavo.paiva" Date: Tue, 18 Oct 2022 18:19:14 -0300 Subject: [PATCH 4/4] fix merge tests --- exporters/prometheus/confg_test.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/exporters/prometheus/confg_test.go b/exporters/prometheus/confg_test.go index 678f2d22b57..84b55f0221b 100644 --- a/exporters/prometheus/confg_test.go +++ b/exporters/prometheus/confg_test.go @@ -56,8 +56,7 @@ func TestNewConfig(t *testing.T) { WithAggregationSelector(aggregationSelector), }, wantConfig: config{ - registerer: prometheus.DefaultRegisterer, - aggregation: aggregationSelector, + registerer: prometheus.DefaultRegisterer, }, }, { @@ -68,8 +67,7 @@ func TestNewConfig(t *testing.T) { }, wantConfig: config{ - registerer: registry, - aggregation: aggregationSelector, + registerer: registry, }, }, { @@ -96,6 +94,9 @@ func TestNewConfig(t *testing.T) { t.Run(tt.name, func(t *testing.T) { cfg := newConfig(tt.options...) + // tested by TestConfigManualReaderOptions + cfg.aggregation = nil + assert.Equal(t, tt.wantConfig, cfg) }) }