Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/equinix-labs/otel-init-go
go 1.15

require (
github.com/google/go-cmp v0.5.6 // indirect
github.com/google/go-cmp v0.5.6
go.opentelemetry.io/otel v1.0.0-RC2
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.0.0-RC2
go.opentelemetry.io/otel/sdk v1.0.0-RC2
Expand Down
24 changes: 24 additions & 0 deletions otelhelpers/env_traceparent.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package otelhelpers

import (
"context"
"os"

"go.opentelemetry.io/otel"
)

// ContextWithEnvTraceparent is a helper that looks for the the TRACEPARENT
// environment variable and if it's set, it grabs the traceparent and
// adds it to the context it returns. When there is no envvar or it's
// empty, the original context is returned unmodified.
func ContextWithEnvTraceparent(ctx context.Context) context.Context {
traceparent := os.Getenv("TRACEPARENT")
if traceparent != "" {
carrier := SimpleCarrier{}
carrier.Set("traceparent", traceparent)
prop := otel.GetTextMapPropagator()
return prop.Extract(ctx, carrier)
}

return ctx
}
33 changes: 33 additions & 0 deletions otelhelpers/simple_carrier.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package otelhelpers

// SimpleCarrier is an abstraction for handling traceparent propagation
// that needs a type that implements the propagation.TextMapCarrier().
// This is the simplest possible implementation that is a little fragile
// but since we're not doing anything else with it, it's fine for this.
type SimpleCarrier map[string]string

// Get implements the otel interface for propagation.
func (otp SimpleCarrier) Get(key string) string {
return otp[key]
}

// Set implements the otel interface for propagation.
func (otp SimpleCarrier) Set(key, value string) {
otp[key] = value
}

// Keys implements the otel interface for propagation.
func (otp SimpleCarrier) Keys() []string {
out := []string{}
for k := range otp {
out = append(out, k)
}
return out
}

// Clear implements the otel interface for propagation.
func (otp SimpleCarrier) Clear() {
for k := range otp {
delete(otp, k)
}
}