mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-07-31 04:24:00 +00:00
87 lines
2.9 KiB
Go
87 lines
2.9 KiB
Go
package tracing
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type contextKey string
|
|
|
|
const (
|
|
traceIDKey contextKey = "goclaw_trace_id"
|
|
parentSpanKey contextKey = "goclaw_parent_span_id"
|
|
collectorKey contextKey = "goclaw_trace_collector"
|
|
announceParentKey contextKey = "goclaw_announce_parent_span_id"
|
|
delegateParentTraceKey contextKey = "goclaw_delegate_parent_trace_id"
|
|
)
|
|
|
|
// WithTraceID returns a context with the given trace ID.
|
|
func WithTraceID(ctx context.Context, id uuid.UUID) context.Context {
|
|
return context.WithValue(ctx, traceIDKey, id)
|
|
}
|
|
|
|
// TraceIDFromContext extracts the trace ID from context. Returns uuid.Nil if not set.
|
|
func TraceIDFromContext(ctx context.Context) uuid.UUID {
|
|
if v, ok := ctx.Value(traceIDKey).(uuid.UUID); ok {
|
|
return v
|
|
}
|
|
return uuid.Nil
|
|
}
|
|
|
|
// WithParentSpanID returns a context with the given parent span ID.
|
|
func WithParentSpanID(ctx context.Context, id uuid.UUID) context.Context {
|
|
return context.WithValue(ctx, parentSpanKey, id)
|
|
}
|
|
|
|
// ParentSpanIDFromContext extracts the parent span ID. Returns uuid.Nil if not set.
|
|
func ParentSpanIDFromContext(ctx context.Context) uuid.UUID {
|
|
if v, ok := ctx.Value(parentSpanKey).(uuid.UUID); ok {
|
|
return v
|
|
}
|
|
return uuid.Nil
|
|
}
|
|
|
|
// WithCollector returns a context with the given Collector.
|
|
func WithCollector(ctx context.Context, c *Collector) context.Context {
|
|
return context.WithValue(ctx, collectorKey, c)
|
|
}
|
|
|
|
// CollectorFromContext extracts the Collector from context. Returns nil if not set.
|
|
func CollectorFromContext(ctx context.Context) *Collector {
|
|
if v, ok := ctx.Value(collectorKey).(*Collector); ok {
|
|
return v
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// WithAnnounceParentSpanID returns a context indicating this run's agent span
|
|
// should be nested under the given parent span (used for announce runs).
|
|
func WithAnnounceParentSpanID(ctx context.Context, id uuid.UUID) context.Context {
|
|
return context.WithValue(ctx, announceParentKey, id)
|
|
}
|
|
|
|
// AnnounceParentSpanIDFromContext extracts the announce parent span ID.
|
|
// Returns uuid.Nil if not set (i.e., this is a normal run, not an announce).
|
|
func AnnounceParentSpanIDFromContext(ctx context.Context) uuid.UUID {
|
|
if v, ok := ctx.Value(announceParentKey).(uuid.UUID); ok {
|
|
return v
|
|
}
|
|
return uuid.Nil
|
|
}
|
|
|
|
// WithDelegateParentTraceID sets the parent trace ID for delegation linking.
|
|
// Unlike ParentTraceID on RunRequest (which reuses the parent trace for announces),
|
|
// this creates a NEW trace that links back to the parent via parent_trace_id.
|
|
func WithDelegateParentTraceID(ctx context.Context, id uuid.UUID) context.Context {
|
|
return context.WithValue(ctx, delegateParentTraceKey, id)
|
|
}
|
|
|
|
// DelegateParentTraceIDFromContext extracts the delegation parent trace ID.
|
|
func DelegateParentTraceIDFromContext(ctx context.Context) uuid.UUID {
|
|
if v, ok := ctx.Value(delegateParentTraceKey).(uuid.UUID); ok {
|
|
return v
|
|
}
|
|
return uuid.Nil
|
|
}
|