otelslog

package module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 15, 2023 License: MIT Imports: 6 Imported by: 1

README

OpenTelemetry handler

GitHub Workflow Status go.dev reference Go Version built with nix

log/slog handler attaching OpenTelemetry trace details to logs.

Installation

go get github.com/go-slog/otelslog

Usage

Wrap an existing handler:

import(
    "log/slog"

    "github.com/go-slog/otelslog"
)

var handler slog.Handler

// Set up your handler
// handler = ...

// Wrap Handler
handler = otelslog.NewHandler(handler)

logger := slog.New(handler)

// Call logger with a context

logger.InfoContext(ctx, "hello world")

// Output: level=INFO msg="hello world" trace_id=74726163655f69645f74657374313233 span_id=7370616e5f696431

Use it as a middleware in slogmulti.Pipe:

import (
    "github.com/go-slog/otelslog"
    "github.com/samber/slog-multi"
)

handler = slogmulti.Pipe(otelslog.Middleware()).Handler(handler)

// Set p logger
// ...

Development

Run tests:

go test -race -v ./...

Run linter:

golangci-lint run

License

The project is licensed under the MIT License.

Documentation

Overview

Package otelslog provides an slog.Handler that attaches OpenTelemetry trace details to logs.

Package otelslog provides an slog.Handler that attaches OpenTelemetry trace details to logs.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Middleware

func Middleware() func(slog.Handler) slog.Handler

Middleware returns a Middleware for an slogmulti.Pipe handler.

func NewHandler

func NewHandler(handler slog.Handler) slog.Handler

NewHandler returns a new Handler.

func WithResource added in v0.1.0

func WithResource(logger *slog.Logger, res *resource.Resource) *slog.Logger

WithResource returns an slog.Logger with all attributes attached from a resource.Resource.

Example
// Set up handler
handler := testHandler()

// Set up logger
logger := slog.New(handler)

res, _ := resource.New(
	context.Background(),
	resource.WithAttributes(
		attribute.String("service.name", "my-service"),
		attribute.String("service.version", "1.0.0"),
		attribute.Bool("debug", false),
		attribute.Float64("sampling", 0.6),
	),
)

// Attach resource details to logger
logger = otelslog.WithResource(logger, res)

// Call logger
logger.Info("hello world")
Output:

time=0001-01-01T00:00:00.000Z level=INFO msg="hello world" debug=false sampling=0.6 service.name=my-service service.version=1.0.0

Types

type Handler

type Handler struct {
	slog.Handler
}

Handler attaches details from an OpenTelemetry trace to each log record.

Example
package main

import (
	"context"
	"log/slog"
	"os"
	"time"

	"go.opentelemetry.io/otel/trace"

	"github.com/go-slog/otelslog"
)

func testHandler() slog.Handler {
	return slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
		AddSource: false,
		Level:     nil,
		ReplaceAttr: func(_ []string, a slog.Attr) slog.Attr {
			if a.Key == slog.TimeKey {
				a.Value = slog.TimeValue(time.Time{})
			}

			return a
		},
	})
}

func testContext() context.Context {
	ctx := context.Background()

	spanContext := trace.NewSpanContext(trace.SpanContextConfig{
		TraceID: [16]byte{116, 114, 97, 99, 101, 95, 105, 100, 95, 116, 101, 115, 116, 49, 50, 51},
		SpanID:  [8]byte{115, 112, 97, 110, 95, 105, 100, 49},
	})
	ctx = trace.ContextWithSpanContext(ctx, spanContext)

	return ctx
}

func main() {
	var handler slog.Handler

	// Set up handler
	handler = testHandler()

	// Wrap handler
	handler = otelslog.NewHandler(handler)

	// Set up logger
	logger := slog.New(handler)

	// later in some trace context (eg. http request)

	ctx := testContext()

	// Call logger with a context
	logger.InfoContext(ctx, "hello world")

}
Output:

time=0001-01-01T00:00:00.000Z level=INFO msg="hello world" trace_id=74726163655f69645f74657374313233 span_id=7370616e5f696431

func (Handler) Handle

func (h Handler) Handle(ctx context.Context, record slog.Record) error

Handle implements slog.Handler.

func (Handler) WithAttrs

func (h Handler) WithAttrs(attrs []slog.Attr) slog.Handler

WithAttrs implements slog.Handler.

func (Handler) WithGroup

func (h Handler) WithGroup(name string) slog.Handler

WithGroup implements slog.Handler.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL