Skip to content

Instantly share code, notes, and snippets.

@totegamma
Created October 31, 2023 10:25
Show Gist options
  • Save totegamma/100052265294670cf0272d2e61b8d5c4 to your computer and use it in GitHub Desktop.
Save totegamma/100052265294670cf0272d2e61b8d5c4 to your computer and use it in GitHub Desktop.
package main
import (
"context"
"log/slog"
"os"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
"go.opentelemetry.io/otel/trace"
)
var (
tracer = otel.Tracer("main")
)
type CustomHandler struct {
slog.Handler
}
func (h *CustomHandler) Handle(ctx context.Context, r slog.Record) error {
span := trace.SpanFromContext(ctx)
if span.SpanContext().IsValid() {
r.AddAttrs(slog.String("traceID", span.SpanContext().TraceID().String()))
r.AddAttrs(slog.String("spanID", span.SpanContext().SpanID().String()))
}
return h.Handler.Handle(ctx, r)
}
func main() {
handler := &CustomHandler{Handler: slog.NewJSONHandler(os.Stdout, nil)}
logger := slog.New(handler)
slog.SetDefault(logger)
cleanup, err := setupTraceProvider("example-service", "1.0.0")
if err != nil {
panic(err)
}
defer cleanup()
ctx, span := tracer.Start(context.Background(), "main")
defer span.End()
someFunc(ctx)
}
func someFunc(ctx context.Context) {
ctx, span := tracer.Start(ctx, "someFunc")
defer span.End()
slog.InfoContext(ctx, "someFunc called")
}
func setupTraceProvider(serviceName string, serviceVersion string) (func(), error) {
// write to file
file, err := os.OpenFile("trace.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
exporter, err := stdouttrace.New(
stdouttrace.WithPrettyPrint(),
stdouttrace.WithWriter(file),
)
if err != nil {
return nil, err
}
resource := resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String(serviceName),
semconv.ServiceVersionKey.String(serviceVersion),
)
tracerProvider := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exporter),
sdktrace.WithSampler(sdktrace.AlwaysSample()),
sdktrace.WithResource(resource),
)
otel.SetTracerProvider(tracerProvider)
cleanup := func() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
tracerProvider.Shutdown(ctx)
}
return cleanup, nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment