Skip to content

Release Notes v0.8.0

Release Date: March 2026

Highlights

  • Unified Entry Point: New omniobserve package providing single entry point for observability with HTTP middleware
  • sloghandler package: New slog.Handler implementation with dual output (local + remote) and automatic trace context injection
  • Dynatrace provider: Full Dynatrace observability support via OTLP
  • SlogHandler integration: All observops providers now support SlogHandler() for trace-correlated logging
  • Observability specs: New specs package for structured observability specifications (OpenSLO, RED metrics)

New Features

Unified Entry Point (Phase 4)

New omniobserve package provides a single entry point for all observability needs:

import (
    "github.com/plexusone/omniobserve/omniobserve"
    _ "github.com/plexusone/omniobserve/observops/otlp"
)

obs, _ := omniobserve.New("otlp",
    omniobserve.WithServiceName("my-service"),
    omniobserve.WithServiceVersion("1.0.0"),
    omniobserve.WithEndpoint("localhost:4317"),
)
defer obs.Shutdown(ctx)

// HTTP middleware - auto-instruments requests
handler := obs.Middleware()(mux)

// Context utilities
logger := omniobserve.L(ctx)  // Get logger with trace context
span := omniobserve.S(ctx)    // Get current span
obs := omniobserve.O(ctx)     // Get observability instance

// Automatic span management
err := omniobserve.Trace(ctx, "operation", func(ctx context.Context) error {
    // Span automatically created and ended
    return doWork(ctx)
})

Features:

  • HTTP middleware: Auto-instruments requests with spans, metrics, trace ID propagation
  • Context utilities: L(), O(), S() shortcuts for logger, observability, span
  • Trace() and TraceFunc[T](): Automatic span management with error recording
  • Skip paths: Health checks (/health, /healthz, etc.) excluded by default
  • X-Trace-ID header: Trace ID propagation in response headers

sloghandler Package

A new standalone sloghandler package provides a unified slog.Handler with:

  • Dual output: Send logs to both local console and remote observability backend
  • Trace context injection: Automatic trace_id and span_id injection from OpenTelemetry spans
  • Configurable levels: Different log levels for local vs remote output
  • Attribute processors: Filter and transform log attributes
  • Fanout handler: Multi-destination logging
import "github.com/plexusone/omniobserve/sloghandler"

handler := sloghandler.New(
    sloghandler.WithLocalHandler(slog.NewJSONHandler(os.Stdout, nil)),
    sloghandler.WithRemoteHandler(remoteHandler),
    sloghandler.WithRemoteLevel(slog.LevelWarn),
    sloghandler.WithIncludeTraceContext(true),
)
slog.SetDefault(slog.New(handler))

Dynatrace Provider

New Dynatrace observability provider using OTLP/HTTP:

import _ "github.com/plexusone/omniobserve/observops/dynatrace"

provider, _ := observops.Open("dynatrace",
    observops.WithEndpoint("https://{env-id}.live.dynatrace.com/api/v2/otlp"),
    observops.WithAPIKey("dt0c01.XXX.YYY"),
    observops.WithServiceName("my-service"),
)

Features:

  • Metrics, traces, and logs support
  • SaaS, Managed, and ActiveGate endpoint formats
  • API token authentication
  • Automatic resource detection

SlogHandler on All Providers

All observops providers now implement SlogHandler():

// Works with otlp, datadog, newrelic, dynatrace
handler := provider.SlogHandler(
    observops.WithSlogLocalHandler(slog.NewJSONHandler(os.Stdout, nil)),
    observops.WithSlogRemoteLevel(slog.LevelInfo),
)
slog.SetDefault(slog.New(handler))

// Logs include trace_id and span_id automatically
slog.InfoContext(ctx, "request processed", "user_id", 123)

Observability Specs Package

New specs package for structured observability specifications:

  • OpenSLO integration: Define SLOs/SLIs using OpenSLO standard
  • RED metrics: Rate, Errors, Duration patterns for services
  • Service classes: Pre-built templates for API, Worker, Database services
  • JSON Schema generation: Generate schemas from Go types
import "github.com/plexusone/omniobserve/specs/openslo"

slo := openslo.NewAvailabilitySLO("api-availability", 0.999)

Added

  • omniobserve package with unified entry point and HTTP middleware (4dac7c2)
  • sloghandler package with dual output and trace context injection (38ca9cc)
  • observops/dynatrace provider for Dynatrace via OTLP (f671b7f)
  • SlogHandler() method on all observops providers (a5f157a)
  • SlogOption and SlogConfig types for handler configuration (afd573e)
  • specs package with OpenSLO, RED metrics, and service classes (621ad2a)
  • cmd/genspecs CLI for JSON Schema generation (00eaf6f)
  • Provider documentation in docs/providers/ (c1dfba6)

Build

  • Update to shared CI workflows (ce26e0d)
  • Rename workflow files with go- prefix (6df4d52)

Dependencies

  • Added go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp
  • Added go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
  • Added github.com/OpenSLO/go-sdk for OpenSLO support
  • Added github.com/invopop/jsonschema for schema generation
  • Updated OpenTelemetry SDK to v1.42.0