From bfe7858db39dc9cf18941f246e3a4ca308a8a6d7 Mon Sep 17 00:00:00 2001 From: Fiery-Fenix Date: Wed, 13 Nov 2024 17:03:24 +0200 Subject: [PATCH 1/2] [exporter/clickhouse] Fix incorrect ServiceName set for Logs Records --- ..._clickhouse-exporter-log-service-name.yaml | 27 +++++++++++++ exporter/clickhouseexporter/exporter_logs.go | 2 +- .../clickhouseexporter/exporter_logs_test.go | 40 +++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 .chloggen/fix_clickhouse-exporter-log-service-name.yaml diff --git a/.chloggen/fix_clickhouse-exporter-log-service-name.yaml b/.chloggen/fix_clickhouse-exporter-log-service-name.yaml new file mode 100644 index 000000000000..b0b5cb034a21 --- /dev/null +++ b/.chloggen/fix_clickhouse-exporter-log-service-name.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: clickhouseexporter + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Fix incorrect ServiceName set for Logs Records + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [36349] + +# (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/clickhouseexporter/exporter_logs.go b/exporter/clickhouseexporter/exporter_logs.go index a4987457420a..7f985fdbd38b 100644 --- a/exporter/clickhouseexporter/exporter_logs.go +++ b/exporter/clickhouseexporter/exporter_logs.go @@ -71,13 +71,13 @@ func (e *logsExporter) pushLogsData(ctx context.Context, ld plog.Logs) error { defer func() { _ = statement.Close() }() - var serviceName string for i := 0; i < ld.ResourceLogs().Len(); i++ { logs := ld.ResourceLogs().At(i) res := logs.Resource() resURL := logs.SchemaUrl() resAttr := attributesToMap(res.Attributes()) + var serviceName string if v, ok := res.Attributes().Get(conventions.AttributeServiceName); ok { serviceName = v.Str() } diff --git a/exporter/clickhouseexporter/exporter_logs_test.go b/exporter/clickhouseexporter/exporter_logs_test.go index 5ab742e32b68..e38f7bd8d5fa 100644 --- a/exporter/clickhouseexporter/exporter_logs_test.go +++ b/exporter/clickhouseexporter/exporter_logs_test.go @@ -128,6 +128,22 @@ func TestExporter_pushLogsData(t *testing.T) { exporter := newTestLogsExporter(t, defaultEndpoint) mustPushLogsData(t, exporter, simpleLogsWithNoTimestamp(1)) }) + t.Run("test with 2 log records with different service.name", func(t *testing.T) { + initClickhouseTestServer(t, func(query string, values []driver.Value) error { + if strings.HasPrefix(query, "INSERT") { + body, _ := values[7].(string) + if body == "empty ServiceName" { + require.Equal(t, "", values[6]) + } else { + require.Equal(t, "test-service", values[6]) + } + } + return nil + }) + + exporter := newTestLogsExporter(t, defaultEndpoint) + mustPushLogsData(t, exporter, multipleLogsWithDifferentServiceName(1)) + }) } func TestLogsClusterConfig(t *testing.T) { @@ -215,6 +231,30 @@ func simpleLogsWithNoTimestamp(count int) plog.Logs { return logs } +func multipleLogsWithDifferentServiceName(count int) plog.Logs { + logs := simpleLogs(count) + rl := logs.ResourceLogs().AppendEmpty() + rl.SetSchemaUrl("https://opentelemetry.io/schemas/1.4.0") + sl := rl.ScopeLogs().AppendEmpty() + sl.SetSchemaUrl("https://opentelemetry.io/schemas/1.7.0") + sl.Scope().SetName("io.opentelemetry.contrib.clickhouse") + sl.Scope().SetVersion("1.0.0") + sl.Scope().Attributes().PutStr("lib", "clickhouse") + timestamp := time.Unix(1703498029, 0) + for i := 0; i < count; i++ { + r := sl.LogRecords().AppendEmpty() + r.SetObservedTimestamp(pcommon.NewTimestampFromTime(timestamp)) + r.SetSeverityNumber(plog.SeverityNumberError2) + r.SetSeverityText("error") + r.Body().SetStr("empty ServiceName") + r.Attributes().PutStr(conventions.AttributeServiceNamespace, "default") + r.SetFlags(plog.DefaultLogRecordFlags) + r.SetTraceID([16]byte{1, 2, 3, byte(i)}) + r.SetSpanID([8]byte{1, 2, 3, byte(i)}) + } + return logs +} + func mustPushLogsData(t *testing.T, exporter *logsExporter, ld plog.Logs) { err := exporter.pushLogsData(context.TODO(), ld) require.NoError(t, err) From cd48d37d564ad853e1008f6e1d9575f5a55c8fec Mon Sep 17 00:00:00 2001 From: Fiery-Fenix Date: Mon, 18 Nov 2024 12:28:05 +0200 Subject: [PATCH 2/2] Update changelog title --- .chloggen/fix_clickhouse-exporter-log-service-name.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.chloggen/fix_clickhouse-exporter-log-service-name.yaml b/.chloggen/fix_clickhouse-exporter-log-service-name.yaml index b0b5cb034a21..9ee63c3a6bc3 100644 --- a/.chloggen/fix_clickhouse-exporter-log-service-name.yaml +++ b/.chloggen/fix_clickhouse-exporter-log-service-name.yaml @@ -7,7 +7,7 @@ change_type: bug_fix component: clickhouseexporter # A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). -note: Fix incorrect ServiceName set for Logs Records +note: Fix incorrect Resource Attribute `service.name` translation to ClickHouse ServiceName field for Logs Records # Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. issues: [36349]