From b531b37167f6a63f63443eae57410ca6da569c23 Mon Sep 17 00:00:00 2001 From: Andrew Steurer <94206073+asteurer@users.noreply.github.com> Date: Sun, 22 Mar 2026 03:10:57 +0100 Subject: [PATCH] fix: logs are now associated with a trace id in the go and ts example applications Signed-off-by: Andrew Steurer <94206073+asteurer@users.noreply.github.com> --- go/examples/spin-basic/main.go | 20 ++++++++++---------- go/tracing/conversions.go | 9 +++++++-- ts/examples/spin-basic/src/index.ts | 14 ++++++++------ ts/src/logs.ts | 7 ++++--- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/go/examples/spin-basic/main.go b/go/examples/spin-basic/main.go index eed209e..3cb04de 100644 --- a/go/examples/spin-basic/main.go +++ b/go/examples/spin-basic/main.go @@ -24,16 +24,6 @@ func init() { spinhttp.Handle(func(w http.ResponseWriter, r *http.Request) { ctx := context.Background() - /* - ### LOGS ### - */ - loggerProvider := log.NewLoggerProvider(log.WithProcessor(wasiLogs.NewWasiLogProcessor())) - logger := loggerProvider.Logger("spin-logs") - logRecord := logApi.Record{} - logRecord.SetBody(logApi.StringValue("Hello from Go!")) - logRecord.SetSeverity(logApi.SeverityInfo) - logger.Emit(ctx, logRecord) - /* ### METRICS ### */ @@ -112,6 +102,16 @@ func init() { childSpan.SetStatus(codes.Ok, "success") }() + /* + ### LOGS ### + */ + loggerProvider := log.NewLoggerProvider(log.WithProcessor(wasiLogs.NewWasiLogProcessor())) + logger := loggerProvider.Logger("spin-logs") + logRecord := logApi.Record{} + logRecord.SetBody(logApi.StringValue("Hello from Go!")) + logRecord.SetSeverity(logApi.SeverityInfo) + logger.Emit(hostCtx, logRecord) // To have the log associated with the trace, we pass the host context + w.Header().Set("Content-Type", "text/plain") fmt.Fprintln(w, "Hello World!") }) diff --git a/go/tracing/conversions.go b/go/tracing/conversions.go index f595546..bb567ac 100644 --- a/go/tracing/conversions.go +++ b/go/tracing/conversions.go @@ -3,6 +3,7 @@ package tracing import ( "encoding/hex" "fmt" + "strings" "github.com/bytecodealliance/wit-bindgen/wit_types" "github.com/calebschoepp/opentelemetry-wasi/internal/wasi_otel_tracing" @@ -89,7 +90,9 @@ func toWasiSpanKind(sk traceApi.SpanKind) wasi_otel_tracing.SpanKind { } func toOtelSpanContext(ctx wasi_otel_tracing.SpanContext) traceApi.SpanContext { - tid, err := hex.DecodeString(ctx.TraceId) + traceIdHex := fmt.Sprintf("%032s", ctx.TraceId) + traceIdHex = strings.ReplaceAll(traceIdHex, " ", "0") + tid, err := hex.DecodeString(traceIdHex) if err != nil { panic(fmt.Sprintf("invalid trace ID: %v", err)) } @@ -97,7 +100,9 @@ func toOtelSpanContext(ctx wasi_otel_tracing.SpanContext) traceApi.SpanContext { panic(fmt.Sprintf("trace ID must be 16 bytes, got %d", len(tid))) } - sid, err := hex.DecodeString(ctx.SpanId) + spanIdHex := fmt.Sprintf("%016s", ctx.SpanId) + spanIdHex = strings.ReplaceAll(spanIdHex, " ", "0") + sid, err := hex.DecodeString(spanIdHex) if err != nil { panic(fmt.Sprintf("invalid span ID: %v", err)) } diff --git a/ts/examples/spin-basic/src/index.ts b/ts/examples/spin-basic/src/index.ts index 0f48aa4..18d8061 100644 --- a/ts/examples/spin-basic/src/index.ts +++ b/ts/examples/spin-basic/src/index.ts @@ -36,6 +36,8 @@ const provider = new BasicTracerProvider({ const router = AutoRouter(); router.get('/', async () => { + const hostContext = propagator.extract(context.active()); + /* ### METRICS ### */ @@ -64,16 +66,16 @@ router.get('/', async () => { const logger = logs.getLogger('spin-logs'); logger.emit({ - severityNumber: SeverityNumber.INFO, - severityText: 'INFO', - body: 'Hello from TypeScript!', - attributes: attrs, - }); + severityNumber: SeverityNumber.INFO, + severityText: 'INFO', + body: 'Hello from TypeScript!', + attributes: attrs, + context: hostContext, // To have the log associated with the trace, we pass the host context + }); /* ### TRACING ### */ - const hostContext = propagator.extract(context.active()); const tracer = provider.getTracer('basic-spin'); return tracer.startActiveSpan( 'main-operation', diff --git a/ts/src/logs.ts b/ts/src/logs.ts index 18aec43..c22193d 100644 --- a/ts/src/logs.ts +++ b/ts/src/logs.ts @@ -4,6 +4,7 @@ import { LogRecord as WasiLogRecord } from 'wasi:otel/logs@0.2.0-rc.2'; import { KeyValue as WasiKeyValue } from 'wasi:otel/types@0.2.0-rc.2'; import { dateTimeToWasi, instrumentationScopeToWasi } from './types'; import { AnyValue, AnyValueMap } from '@opentelemetry/api-logs'; +import { TraceFlags } from '@opentelemetry/api'; export class WasiLogProcessor implements LogRecordProcessor { onEmit(logRecord: SdkLogRecord): void { @@ -38,9 +39,9 @@ function logRecordToWasi(r: SdkLogRecord): WasiLogRecord { schemaUrl: r.resource.schemaUrl, }, instrumentationScope: instrumentationScopeToWasi(r.instrumentationScope), - traceId: undefined, - spanId: undefined, - traceFlags: undefined, + traceId: r.spanContext?.traceId, + spanId: r.spanContext?.spanId, + traceFlags: r.spanContext ? { sampled: !!(r.spanContext.traceFlags & TraceFlags.SAMPLED) } : undefined, }; }