From d0ccb60ce955f674208db5e29b03c9f80fd03eed Mon Sep 17 00:00:00 2001 From: Eric Yap Date: Mon, 27 Jan 2025 16:05:20 +0800 Subject: [PATCH] fix: Truncate string slice attributes --- input/otlp/metadata.go | 2 +- input/otlp/metadata_test.go | 117 ++++++++++++++++++++++-------------- 2 files changed, 72 insertions(+), 47 deletions(-) diff --git a/input/otlp/metadata.go b/input/otlp/metadata.go index 2a1e854c..279356d4 100644 --- a/input/otlp/metadata.go +++ b/input/otlp/metadata.go @@ -516,7 +516,7 @@ func setLabel(key string, event *modelpb.APMEvent, v pcommon.Value) { for i := 0; i < s.Len(); i++ { r := s.At(i) if r.Type() == pcommon.ValueTypeStr { - result = append(result, r.Str()) + result = append(result, truncate(r.Str())) } } modelpb.Labels(event.Labels).SetSlice(key, result) diff --git a/input/otlp/metadata_test.go b/input/otlp/metadata_test.go index db5a48cf..e8bb364e 100644 --- a/input/otlp/metadata_test.go +++ b/input/otlp/metadata_test.go @@ -18,6 +18,7 @@ package otlp_test import ( + "strings" "testing" "github.com/google/go-cmp/cmp" @@ -350,53 +351,77 @@ func TestResourceConventions(t *testing.T) { // This test ensures that the values are properly translated, // and that heterogeneous array elements are dropped without a panic. func TestResourceLabels(t *testing.T) { - metadata := transformResourceMetadata(t, map[string]interface{}{ - "string_value": "abc", - "bool_value": true, - "int_value": 123, - "float_value": 1.23, - "string_array": []interface{}{"abc", "def", true, 123, 1.23, nil}, - "bool_array": []interface{}{true, false, "true", 123, 1.23, nil}, - "int_array": []interface{}{123, 456, "abc", true, 1.23, nil}, - "float_array": []interface{}{1.23, 4.56, "abc", true, 123, nil}, - "empty_array": []interface{}{}, // Ensure that an empty array is ignored. + t.Run("drop invalid", func(t *testing.T) { + metadata := transformResourceMetadata(t, map[string]interface{}{ + "string_value": "abc", + "bool_value": true, + "int_value": 123, + "float_value": 1.23, + "string_array": []interface{}{"abc", "def", true, 123, 1.23, nil}, + "bool_array": []interface{}{true, false, "true", 123, 1.23, nil}, + "int_array": []interface{}{123, 456, "abc", true, 1.23, nil}, + "float_array": []interface{}{1.23, 4.56, "abc", true, 123, nil}, + "empty_array": []interface{}{}, // Ensure that an empty array is ignored. + }) + assert.Equal(t, modelpb.Labels{ + "string_value": { + Global: true, + Value: "abc", + }, + "bool_value": { + Global: true, + Value: "true", + }, + "string_array": { + Global: true, + Values: []string{"abc", "def"}, + }, + "bool_array": { + Global: true, + Values: []string{"true", "false"}, + }, + }, modelpb.Labels(metadata.Labels)) + assert.Equal(t, modelpb.NumericLabels{ + "int_value": { + Global: true, + Value: 123, + }, + "float_value": { + Global: true, + Value: 1.23, + }, + "int_array": { + Global: true, + Values: []float64{123, 456}, + }, + "float_array": { + Global: true, + Values: []float64{1.23, 4.56}, + }, + }, modelpb.NumericLabels(metadata.NumericLabels)) + }) + + t.Run("string truncate", func(t *testing.T) { + metadata := transformResourceMetadata(t, map[string]interface{}{ + "string_value": strings.Repeat("a", 2000), + "string_array": []interface{}{strings.Repeat("a", 2000)}, + }) + + assert.Equal(t, + // Expect to truncate to keywordLength + modelpb.Labels{ + "string_value": { + Global: true, + Value: strings.Repeat("a", 1024), + }, + "string_array": { + Global: true, + Values: []string{strings.Repeat("a", 1024)}, + }, + }, + modelpb.Labels(metadata.Labels), + ) }) - assert.Equal(t, modelpb.Labels{ - "string_value": { - Global: true, - Value: "abc", - }, - "bool_value": { - Global: true, - Value: "true", - }, - "string_array": { - Global: true, - Values: []string{"abc", "def"}, - }, - "bool_array": { - Global: true, - Values: []string{"true", "false"}, - }, - }, modelpb.Labels(metadata.Labels)) - assert.Equal(t, modelpb.NumericLabels{ - "int_value": { - Global: true, - Value: 123, - }, - "float_value": { - Global: true, - Value: 1.23, - }, - "int_array": { - Global: true, - Values: []float64{123, 456}, - }, - "float_array": { - Global: true, - Values: []float64{1.23, 4.56}, - }, - }, modelpb.NumericLabels(metadata.NumericLabels)) } func transformResourceMetadata(t *testing.T, resourceAttrs map[string]interface{}) *modelpb.APMEvent {