Documentation
¶
Overview ¶
Package otel provides OpenTelemetry instrumentation utilities for github.com/jasoet/pkg/v2.
This package offers:
- Centralized configuration for traces, metrics, and logs
- Library-specific semantic conventions
- No-op implementations when telemetry is disabled
Configuration ¶
Create an otel.Config with the desired providers:
cfg := &otel.Config{
TracerProvider: tracerProvider, // optional
MeterProvider: meterProvider, // optional
LoggerProvider: loggerProvider, // optional
ServiceName: "my-service",
ServiceVersion: "1.0.0",
}
Then pass this config to package configurations (server.Config, grpc options, etc.).
Telemetry Pillars ¶
Enable any combination of:
- Traces (distributed tracing)
- Metrics (measurements and aggregations)
- Logs (structured log export via OpenTelemetry standard)
Each pillar is independently controlled by setting its provider. Nil providers result in no-op implementations with zero overhead.
Standard Logging Helper ¶
This package provides otel.LogHelper for OTel-aware logging that automatically correlates logs with traces. It uses OTel LoggerProvider when available, otherwise falls back to zerolog. See helper.go for details.
Index ¶
- Constants
- func NewLoggerProviderWithOptions(serviceName string, debug bool, opts ...LoggerProviderOption) (log.LoggerProvider, error)
- type Config
- func (c *Config) GetLogger(scopeName string, opts ...log.LoggerOption) log.Logger
- func (c *Config) GetMeter(scopeName string, opts ...metric.MeterOption) metric.Meter
- func (c *Config) GetTracer(scopeName string, opts ...trace.TracerOption) trace.Tracer
- func (c *Config) IsLoggingEnabled() bool
- func (c *Config) IsMetricsEnabled() bool
- func (c *Config) IsTracingEnabled() bool
- func (c *Config) Shutdown(ctx context.Context) error
- func (c *Config) WithLoggerProvider(lp log.LoggerProvider) *Config
- func (c *Config) WithMeterProvider(mp metric.MeterProvider) *Config
- func (c *Config) WithServiceVersion(version string) *Config
- func (c *Config) WithTracerProvider(tp trace.TracerProvider) *Config
- func (c *Config) WithoutLogging() *Config
- type Field
- type LogHelper
- type LogLevel
- type LoggerProviderOption
Constants ¶
const ( LogLevelDebug = logging.LogLevelDebug LogLevelInfo = logging.LogLevelInfo LogLevelWarn = logging.LogLevelWarn LogLevelError = logging.LogLevelError LogLevelNone = logging.LogLevelNone )
Re-export LogLevel constants from logging package
Variables ¶
This section is empty.
Functions ¶
func NewLoggerProviderWithOptions ¶ added in v2.4.8
func NewLoggerProviderWithOptions(serviceName string, debug bool, opts ...LoggerProviderOption) (log.LoggerProvider, error)
NewLoggerProviderWithOptions creates a LoggerProvider with flexible options. It supports both console output (zerolog) and OTLP export, or both simultaneously.
Parameters:
- serviceName: Name of the service
- debug: If true, sets log level to Debug, otherwise Info
- opts: Optional configuration options
Returns:
- A log.LoggerProvider configured according to the options
- An error if OTLP exporter creation fails
Example:
provider, err := otel.NewLoggerProviderWithOptions("my-service", false,
otel.WithOTLPEndpoint("localhost:4318", true),
otel.WithConsoleOutput(true))
Types ¶
type Config ¶
type Config struct {
// TracerProvider for distributed tracing
// If nil, tracing will be disabled (no-op tracer)
TracerProvider trace.TracerProvider
// MeterProvider for metrics collection
// If nil, metrics will be disabled (no-op meter)
MeterProvider metric.MeterProvider
// LoggerProvider for structured logging via OTel
// Defaults to zerolog-based provider when using NewConfig()
// Set to nil explicitly to disable logging
LoggerProvider log.LoggerProvider
// ServiceName identifies the service in telemetry data
ServiceName string
// ServiceVersion identifies the service version
ServiceVersion string
}
Config holds OpenTelemetry configuration for instrumentation. TracerProvider and MeterProvider are optional - nil values result in no-op implementations. LoggerProvider defaults to zerolog-based provider when using NewConfig().
func NewConfig ¶
NewConfig creates a new OpenTelemetry configuration with default LoggerProvider. The default LoggerProvider uses zerolog with automatic log-span correlation for production use. Use With* methods to add TracerProvider and MeterProvider.
Example:
cfg := otel.NewConfig("my-service").
WithTracerProvider(tp).
WithMeterProvider(mp)
For custom logger configuration:
import "github.com/jasoet/pkg/v2/logging"
cfg := &otel.Config{
ServiceName: "my-service",
LoggerProvider: logging.NewLoggerProvider("my-service", true), // enable debug mode
}
cfg.WithTracerProvider(tp).WithMeterProvider(mp)
func (*Config) GetLogger ¶
GetLogger returns a logger for the given instrumentation scope. Returns a no-op logger if logging is not configured.
func (*Config) GetMeter ¶
GetMeter returns a meter for the given instrumentation scope. Returns a no-op meter if metrics are not configured.
func (*Config) GetTracer ¶
GetTracer returns a tracer for the given instrumentation scope. Returns a no-op tracer if tracing is not configured.
func (*Config) IsLoggingEnabled ¶
IsLoggingEnabled returns true if OTel logging is configured
func (*Config) IsMetricsEnabled ¶
IsMetricsEnabled returns true if metrics collection is configured
func (*Config) IsTracingEnabled ¶
IsTracingEnabled returns true if tracing is configured
func (*Config) Shutdown ¶
Shutdown gracefully shuts down all configured providers Call this when your application exits to flush any pending telemetry
func (*Config) WithLoggerProvider ¶
func (c *Config) WithLoggerProvider(lp log.LoggerProvider) *Config
WithLoggerProvider sets a custom LoggerProvider, replacing the default stdout logger
func (*Config) WithMeterProvider ¶
func (c *Config) WithMeterProvider(mp metric.MeterProvider) *Config
WithMeterProvider sets the MeterProvider for metrics collection
func (*Config) WithServiceVersion ¶
WithServiceVersion sets the service version for telemetry data
func (*Config) WithTracerProvider ¶
func (c *Config) WithTracerProvider(tp trace.TracerProvider) *Config
WithTracerProvider sets the TracerProvider for distributed tracing
func (*Config) WithoutLogging ¶
WithoutLogging disables the default logging by setting LoggerProvider to nil
type Field ¶ added in v2.2.1
Field represents a key-value pair for structured logging. Use the F() function to create fields for type-safe logging.
type LogHelper ¶ added in v2.2.0
type LogHelper struct {
// contains filtered or unexported fields
}
It uses OTel logging when available (with automatic trace_id/span_id injection), otherwise falls back to plain zerolog.
This is the standard logging pattern for all packages in github.com/jasoet/pkg/v2:
- When OTel is configured: uses OTel LoggerProvider for automatic log-span correlation
- When OTel is not configured: falls back to zerolog
Usage:
logger := otel.NewLogHelper(ctx, cfg, "scope-name", "function-name")
logger.Debug("message", "key", "value")
logger.Info("message", "key", "value")
logger.Error(err, "message", "key", "value")
func NewLogHelper ¶ added in v2.2.0
NewLogHelper creates a logger that uses OTel when available, zerolog otherwise. When OTel is enabled, logs are automatically correlated with active spans.
Parameters:
- ctx: Context for trace correlation
- config: OTel configuration (can be nil for zerolog-only mode)
- scopeName: OpenTelemetry scope name (e.g., "github.com/jasoet/pkg/v2/argo")
- function: Function name to include in logs (e.g., "argo.NewClient")
Example:
// With OTel configured
logger := otel.NewLogHelper(ctx, otelConfig, "github.com/jasoet/pkg/v2/mypackage", "mypackage.DoWork")
logger.Debug("Starting work", "workerId", 123)
// Without OTel (falls back to zerolog)
logger := otel.NewLogHelper(ctx, nil, "", "mypackage.DoWork")
logger.Info("Work completed")
func (*LogHelper) Debug ¶ added in v2.2.0
Debug logs a debug-level message with optional fields. If OTel is enabled, automatically adds trace_id and span_id.
Example:
logger.Debug("Processing request", F("request_id", reqID), F("user", userID))
func (*LogHelper) Error ¶ added in v2.2.0
Error logs an error-level message with optional fields. Also sets span status to error if a span is active.
Example:
logger.Error(err, "Failed to process request", F("request_id", reqID), F("attempt", 3))
type LoggerProviderOption ¶ added in v2.4.8
type LoggerProviderOption func(*loggerProviderConfig)
LoggerProviderOption configures LoggerProvider behavior
func WithConsoleOutput ¶ added in v2.4.8
func WithConsoleOutput(enabled bool) LoggerProviderOption
WithConsoleOutput enables console logging alongside OTLP
func WithLogLevel ¶ added in v2.4.9
func WithLogLevel(level LogLevel) LoggerProviderOption
WithLogLevel sets the log level for console output Valid levels: "debug", "info", "warn", "error", "none" If not specified, defaults to "info" (or "debug" if debug parameter is true)
func WithOTLPEndpoint ¶ added in v2.4.8
func WithOTLPEndpoint(endpoint string, insecure bool) LoggerProviderOption
WithOTLPEndpoint enables OTLP log export