OpenTelemetry
Vendor-neutral observability framework for distributed tracing, metrics, and logs. Provides SDKs for application instrumentation and a Collector for receiving, processing, and exporting telemetry data.
Architecture
App (SDK) → OTEL Collector → Backend (Jaeger / Tempo+Grafana)
↓ ↓
Traces Pipelines:
Metrics receivers → processors → exporters
Logs
Task Reference
Go Instrumentation
- SDK setup, TracerProvider, SpanProcessor → references/languages/go.md
- Creating spans, attributes, events, status → references/languages/go.md
- HTTP/gRPC middleware, database tracing → references/languages/go.md
Trace Backends
- Jaeger deployment, UI, query patterns → references/backends/jaeger.md
- Tempo + Grafana + TraceQL queries → references/backends/tempo-grafana.md
Observability Pillars
- Spans, context propagation, sampling, perf analysis → references/observability/tracing.md
- Metrics SDK, custom metrics, exemplars → references/observability/metrics.md
- Structured logging with trace/span IDs → references/observability/log-correlation.md
Framework Instrumentation
- Django auto/manual instrumentation, ORM tracing → references/frameworks/django.md
- FastAPI instrumentation, SQLAlchemy, async patterns → references/frameworks/fastapi.md
- Go frameworks: Gin, Echo, Chi, Fiber middleware → references/frameworks/gin.md
- Node.js: Express, NestJS, Fastify, Prisma → references/frameworks/express.md
Collector Infrastructure
- OTEL Collector on Kubernetes (DaemonSet/Sidecar) → references/collector/setup.md
- Pipeline config (receivers, processors, exporters) → references/collector/setup.md
Quick Start (Go)
import (
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.26.0"
)
func initTracer(ctx context.Context) (*sdktrace.TracerProvider, error) {
exporter, err := otlptracegrpc.New(ctx,
otlptracegrpc.WithEndpoint("otel-collector:4317"),
otlptracegrpc.WithInsecure(),
)
if err != nil {
return nil, err
}
tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceNameKey.String("my-service"),
)),
)
otel.SetTracerProvider(tp)
otel.SetTextMapPropagator(propagation.TraceContext{})
return tp, nil
}
Identifying Slowdowns
- Add spans around suspected slow operations (DB queries, HTTP calls, processing loops)
- Add timing attributes —
span.SetAttributes(attribute.Int64("db.rows", count))
- Query in Jaeger/Tempo — filter by
duration > 500ms or sort by duration
- Drill into trace waterfall — identify which child span dominates total latency
- Use exemplars — link slow metric samples directly to the trace that caused them
See references/observability/tracing.md for detailed span analysis patterns.
Key Go Packages
| Package |
Purpose |
go.opentelemetry.io/otel |
Core API (tracer, propagation) |
go.opentelemetry.io/otel/sdk/trace |
TracerProvider, SpanProcessor |
go.opentelemetry.io/otel/sdk/metric |
MeterProvider, metric instruments |
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc |
OTLP gRPC trace exporter |
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc |
OTLP gRPC metric exporter |
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp |
HTTP middleware |
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc |
gRPC interceptors |
go.opentelemetry.io/otel/semconv/v1.26.0 |
Semantic conventions |
Key Python Packages
| Package |
Purpose |
opentelemetry-api |
Core API |
opentelemetry-sdk |
TracerProvider, MeterProvider |
opentelemetry-exporter-otlp-proto-grpc |
OTLP gRPC exporter |
opentelemetry-instrumentation-django |
Django auto-instrumentation |
opentelemetry-instrumentation-fastapi |
FastAPI auto-instrumentation |
opentelemetry-instrumentation-sqlalchemy |
SQLAlchemy query tracing |
opentelemetry-instrumentation-requests |
requests library tracing |
opentelemetry-instrumentation-httpx |
httpx async client tracing |
Key Node.js Packages
| Package |
Purpose |
@opentelemetry/sdk-node |
Node.js SDK (TracerProvider, etc.) |
@opentelemetry/auto-instrumentations-node |
All auto-instrumentations |
@opentelemetry/instrumentation-express |
Express middleware |
@opentelemetry/instrumentation-nestjs-core |
NestJS interceptors |
@opentelemetry/instrumentation-fastify |
Fastify plugin |
@opentelemetry/exporter-trace-otlp-grpc |
OTLP gRPC exporter |
Common Mistakes
| Mistake |
Fix |
Forgetting tp.Shutdown(ctx) |
Defer shutdown in main — flushes pending spans |
| Not propagating context |
Always pass ctx through call chain, never context.Background() |
| Too many spans (span explosion) |
Instrument boundaries (HTTP, DB, queue), not every function |
| Missing service.name resource |
Always set via semconv.ServiceNameKey — required for backend grouping |
Using SimpleSpanProcessor in prod |
Use BatchSpanProcessor — batches exports, reduces overhead |
Official Documentation
Related skill: For Grafana dashboards, Prometheus, and ServiceMonitors — see the grafana skill.
Source: kettleofketchup/KettleOfSkills — distributed by TomeVault.
1---2name: opentelemetry3description: OpenTelemetry (OTEL) distributed tracing, metrics, and log correlation. Use when instrumenting Go, Python (Django, FastAPI), or Node.js (Express, NestJS) applications with tracing/spans, instrumenting HTTP handlers or database queries, deploying OTEL Collector on Kubernetes, configuring Jaeger or Tempo/Grafana backends, identifying performance slowdowns via span analysis, correlating logs with trace context, setting up metrics with exemplars, or adding OTEL to Gin/Echo/Chi/Fiber frameworks. Use when this capability is needed.4---56# OpenTelemetry78Vendor-neutral observability framework for distributed tracing, metrics, and logs. Provides SDKs for application instrumentation and a Collector for receiving, processing, and exporting telemetry data.910## Architecture1112```13App (SDK) → OTEL Collector → Backend (Jaeger / Tempo+Grafana)14 ↓ ↓15 Traces Pipelines:16 Metrics receivers → processors → exporters17 Logs18```1920## Task Reference2122### Go Instrumentation23- SDK setup, TracerProvider, SpanProcessor → [references/languages/go.md](references/languages/go.md)24- Creating spans, attributes, events, status → [references/languages/go.md](references/languages/go.md)25- HTTP/gRPC middleware, database tracing → [references/languages/go.md](references/languages/go.md)2627### Trace Backends28- Jaeger deployment, UI, query patterns → [references/backends/jaeger.md](references/backends/jaeger.md)29- Tempo + Grafana + TraceQL queries → [references/backends/tempo-grafana.md](references/backends/tempo-grafana.md)3031### Observability Pillars32- Spans, context propagation, sampling, perf analysis → [references/observability/tracing.md](references/observability/tracing.md)33- Metrics SDK, custom metrics, exemplars → [references/observability/metrics.md](references/observability/metrics.md)34- Structured logging with trace/span IDs → [references/observability/log-correlation.md](references/observability/log-correlation.md)3536### Framework Instrumentation37- Django auto/manual instrumentation, ORM tracing → [references/frameworks/django.md](references/frameworks/django.md)38- FastAPI instrumentation, SQLAlchemy, async patterns → [references/frameworks/fastapi.md](references/frameworks/fastapi.md)39- Go frameworks: Gin, Echo, Chi, Fiber middleware → [references/frameworks/gin.md](references/frameworks/gin.md)40- Node.js: Express, NestJS, Fastify, Prisma → [references/frameworks/express.md](references/frameworks/express.md)4142### Collector Infrastructure43- OTEL Collector on Kubernetes (DaemonSet/Sidecar) → [references/collector/setup.md](references/collector/setup.md)44- Pipeline config (receivers, processors, exporters) → [references/collector/setup.md](references/collector/setup.md)4546## Quick Start (Go)4748```go49import (50 "go.opentelemetry.io/otel"51 "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"52 "go.opentelemetry.io/otel/propagation"53 "go.opentelemetry.io/otel/sdk/resource"54 sdktrace "go.opentelemetry.io/otel/sdk/trace"55 semconv "go.opentelemetry.io/otel/semconv/v1.26.0"56)5758func initTracer(ctx context.Context) (*sdktrace.TracerProvider, error) {59 exporter, err := otlptracegrpc.New(ctx,60 otlptracegrpc.WithEndpoint("otel-collector:4317"),61 otlptracegrpc.WithInsecure(),62 )63 if err != nil {64 return nil, err65 }66 tp := sdktrace.NewTracerProvider(67 sdktrace.WithBatcher(exporter),68 sdktrace.WithResource(resource.NewWithAttributes(69 semconv.SchemaURL,70 semconv.ServiceNameKey.String("my-service"),71 )),72 )73 otel.SetTracerProvider(tp)74 otel.SetTextMapPropagator(propagation.TraceContext{})75 return tp, nil76}77```7879## Identifying Slowdowns80811. Add spans around suspected slow operations (DB queries, HTTP calls, processing loops)822. Add timing attributes — `span.SetAttributes(attribute.Int64("db.rows", count))`833. Query in Jaeger/Tempo — filter by `duration > 500ms` or sort by duration844. Drill into trace waterfall — identify which child span dominates total latency855. Use exemplars — link slow metric samples directly to the trace that caused them8687See [references/observability/tracing.md](references/observability/tracing.md) for detailed span analysis patterns.8889## Key Go Packages9091| Package | Purpose |92|---------|---------|93| `go.opentelemetry.io/otel` | Core API (tracer, propagation) |94| `go.opentelemetry.io/otel/sdk/trace` | TracerProvider, SpanProcessor |95| `go.opentelemetry.io/otel/sdk/metric` | MeterProvider, metric instruments |96| `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc` | OTLP gRPC trace exporter |97| `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc` | OTLP gRPC metric exporter |98| `go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp` | HTTP middleware |99| `go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc` | gRPC interceptors |100| `go.opentelemetry.io/otel/semconv/v1.26.0` | Semantic conventions |101102## Key Python Packages103104| Package | Purpose |105|---------|---------|106| `opentelemetry-api` | Core API |107| `opentelemetry-sdk` | TracerProvider, MeterProvider |108| `opentelemetry-exporter-otlp-proto-grpc` | OTLP gRPC exporter |109| `opentelemetry-instrumentation-django` | Django auto-instrumentation |110| `opentelemetry-instrumentation-fastapi` | FastAPI auto-instrumentation |111| `opentelemetry-instrumentation-sqlalchemy` | SQLAlchemy query tracing |112| `opentelemetry-instrumentation-requests` | requests library tracing |113| `opentelemetry-instrumentation-httpx` | httpx async client tracing |114115## Key Node.js Packages116117| Package | Purpose |118|---------|---------|119| `@opentelemetry/sdk-node` | Node.js SDK (TracerProvider, etc.) |120| `@opentelemetry/auto-instrumentations-node` | All auto-instrumentations |121| `@opentelemetry/instrumentation-express` | Express middleware |122| `@opentelemetry/instrumentation-nestjs-core` | NestJS interceptors |123| `@opentelemetry/instrumentation-fastify` | Fastify plugin |124| `@opentelemetry/exporter-trace-otlp-grpc` | OTLP gRPC exporter |125126## Common Mistakes127128| Mistake | Fix |129|---------|-----|130| Forgetting `tp.Shutdown(ctx)` | Defer shutdown in main — flushes pending spans |131| Not propagating context | Always pass `ctx` through call chain, never `context.Background()` |132| Too many spans (span explosion) | Instrument boundaries (HTTP, DB, queue), not every function |133| Missing service.name resource | Always set via `semconv.ServiceNameKey` — required for backend grouping |134| Using `SimpleSpanProcessor` in prod | Use `BatchSpanProcessor` — batches exports, reduces overhead |135136## Official Documentation137- [OpenTelemetry Go SDK](https://opentelemetry.io/docs/languages/go/)138- [OpenTelemetry Python SDK](https://opentelemetry.io/docs/languages/python/)139- [OpenTelemetry JS SDK](https://opentelemetry.io/docs/languages/js/)140- [OTEL Collector](https://opentelemetry.io/docs/collector/)141- [Semantic Conventions](https://opentelemetry.io/docs/specs/semconv/)142143> **Related skill:** For Grafana dashboards, Prometheus, and ServiceMonitors — see the `grafana` skill.144145---146> Source: [kettleofketchup/KettleOfSkills](https://github.com/kettleofketchup/KettleOfSkills) — distributed by [TomeVault](https://tomevault.io).147<!-- tomevault:4.0:skill_md:2026-05-22 -->