feat(tracing): switch to OpenTelemetry
Switch the underlying tracing library to OpenTelemetry, with a bridge to OpenCensus for compatibility
This commit is contained in:
+51
-40
@@ -4,9 +4,15 @@ import (
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"contrib.go.opencensus.io/exporter/jaeger"
|
||||
octrace "go.opencensus.io/trace"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/bridge/opencensus"
|
||||
"go.opentelemetry.io/otel/exporters/jaeger"
|
||||
"go.opentelemetry.io/otel/sdk/resource"
|
||||
tracesdk "go.opentelemetry.io/otel/sdk/trace"
|
||||
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
|
||||
|
||||
logging "github.com/ipfs/go-log/v2"
|
||||
"go.opencensus.io/trace"
|
||||
)
|
||||
|
||||
var log = logging.Logger("tracing")
|
||||
@@ -14,7 +20,6 @@ var log = logging.Logger("tracing")
|
||||
const (
|
||||
// environment variable names
|
||||
envCollectorEndpoint = "LOTUS_JAEGER_COLLECTOR_ENDPOINT"
|
||||
envAgentEndpoint = "LOTUS_JAEGER_AGENT_ENDPOINT"
|
||||
envAgentHost = "LOTUS_JAEGER_AGENT_HOST"
|
||||
envAgentPort = "LOTUS_JAEGER_AGENT_PORT"
|
||||
envJaegerUser = "LOTUS_JAEGER_USERNAME"
|
||||
@@ -26,54 +31,60 @@ const (
|
||||
// The agent endpoint is a thrift/udp protocol and should be given
|
||||
// as a string like "hostname:port". The agent can also be configured
|
||||
// with separate host and port variables.
|
||||
func jaegerOptsFromEnv(opts *jaeger.Options) bool {
|
||||
func jaegerOptsFromEnv() jaeger.EndpointOption {
|
||||
var e string
|
||||
var ok bool
|
||||
if e, ok = os.LookupEnv(envJaegerUser); ok {
|
||||
if p, ok := os.LookupEnv(envJaegerCred); ok {
|
||||
opts.Username = e
|
||||
opts.Password = p
|
||||
} else {
|
||||
log.Warn("jaeger username supplied with no password. authentication will not be used.")
|
||||
}
|
||||
}
|
||||
|
||||
if e, ok = os.LookupEnv(envCollectorEndpoint); ok {
|
||||
opts.CollectorEndpoint = e
|
||||
log.Infof("jaeger tracess will send to collector %s", e)
|
||||
return true
|
||||
}
|
||||
if e, ok = os.LookupEnv(envAgentEndpoint); ok {
|
||||
log.Infof("jaeger traces will be sent to agent %s", e)
|
||||
opts.AgentEndpoint = e
|
||||
return true
|
||||
}
|
||||
if e, ok = os.LookupEnv(envAgentHost); ok {
|
||||
if p, ok := os.LookupEnv(envAgentPort); ok {
|
||||
opts.AgentEndpoint = strings.Join([]string{e, p}, ":")
|
||||
} else {
|
||||
opts.AgentEndpoint = strings.Join([]string{e, "6831"}, ":")
|
||||
options := []jaeger.CollectorEndpointOption{jaeger.WithEndpoint(e)}
|
||||
if u, ok := os.LookupEnv(envJaegerUser); ok {
|
||||
if p, ok := os.LookupEnv(envJaegerCred); ok {
|
||||
options = append(options, jaeger.WithUsername(u))
|
||||
options = append(options, jaeger.WithPassword(p))
|
||||
} else {
|
||||
log.Warn("jaeger username supplied with no password. authentication will not be used.")
|
||||
}
|
||||
}
|
||||
log.Infof("jaeger traces will be sent to agent %s", opts.AgentEndpoint)
|
||||
return true
|
||||
log.Infof("jaeger tracess will send to collector %s", e)
|
||||
return jaeger.WithCollectorEndpoint(options...)
|
||||
}
|
||||
return false
|
||||
|
||||
if e, ok = os.LookupEnv(envAgentHost); ok {
|
||||
options := []jaeger.AgentEndpointOption{jaeger.WithAgentHost(e)}
|
||||
var ep string
|
||||
if p, ok := os.LookupEnv(envAgentPort); ok {
|
||||
options = append(options, jaeger.WithAgentPort(p))
|
||||
ep = strings.Join([]string{e, p}, ":")
|
||||
} else {
|
||||
ep = strings.Join([]string{e, "6831"}, ":")
|
||||
}
|
||||
log.Infof("jaeger traces will be sent to agent %s", ep)
|
||||
return jaeger.WithAgentEndpoint(options...)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func SetupJaegerTracing(serviceName string) *jaeger.Exporter {
|
||||
opts := jaeger.Options{}
|
||||
if !jaegerOptsFromEnv(&opts) {
|
||||
func SetupJaegerTracing(serviceName string) *tracesdk.TracerProvider {
|
||||
jaegerEndpoint := jaegerOptsFromEnv()
|
||||
if jaegerEndpoint == nil {
|
||||
return nil
|
||||
}
|
||||
opts.ServiceName = serviceName
|
||||
je, err := jaeger.NewExporter(opts)
|
||||
je, err := jaeger.New(jaegerEndpoint)
|
||||
if err != nil {
|
||||
log.Errorw("failed to create the jaeger exporter", "error", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
trace.RegisterExporter(je)
|
||||
trace.ApplyConfig(trace.Config{
|
||||
DefaultSampler: trace.AlwaysSample(),
|
||||
})
|
||||
return je
|
||||
tp := tracesdk.NewTracerProvider(
|
||||
// Always be sure to batch in production.
|
||||
tracesdk.WithBatcher(je),
|
||||
// Record information about this application in an Resource.
|
||||
tracesdk.WithResource(resource.NewWithAttributes(
|
||||
semconv.SchemaURL,
|
||||
semconv.ServiceNameKey.String(serviceName),
|
||||
)),
|
||||
)
|
||||
otel.SetTracerProvider(tp)
|
||||
tracer := tp.Tracer(serviceName)
|
||||
octrace.DefaultTracer = opencensus.NewTracer(tracer)
|
||||
return tp
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user