diff --git a/exporters/otlp/otlplog/otlploghttp/internal/transform/log_test.go b/exporters/otlp/otlplog/otlploghttp/internal/transform/log_test.go index 8a3e85f0a..25613601b 100644 --- a/exporters/otlp/otlplog/otlploghttp/internal/transform/log_test.go +++ b/exporters/otlp/otlplog/otlploghttp/internal/transform/log_test.go @@ -109,7 +109,7 @@ var ( TraceID: trace.TraceID(traceIDA), SpanID: trace.SpanID(spanIDA), TraceFlags: trace.TraceFlags(flagsA), - InstrumentationScope: scope, + InstrumentationScope: &scope, Resource: res, }.NewRecord()) @@ -123,7 +123,7 @@ var ( TraceID: trace.TraceID(traceIDA), SpanID: trace.SpanID(spanIDA), TraceFlags: trace.TraceFlags(flagsA), - InstrumentationScope: scope, + InstrumentationScope: &scope, Resource: res, }.NewRecord()) @@ -137,7 +137,7 @@ var ( TraceID: trace.TraceID(traceIDB), SpanID: trace.SpanID(spanIDB), TraceFlags: trace.TraceFlags(flagsB), - InstrumentationScope: scope, + InstrumentationScope: &scope, Resource: res, }.NewRecord()) @@ -151,7 +151,7 @@ var ( TraceID: trace.TraceID(traceIDB), SpanID: trace.SpanID(spanIDB), TraceFlags: trace.TraceFlags(flagsB), - InstrumentationScope: scope, + InstrumentationScope: &scope, Resource: res, }.NewRecord()) diff --git a/exporters/stdout/stdoutlog/exporter_test.go b/exporters/stdout/stdoutlog/exporter_test.go index 45ccf2023..606fba40b 100644 --- a/exporters/stdout/stdoutlog/exporter_test.go +++ b/exporters/stdout/stdoutlog/exporter_test.go @@ -294,7 +294,7 @@ func getRecord(now time.Time) sdklog.Record { "https://example.com/custom-resource-schema", attribute.String("foo", "bar"), ), - InstrumentationScope: instrumentation.Scope{Name: "name", Version: "version", SchemaURL: "https://example.com/custom-schema"}, + InstrumentationScope: &instrumentation.Scope{Name: "name", Version: "version", SchemaURL: "https://example.com/custom-schema"}, DroppedAttributes: 10, } diff --git a/sdk/log/logtest/example_test.go b/sdk/log/logtest/example_test.go index 68376a726..7bfdb38df 100644 --- a/sdk/log/logtest/example_test.go +++ b/sdk/log/logtest/example_test.go @@ -19,7 +19,7 @@ import ( func ExampleRecordFactory() { exp := exporter{os.Stdout} rf := logtest.RecordFactory{ - InstrumentationScope: instrumentation.Scope{Name: "myapp"}, + InstrumentationScope: &instrumentation.Scope{Name: "myapp"}, } rf.Body = logapi.StringValue("foo") diff --git a/sdk/log/logtest/factory.go b/sdk/log/logtest/factory.go index 86b75d893..f9f32aafa 100644 --- a/sdk/log/logtest/factory.go +++ b/sdk/log/logtest/factory.go @@ -5,9 +5,9 @@ package logtest // import "go.opentelemetry.io/otel/sdk/log/logtest" import ( - "context" - "slices" + "reflect" "time" + "unsafe" "go.opentelemetry.io/otel/log" "go.opentelemetry.io/otel/sdk/instrumentation" @@ -33,75 +33,44 @@ type RecordFactory struct { TraceFlags trace.TraceFlags Resource *resource.Resource - InstrumentationScope instrumentation.Scope + InstrumentationScope *instrumentation.Scope - DroppedAttributes int + DroppedAttributes int + AttributeValueLengthLimit int + AttributeCountLimit int } -// NewRecord returns a log record. -func (b RecordFactory) NewRecord() sdklog.Record { - var record sdklog.Record - p := processor(func(r sdklog.Record) { - r.SetTimestamp(b.Timestamp) - r.SetObservedTimestamp(b.ObservedTimestamp) - r.SetSeverity(b.Severity) - r.SetSeverityText(b.SeverityText) - r.SetBody(b.Body) - r.SetAttributes(slices.Clone(b.Attributes)...) +// NewRecord returns a [sdklog.Record] configured from the values of f. +func (f RecordFactory) NewRecord() sdklog.Record { + // r needs to be addressable for set() below. + r := new(sdklog.Record) - // Generate dropped attributes. - for i := 0; i < b.DroppedAttributes; i++ { - r.AddAttributes(log.KeyValue{}) - } + // Set to unlimited so attributes are set exactly. + set(r, "attributeCountLimit", -1) + set(r, "attributeValueLengthLimit", -1) - r.SetTraceID(b.TraceID) - r.SetSpanID(b.SpanID) - r.SetTraceFlags(b.TraceFlags) + r.SetTimestamp(f.Timestamp) + r.SetObservedTimestamp(f.ObservedTimestamp) + r.SetSeverity(f.Severity) + r.SetSeverityText(f.SeverityText) + r.SetBody(f.Body) + r.SetAttributes(f.Attributes...) + r.SetTraceID(f.TraceID) + r.SetSpanID(f.SpanID) + r.SetTraceFlags(f.TraceFlags) - record = r - }) + set(r, "resource", f.Resource) + set(r, "scope", f.InstrumentationScope) + set(r, "dropped", f.DroppedAttributes) + set(r, "attributeCountLimit", f.AttributeCountLimit) + set(r, "attributeValueLengthLimit", f.AttributeValueLengthLimit) - attributeCountLimit := -1 - if b.DroppedAttributes > 0 { - // Make sure that we can generate dropped attributes. - attributeCountLimit = len(b.Attributes) - } - - res := b.Resource - if res == nil { - res = resource.Empty() - } - - provider := sdklog.NewLoggerProvider( - sdklog.WithResource(res), - sdklog.WithAttributeCountLimit(attributeCountLimit), - sdklog.WithAttributeValueLengthLimit(-1), - sdklog.WithProcessor(p), - ) - - l := provider.Logger(b.InstrumentationScope.Name, - log.WithInstrumentationVersion(b.InstrumentationScope.Version), - log.WithSchemaURL(b.InstrumentationScope.SchemaURL), - ) - l.Emit(context.Background(), log.Record{}) // This executes the processor function. - return record + return *r } -type processor func(r sdklog.Record) - -func (p processor) OnEmit(ctx context.Context, r sdklog.Record) error { - p(r) - return nil -} - -func (processor) Enabled(context.Context, sdklog.Record) bool { - return true -} - -func (processor) Shutdown(ctx context.Context) error { - return nil -} - -func (processor) ForceFlush(context.Context) error { - return nil +func set(r *sdklog.Record, name string, value any) { + rVal := reflect.ValueOf(r).Elem() + rf := rVal.FieldByName(name) + rf = reflect.NewAt(rf.Type(), unsafe.Pointer(rf.UnsafeAddr())).Elem() + rf.Set(reflect.ValueOf(value)) } diff --git a/sdk/log/logtest/factory_test.go b/sdk/log/logtest/factory_test.go index dc9662cd6..63e48de8b 100644 --- a/sdk/log/logtest/factory_test.go +++ b/sdk/log/logtest/factory_test.go @@ -18,6 +18,10 @@ import ( "go.opentelemetry.io/otel/trace" ) +func TestRecordFactoryEmpty(t *testing.T) { + assert.Equal(t, sdklog.Record{}, RecordFactory{}.NewRecord()) +} + func TestRecordFactory(t *testing.T) { now := time.Now() observed := now.Add(time.Second) @@ -49,7 +53,7 @@ func TestRecordFactory(t *testing.T) { SpanID: spanID, TraceFlags: traceFlags, DroppedAttributes: dropped, - InstrumentationScope: scope, + InstrumentationScope: &scope, Resource: r, }.NewRecord() @@ -82,7 +86,7 @@ func TestRecordFactoryMultiple(t *testing.T) { Timestamp: now, Attributes: attrs, DroppedAttributes: 1, - InstrumentationScope: scope, + InstrumentationScope: &scope, } record1 := f.NewRecord()