Skip to content

nxdir-s/telemetry

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

21 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Telemetry

This repository contains utilities for working with Open Telemetry. You can find a getting started guide with OpenTelemetry in Go on opentelemetry.io

Usage

Initialize the telemetry providers within main()

cfg := &telemetry.Config{
    ServiceName:        os.Getenv("OTEL_SERVICE_NAME"),
    OtelEndpoint:       os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT"),
}

cleanup, err := telemetry.InitProviders(ctx, cfg)
if err != nil {
    // handle error
}

Example Lambda Setup

func main() {
    ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
    defer cancel()

    logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
    slog.SetDefault(logger)

    cfg := &telemetry.Config{
        ServiceName:        os.Getenv("OTEL_SERVICE_NAME"),
        OtelEndpoint:       os.Getenv("OTEL_EXPORTER_OTLP_ENDPOINT"),
        Lambda:             true,
    }

    cleanup, err := telemetry.InitProviders(ctx, cfg)
    if err != nil {
        // handle error
    }

    adapter := primary.NewLambdaAdapter()

    // any remaining setup for lambda...

    lambda.StartWithOptions(
        otellambda.InstrumentHandler(adapter.HandleRequest,
            otellambda.WithTracerProvider(otel.GetTracerProvider()),
            otellambda.WithFlusher(otel.GetTracerProvider().(*trace.TracerProvider)),
            otellambda.WithPropagator(otel.GetTextMapPropagator()),
        ),
        lambda.WithContext(ctx),
        lambda.WithEnableSIGTERM(func() {
            cleanup()
            cancel()
        }),
    )
}

Instrumentation

Applications can be manually instrumented or you can use any of the officially supported instrumentation libraries

docs: https://opentelemetry.io/docs/languages/go/instrumentation/#metrics


To add custom spans within your application, the following can be done

ctx, span := tracer.Start(ctx, "Adapter.HandleRequest")
defer span.End()

docs: https://opentelemetry.io/docs/languages/go/instrumentation/#creating-spans


AWS SDK

Add the following after initialization to instrument the aws sdk

// init aws config
cfg, err := awsConfig.LoadDefaultConfig(ctx)
if err != nil {
    // handle error
}

// instrument all aws clients
otelaws.AppendMiddlewares(&cfg.APIOptions)

Host and Runtime Metrics

Add the following after initialization to instrument host and runtime metric collection

err = host.Start(host.WithMeterProvider(otel.GetMeterProvider()))
if err != nil {
    // handle error
}

err = runtime.Start(runtime.WithMeterProvider(otel.GetMeterProvider()), runtime.WithMinimumReadMemStatsInterval(time.Second))
if err != nil {
    // handle error
}

About

Open Telemetry Utilities for Go

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages