You've already forked opentelemetry-go
							
							
				mirror of
				https://github.com/open-telemetry/opentelemetry-go.git
				synced 2025-10-31 00:07:40 +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:
		| @@ -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() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user