mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2024-12-28 21:09:17 +02:00
Use reflect to construct a Record in logtest
(#5275)
* Use reflect to construct Record * Fix merge * Fix merge
This commit is contained in:
parent
e0ed6a3028
commit
36bee9356a
@ -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())
|
||||
|
||||
|
@ -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,
|
||||
}
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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))
|
||||
}
|
||||
|
@ -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()
|
||||
|
Loading…
Reference in New Issue
Block a user