diff --git a/cmd/configschema/go.mod b/cmd/configschema/go.mod index 61b11c8ef301f..500630c888c95 100644 --- a/cmd/configschema/go.mod +++ b/cmd/configschema/go.mod @@ -404,7 +404,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/pquerna/cachecontrol v0.1.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect + github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.34.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect diff --git a/cmd/configschema/go.sum b/cmd/configschema/go.sum index 7addbd4bbe4e2..16f51a8f820c5 100644 --- a/cmd/configschema/go.sum +++ b/cmd/configschema/go.sum @@ -1807,8 +1807,9 @@ github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83A github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff h1:iSQ1cKhnRgOLZhTsXtL+zgT6PGM6WWj9qxJvBktwCB4= +github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff/go.mod h1:KLGtagmR8GET5drwfO/cxzy0C3Om4pyqDr8kpjTJm6s= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= diff --git a/exporter/prometheusexporter/collector.go b/exporter/prometheusexporter/collector.go index 45e9634868318..6c0fb67d30d76 100644 --- a/exporter/prometheusexporter/collector.go +++ b/exporter/prometheusexporter/collector.go @@ -20,6 +20,7 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/model" + "go.opentelemetry.io/collector/model/pdata" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" conventions "go.opentelemetry.io/collector/semconv/v1.6.1" @@ -194,6 +195,7 @@ func (c *collector) convertDoubleHistogram(metric pmetric.Metric, resourceAttrs indicesMap := make(map[float64]int) buckets := make([]float64, 0, len(ip.MBucketCounts())) + for index, bucket := range ip.MExplicitBounds() { if _, added := indicesMap[bucket]; !added { indicesMap[bucket] = index @@ -215,11 +217,36 @@ func (c *collector) convertDoubleHistogram(metric pmetric.Metric, resourceAttrs points[bucket] = cumCount } + arrLen := ip.Exemplars().Len() + exemplars := make([]prometheus.Exemplar, arrLen) + for i := 0; i < arrLen; i++ { + e := ip.Exemplars().At(i) + + labels := make(prometheus.Labels, e.FilteredAttributes().Len()) + e.FilteredAttributes().Range(func(k string, v pdata.Value) bool { + labels[k] = v.AsString() + return true + }) + + exemplars[i] = prometheus.Exemplar{ + Value: e.DoubleVal(), + Labels: labels, + Timestamp: e.Timestamp().AsTime(), + } + } + m, err := prometheus.NewConstHistogram(desc, ip.Count(), ip.Sum(), points, attributes...) if err != nil { return nil, err } + if arrLen > 0 { + m, err = prometheus.NewMetricWithExemplars(m, exemplars...) + if err != nil { + return nil, err + } + } + if c.sendTimestamps { return prometheus.NewMetricWithTimestamp(ip.Timestamp().AsTime(), m), nil } diff --git a/exporter/prometheusexporter/collector_test.go b/exporter/prometheusexporter/collector_test.go index 5870ece0ce638..aba8702de4f43 100644 --- a/exporter/prometheusexporter/collector_test.go +++ b/exporter/prometheusexporter/collector_test.go @@ -21,6 +21,7 @@ import ( "github.com/prometheus/client_golang/prometheus" io_prometheus_client "github.com/prometheus/client_model/go" "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/model/pdata" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/pmetric" conventions "go.opentelemetry.io/collector/semconv/v1.6.1" @@ -96,6 +97,84 @@ func TestConvertInvalidMetric(t *testing.T) { } } +func TestConvertDoubleHistogramExemplar(t *testing.T) { + // initialize empty histogram + metric := pdata.NewMetric() + metric.SetDataType(pmetric.MetricDataTypeHistogram) + metric.SetName("test_metric") + metric.SetDescription("this is test metric") + metric.SetUnit("T") + + // initialize empty datapoint + hd := metric.Histogram().DataPoints().AppendEmpty() + + bounds := []float64{5, 25, 90} + hd.SetExplicitBounds(bounds) + bc := []uint64{2, 35, 70} + hd.SetBucketCounts(bc) + + exemplarTs, _ := time.Parse("unix", "Mon Jan _2 15:04:05 MST 2006") + exemplars := []prometheus.Exemplar{ + { + Timestamp: exemplarTs, + Value: 3, + Labels: prometheus.Labels{"test_label_0": "label_value_0"}, + }, + { + Timestamp: exemplarTs, + Value: 50, + Labels: prometheus.Labels{"test_label_1": "label_value_1"}, + }, + { + Timestamp: exemplarTs, + Value: 78, + Labels: prometheus.Labels{"test_label_2": "label_value_2"}, + }, + } + + // add each exemplar value to the metric + for _, e := range exemplars { + pde := hd.Exemplars().AppendEmpty() + pde.SetDoubleVal(e.Value) + for k, v := range e.Labels { + pde.FilteredAttributes().InsertString(k, v) + } + pde.SetTimestamp(pdata.NewTimestampFromTime(e.Timestamp)) + } + + c := collector{ + accumulator: &mockAccumulator{ + []pdata.Metric{metric}, + pcommon.NewMap(), + }, + logger: zap.NewNop(), + } + + pbMetric, _ := c.convertDoubleHistogram(metric, pcommon.NewMap()) + m := io_prometheus_client.Metric{} + require.NoError(t, pbMetric.Write(&m)) + + buckets := m.GetHistogram().GetBucket() + + require.Equal(t, 3, len(buckets)) + + require.Equal(t, 3.0, buckets[0].GetExemplar().GetValue()) + require.Equal(t, int32(128654848), buckets[0].GetExemplar().GetTimestamp().GetNanos()) + require.Equal(t, 1, len(buckets[0].GetExemplar().GetLabel())) + require.Equal(t, "test_label_0", buckets[0].GetExemplar().GetLabel()[0].GetName()) + require.Equal(t, "label_value_0", buckets[0].GetExemplar().GetLabel()[0].GetValue()) + + require.Equal(t, 0.0, buckets[1].GetExemplar().GetValue()) + require.Equal(t, int32(0), buckets[1].GetExemplar().GetTimestamp().GetNanos()) + require.Equal(t, 0, len(buckets[1].GetExemplar().GetLabel())) + + require.Equal(t, 78.0, buckets[2].GetExemplar().GetValue()) + require.Equal(t, int32(128654848), buckets[2].GetExemplar().GetTimestamp().GetNanos()) + require.Equal(t, 1, len(buckets[2].GetExemplar().GetLabel())) + require.Equal(t, "test_label_2", buckets[2].GetExemplar().GetLabel()[0].GetName()) + require.Equal(t, "label_value_2", buckets[2].GetExemplar().GetLabel()[0].GetValue()) +} + // errorCheckCore keeps track of logged errors type errorCheckCore struct { errorMessages []string diff --git a/exporter/prometheusexporter/config.go b/exporter/prometheusexporter/config.go index 41ab87ad0f4f7..9e6e44d98ccfd 100644 --- a/exporter/prometheusexporter/config.go +++ b/exporter/prometheusexporter/config.go @@ -46,6 +46,9 @@ type Config struct { // ResourceToTelemetrySettings defines configuration for converting resource attributes to metric labels. ResourceToTelemetrySettings resourcetotelemetry.Settings `mapstructure:"resource_to_telemetry_conversion"` + // EnableOpenMetrics enables the use of the OpenMetrics encoding option for the prometheus exporter. + EnableOpenMetrics bool `mapstructure:"enable_open_metrics"` + // skipSanitizeLabel if enabled, labels that start with _ are not sanitized skipSanitizeLabel bool } diff --git a/exporter/prometheusexporter/factory.go b/exporter/prometheusexporter/factory.go index 05af3cdde06f9..fd7f440e02c1e 100644 --- a/exporter/prometheusexporter/factory.go +++ b/exporter/prometheusexporter/factory.go @@ -46,6 +46,7 @@ func createDefaultConfig() config.Exporter { ConstLabels: map[string]string{}, SendTimestamps: false, MetricExpiration: time.Minute * 5, + EnableOpenMetrics: false, skipSanitizeLabel: featuregate.GetRegistry().IsEnabled(dropSanitizationGate.ID), } } diff --git a/exporter/prometheusexporter/go.mod b/exporter/prometheusexporter/go.mod index aa7bf0f666597..ef932a465da2c 100644 --- a/exporter/prometheusexporter/go.mod +++ b/exporter/prometheusexporter/go.mod @@ -6,12 +6,13 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.51.0 github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.51.0 github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver v0.51.0 - github.com/prometheus/client_golang v1.12.1 + github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff github.com/prometheus/client_model v0.2.0 github.com/prometheus/common v0.34.0 github.com/prometheus/prometheus v0.35.1-0.20220503184552-2381d7be5731 github.com/stretchr/testify v1.7.1 go.opentelemetry.io/collector v0.51.0 + go.opentelemetry.io/collector/model v0.50.0 go.opentelemetry.io/collector/pdata v0.51.0 go.opentelemetry.io/collector/semconv v0.51.0 go.uber.org/zap v1.21.0 diff --git a/exporter/prometheusexporter/go.sum b/exporter/prometheusexporter/go.sum index 17d92364b70ca..7d25f4ba92530 100644 --- a/exporter/prometheusexporter/go.sum +++ b/exporter/prometheusexporter/go.sum @@ -1016,8 +1016,9 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff h1:iSQ1cKhnRgOLZhTsXtL+zgT6PGM6WWj9qxJvBktwCB4= +github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff/go.mod h1:KLGtagmR8GET5drwfO/cxzy0C3Om4pyqDr8kpjTJm6s= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1217,6 +1218,8 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/collector v0.51.0 h1:r4cfvLYkmdTWU+RioL2QqxD/GLJUXRNifG0NCfRmxwk= go.opentelemetry.io/collector v0.51.0/go.mod h1:2pHwJxKDhSd4t42GkiCosU9G3szHoWUK2R0qnB6X67A= +go.opentelemetry.io/collector/model v0.50.0 h1:1wt8pQ4O6GaUeYEaR+dh3zHmYsFicduF2bbPGMZeSKk= +go.opentelemetry.io/collector/model v0.50.0/go.mod h1:vKpC0JMtrL7g9tUHmzcQqd8rEbnahKVdTWZSVO7x3Ms= go.opentelemetry.io/collector/pdata v0.51.0 h1:J5CCnrg1iGOA1CfFOH+wAkMlJ1vjcm677kuPp18mbko= go.opentelemetry.io/collector/pdata v0.51.0/go.mod h1:FsowYKNmf8CgsHgOfJv8V3KjALmy6FYQRHtXAOY3fho= go.opentelemetry.io/collector/semconv v0.51.0 h1:Almgp3RZKDZNIp5491LfQ/oF2GG5gPK14IghjUxgkPg= diff --git a/exporter/prometheusexporter/prometheus.go b/exporter/prometheusexporter/prometheus.go index 15887e49d54bb..e0c226b6af0fb 100644 --- a/exporter/prometheusexporter/prometheus.go +++ b/exporter/prometheusexporter/prometheus.go @@ -56,8 +56,9 @@ func newPrometheusExporter(config *Config, set component.ExporterCreateSettings) handler: promhttp.HandlerFor( registry, promhttp.HandlerOpts{ - ErrorHandling: promhttp.ContinueOnError, - ErrorLog: newPromLogger(set.Logger), + ErrorHandling: promhttp.ContinueOnError, + ErrorLog: newPromLogger(set.Logger), + EnableOpenMetrics: config.EnableOpenMetrics, }, ), }, nil diff --git a/go.mod b/go.mod index b3fc74683b408..d5a4338caffe9 100644 --- a/go.mod +++ b/go.mod @@ -404,7 +404,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/pquerna/cachecontrol v0.1.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect + github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.34.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect diff --git a/go.sum b/go.sum index 6ef033b637099..82bdf5aee2298 100644 --- a/go.sum +++ b/go.sum @@ -1806,8 +1806,9 @@ github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83A github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff h1:iSQ1cKhnRgOLZhTsXtL+zgT6PGM6WWj9qxJvBktwCB4= +github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff/go.mod h1:KLGtagmR8GET5drwfO/cxzy0C3Om4pyqDr8kpjTJm6s= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= diff --git a/internal/coreinternal/processor/filterconfig/config.go b/internal/coreinternal/processor/filterconfig/config.go index abdefe5b28a53..53e6c149f087f 100644 --- a/internal/coreinternal/processor/filterconfig/config.go +++ b/internal/coreinternal/processor/filterconfig/config.go @@ -118,8 +118,18 @@ type MatchProperties struct { // A match occurs if the span's implementation library matches at least one item in this list. // This is an optional field. Libraries []InstrumentationLibrary `mapstructure:"libraries"` + + // SpanKinds specify the list of items to match the span kind against. + // A match occurs if the span's span kind matches at least one item in this list. + SpanKinds []string `mapstructure:"span_kinds"` } +var ( + ErrMissingRequiredField = errors.New(`at least one of "attributes", "libraries", or "resources" field must be specified`) + ErrInvalidLogField = errors.New("services, span_names, and span_kinds are not valid for log records") + ErrMissingRequiredLogField = errors.New(`at least one of "log_names", "log_bodies", "log_severity_texts", "attributes", "libraries", "span_kinds", or "resources" field must be specified`) +) + // ValidateForSpans validates properties for spans. func (mp *MatchProperties) ValidateForSpans() error { if len(mp.LogBodies) > 0 { @@ -131,8 +141,8 @@ func (mp *MatchProperties) ValidateForSpans() error { } if len(mp.Services) == 0 && len(mp.SpanNames) == 0 && len(mp.Attributes) == 0 && - len(mp.Libraries) == 0 && len(mp.Resources) == 0 { - return errors.New(`at least one of "services", "span_names", "attributes", "libraries" or "resources" field must be specified`) + len(mp.Libraries) == 0 && len(mp.Resources) == 0 && len(mp.SpanKinds) == 0 { + return ErrMissingRequiredField } return nil @@ -140,12 +150,12 @@ func (mp *MatchProperties) ValidateForSpans() error { // ValidateForLogs validates properties for logs. func (mp *MatchProperties) ValidateForLogs() error { - if len(mp.SpanNames) > 0 || len(mp.Services) > 0 { - return errors.New("neither services nor span_names should be specified for log records") + if len(mp.SpanNames) > 0 || len(mp.Services) > 0 || len(mp.SpanKinds) > 0 { + return ErrInvalidLogField } - if len(mp.Attributes) == 0 && len(mp.Libraries) == 0 && len(mp.Resources) == 0 && len(mp.LogBodies) == 0 && len(mp.LogSeverityTexts) == 0 { - return errors.New(`at least one of "attributes", "libraries", "resources", "log_bodies" or "log_severity_texts" field must be specified`) + if len(mp.Attributes) == 0 && len(mp.Libraries) == 0 && len(mp.Resources) == 0 && len(mp.LogBodies) == 0 && len(mp.LogSeverityTexts) == 0 && len(mp.SpanKinds) == 0 { + return ErrMissingRequiredLogField } return nil diff --git a/internal/coreinternal/processor/filterlog/filterlog_test.go b/internal/coreinternal/processor/filterlog/filterlog_test.go index df2d7eb5f9528..0afe9e3c95652 100644 --- a/internal/coreinternal/processor/filterlog/filterlog_test.go +++ b/internal/coreinternal/processor/filterlog/filterlog_test.go @@ -41,7 +41,7 @@ func TestLogRecord_validateMatchesConfiguration_InvalidConfig(t *testing.T) { { name: "empty_property", property: filterconfig.MatchProperties{}, - errorString: `at least one of "attributes", "libraries", "resources", "log_bodies" or "log_severity_texts" field must be specified`, + errorString: `at least one of "log_names", "log_bodies", "log_severity_texts", "attributes", "libraries", "span_kinds", or "resources" field must be specified`, }, { name: "empty_log_bodies_and_attributes", @@ -49,14 +49,14 @@ func TestLogRecord_validateMatchesConfiguration_InvalidConfig(t *testing.T) { LogBodies: []string{}, LogSeverityTexts: []string{}, }, - errorString: `at least one of "attributes", "libraries", "resources", "log_bodies" or "log_severity_texts" field must be specified`, + errorString: `at least one of "log_names", "log_bodies", "log_severity_texts", "attributes", "libraries", "span_kinds", or "resources" field must be specified`, }, { name: "span_properties", property: filterconfig.MatchProperties{ SpanNames: []string{"span"}, }, - errorString: "neither services nor span_names should be specified for log records", + errorString: "services, span_names, and span_kinds are not valid for log records", }, { name: "invalid_match_type", diff --git a/internal/coreinternal/processor/filterspan/filterspan.go b/internal/coreinternal/processor/filterspan/filterspan.go index 618d8cbddae15..ddde89b4ae1e0 100644 --- a/internal/coreinternal/processor/filterspan/filterspan.go +++ b/internal/coreinternal/processor/filterspan/filterspan.go @@ -43,6 +43,9 @@ type propertiesMatcher struct { // Span names to compare to. nameFilters filterset.FilterSet + + // Span kinds to compare to + kindFilters filterset.FilterSet } // NewMatcher creates a span Matcher that matches based on the given MatchProperties. @@ -76,10 +79,19 @@ func NewMatcher(mp *filterconfig.MatchProperties) (Matcher, error) { } } + var kindFS filterset.FilterSet + if len(mp.SpanKinds) > 0 { + kindFS, err = filterset.CreateFilterSet(mp.SpanKinds, &mp.Config) + if err != nil { + return nil, fmt.Errorf("error creating span kind filters: %v", err) + } + } + return &propertiesMatcher{ PropertiesMatcher: rm, serviceFilters: serviceFS, nameFilters: nameFS, + kindFilters: kindFS, }, nil } @@ -122,6 +134,10 @@ func (mp *propertiesMatcher) MatchSpan(span ptrace.Span, resource pcommon.Resour return false } + if mp.kindFilters != nil && !mp.kindFilters.Matches(span.Kind().String()) { + return false + } + return mp.PropertiesMatcher.Match(span.Attributes(), resource, library) } diff --git a/internal/coreinternal/processor/filterspan/filterspan_test.go b/internal/coreinternal/processor/filterspan/filterspan_test.go index 3aa9de5f6ba4f..946e1474a5cfd 100644 --- a/internal/coreinternal/processor/filterspan/filterspan_test.go +++ b/internal/coreinternal/processor/filterspan/filterspan_test.go @@ -43,14 +43,14 @@ func TestSpan_validateMatchesConfiguration_InvalidConfig(t *testing.T) { { name: "empty_property", property: filterconfig.MatchProperties{}, - errorString: "at least one of \"services\", \"span_names\", \"attributes\", \"libraries\" or \"resources\" field must be specified", + errorString: filterconfig.ErrMissingRequiredField.Error(), }, { name: "empty_service_span_names_and_attributes", property: filterconfig.MatchProperties{ Services: []string{}, }, - errorString: "at least one of \"services\", \"span_names\", \"attributes\", \"libraries\" or \"resources\" field must be specified", + errorString: filterconfig.ErrMissingRequiredField.Error(), }, { name: "log_properties", @@ -113,7 +113,6 @@ func TestSpan_Matching_False(t *testing.T) { Attributes: []filterconfig.Attribute{}, }, }, - { name: "service_name_doesnt_match_strict", properties: &filterconfig.MatchProperties{ @@ -144,6 +143,23 @@ func TestSpan_Matching_False(t *testing.T) { Attributes: []filterconfig.Attribute{}, }, }, + + { + name: "span_kind_doesnt_match_regexp", + properties: &filterconfig.MatchProperties{ + Config: *createConfig(filterset.Regexp), + Attributes: []filterconfig.Attribute{}, + SpanKinds: []string{ptrace.SpanKindProducer.String()}, + }, + }, + { + name: "span_kind_doesnt_match_strict", + properties: &filterconfig.MatchProperties{ + Config: *createConfig(filterset.Strict), + Attributes: []filterconfig.Attribute{}, + SpanKinds: []string{ptrace.SpanKindProducer.String()}, + }, + }, } span := ptrace.NewSpan() @@ -218,6 +234,26 @@ func TestSpan_Matching_True(t *testing.T) { Attributes: []filterconfig.Attribute{}, }, }, + { + name: "span_kind_match_strict", + properties: &filterconfig.MatchProperties{ + Config: *createConfig(filterset.Strict), + SpanKinds: []string{ + ptrace.SpanKindClient.String(), + }, + Attributes: []filterconfig.Attribute{}, + }, + }, + { + name: "span_kind_match_regexp", + properties: &filterconfig.MatchProperties{ + Config: *createConfig(filterset.Regexp), + SpanKinds: []string{ + "CLIENT", + }, + Attributes: []filterconfig.Attribute{}, + }, + }, } span := ptrace.NewSpan() @@ -227,6 +263,7 @@ func TestSpan_Matching_True(t *testing.T) { span.Attributes().InsertDouble("keyDouble", 3245.6) span.Attributes().InsertBool("keyBool", true) span.Attributes().InsertString("keyExists", "present") + span.SetKind(ptrace.SpanKindClient) assert.NotNil(t, span) resource := pcommon.NewResource() diff --git a/processor/probabilisticsamplerprocessor/config.go b/processor/probabilisticsamplerprocessor/config.go index d7dd5dada8c0b..daa6904730d4d 100644 --- a/processor/probabilisticsamplerprocessor/config.go +++ b/processor/probabilisticsamplerprocessor/config.go @@ -16,12 +16,16 @@ package probabilisticsamplerprocessor // import "github.com/open-telemetry/opent import ( "go.opentelemetry.io/collector/config" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/processor/filterconfig" ) // Config has the configuration guiding the trace sampler processor. type Config struct { config.ProcessorSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct + filterconfig.MatchConfig `mapstructure:",squash"` + // SamplingPercentage is the percentage rate at which traces are going to be sampled. Defaults to zero, i.e.: no sample. // Values greater or equal 100 are treated as "sample all traces". SamplingPercentage float32 `mapstructure:"sampling_percentage"` diff --git a/processor/probabilisticsamplerprocessor/go.mod b/processor/probabilisticsamplerprocessor/go.mod index 3fa5791dd63a8..82f0f38736532 100644 --- a/processor/probabilisticsamplerprocessor/go.mod +++ b/processor/probabilisticsamplerprocessor/go.mod @@ -13,6 +13,7 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/knadh/koanf v1.4.1 // indirect @@ -24,6 +25,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rogpeppe/go-internal v1.6.1 // indirect + github.com/spf13/cast v1.4.1 // indirect go.opencensus.io v0.23.0 // indirect go.opentelemetry.io/otel v1.7.0 // indirect go.opentelemetry.io/otel/metric v0.30.0 // indirect diff --git a/processor/probabilisticsamplerprocessor/go.sum b/processor/probabilisticsamplerprocessor/go.sum index 14bfd15150068..a9aa045d524d4 100644 --- a/processor/probabilisticsamplerprocessor/go.sum +++ b/processor/probabilisticsamplerprocessor/go.sum @@ -59,6 +59,7 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -173,6 +174,8 @@ github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA= +github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/processor/probabilisticsamplerprocessor/probabilisticsampler.go b/processor/probabilisticsamplerprocessor/probabilisticsampler.go index f325419f72f7b..81d819553be76 100644 --- a/processor/probabilisticsamplerprocessor/probabilisticsampler.go +++ b/processor/probabilisticsamplerprocessor/probabilisticsampler.go @@ -23,6 +23,8 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/ptrace" "go.opentelemetry.io/collector/processor/processorhelper" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/processor/filterspan" ) // samplingPriority has the semantic result of parsing the "sampling.priority" @@ -52,15 +54,28 @@ const ( type tracesamplerprocessor struct { scaledSamplingRate uint32 hashSeed uint32 + include filterspan.Matcher + exclude filterspan.Matcher } // newTracesProcessor returns a processor.TracesProcessor that will perform head sampling according to the given // configuration. func newTracesProcessor(nextConsumer consumer.Traces, cfg *Config) (component.TracesProcessor, error) { + include, err := filterspan.NewMatcher(cfg.Include) + if err != nil { + return nil, err + } + exclude, err := filterspan.NewMatcher(cfg.Exclude) + if err != nil { + return nil, err + } + tsp := &tracesamplerprocessor{ // Adjust sampling percentage on private so recalculations are avoided. scaledSamplingRate: uint32(cfg.SamplingPercentage * percentageScaleFactor), hashSeed: cfg.HashSeed, + include: include, + exclude: exclude, } return processorhelper.NewTracesProcessor( @@ -74,6 +89,9 @@ func (tsp *tracesamplerprocessor) processTraces(_ context.Context, td ptrace.Tra td.ResourceSpans().RemoveIf(func(rs ptrace.ResourceSpans) bool { rs.ScopeSpans().RemoveIf(func(ils ptrace.ScopeSpans) bool { ils.Spans().RemoveIf(func(s ptrace.Span) bool { + if filterspan.SkipSpan(tsp.include, tsp.exclude, s, rs.Resource(), ils.Scope()) { + return false + } sp := parseSpanSamplingPriority(s) if sp == doNotSampleSpan { // The OpenTelemetry mentions this as a "hint" we take a stronger diff --git a/processor/spanmetricsprocessor/config.go b/processor/spanmetricsprocessor/config.go index 5be4cd7f40095..c7d7b4546f883 100644 --- a/processor/spanmetricsprocessor/config.go +++ b/processor/spanmetricsprocessor/config.go @@ -20,6 +20,8 @@ import ( "go.opentelemetry.io/collector/config" "go.opentelemetry.io/collector/pdata/pmetric" "go.opentelemetry.io/collector/service/featuregate" + + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/processor/filterconfig" ) const ( @@ -37,6 +39,8 @@ type Dimension struct { type Config struct { config.ProcessorSettings `mapstructure:",squash"` // squash ensures fields are correctly decoded in embedded struct + filterconfig.MatchConfig `mapstructure:",squash"` + // MetricsExporter is the name of the metrics exporter to use to ship metrics. MetricsExporter string `mapstructure:"metrics_exporter"` diff --git a/processor/spanmetricsprocessor/go.mod b/processor/spanmetricsprocessor/go.mod index bf28114ce5dcf..3dd5622e6f974 100644 --- a/processor/spanmetricsprocessor/go.mod +++ b/processor/spanmetricsprocessor/go.mod @@ -6,6 +6,7 @@ require ( github.com/hashicorp/golang-lru v0.5.4 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerexporter v0.51.0 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/prometheusexporter v0.51.0 + github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.51.0 github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.51.0 github.com/stretchr/testify v1.7.1 go.opentelemetry.io/collector v0.51.0 @@ -29,6 +30,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/gorilla/mux v1.8.0 // indirect @@ -45,13 +47,12 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mostynb/go-grpc-compression v1.1.16 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.51.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.51.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.51.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pelletier/go-toml v1.9.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.12.1 // indirect + github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common v0.34.0 // indirect github.com/prometheus/procfs v0.7.3 // indirect @@ -66,6 +67,7 @@ require ( github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect go.opencensus.io v0.23.0 // indirect + go.opentelemetry.io/collector/model v0.50.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.32.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 // indirect go.opentelemetry.io/otel v1.7.0 // indirect diff --git a/processor/spanmetricsprocessor/go.sum b/processor/spanmetricsprocessor/go.sum index a1eed9df69642..fd8ed8f1d6129 100644 --- a/processor/spanmetricsprocessor/go.sum +++ b/processor/spanmetricsprocessor/go.sum @@ -141,6 +141,7 @@ github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGw github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -332,8 +333,9 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff h1:iSQ1cKhnRgOLZhTsXtL+zgT6PGM6WWj9qxJvBktwCB4= +github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff/go.mod h1:KLGtagmR8GET5drwfO/cxzy0C3Om4pyqDr8kpjTJm6s= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -404,6 +406,8 @@ go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/collector v0.51.0 h1:r4cfvLYkmdTWU+RioL2QqxD/GLJUXRNifG0NCfRmxwk= go.opentelemetry.io/collector v0.51.0/go.mod h1:2pHwJxKDhSd4t42GkiCosU9G3szHoWUK2R0qnB6X67A= +go.opentelemetry.io/collector/model v0.50.0 h1:1wt8pQ4O6GaUeYEaR+dh3zHmYsFicduF2bbPGMZeSKk= +go.opentelemetry.io/collector/model v0.50.0/go.mod h1:vKpC0JMtrL7g9tUHmzcQqd8rEbnahKVdTWZSVO7x3Ms= go.opentelemetry.io/collector/pdata v0.51.0 h1:J5CCnrg1iGOA1CfFOH+wAkMlJ1vjcm677kuPp18mbko= go.opentelemetry.io/collector/pdata v0.51.0/go.mod h1:FsowYKNmf8CgsHgOfJv8V3KjALmy6FYQRHtXAOY3fho= go.opentelemetry.io/collector/semconv v0.51.0 h1:Almgp3RZKDZNIp5491LfQ/oF2GG5gPK14IghjUxgkPg= diff --git a/processor/spanmetricsprocessor/processor.go b/processor/spanmetricsprocessor/processor.go index 9286d0b8a0e4a..1644ebd063719 100644 --- a/processor/spanmetricsprocessor/processor.go +++ b/processor/spanmetricsprocessor/processor.go @@ -33,6 +33,7 @@ import ( conventions "go.opentelemetry.io/collector/semconv/v1.6.1" "go.uber.org/zap" + "github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal/processor/filterspan" "github.com/open-telemetry/opentelemetry-collector-contrib/processor/spanmetricsprocessor/internal/cache" ) @@ -90,12 +91,24 @@ type processorImp struct { // An LRU cache of dimension key-value maps keyed by a unique identifier formed by a concatenation of its values: // e.g. { "foo/barOK": { "serviceName": "foo", "operation": "/bar", "status_code": "OK" }} metricKeyToDimensions *cache.Cache + + include filterspan.Matcher + exclude filterspan.Matcher } func newProcessor(logger *zap.Logger, config config.Processor, nextConsumer consumer.Traces) (*processorImp, error) { logger.Info("Building spanmetricsprocessor") pConfig := config.(*Config) + include, err := filterspan.NewMatcher(pConfig.Include) + if err != nil { + return nil, err + } + exclude, err := filterspan.NewMatcher(pConfig.Exclude) + if err != nil { + return nil, err + } + bounds := defaultLatencyHistogramBucketsMs if pConfig.LatencyHistogramBuckets != nil { bounds = mapDurationsToMillis(pConfig.LatencyHistogramBuckets) @@ -106,7 +119,8 @@ func newProcessor(logger *zap.Logger, config config.Processor, nextConsumer cons } } - if err := validateDimensions(pConfig.Dimensions, pConfig.skipSanitizeLabel); err != nil { + err = validateDimensions(pConfig.Dimensions, pConfig.skipSanitizeLabel) + if err != nil { return nil, err } @@ -134,6 +148,8 @@ func newProcessor(logger *zap.Logger, config config.Processor, nextConsumer cons nextConsumer: nextConsumer, dimensions: pConfig.Dimensions, metricKeyToDimensions: metricKeyToDimensionsCache, + include: include, + exclude: exclude, }, nil } @@ -375,6 +391,9 @@ func (p *processorImp) aggregateMetricsForServiceSpans(rspans ptrace.ResourceSpa spans := ils.Spans() for k := 0; k < spans.Len(); k++ { span := spans.At(k) + if filterspan.SkipSpan(p.include, p.exclude, span, rspans.Resource(), ils.Scope()) { + continue + } p.aggregateMetricsForSpan(serviceName, span, rspans.Resource().Attributes()) } } diff --git a/testbed/go.mod b/testbed/go.mod index d992ff1da8777..6861452cbad9a 100644 --- a/testbed/go.mod +++ b/testbed/go.mod @@ -155,7 +155,7 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect - github.com/prometheus/client_golang v1.12.1 // indirect + github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff // indirect github.com/prometheus/client_model v0.2.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect github.com/prometheus/procfs v0.7.3 // indirect @@ -183,6 +183,7 @@ require ( github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect go.opencensus.io v0.23.0 // indirect + go.opentelemetry.io/collector/model v0.50.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.32.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 // indirect go.opentelemetry.io/contrib/zpages v0.32.0 // indirect diff --git a/testbed/go.sum b/testbed/go.sum index 278d178f81d1c..270b70abec96d 100644 --- a/testbed/go.sum +++ b/testbed/go.sum @@ -1287,8 +1287,9 @@ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff h1:iSQ1cKhnRgOLZhTsXtL+zgT6PGM6WWj9qxJvBktwCB4= +github.com/prometheus/client_golang v1.12.2-0.20220318110013-3bc8f2c651ff/go.mod h1:KLGtagmR8GET5drwfO/cxzy0C3Om4pyqDr8kpjTJm6s= github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -1579,6 +1580,8 @@ go.opentelemetry.io/collector v0.51.0/go.mod h1:2pHwJxKDhSd4t42GkiCosU9G3szHoWUK go.opentelemetry.io/collector/model v0.44.0/go.mod h1:4jo1R8uBDspLCxUGhQ0k3v/EFXFbW7s0AIy3LuGLbcU= go.opentelemetry.io/collector/model v0.45.0/go.mod h1:uyiyyq8lV45zrJ94MnLip26sorfNLP6J9XmOvaEmy7w= go.opentelemetry.io/collector/model v0.48.0/go.mod h1:1QVYv8TqsTMt9wVC5BUF9fqMVtk2C5EclWDnuVqdKoU= +go.opentelemetry.io/collector/model v0.50.0 h1:1wt8pQ4O6GaUeYEaR+dh3zHmYsFicduF2bbPGMZeSKk= +go.opentelemetry.io/collector/model v0.50.0/go.mod h1:vKpC0JMtrL7g9tUHmzcQqd8rEbnahKVdTWZSVO7x3Ms= go.opentelemetry.io/collector/pdata v0.51.0 h1:J5CCnrg1iGOA1CfFOH+wAkMlJ1vjcm677kuPp18mbko= go.opentelemetry.io/collector/pdata v0.51.0/go.mod h1:FsowYKNmf8CgsHgOfJv8V3KjALmy6FYQRHtXAOY3fho= go.opentelemetry.io/collector/semconv v0.51.0 h1:Almgp3RZKDZNIp5491LfQ/oF2GG5gPK14IghjUxgkPg=