otel

package module
v0.0.0-...-d659e34 Latest Latest
Warning

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

Go to latest
Published: Jul 10, 2026 License: MIT Imports: 18 Imported by: 0

README

phuslog OpenTelemetry Logs Adapter

This submodule is for applications that want OpenTelemetry Logs API compatibility while keeping phuslog JSON as the log output format. It bridges OpenTelemetry Logs API records to github.com/phuslu/log, preserving common OpenTelemetry metadata such as severity, trace context, scope, and attributes as JSON fields.

It is not an OTLP exporter and does not implement the OpenTelemetry SDK pipeline. To send logs to an OpenTelemetry Collector, write phuslog JSON to stdout or a file and configure a Collector receiver, or use an OpenTelemetry SDK exporter separately.

package main

import (
	"context"

	phuslog "github.com/phuslu/log"
	phuslogotel "github.com/phuslu/log/otel"
	otellog "go.opentelemetry.io/otel/log"
)

func main() {
	var logger otellog.Logger = phuslogotel.Logger{
		Log: phuslog.Logger{
			Level: phuslog.InfoLevel,
		},
	}

	var record otellog.Record
	record.SetSeverity(otellog.SeverityInfo)
	record.SetBody(otellog.StringValue("hello from otel"))
	record.AddAttributes(otellog.String("component", "worker"))

	logger.Emit(context.Background(), record)
}

Use LoggerProvider when integrating with OpenTelemetry code that expects a log.LoggerProvider.

Use StdoutExporter when the output should be standard OpenTelemetry stdout log JSON instead of phuslog flat JSON:

package main

import (
	"context"
	"os"

	phuslogotel "github.com/phuslu/log/otel"
	"go.opentelemetry.io/otel/log/global"
	otellog "go.opentelemetry.io/otel/log"
	sdklog "go.opentelemetry.io/otel/sdk/log"
)

func main() {
	ctx := context.Background()
	exporter := &phuslogotel.StdoutExporter{Writer: os.Stdout}
	provider := sdklog.NewLoggerProvider(
		sdklog.WithProcessor(sdklog.NewBatchProcessor(exporter)),
	)
	defer provider.Shutdown(ctx)
	global.SetLoggerProvider(provider)

	logger := global.Logger("example")
	var record otellog.Record
	record.SetSeverity(otellog.SeverityInfo)
	record.SetBody(otellog.StringValue("hello from otel stdout"))
	record.AddAttributes(otellog.String("component", "worker"))

	logger.Emit(ctx, record)
}

Performance

Benchmarks compare the phuslog flat JSON adapter, the phuslog stdout exporter, and the official OpenTelemetry stdoutlog exporter, all writing equivalent nested log records as JSON to io.Discard. The official stdoutlog benchmark is an exporter-only lower bound; it skips the SDK logger and processor path. In this nested-record benchmark, the direct adapter path runs with 0 B/op and 0 allocs/op.

Measured with Go 1.26.2 on linux/arm64:

go test -run=^$ -bench='Benchmark(PhusluLoggerEmitNestedValues|PhusluStdoutExporterNestedValues|OTelStdoutExporterNestedValues)$' -benchmem -count=10

Representative result:

BenchmarkPhusluLoggerEmitNestedValues-4         1219254    999.2 ns/op     0 B/op   0 allocs/op
BenchmarkPhusluStdoutExporterNestedValues-4      400059   2858 ns/op    1264 B/op   5 allocs/op
BenchmarkOTelStdoutExporterNestedValues-4         64694  18546 ns/op    2178 B/op  41 allocs/op

Across 10 runs:

Benchmark Path Result range
BenchmarkPhusluLoggerEmitNestedValues otellog.Record to phuslog JSON 967.5-1003 ns/op, 0 B/op, 0 allocs/op
BenchmarkPhusluStdoutExporterNestedValues sdklog.Record through StdoutExporter 2795-2993 ns/op, 1264 B/op, 5 allocs/op
BenchmarkOTelStdoutExporterNestedValues sdklog.Record through stdoutlog 18303-18773 ns/op, 2177-2178 B/op, 41 allocs/op

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type FieldNames

type FieldNames struct {
	Timestamp       string
	ObservedTime    string
	EventName       string
	SeverityNumber  string
	SeverityText    string
	TraceID         string
	SpanID          string
	TraceFlags      string
	ScopeName       string
	ScopeVersion    string
	ScopeSchemaURL  string
	ScopeAttributes string
}

FieldNames controls the phuslog fields used for OpenTelemetry metadata.

type Logger

type Logger struct {
	embedded.Logger

	// Logger specifies the output logger.
	Log log.Logger

	// FieldNames overrides non-empty OpenTelemetry metadata field names.
	FieldNames FieldNames

	// DisableTraceContext disables trace_id, span_id, and trace_flags extraction.
	DisableTraceContext bool

	// DisableScopeFields disables instrumentation scope fields from LoggerProvider.
	DisableScopeFields bool
	// contains filtered or unexported fields
}

Logger bridges OpenTelemetry log records into a phuslog Logger.

func (Logger) Emit

func (l Logger) Emit(ctx context.Context, record otellog.Record)

Emit emits an OpenTelemetry log record to log.

func (Logger) Enabled

func (l Logger) Enabled(_ context.Context, param otellog.EnabledParameters) bool

Enabled reports whether the logger would emit a record with param.

type LoggerProvider

type LoggerProvider struct {
	embedded.LoggerProvider

	// Log specifies the output logger.
	Log log.Logger

	// FieldNames overrides non-empty OpenTelemetry metadata field names.
	FieldNames FieldNames

	// DisableTraceContext disables trace_id, span_id, and trace_flags extraction.
	DisableTraceContext bool

	// DisableScopeFields disables instrumentation scope fields.
	DisableScopeFields bool
}

LoggerProvider creates OpenTelemetry loggers backed by a phuslog Logger.

func (LoggerProvider) Logger

func (p LoggerProvider) Logger(name string, options ...otellog.LoggerOption) otellog.Logger

Logger returns a scoped OpenTelemetry logger.

type StdoutExporter

type StdoutExporter struct {
	// Writer is the destination. If nil, os.Stdout is used.
	Writer io.Writer

	// PrettyPrint prettifies the emitted output.
	PrettyPrint bool

	// DisableTimestamps omits timestamp fields from the emitted output.
	DisableTimestamps bool
	// contains filtered or unexported fields
}

StdoutExporter writes OpenTelemetry SDK log records as standard stdout JSON.

func (*StdoutExporter) Export

func (e *StdoutExporter) Export(ctx context.Context, records []sdklog.Record) error

Export writes records to the configured writer.

func (*StdoutExporter) ForceFlush

func (*StdoutExporter) ForceFlush(context.Context) error

ForceFlush performs no action.

func (*StdoutExporter) Shutdown

func (e *StdoutExporter) Shutdown(context.Context) error

Shutdown shuts down the Exporter.

Jump to

Keyboard shortcuts

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