diff --git a/tracing/tracing.go b/tracing/tracing.go new file mode 100644 index 0000000..276172a --- /dev/null +++ b/tracing/tracing.go @@ -0,0 +1,53 @@ +package tracing + +import "context" + +type tracingContextKey int + +const ( + CallerContext tracingContextKey = 1 + iota +) + +type jobSubtree struct { + jobid string +} + +type ctx struct { + parent *ctx + job *jobSubtree + ident string +} + +var root = &ctx{nil, nil, ""} + +func getParentOrRoot(c context.Context) *ctx { + parent, ok := c.Value(CallerContext).(*ctx) + if !ok { + parent = root + } + return parent +} + +func makeChild(c context.Context, child *ctx) context.Context { + if child.parent == nil { + panic(child) + } + return context.WithValue(c, CallerContext, child) +} + +func Child(c context.Context, ident string) context.Context { + parent := getParentOrRoot(c) + return makeChild(c, &ctx{parent: parent, ident: ident}) +} + +func GetStack(c context.Context) (idents []string) { + ct, ok := c.Value(CallerContext).(*ctx) + if !ok { + return idents + } + for ct.parent != nil { + idents = append(idents, ct.ident) + ct = ct.parent + } + return idents +} diff --git a/tracing/tracing_test.go b/tracing/tracing_test.go new file mode 100644 index 0000000..4255a64 --- /dev/null +++ b/tracing/tracing_test.go @@ -0,0 +1,21 @@ +package tracing + +import ( + "context" + "strings" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestIt(t *testing.T) { + ctx := context.Background() + + ctx = Child(ctx, "a") + ctx = Child(ctx, "b") + ctx = Child(ctx, "c") + ctx = Child(ctx, "d") + + assert.Equal(t, "dcba", strings.Join(GetStack(ctx), "")) + +}