OpenTelemetry Collector Integration
How to configure Telegen with OpenTelemetry Collector.
Overview
The OpenTelemetry Collector acts as a central pipeline for receiving, processing, and exporting telemetry data. Telegen exports directly to the Collector via OTLP.
┌─────────────┐ OTLP ┌─────────────────────┐ Various ┌──────────┐
│ Telegen │──────────────▶│ OTel Collector │────────────────▶│ Backends │
│ (Agent) │ │ (Gateway) │ │ │
└─────────────┘ └─────────────────────┘ └──────────┘
Basic Setup
Telegen Configuration
otlp:
endpoint: "otel-collector:4317"
insecure: true
traces:
enabled: true
metrics:
enabled: true
logs:
enabled: true
Collector Configuration
# otel-collector-config.yaml
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 5s
send_batch_size: 512
exporters:
debug:
verbosity: detailed
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [debug]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [debug]
logs:
receivers: [otlp]
processors: [batch]
exporters: [debug]
Deployment Patterns
Sidecar Pattern
Collector runs alongside Telegen on each node:
# Kubernetes DaemonSet
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: telegen-collector
spec:
template:
spec:
containers:
- name: telegen
image: ghcr.io/mirastacklabs-ai/telegen:latest
env:
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "localhost:4317"
- name: otel-collector
image: otel/opentelemetry-collector-contrib:latest
ports:
- containerPort: 4317
Gateway Pattern
Centralized collector cluster:
# Telegen on each node
otlp:
endpoint: "otel-collector.monitoring.svc:4317"
# Collector Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: otel-collector
namespace: monitoring
spec:
replicas: 3
template:
spec:
containers:
- name: collector
image: otel/opentelemetry-collector-contrib:latest
Collector Processing
Memory Limiter
Protect collector from OOM:
processors:
memory_limiter:
check_interval: 1s
limit_mib: 1024
spike_limit_mib: 256
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [...]
Tail-Based Sampling
Intelligent sampling in collector:
processors:
tail_sampling:
decision_wait: 30s
num_traces: 100000
policies:
- name: errors
type: status_code
status_code:
status_codes: [ERROR]
- name: slow-requests
type: latency
latency:
threshold_ms: 1000
- name: probabilistic
type: probabilistic
probabilistic:
sampling_percentage: 10
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, tail_sampling, batch]
exporters: [...]
Resource Detection
Enrich with infrastructure metadata:
processors:
resourcedetection:
detectors: [env, system, docker, gcp, aws, azure]
timeout: 5s
override: false
k8sattributes:
auth_type: "serviceAccount"
passthrough: false
extract:
metadata:
- k8s.pod.name
- k8s.namespace.name
- k8s.deployment.name
- k8s.node.name
Transform Processor
Modify telemetry data:
processors:
transform:
trace_statements:
- context: span
statements:
# Add custom attribute
- set(attributes["env"], "production")
# Truncate long attribute values
- truncate_all(attributes, 4096)
metric_statements:
- context: metric
statements:
# Rename metric
- set(name, Concat([name, "_renamed"], "")) where name == "old_metric"
Multi-Tenant Setup
Per-Tenant Headers
# Telegen config for tenant-a
otlp:
endpoint: "otel-collector:4317"
headers:
X-Tenant-ID: "tenant-a"
Collector Routing
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
processors:
routing:
from_attribute: X-Tenant-ID
table:
- value: tenant-a
exporters: [exporter-tenant-a]
- value: tenant-b
exporters: [exporter-tenant-b]
exporters:
otlp/tenant-a:
endpoint: "backend-a:4317"
otlp/tenant-b:
endpoint: "backend-b:4317"
service:
pipelines:
traces:
receivers: [otlp]
processors: [routing]
exporters: [otlp/tenant-a, otlp/tenant-b]
Load Balancing
Collector Behind Load Balancer
# Telegen
otlp:
endpoint: "otel-collector-lb.monitoring.svc:4317"
# Use gRPC load balancing
otlp:
endpoint: "dns:///otel-collector-headless.monitoring.svc:4317"
Kubernetes Service
apiVersion: v1
kind: Service
metadata:
name: otel-collector
spec:
type: ClusterIP
ports:
- port: 4317
targetPort: 4317
selector:
app: otel-collector
---
# Headless for DNS load balancing
apiVersion: v1
kind: Service
metadata:
name: otel-collector-headless
spec:
clusterIP: None
ports:
- port: 4317
selector:
app: otel-collector
High Availability
Collector with Kafka
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
exporters:
kafka:
brokers:
- kafka-0:9092
- kafka-1:9092
- kafka-2:9092
topic: telemetry-traces
encoding: otlp_proto
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [kafka]
Consumer Collector
receivers:
kafka:
brokers:
- kafka-0:9092
topic: telemetry-traces
encoding: otlp_proto
group_id: otel-consumer
exporters:
otlp:
endpoint: "backend:4317"
service:
pipelines:
traces:
receivers: [kafka]
processors: [batch]
exporters: [otlp]
Security
TLS Configuration
# Telegen
otlp:
endpoint: "otel-collector:4317"
tls:
ca_file: "/etc/tls/ca.crt"
cert_file: "/etc/tls/client.crt"
key_file: "/etc/tls/client.key"
# Collector
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
tls:
cert_file: /etc/tls/server.crt
key_file: /etc/tls/server.key
client_ca_file: /etc/tls/ca.crt
Authentication
# Telegen with bearer token
otlp:
endpoint: "otel-collector:4317"
headers:
Authorization: "Bearer ${OTEL_TOKEN}"
# Collector with auth extension
extensions:
bearertokenauth:
token: "${OTEL_TOKEN}"
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
auth:
authenticator: bearertokenauth
Profiles (OTLP Profiles)
For continuous profiling data:
# Collector receiving profiles
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
exporters:
otlp/pyroscope:
endpoint: "pyroscope:4317"
service:
pipelines:
profiles:
receivers: [otlp]
processors: [batch]
exporters: [otlp/pyroscope]
Example: Complete Production Setup
# otel-collector-config.yaml
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
processors:
memory_limiter:
check_interval: 1s
limit_mib: 2048
batch:
timeout: 5s
send_batch_size: 1024
resource:
attributes:
- key: environment
value: production
action: upsert
filter:
spans:
exclude:
match_type: regexp
attributes:
- key: http.target
value: "^/health.*"
exporters:
otlp/traces:
endpoint: "tempo:4317"
tls:
insecure: true
prometheusremotewrite:
endpoint: "http://mimir:9009/api/v1/push"
loki:
endpoint: "http://loki:3100/loki/api/v1/push"
service:
extensions: [health_check]
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, filter, resource, batch]
exporters: [otlp/traces]
metrics:
receivers: [otlp]
processors: [memory_limiter, resource, batch]
exporters: [prometheusremotewrite]
logs:
receivers: [otlp]
processors: [memory_limiter, resource, batch]
exporters: [loki]
extensions:
health_check:
endpoint: 0.0.0.0:13133
Next Steps
- Backends - Configure specific backends
- Monitoring - Monitor the collector
- Performance Tuning - Tune collector performance