Setup otlp from env

This allows standard OTLP env vars to be used for configuring tracing
exporters.

Note: This does mean that, as written now, if no env var is set the
trace exporter will try to connect to the default OTLP address
(`localhost:4318`).
I've left this alone for now, but we could detect the OTLP vars
ourselves and if not set don't configure the exporter.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
This commit is contained in:
Brian Goff 2023-06-02 22:49:24 +00:00
parent 4b7145cfd3
commit 007c5b6e35

View File

@ -47,9 +47,6 @@ func init() {
Config: &OTLPConfig{}, Config: &OTLPConfig{},
InitFn: func(ic *plugin.InitContext) (interface{}, error) { InitFn: func(ic *plugin.InitContext) (interface{}, error) {
cfg := ic.Config.(*OTLPConfig) cfg := ic.Config.(*OTLPConfig)
if cfg.Endpoint == "" {
return nil, fmt.Errorf("no OpenTelemetry endpoint: %w", plugin.ErrSkipPlugin)
}
exp, err := newExporter(ic.Context, cfg) exp, err := newExporter(ic.Context, cfg)
if err != nil { if err != nil {
return nil, err return nil, err
@ -121,27 +118,30 @@ func newExporter(ctx context.Context, cfg *OTLPConfig) (*otlptrace.Exporter, err
ctx, cancel := context.WithTimeout(ctx, timeout) ctx, cancel := context.WithTimeout(ctx, timeout)
defer cancel() defer cancel()
if cfg.Protocol == "http/protobuf" || cfg.Protocol == "" { switch cfg.Protocol {
u, err := url.Parse(cfg.Endpoint) case "", "http/protobuf":
if err != nil { var opts []otlptracehttp.Option
return nil, fmt.Errorf("OpenTelemetry endpoint %q %w : %v", cfg.Endpoint, errdefs.ErrInvalidArgument, err) if cfg.Endpoint != "" {
} u, err := url.Parse(cfg.Endpoint)
opts := []otlptracehttp.Option{ if err != nil {
otlptracehttp.WithEndpoint(u.Host), return nil, fmt.Errorf("OpenTelemetry endpoint %q %w : %v", cfg.Endpoint, errdefs.ErrInvalidArgument, err)
} }
if u.Scheme == "http" { opts = append(opts, otlptracehttp.WithEndpoint(u.Host))
opts = append(opts, otlptracehttp.WithInsecure()) if u.Scheme == "http" {
opts = append(opts, otlptracehttp.WithInsecure())
}
} }
return otlptracehttp.New(ctx, opts...) return otlptracehttp.New(ctx, opts...)
} else if cfg.Protocol == "grpc" { case "grpc":
opts := []otlptracegrpc.Option{ var opts []otlptracegrpc.Option
otlptracegrpc.WithEndpoint(cfg.Endpoint), if cfg.Endpoint != "" {
opts = append(opts, otlptracegrpc.WithEndpoint(cfg.Endpoint))
} }
if cfg.Insecure { if cfg.Insecure {
opts = append(opts, otlptracegrpc.WithInsecure()) opts = append(opts, otlptracegrpc.WithInsecure())
} }
return otlptracegrpc.New(ctx, opts...) return otlptracegrpc.New(ctx, opts...)
} else { default:
// Other protocols such as "http/json" are not supported. // Other protocols such as "http/json" are not supported.
return nil, fmt.Errorf("OpenTelemetry protocol %q : %w", cfg.Protocol, errdefs.ErrNotImplemented) return nil, fmt.Errorf("OpenTelemetry protocol %q : %w", cfg.Protocol, errdefs.ErrNotImplemented)
} }
@ -152,7 +152,6 @@ func newExporter(ctx context.Context, cfg *OTLPConfig) (*otlptrace.Exporter, err
// //
// Note that this function sets process-wide tracing configuration. // Note that this function sets process-wide tracing configuration.
func newTracer(ctx context.Context, config *TraceConfig, procs []trace.SpanProcessor) (io.Closer, error) { func newTracer(ctx context.Context, config *TraceConfig, procs []trace.SpanProcessor) (io.Closer, error) {
res, err := resource.New(ctx, res, err := resource.New(ctx,
resource.WithHost(), resource.WithHost(),
resource.WithAttributes( resource.WithAttributes(