Elysia Tools
Navigation
Observability
Distributed Tracing Samples
Comprehensive distributed tracing examples using Jaeger, OpenTelemetry, and other modern observability tools for microservices architecture
Samples
Entries inside this sample collection
Jaeger Distributed Tracing Setup
Complete Jaeger deployment configuration with collectors, agents, and UI for end-to-end distributed tracing
Difficulty
6/10
Estimated time
20 min
Tags
jaeger, collector, agent, deployment, sampling, storage
# Jaeger Configuration File
# Complete setup for production distributed tracing
version: '3.8'
services:
# Jaeger Collector
jaeger-collector:
image: jaegertracing/jaeger-collector:1.45
environment:
- SPAN_STORAGE_TYPE=elasticsearch
- ES_SERVER_URLS=http://elasticsearch:9200
- ES_USERNAME=elastic
- ES_PASSWORD=changeme
- ES_INDEX_PREFIX=jaeger
- COLLECTOR_ZIPKIN_HOST_PORT=:9411
- COLLECTOR_OTLP_ENABLED=true
ports:
- "14269:14269"
- "14268:14268"
- "14250:14250"
- "9411:9411"
depends_on:
- elasticsearch
# Jaeger Agent
jaeger-agent:
image: jaegertracing/jaeger-agent:1.45
command: ["--reporter.grpc.host-port=jaeger-collector:14250"]
ports:
- "6831:6831/udp"
- "6832:6832/udp"
depends_on:
- jaeger-collector
# Jaeger Query Service
jaeger-query:
image: jaegertracing/jaeger-query:1.45
environment:
- SPAN_STORAGE_TYPE=elasticsearch
- ES_SERVER_URLS=http://elasticsearch:9200
- ES_USERNAME=elastic
- ES_PASSWORD=changeme
- ES_INDEX_PREFIX=jaeger
- JAEGER_UI_CONFIG_JSON=/etc/jaeger-ui-config.json
ports:
- "16686:16686"
- "16687:16687"
volumes:
- ./jaeger-ui-config.json:/etc/jaeger-ui-config.json
depends_on:
- elasticsearch
# Elasticsearch Backend
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.8.0
environment:
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms1g -Xmx1g
- xpack.security.enabled=false
ports:
- "9200:9200"
volumes:
- elasticsearch_data:/usr/share/elasticsearch/data
volumes:
elasticsearch_data:- format
- YAML
- version
- 1.x
- components
- ["collector","agent","query-service","ui"]
- storage
- elasticsearch
- features
- ["sampling","compression","batch-processing"]
OpenTelemetry Auto-Instrumentation
OpenTelemetry auto-instrumentation configuration for Java, Python, Node.js, and Go applications with custom spans
Difficulty
7/10
Estimated time
25 min
Tags
opentelemetry, instrumentation, auto-instrument, telemetry, metrics, tracing
# OpenTelemetry Auto-Instrumentation Configuration
# Example configuration for Java applications
# Environment Variables
export OTEL_SERVICE_NAME=my-service
export OTEL_RESOURCE_ATTRIBUTES=service.name=my-service,service.version=1.0.0
export OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
export OTEL_TRACES_SAMPLER=traceidratio
export OTEL_TRACES_SAMPLER_ARG=1.0
# Java Agent Configuration
-javaagent:/app/opentelemetry-javaagent.jar -Dotel.service.name=my-service -Dotel.resource.attributes=service.name=my-service,service.version=1.0.0 -Dotel.exporter.otlp.endpoint=http://otel-collector:4317 -Dotel.traces.sampler=traceidratio -Dotel.traces.sampler.arg=1.0 -Dotel.javaagent.extensions=io.opentelemetry.extension.noopapi.NoOpApiExtension
# Custom Span Creation (Java Example)
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
Tracer tracer = OpenTelemetry.getGlobalTracer("my-service");
Span span = tracer.spanBuilder("custom-operation")
.setAttribute("user.id", "12345")
.setAttribute("operation.type", "business")
.startSpan();
// Do work here...
span.end();- format
- JSON
- specification
- OpenTelemetry
- languages
- ["java","python","nodejs","go","dotnet"]
- features
- ["auto-instrumentation","custom-spans","baggage","propagation"]
Microservices Request Flow Trace
Sample distributed trace showing request flow across multiple microservices with correlation IDs and context propagation
Difficulty
5/10
Estimated time
10 min
Tags
microservices, request-flow, correlation, context-propagation, span-tree
{
"trace_id": "550e8400-e29b-41d4-a716-446655440000",
"spans": [
{
"trace_id": "550e8400-e29b-41d4-a716-446655440000",
"span_id": "550e8400-e29b-41d4-a716-446655440001",
"parent_span_id": null,
"operation_name": "HTTP GET /api/orders",
"service_name": "api-gateway",
"start_time": 1701954645123000000,
"end_time": 1701954645156000000,
"duration_ms": 33,
"tags": {
"http.method": "GET",
"http.url": "/api/orders",
"http.status_code": "200",
"component": "netty"
},
"logs": [
{
"timestamp": 1701954645140000000,
"level": "info",
"message": "Request authenticated successfully"
}
]
},
{
"trace_id": "550e8400-e29b-41d4-a716-446655440000",
"span_id": "550e8400-e29b-41d4-a716-446655440002",
"parent_span_id": "550e8400-e29b-41d4-a716-446655440001",
"operation_name": "UserService.GetUser",
"service_name": "user-service",
"start_time": 1701954645130000000,
"end_time": 1701954645145000000,
"duration_ms": 15,
"tags": {
"user.id": "12345",
"db.system": "postgresql",
"operation.type": "query"
}
},
{
"trace_id": "550e8400-e29b-41d4-a716-446655440000",
"span_id": "550e8400-e29b-41d4-a716-446655440003",
"parent_span_id": "550e8400-e29b-41d4-a716-446655440001",
"operation_name": "OrderService.GetOrders",
"service_name": "order-service",
"start_time": 1701954645132000000,
"end_time": 1701954645152000000,
"duration_ms": 20,
"tags": {
"user.id": "12345",
"operation.type": "business"
}
}
]
}- format
- JSON
- services
- ["api-gateway","user-service","order-service","payment-service","notification-service"]
- spanTypes
- ["http","database","cache","message-queue"]
- complexity
- multi-service
Performance Bottleneck Detection
Advanced tracing configuration for identifying performance bottlenecks with detailed span attributes and error tracking
Difficulty
8/10
Estimated time
30 min
Tags
performance, bottleneck, analysis, optimization, error-tracking, metrics
# Performance Analysis Configuration
# Example setup for performance bottleneck detection
# Custom Span Attributes
attributes:
- database.query.duration
- cache.hit_ratio
- memory.usage
- cpu.utilization
# Performance Thresholds
thresholds:
slow_query: 100ms
high_memory: 80%
high_cpu: 90%
# Alert Configuration
alerts:
- name: Slow Database Queries
condition: span.duration > 100ms
severity: warning- format
- YAML
- features
- ["span-attributes","error-tracking","slow-queries","memory-usage","cpu-profiling"]
- alerts
- ["threshold-based","anomaly-detection"]
- integrations
- ["prometheus","grafana"]
OpenTelemetry Collector Pipeline
OpenTelemetry Collector configuration for processing, filtering, and exporting traces to multiple backends
Difficulty
7/10
Estimated time
25 min
Tags
otel-collector, pipeline, processors, exporters, receivers
# OpenTelemetry Collector Configuration
receivers:
otlp:
protocols:
grpc:
http:
processors:
memory_limiter:
check_interval: 5s
limit_mib: 512
batch:
timeout: 5s
send_batch_size: 1024
attributes:
actions:
- key: environment
value: production
action: insert
exporters:
otlp/jaeger:
endpoint: jaeger-collector:4317
tls:
insecure: true
logging:
loglevel: info
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch, attributes]
exporters: [otlp/jaeger, logging]- format
- YAML
- version
- 0.x
- components
- ["receivers","processors","exporters","extensions"]
- backends
- ["jaeger","zipkin","prometheus","elasticsearch"]
- features
- ["batch-processing","sampling","filtering","transformation"]
Cross-Service Context Propagation
Implementation example of context propagation between microservices using OpenTelemetry context API and custom headers
Difficulty
6/10
Estimated time
15 min
Tags
context-propagation, headers, cross-service, correlation, baggage
// Context propagation across services (Node.js + OpenTelemetry)
import { context, propagation, trace } from '@opentelemetry/api'
const tracer = trace.getTracer('orders-service')
export async function handleIncomingRequest(req, res) {
// Extract trace context from inbound HTTP headers
const parentContext = propagation.extract(context.active(), req.headers)
await context.with(parentContext, async () => {
const span = tracer.startSpan('handle-order-request')
try {
span.setAttribute('http.route', req.url)
span.setAttribute('service.name', 'orders-service')
// Inject context when calling downstream service
const headers = {}
const spanContext = trace.setSpan(context.active(), span)
propagation.inject(spanContext, headers)
const response = await fetch('http://inventory-service/check', {
method: 'POST',
headers: {
...headers,
'content-type': 'application/json'
},
body: JSON.stringify({ sku: req.body.sku, quantity: req.body.quantity })
})
if (!response.ok) {
span.setAttribute('error', true)
span.setAttribute('http.status_code', response.status)
}
res.status(200).json({ ok: true })
} catch (error) {
span.recordException(error)
span.setAttribute('error', true)
res.status(500).json({ ok: false })
} finally {
span.end()
}
})
}- format
- JavaScript
- apis
- ["@opentelemetry/api","@opentelemetry/sdk-node"]
- concepts
- ["context","baggage","propagators","extract","inject"]
- protocols
- ["http","grpc","messaging"]
Tools
Tools frequently paired with this sample
Related