NewConsole bootstraps the OTel SDK with three logz-backed exporters: - Trace: WithSyncer, one log line per closed span (immediate, no batch) - Metric: PeriodicReader (60s), flushed on shutdown - OTel log: BatchProcessor, for third-party libs using OTel log API ConsoleConfig requires only ServiceName — no OTLP endpoint needed. Adds logz v1.0.1 as direct dependency; module tier bumped 1 → 2.
4.4 KiB
4.4 KiB
Changelog
All notable changes to this module will be documented in this file.
The format is based on Keep a Changelog, and this module adheres to Semantic Versioning.
1.1.0 - 2026-05-12
Added
ConsoleConfig— service identity configuration for console/dev mode (onlyServiceName,ServiceVersion,Environment; no OTLP endpoint required)NewConsole(ctx, logger logz.Logger, cfg ConsoleConfig) (func(context.Context) error, error)— bootstraps the OTel SDK with logz-backed exporters for local development. Traces are exported synchronously viaWithSyncer(one log line per closed span); metrics viaPeriodicReader(flushed on shutdown); OTel log records viaBatchProcessor. No collector needed.logz v1.0.1added as direct dependency (tier bumped from 1 → 2).
Output format
INFO otel: span name=GET /api/v1/permisos trace_id=3f2a9c... duration_ms=18 status=Ok
INFO otel: metric name=http.server.duration kind=histogram count=5 sum=87.3 unit=ms
INFO otel: log body=cache miss severity=INFO
1.0.0 - 2026-05-12
Changed
- Go directive bumped from 1.25 to 1.26
- Shutdown function now wraps each provider error with a
providerErrtype that prefixes the signal name ("telemetry: trace provider shutdown: …","telemetry: metric provider shutdown: …","telemetry: log provider shutdown: …"). The combined error is still joined witherrors.Join; individual causes remain unwrappable viaerrors.As. Previously, the three errors were joined without labels.
Stabilization
- API committed as stable.
Config,New, and the shutdown function signature (func(context.Context) error) are unchanged from v0.9.0.
0.9.0 - 2026-03-18
Added
Configstruct — holds OTel bootstrap configuration with env-tag support:ServiceName(OTEL_SERVICE_NAME, required),ServiceVersion(OTEL_SERVICE_VERSION, defaultunknown),Environment(OTEL_ENVIRONMENT, defaultdevelopment),OTLPEndpoint(OTEL_EXPORTER_OTLP_ENDPOINT, required),OTLPInsecure(OTEL_EXPORTER_OTLP_INSECURE, defaultfalse)New(ctx context.Context, cfg Config) (func(context.Context) error, error)— bootstraps the full OpenTelemetry SDK by creating three OTLP gRPC exporters and their corresponding SDK providers:TracerProvider(traces → Grafana Alloy → Tempo),MeterProvider(metrics → Grafana Alloy → Mimir), andLoggerProvider(logs → Grafana Alloy → Loki); sets all three OTel globals (otel.SetTracerProvider,otel.SetMeterProvider,global.SetLoggerProvider) and installs W3C TraceContext and Baggage as the global text map propagator; returns(shutdown, nil)on success or(nil, error)on failure with sequential rollback of any already-created providers- Shutdown function
func(context.Context) error— returned byNew; flushes and shuts down all three providers usingerrors.Join, allowing deferred call inmainor wiring into a launcherBeforeStophook - OTel resource construction — every signal is tagged with
service.name,service.version, anddeployment.environmentattributes, merged with the OTel SDK default resource (SDK version, process info, etc.) usingresource.Merge - Sequential error rollback — if the metric exporter fails after the trace exporter is created, the trace provider is shut down before returning the error; if the log exporter fails, both the trace and metric providers are shut down; the process never runs with a partial telemetry state
Design Notes
- This module is Tier 1 (no micro-lib dependencies) and must never be imported by framework libraries; those libraries use only the OTel API, which defaults to no-ops until
Newis called and sets the global providers - All three signals share a single OTLP gRPC endpoint, matching the standard Grafana LGTM stack topology where Grafana Alloy receives all signals and fans them out to Tempo, Mimir, and Loki
- The module intentionally does not implement
launcher.Component; the returned shutdown function is deferred directly inmain, keeping the dependency graph free oflauncherand the interface as simple as a single function call