diff --git a/.chloggen/awsemf_stdoutpanic.yaml b/.chloggen/awsemf_stdoutpanic.yaml new file mode 100755 index 000000000000..be8584209acc --- /dev/null +++ b/.chloggen/awsemf_stdoutpanic.yaml @@ -0,0 +1,27 @@ +# Use this changelog template to create an entry for release notes. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: bug_fix + +# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver) +component: awsemfexporter + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Fix possible panic in when configuration option `awsemf.output_destination:stdout` is set + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [26250] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: + +# If your change doesn't affect end users or the exported elements of any package, +# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. +# Optional: The change log or logs in which this entry should be included. +# e.g. '[user]' or '[user, api]' +# Include 'user' if the change is relevant to end users. +# Include 'api' if there is a change to a library API. +# Default: '[user]' +change_logs: [] diff --git a/exporter/awsemfexporter/emf_exporter.go b/exporter/awsemfexporter/emf_exporter.go index 97de506a86f8..7609e56dff2b 100644 --- a/exporter/awsemfexporter/emf_exporter.go +++ b/exporter/awsemfexporter/emf_exporter.go @@ -106,10 +106,17 @@ func (emf *emfExporter) pushMetricsData(_ context.Context, md pmetric.Metrics) e for _, groupedMetric := range groupedMetrics { cWMetric := translateGroupedMetricToCWMetric(groupedMetric, emf.config) - putLogEvent := translateCWMetricToEMF(cWMetric, emf.config) + putLogEvent, err := translateCWMetricToEMF(cWMetric, emf.config) + if err != nil { + return err + } // Currently we only support two options for "OutputDestination". if strings.EqualFold(outputDestination, outputDestinationStdout) { - fmt.Println(*putLogEvent.InputLogEvent.Message) + if putLogEvent != nil && + putLogEvent.InputLogEvent != nil && + putLogEvent.InputLogEvent.Message != nil { + fmt.Println(*putLogEvent.InputLogEvent.Message) + } } else if strings.EqualFold(outputDestination, outputDestinationCloudWatch) { logGroup := groupedMetric.metadata.logGroup logStream := groupedMetric.metadata.logStream diff --git a/exporter/awsemfexporter/metric_translator.go b/exporter/awsemfexporter/metric_translator.go index 2c3b817be354..3b97f4627f6c 100644 --- a/exporter/awsemfexporter/metric_translator.go +++ b/exporter/awsemfexporter/metric_translator.go @@ -352,7 +352,7 @@ func groupedMetricToCWMeasurementsWithFilters(groupedMetric *groupedMetric, conf } // translateCWMetricToEMF converts CloudWatch Metric format to EMF. -func translateCWMetricToEMF(cWMetric *cWMetrics, config *Config) *cwlogs.Event { +func translateCWMetricToEMF(cWMetric *cWMetrics, config *Config) (*cwlogs.Event, error) { // convert CWMetric into map format for compatible with PLE input fieldMap := cWMetric.fields @@ -433,7 +433,7 @@ func translateCWMetricToEMF(cWMetric *cWMetrics, config *Config) *cwlogs.Event { pleMsg, err := json.Marshal(fieldMap) if err != nil { - return nil + return nil, err } metricCreationTime := cWMetric.timestampMs @@ -443,5 +443,5 @@ func translateCWMetricToEMF(cWMetric *cWMetrics, config *Config) *cwlogs.Event { ) logEvent.GeneratedTime = time.Unix(0, metricCreationTime*int64(time.Millisecond)) - return logEvent + return logEvent, nil } diff --git a/exporter/awsemfexporter/metric_translator_test.go b/exporter/awsemfexporter/metric_translator_test.go index 71ab36964ad1..16fa3f7e1961 100644 --- a/exporter/awsemfexporter/metric_translator_test.go +++ b/exporter/awsemfexporter/metric_translator_test.go @@ -453,7 +453,8 @@ func TestTranslateCWMetricToEMF(t *testing.T) { measurements: tc.measurements, } - emfLogEvent := translateCWMetricToEMF(cloudwatchMetric, config) + emfLogEvent, err := translateCWMetricToEMF(cloudwatchMetric, config) + require.NoError(t, err) assert.Equal(t, tc.expectedEMFLogEvent, *emfLogEvent.InputLogEvent.Message) }) @@ -2174,7 +2175,8 @@ func BenchmarkTranslateCWMetricToEMF(b *testing.B) { b.ResetTimer() for n := 0; n < b.N; n++ { - translateCWMetricToEMF(met, &Config{}) + _, err := translateCWMetricToEMF(met, &Config{}) + require.NoError(b, err) } }