From harness-claude
Configures OTLP exporters to send traces, metrics, and logs to observability backends and collectors. Covers direct export vs collector-mediated export, batching, compression, and retry behavior.
How this skill is triggered — by the user, by Claude, or both
Slash command
/harness-claude:otel-exporter-configThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
> Configure OTLP exporters to send traces, metrics, and logs to observability backends and collectors
Configure OTLP exporters to send traces, metrics, and logs to observability backends and collectors
@opentelemetry/exporter-trace-otlp-http) or gRPC (@opentelemetry/exporter-trace-otlp-grpc). HTTP is simpler; gRPC has better performance for high-volume telemetry.// Direct export to backend (simple setup)
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
import { BatchSpanProcessor } from '@opentelemetry/sdk-trace-base';
import { PeriodicExportingMetricReader } from '@opentelemetry/sdk-metrics';
// Traces
const traceExporter = new OTLPTraceExporter({
url: process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT || 'http://localhost:4318/v1/traces',
headers: {
Authorization: `Bearer ${process.env.OTEL_EXPORTER_API_KEY}`,
},
compression: 'gzip',
});
const spanProcessor = new BatchSpanProcessor(traceExporter, {
maxQueueSize: 2048,
maxExportBatchSize: 512,
scheduledDelayMillis: 5000,
exportTimeoutMillis: 30000,
});
// Metrics
const metricReader = new PeriodicExportingMetricReader({
exporter: new OTLPMetricExporter({
url: process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT || 'http://localhost:4318/v1/metrics',
}),
exportIntervalMillis: 15000,
});
# otel-collector-config.yaml — Collector as telemetry pipeline
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 5s
send_batch_size: 1024
memory_limiter:
check_interval: 1s
limit_mib: 512
attributes:
actions:
- key: environment
value: production
action: upsert
exporters:
otlphttp/grafana:
endpoint: https://tempo.grafana.net
headers:
Authorization: 'Basic ${GRAFANA_API_KEY}'
prometheus:
endpoint: 0.0.0.0:8889
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch, attributes]
exporters: [otlphttp/grafana]
metrics:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [prometheus]
Direct export vs Collector:
Environment variables (standard):
OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4318
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_EXPORTER_OTLP_HEADERS=Authorization=Bearer token
OTEL_EXPORTER_OTLP_COMPRESSION=gzip
OTEL_EXPORTER_OTLP_TIMEOUT=10000
Backend-specific configurations:
// Honeycomb
new OTLPTraceExporter({
url: 'https://api.honeycomb.io/v1/traces',
headers: { 'x-honeycomb-team': process.env.HONEYCOMB_API_KEY },
});
// Grafana Cloud
new OTLPTraceExporter({
url: 'https://tempo-us-central1.grafana.net/tempo',
headers: { Authorization: `Basic ${btoa(`${instanceId}:${apiKey}`)}` },
});
// Datadog (via OTLP)
new OTLPTraceExporter({
url: 'http://datadog-agent:4318/v1/traces',
});
Console exporter for development:
import { ConsoleSpanExporter } from '@opentelemetry/sdk-trace-base';
const sdk = new NodeSDK({
traceExporter: new ConsoleSpanExporter(), // Prints traces to stdout
});
Batch processor tuning:
maxQueueSize: 2048 — max spans held in memory before droppingmaxExportBatchSize: 512 — spans sent per export callscheduledDelayMillis: 5000 — export intervalhttps://opentelemetry.io/docs/languages/js/exporters/
npx claudepluginhub intense-visions/harness-engineering --plugin harness-claudeGuides OpenTelemetry instrumentation setup across multiple languages (Node.js, Go, Python, Java, .NET, Ruby, PHP, browser, Next.js). Covers spans, metrics, logs, resource attributes, sampling, and sensitive data handling.
Instrument apps with OpenTelemetry and send telemetry to Grafana Cloud via OTLP. Covers SDK setup, Alloy collector, sampling, and migration from other observability tools.
Configures the OpenTelemetry Collector with Sentry Exporter for multi-project routing and automatic project creation. Use when setting up OTel with Sentry or routing telemetry from multiple services to Sentry projects.