Distributed Tracing Beispiele

Umfassende Beispiele für verteiltes Tracing mit Jaeger, OpenTelemetry und modernen Observability Tools

Key Facts

Category
Observability
Items
6
Format Families
json, yaml, text

Sample Overview

Umfassende Beispiele für verteiltes Tracing mit Jaeger, OpenTelemetry und modernen Observability Tools This sample set belongs to Observability and can be used to test related workflows inside Elysia Tools.

⚙️ Jaeger Konfiguration

🟡 intermediate ⭐⭐⭐

Vollständige Jaeger-Konfiguration für End-to-End Tracing

⏱️ 20 min 🏷️ 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:

📝 Microservice Flow

🟡 intermediate ⭐⭐⭐

Vollständiges Beispiel für Tracing zwischen Services

⏱️ 10 min 🏷️ 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"
      }
    }
  ]
}

💻 Kontext-Propagation

🟡 intermediate ⭐⭐⭐

Implementierungsbeispiel für Kontext-Propagation

⏱️ 15 min 🏷️ 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()
    }
  })
}

⚙️ OpenTelemetry Instrumentation

🔴 complex ⭐⭐⭐⭐

Auto-Instrumentation für mehrere Sprachen

⏱️ 25 min 🏷️ 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();

⚙️ Performance-Analyse

🔴 complex ⭐⭐⭐⭐

Erweiterte Konfiguration für Performance-Analyse

⏱️ 30 min 🏷️ 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

⚙️ OTEL Collector Pipeline

🔴 complex ⭐⭐⭐⭐

Konfiguration für Verarbeitung und Export

⏱️ 25 min 🏷️ 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]