diff --git a/exporter/awsemfexporter/config_test.go b/exporter/awsemfexporter/config_test.go index ddd1a24e956e..f491ea759f8f 100644 --- a/exporter/awsemfexporter/config_test.go +++ b/exporter/awsemfexporter/config_test.go @@ -328,7 +328,7 @@ func TestIsEnhancedContainerInsights(t *testing.T) { assert.False(t, cfg.IsEnhancedContainerInsights()) } -func TestIsAppSignalsEnabled(t *testing.T) { +func TestIsApplicationSignalsEnabled(t *testing.T) { tests := []struct { name string metricNameSpace string @@ -336,27 +336,27 @@ func TestIsAppSignalsEnabled(t *testing.T) { expectedResult bool }{ { - "validAppSignalsEMF", - "AppSignals", - "/aws/appsignals/eks", + "validApplicationSignalsEMF", + "ApplicationSignals", + "/aws/application-signals/data", true, }, { - "invalidAppSignalsLogsGroup", - "AppSignals", - "/nonaws/appsignals/eks", + "invalidApplicationSignalsLogsGroup", + "ApplicationSignals", + "/nonaws/application-signals/eks", false, }, { - "invalidAppSignalsMetricNamespace", - "NonAppSignals", - "/aws/appsignals/eks", + "invalidApplicationSignalsMetricNamespace", + "NonApplicationSignals", + "/aws/application-signals/data", false, }, { - "invalidAppSignalsEMF", - "NonAppSignals", - "/nonaws/appsignals/eks", + "invalidApplicationSignalsEMF", + "NonApplicationSignals", + "/nonaws/application-signals/eks", false, }, { diff --git a/exporter/awsemfexporter/datapoint.go b/exporter/awsemfexporter/datapoint.go index bfdce3ce20bc..8c04f8c44dc0 100644 --- a/exporter/awsemfexporter/datapoint.go +++ b/exporter/awsemfexporter/datapoint.go @@ -106,9 +106,9 @@ type summaryMetricEntry struct { } // CalculateDeltaDatapoints retrieves the NumberDataPoint at the given index and performs rate/delta calculation if necessary. -func (dps numberDataPointSlice) CalculateDeltaDatapoints(i int, instrumentationScopeName string, _ bool, calculators *emfCalculators) ([]dataPoint, bool) { +func (dps numberDataPointSlice) CalculateDeltaDatapoints(i int, _ string, _ bool, calculators *emfCalculators) ([]dataPoint, bool) { metric := dps.NumberDataPointSlice.At(i) - labels := createLabels(metric.Attributes(), instrumentationScopeName) + labels := createLabels(metric.Attributes()) timestampMs := unixNanoToMilliseconds(metric.Timestamp()) var metricVal float64 @@ -157,9 +157,9 @@ func (dps numberDataPointSlice) IsStaleNaNInf(i int) (bool, pcommon.Map) { } // CalculateDeltaDatapoints retrieves the HistogramDataPoint at the given index. -func (dps histogramDataPointSlice) CalculateDeltaDatapoints(i int, instrumentationScopeName string, _ bool, calculators *emfCalculators) ([]dataPoint, bool) { +func (dps histogramDataPointSlice) CalculateDeltaDatapoints(i int, _ string, _ bool, calculators *emfCalculators) ([]dataPoint, bool) { metric := dps.HistogramDataPointSlice.At(i) - labels := createLabels(metric.Attributes(), instrumentationScopeName) + labels := createLabels(metric.Attributes()) timestamp := unixNanoToMilliseconds(metric.Timestamp()) sum := metric.Sum() @@ -213,7 +213,7 @@ func (dps histogramDataPointSlice) IsStaleNaNInf(i int) (bool, pcommon.Map) { } // CalculateDeltaDatapoints retrieves the ExponentialHistogramDataPoint at the given index. -func (dps exponentialHistogramDataPointSlice) CalculateDeltaDatapoints(idx int, instrumentationScopeName string, _ bool, _ *emfCalculators) ([]dataPoint, bool) { +func (dps exponentialHistogramDataPointSlice) CalculateDeltaDatapoints(idx int, _ string, _ bool, _ *emfCalculators) ([]dataPoint, bool) { metric := dps.ExponentialHistogramDataPointSlice.At(idx) scale := metric.Scale() @@ -289,7 +289,7 @@ func (dps exponentialHistogramDataPointSlice) CalculateDeltaDatapoints(idx int, Max: metric.Max(), Min: metric.Min(), }, - labels: createLabels(metric.Attributes(), instrumentationScopeName), + labels: createLabels(metric.Attributes()), timestampMs: unixNanoToMilliseconds(metric.Timestamp()), }}, true } @@ -312,9 +312,9 @@ func (dps exponentialHistogramDataPointSlice) IsStaleNaNInf(i int) (bool, pcommo } // CalculateDeltaDatapoints retrieves the SummaryDataPoint at the given index and perform calculation with sum and count while retain the quantile value. -func (dps summaryDataPointSlice) CalculateDeltaDatapoints(i int, instrumentationScopeName string, detailedMetrics bool, calculators *emfCalculators) ([]dataPoint, bool) { +func (dps summaryDataPointSlice) CalculateDeltaDatapoints(i int, _ string, detailedMetrics bool, calculators *emfCalculators) ([]dataPoint, bool) { metric := dps.SummaryDataPointSlice.At(i) - labels := createLabels(metric.Attributes(), instrumentationScopeName) + labels := createLabels(metric.Attributes()) timestampMs := unixNanoToMilliseconds(metric.Timestamp()) sum := metric.Sum() @@ -391,18 +391,13 @@ func (dps summaryDataPointSlice) IsStaleNaNInf(i int) (bool, pcommon.Map) { // createLabels converts OTel AttributesMap attributes to a map // and optionally adds in the OTel instrumentation library name -func createLabels(attributes pcommon.Map, instrLibName string) map[string]string { +func createLabels(attributes pcommon.Map) map[string]string { labels := make(map[string]string, attributes.Len()+1) attributes.Range(func(k string, v pcommon.Value) bool { labels[k] = v.AsString() return true }) - // Add OTel instrumentation lib name as an additional label if it is defined - if instrLibName != "" { - labels[oTellibDimensionKey] = instrLibName - } - return labels } diff --git a/exporter/awsemfexporter/datapoint_test.go b/exporter/awsemfexporter/datapoint_test.go index 00141e455a6b..f00f7d84dd89 100644 --- a/exporter/awsemfexporter/datapoint_test.go +++ b/exporter/awsemfexporter/datapoint_test.go @@ -442,7 +442,7 @@ func TestCalculateDeltaDatapoints_NumberDataPointSlice(t *testing.T) { expectedDatapoint: dataPoint{ name: "double", value: 0.4, - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, expectedRetained: retainInitialValueOfDeltaMetric, }, @@ -454,7 +454,7 @@ func TestCalculateDeltaDatapoints_NumberDataPointSlice(t *testing.T) { expectedDatapoint: dataPoint{ name: "double", value: 0.4, - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, expectedRetained: true, }, @@ -466,7 +466,7 @@ func TestCalculateDeltaDatapoints_NumberDataPointSlice(t *testing.T) { expectedDatapoint: dataPoint{ name: "double", value: 0.5, - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, expectedRetained: true, }, @@ -479,7 +479,7 @@ func TestCalculateDeltaDatapoints_NumberDataPointSlice(t *testing.T) { expectedDatapoint: dataPoint{ name: "int", value: float64(-17), - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, expectedRetained: retainInitialValueOfDeltaMetric, }, @@ -491,7 +491,7 @@ func TestCalculateDeltaDatapoints_NumberDataPointSlice(t *testing.T) { expectedDatapoint: dataPoint{ name: "int", value: float64(18), - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, expectedRetained: true, }, @@ -503,7 +503,7 @@ func TestCalculateDeltaDatapoints_NumberDataPointSlice(t *testing.T) { expectedDatapoint: dataPoint{ name: "int", value: float64(10), - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, expectedRetained: true, }, @@ -567,7 +567,7 @@ func TestCalculateDeltaDatapoints_HistogramDataPointSlice(t *testing.T) { expectedDatapoint: dataPoint{ name: "foo", value: &cWMetricStats{Sum: 17.13, Count: 17, Min: 10, Max: 30}, - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, }, { @@ -584,7 +584,7 @@ func TestCalculateDeltaDatapoints_HistogramDataPointSlice(t *testing.T) { expectedDatapoint: dataPoint{ name: "foo", value: &cWMetricStats{Sum: 17.13, Count: 17, Min: 0, Max: 0}, - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, }, { @@ -602,7 +602,7 @@ func TestCalculateDeltaDatapoints_HistogramDataPointSlice(t *testing.T) { expectedDatapoint: dataPoint{ name: "foo", value: &cWMetricStats{Sum: 17.13, Count: 17, Min: 0, Max: 0}, - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, }, } @@ -820,7 +820,7 @@ func TestCalculateDeltaDatapoints_HistogramDataPointSlice_Delta(t *testing.T) { assert.Equal(t, dataPoint{ name: "foo", value: &cWMetricStats{Sum: 0, Count: 0, Min: 10, Max: 30}, - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, dps[0]) histogramDatapointSlice.HistogramDataPointSlice.At(0).SetCount(uint64(27)) @@ -834,7 +834,7 @@ func TestCalculateDeltaDatapoints_HistogramDataPointSlice_Delta(t *testing.T) { assert.Equal(t, dataPoint{ name: "foo", value: &cWMetricStats{Sum: 10.14, Count: 10, Min: 5, Max: 40}, - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, dps[0]) } @@ -861,7 +861,7 @@ func TestCalculateDeltaDatapoints_ExponentialHistogramDataPointSlice(t *testing. expectedDatapoint: dataPoint{ name: "foo", value: &cWMetricHistogram{Values: []float64{}, Counts: []float64{}, Sum: 17.13, Count: 17, Min: 10, Max: 30}, - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, }, { @@ -878,7 +878,7 @@ func TestCalculateDeltaDatapoints_ExponentialHistogramDataPointSlice(t *testing. expectedDatapoint: dataPoint{ name: "foo", value: &cWMetricHistogram{Values: []float64{}, Counts: []float64{}, Sum: 17.13, Count: 17, Min: 0, Max: 0}, - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, }, { @@ -895,7 +895,7 @@ func TestCalculateDeltaDatapoints_ExponentialHistogramDataPointSlice(t *testing. expectedDatapoint: dataPoint{ name: "foo", value: &cWMetricHistogram{Values: []float64{1.5, 3, 6, 0, -1.5, -3, -6}, Counts: []float64{1, 2, 3, 4, 1, 2, 3}}, - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1"}, + labels: map[string]string{"label1": "value1"}, }, }, { @@ -916,7 +916,7 @@ func TestCalculateDeltaDatapoints_ExponentialHistogramDataPointSlice(t *testing. expectedDatapoint: dataPoint{ name: "foo", value: &cWMetricHistogram{Values: []float64{0.625, 2.5, 10, 0, -0.625, -2.5, -10}, Counts: []float64{1, 2, 3, 4, 1, 2, 3}}, - labels: map[string]string{oTellibDimensionKey: instrLibName, "label1": "value1", "label2": "value2"}, + labels: map[string]string{"label1": "value1", "label2": "value2"}, }, }, } @@ -1425,12 +1425,7 @@ func TestCreateLabels(t *testing.T) { "c": "C", })) - labels := createLabels(labelsMap, "") - assert.Equal(t, expectedLabels, labels) - - // With isntrumentation library name - labels = createLabels(labelsMap, "cloudwatch-otel") - expectedLabels[oTellibDimensionKey] = "cloudwatch-otel" + labels := createLabels(labelsMap) assert.Equal(t, expectedLabels, labels) } diff --git a/exporter/awsemfexporter/emf_exporter.go b/exporter/awsemfexporter/emf_exporter.go index d2a446481b53..c8c320b9f125 100644 --- a/exporter/awsemfexporter/emf_exporter.go +++ b/exporter/awsemfexporter/emf_exporter.go @@ -31,8 +31,8 @@ const ( outputDestinationStdout = "stdout" // AppSignals EMF config - appSignalsMetricNamespace = "AppSignals" - appSignalsLogGroupNamePrefix = "/aws/appsignals/" + appSignalsMetricNamespace = "ApplicationSignals" + appSignalsLogGroupNamePrefix = "/aws/application-signals/" ) type emfExporter struct { diff --git a/exporter/awsemfexporter/grouped_metric_test.go b/exporter/awsemfexporter/grouped_metric_test.go index 47bee6e50fea..ac8d1f02b5a0 100644 --- a/exporter/awsemfexporter/grouped_metric_test.go +++ b/exporter/awsemfexporter/grouped_metric_test.go @@ -39,7 +39,7 @@ func TestAddToGroupedMetric(t *testing.T) { name: "Double gauge", metric: generateTestGaugeMetric("foo", doubleValueType), expectedMetricType: pmetric.MetricTypeGauge, - expectedLabels: map[string]string{oTellibDimensionKey: instrumentationLibName, "label1": "value1"}, + expectedLabels: map[string]string{"label1": "value1"}, expectedMetricInfo: map[string]*metricInfo{ "foo": { value: 0.1, @@ -51,7 +51,7 @@ func TestAddToGroupedMetric(t *testing.T) { name: "Int sum", metric: generateTestSumMetric("foo", intValueType), expectedMetricType: pmetric.MetricTypeSum, - expectedLabels: map[string]string{oTellibDimensionKey: instrumentationLibName, "label1": "value1"}, + expectedLabels: map[string]string{"label1": "value1"}, expectedMetricInfo: map[string]*metricInfo{ "foo": { value: float64(1), @@ -63,7 +63,7 @@ func TestAddToGroupedMetric(t *testing.T) { name: "Histogram", metric: generateTestHistogramMetric("foo"), expectedMetricType: pmetric.MetricTypeHistogram, - expectedLabels: map[string]string{oTellibDimensionKey: instrumentationLibName, "label1": "value1"}, + expectedLabels: map[string]string{"label1": "value1"}, expectedMetricInfo: map[string]*metricInfo{ "foo": { value: &cWMetricStats{ @@ -78,7 +78,7 @@ func TestAddToGroupedMetric(t *testing.T) { name: "Summary", metric: generateTestSummaryMetric("foo"), expectedMetricType: pmetric.MetricTypeSummary, - expectedLabels: map[string]string{oTellibDimensionKey: instrumentationLibName, "label1": "value1"}, + expectedLabels: map[string]string{"label1": "value1"}, expectedMetricInfo: map[string]*metricInfo{ "foo": { value: &cWMetricStats{ @@ -120,7 +120,7 @@ func TestAddToGroupedMetric(t *testing.T) { for _, v := range groupedMetrics { assert.Equal(t, len(tc.expectedMetricInfo), len(v.metrics)) assert.Equal(t, tc.expectedMetricInfo, v.metrics) - assert.Equal(t, 2, len(v.labels)) + assert.Equal(t, 1, len(v.labels)) assert.Equal(t, generateTestMetricMetadata(namespace, timestamp, logGroup, logStreamName, instrumentationLibName, tc.expectedMetricType), v.metadata) assert.Equal(t, tc.expectedLabels, v.labels) } @@ -182,8 +182,7 @@ func TestAddToGroupedMetric(t *testing.T) { assert.Fail(t, fmt.Sprintf("Unhandled metric %s not expected", metricName)) } expectedLabels := map[string]string{ - oTellibDimensionKey: "cloudwatch-otel", - "label1": "value1", + "label1": "value1", } assert.Equal(t, expectedLabels, group.labels) } @@ -254,8 +253,7 @@ func TestAddToGroupedMetric(t *testing.T) { assert.Fail(t, fmt.Sprintf("Unhandled metric %s not expected", metricName)) } expectedLabels := map[string]string{ - oTellibDimensionKey: "cloudwatch-otel", - "label1": "value1", + "label1": "value1", } assert.Equal(t, expectedLabels, group.labels) } @@ -303,8 +301,7 @@ func TestAddToGroupedMetric(t *testing.T) { } assert.Equal(t, expectedMetrics, group.metrics) expectedLabels := map[string]string{ - oTellibDimensionKey: "cloudwatch-otel", - "label1": "value1", + "label1": "value1", } assert.Equal(t, expectedLabels, group.labels) @@ -351,8 +348,7 @@ func TestAddToGroupedMetric(t *testing.T) { assert.Equal(t, 1, len(groupedMetrics)) labels := map[string]string{ - oTellibDimensionKey: instrumentationLibName, - "label1": "value1", + "label1": "value1", } // Test output warning logs expectedLogs := []observer.LoggedEntry{ diff --git a/exporter/awsemfexporter/metric_translator_test.go b/exporter/awsemfexporter/metric_translator_test.go index 3c893c07e0ba..076bbf48ad72 100644 --- a/exporter/awsemfexporter/metric_translator_test.go +++ b/exporter/awsemfexporter/metric_translator_test.go @@ -268,7 +268,6 @@ func TestTranslateOtToGroupedMetric(t *testing.T) { translator := newMetricTranslator(*config) defer require.NoError(t, translator.Shutdown()) - noInstrLibMetric := createTestResourceMetrics() instrLibMetric := createTestResourceMetrics() ilm := instrLibMetric.ScopeMetrics().At(0) ilm.Scope().SetName("cloudwatch-lib") @@ -326,21 +325,6 @@ func TestTranslateOtToGroupedMetric(t *testing.T) { { "w/ instrumentation library and namespace", instrLibMetric, - map[string]string{ - (oTellibDimensionKey): "cloudwatch-lib", - "isItAnError": "false", - "spanName": "testSpan", - }, - map[string]string{ - (oTellibDimensionKey): "cloudwatch-lib", - "spanName": "testSpan", - }, - "myServiceNS/myServiceName", - "prometheus", - }, - { - "w/o instrumentation library, w/ namespace", - noInstrLibMetric, map[string]string{ "isItAnError": "false", "spanName": "testSpan", @@ -349,7 +333,7 @@ func TestTranslateOtToGroupedMetric(t *testing.T) { "spanName": "testSpan", }, "myServiceNS/myServiceName", - prometheusReceiver, + "prometheus", }, { "w/o instrumentation library and namespace", @@ -372,8 +356,7 @@ func TestTranslateOtToGroupedMetric(t *testing.T) { "spanName": "testSpan", }, map[string]string{ - oTellibDimensionKey: "cloudwatch-lib", - "spanName": "testSpan", + "spanName": "testSpan", }, "myServiceNS/containerInsightsKubeAPIServerScraper", containerInsightsReceiver, @@ -386,8 +369,7 @@ func TestTranslateOtToGroupedMetric(t *testing.T) { "spanName": "testSpan", }, map[string]string{ - oTellibDimensionKey: "cloudwatch-lib", - "spanName": "testSpan", + "spanName": "testSpan", }, "myServiceNS/containerInsightsDCGMExporterScraper", containerInsightsReceiver, @@ -400,8 +382,7 @@ func TestTranslateOtToGroupedMetric(t *testing.T) { "spanName": "testSpan", }, map[string]string{ - oTellibDimensionKey: "cloudwatch-lib", - "spanName": "testSpan", + "spanName": "testSpan", }, "myServiceNS/containerInsightsNeuronMonitorScraper", containerInsightsReceiver, diff --git a/exporter/awsxrayexporter/internal/translator/segment.go b/exporter/awsxrayexporter/internal/translator/segment.go index ff8efb3090f5..a99d038818c0 100644 --- a/exporter/awsxrayexporter/internal/translator/segment.go +++ b/exporter/awsxrayexporter/internal/translator/segment.go @@ -765,8 +765,12 @@ func fixAnnotationKey(key string) string { } func trimAwsSdkPrefix(name string, span ptrace.Span) string { - if isAwsSdkSpan(span) && strings.HasPrefix(name, "AWS.SDK.") { - return strings.TrimPrefix(name, "AWS.SDK.") + if isAwsSdkSpan(span) { + if strings.HasPrefix(name, "AWS.SDK.") { + return strings.TrimPrefix(name, "AWS.SDK.") + } else if strings.HasPrefix(name, "AWS::") { + return strings.TrimPrefix(name, "AWS::") + } } return name } diff --git a/exporter/awsxrayexporter/internal/translator/segment_test.go b/exporter/awsxrayexporter/internal/translator/segment_test.go index f0082f891ccb..883d6f590b40 100644 --- a/exporter/awsxrayexporter/internal/translator/segment_test.go +++ b/exporter/awsxrayexporter/internal/translator/segment_test.go @@ -1061,7 +1061,7 @@ func TestClientSpanWithAwsRemoteServiceName(t *testing.T) { assert.False(t, strings.Contains(jsonStr, "user")) } -func TestAwsSdkSpanWithAwsRemoteServiceName(t *testing.T) { +func TestAwsSdkSpanWithDeprecatedAwsRemoteServiceName(t *testing.T) { spanName := "DynamoDB.PutItem" parentSpanID := newSegmentID() user := "testingT" @@ -1089,6 +1089,34 @@ func TestAwsSdkSpanWithAwsRemoteServiceName(t *testing.T) { assert.False(t, strings.Contains(jsonStr, "user")) } +func TestAwsSdkSpanWithAwsRemoteServiceName(t *testing.T) { + spanName := "DynamoDB.PutItem" + parentSpanID := newSegmentID() + user := "testingT" + attributes := make(map[string]any) + attributes[conventions.AttributeRPCSystem] = "aws-api" + attributes[conventions.AttributeHTTPMethod] = "POST" + attributes[conventions.AttributeHTTPScheme] = "https" + attributes[conventions.AttributeRPCService] = "DynamoDb" + attributes[awsRemoteService] = "AWS::DynamoDB" + + resource := constructDefaultResource() + span := constructClientSpan(parentSpanID, spanName, 0, "OK", attributes) + + segment, _ := MakeSegment(span, resource, nil, false, nil, false) + assert.Equal(t, "DynamoDB", *segment.Name) + assert.Equal(t, "subsegment", *segment.Type) + + jsonStr, err := MakeSegmentDocumentString(span, resource, nil, false, nil, false) + + assert.NotNil(t, jsonStr) + assert.Nil(t, err) + assert.True(t, strings.Contains(jsonStr, "DynamoDb")) + assert.False(t, strings.Contains(jsonStr, "DynamoDb.PutItem")) + assert.False(t, strings.Contains(jsonStr, user)) + assert.False(t, strings.Contains(jsonStr, "user")) +} + func TestProducerSpanWithAwsRemoteServiceName(t *testing.T) { spanName := "ABC.payment" parentSpanID := newSegmentID() diff --git a/internal/aws/cwlogs/cwlog_client_test.go b/internal/aws/cwlogs/cwlog_client_test.go index e5173b15df27..1f8c3183787c 100644 --- a/internal/aws/cwlogs/cwlog_client_test.go +++ b/internal/aws/cwlogs/cwlog_client_test.go @@ -614,7 +614,7 @@ func TestUserAgent(t *testing.T) { { "validAppSignalsEMFEnabled", component.BuildInfo{Command: "opentelemetry-collector-contrib", Version: "1.0"}, - "/aws/appsignals", + "/aws/application-signals", WithEnabledAppSignals(true), "opentelemetry-collector-contrib/1.0 (AppSignals)", },