From e4f5cfa7f2cf0dae47d3c89380a64ffd3960988e Mon Sep 17 00:00:00 2001 From: Hiroya Onoe Date: Thu, 18 Apr 2024 22:26:38 +0900 Subject: [PATCH] Use sync.Pools for ResourceLogs in otelloghttp transforms --- .../otlp/otlplog/otlploghttp/exporter.go | 3 ++- .../otlp/otlplog/otlploghttp/exporter_test.go | 4 ++-- .../otlploghttp/internal/transform/log.go | 19 ++++++++++++++----- .../internal/transform/log_test.go | 11 ++++++++++- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/exporters/otlp/otlplog/otlploghttp/exporter.go b/exporters/otlp/otlplog/otlploghttp/exporter.go index e852b766501..cd3db1a713a 100644 --- a/exporters/otlp/otlplog/otlploghttp/exporter.go +++ b/exporters/otlp/otlplog/otlploghttp/exporter.go @@ -46,10 +46,11 @@ func (e *Exporter) Export(ctx context.Context, records []log.Record) error { if e.stopped.Load() { return nil } - otlp := transformResourceLogs(records) + otlp, free := transformResourceLogs(records) if otlp == nil { return nil } + defer free() return e.client.Load().UploadLogs(ctx, otlp) } diff --git a/exporters/otlp/otlplog/otlploghttp/exporter_test.go b/exporters/otlp/otlplog/otlploghttp/exporter_test.go index 5123298f302..5cf123e6c9d 100644 --- a/exporters/otlp/otlplog/otlploghttp/exporter_test.go +++ b/exporters/otlp/otlplog/otlploghttp/exporter_test.go @@ -44,9 +44,9 @@ func TestExporterExport(t *testing.T) { orig := transformResourceLogs var got []log.Record - transformResourceLogs = func(r []log.Record) []*logpb.ResourceLogs { + transformResourceLogs = func(r []log.Record) ([]*logpb.ResourceLogs, func()) { got = r - return make([]*logpb.ResourceLogs, 1) + return make([]*logpb.ResourceLogs, 1), func() {} } t.Cleanup(func() { transformResourceLogs = orig }) diff --git a/exporters/otlp/otlplog/otlploghttp/internal/transform/log.go b/exporters/otlp/otlplog/otlploghttp/internal/transform/log.go index 0ad67e1f68e..26b1c9c513e 100644 --- a/exporters/otlp/otlplog/otlploghttp/internal/transform/log.go +++ b/exporters/otlp/otlplog/otlploghttp/internal/transform/log.go @@ -6,6 +6,7 @@ package transform // import "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp/internal/transform" import ( + "sync" "time" cpb "go.opentelemetry.io/proto/slim/otlp/common/v1" @@ -18,18 +19,26 @@ import ( "go.opentelemetry.io/otel/sdk/log" ) +var resourceLogsPool = sync.Pool{ + New: func() any { + return []*lpb.ResourceLogs{} + }, +} + // ResourceLogs returns an slice of OTLP ResourceLogs generated from records. -func ResourceLogs(records []log.Record) []*lpb.ResourceLogs { +func ResourceLogs(records []log.Record) (out []*lpb.ResourceLogs, free func()) { if len(records) == 0 { - return nil + return nil, func() {} } - resMap := resourceLogsMap(records) - out := make([]*lpb.ResourceLogs, 0, len(resMap)) + out = resourceLogsPool.Get().([]*lpb.ResourceLogs) for _, rl := range resMap { out = append(out, rl) } - return out + return out, func() { + out = out[:0:0] + resourceLogsPool.Put(out) + } } func resourceLogsMap(records []log.Record) map[attribute.Distinct]*lpb.ResourceLogs { diff --git a/exporters/otlp/otlplog/otlploghttp/internal/transform/log_test.go b/exporters/otlp/otlplog/otlploghttp/internal/transform/log_test.go index db8063e1587..7b988ab062a 100644 --- a/exporters/otlp/otlplog/otlploghttp/internal/transform/log_test.go +++ b/exporters/otlp/otlplog/otlploghttp/internal/transform/log_test.go @@ -163,7 +163,16 @@ var ( func TestResourceLogs(t *testing.T) { want := []*lpb.ResourceLogs{pbResourceLogs} - assert.Equal(t, want, ResourceLogs(records)) + out, free := ResourceLogs(records) + assert.Equal(t, want, out) + free() + want = []*lpb.ResourceLogs{{ + ScopeLogs: []*lpb.ScopeLogs{{ + LogRecords: pbLogRecords[2:], + }}, + }} + out, free = ResourceLogs(records[2:]) + assert.Equal(t, want, out) } func TestSeverityNumber(t *testing.T) {