• v1.0.0 b583af1973

    Rene Nochebuena released this 2026-05-29 10:10:18 -06:00 | 0 commits to main since this release

    v1.0.0

    code.nochebuena.dev/einherjar/telemetry


    Architecture Decisions Resolved

    Decision Outcome
    lifecycle.Component vs standalone bootstrap Standalone — telemetry must be initialized before the launcher and shut down after all components stop; Component lifecycle ordering cannot guarantee this
    Production exporter OTLP over gRPC — vendor-neutral; works with Grafana, Jaeger, Tempo, Datadog, Honeycomb
    Development mode Console exporter via logging.Logger — no collector required; integrates with structured log output
    Shutdown pattern Returns func(context.Context) error — caller defers it in main(); clean shutdown flushes pending spans/metrics/logs

    API

    import "code.nochebuena.dev/einherjar/telemetry"
    
    // Package sentinel
    // Module identifies this package to observability systems.
    // telemetry bootstraps before the launcher and shuts down after — not a lifecycle component.
    // Register Module manually with any version registry if needed.
    var Module observability.Identifiable
    
    // Production config (OTLP over gRPC)
    type Config struct {
        ServiceName    string `env:"EINHERJAR_OTEL_SERVICE_NAME,required"`
        ServiceVersion string `env:"EINHERJAR_OTEL_SERVICE_VERSION"    envDefault:"unknown"`
        Environment    string `env:"EINHERJAR_OTEL_ENVIRONMENT"         envDefault:"development"`
        OTLPEndpoint   string `env:"EINHERJAR_OTEL_EXPORTER_ENDPOINT,required"`
        OTLPInsecure   bool   `env:"EINHERJAR_OTEL_EXPORTER_INSECURE"  envDefault:"false"`
    }
    func DefaultConfig() Config
    
    // Development config (console/structured log output)
    type ConsoleConfig struct {
        ServiceName    string `env:"EINHERJAR_OTEL_SERVICE_NAME,required"`
        ServiceVersion string `env:"EINHERJAR_OTEL_SERVICE_VERSION" envDefault:"unknown"`
        Environment    string `env:"EINHERJAR_OTEL_ENVIRONMENT"     envDefault:"development"`
    }
    func DefaultConsoleConfig() ConsoleConfig
    
    // Bootstrap functions — call before launcher.Run(); defer the returned shutdown fn
    func New(ctx context.Context, cfg Config) (func(context.Context) error, error)
    func NewConsole(ctx context.Context, logger logging.Logger, cfg ConsoleConfig) (func(context.Context) error, error)
    

    Usage:

    shutdown, err := telemetry.New(ctx, cfg)
    if err != nil {
        log.Fatal(err)
    }
    defer shutdown(ctx)
    
    lc := launcher.New(logger)
    lc.Append(db, cache, srv)
    lc.Run()
    

    Install

    go get code.nochebuena.dev/einherjar/telemetry@v1.0.0
    

    Dependencies

    Module Version Role
    code.nochebuena.dev/einherjar/contracts v1.0.0 logging.Logger
    code.nochebuena.dev/einherjar/core v1.0.0 xerrors
    go.opentelemetry.io/otel v1.42.0 OTel API
    go.opentelemetry.io/otel/sdk v1.42.0 OTel SDK (tracer, meter, logger providers)
    go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.42.0 OTLP gRPC trace exporter
    go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.42.0 OTLP gRPC metric exporter
    go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.18.0 OTLP gRPC log exporter
    Downloads