Lab 13: OpenTelemetry & Micrometer

Time: 60 minutes | Level: Architect | Docker: docker run -it --rm zchencow/innozverse-java:latest bash


Overview

Production observability requires distributed traces, metrics, and structured logs. Implement OpenTelemetry Java SDK for distributed tracing with W3C TraceContext propagation, Micrometer for metrics (Counter/Timer/Gauge), and structured JSON logging with SLF4J/Logback.


Step 1: Observability Pillars

Three pillars of observability:
  TRACES  — distributed execution paths (WHO called WHAT and WHEN)
  METRICS — aggregated numeric measurements (HOW MANY, HOW FAST, HOW BIG)
  LOGS    — discrete events with context (WHAT HAPPENED)

OpenTelemetry unifies all three:
  Traces  → OTel SDK → OTLP → Jaeger/Tempo
  Metrics → OTel SDK → OTLP → Prometheus/Victoria
  Logs    → OTel SDK → OTLP → Loki/Elasticsearch

Java ecosystem:
  Traces:  OpenTelemetry Java SDK (opentelemetry-sdk)
  Metrics: Micrometer (micrometer-core) → OTel bridge or Prometheus
  Logs:    SLF4J + Logback (with JSON appender) → MDC for trace correlation

Step 2: OpenTelemetry SDK Setup


Step 3: Creating Spans and Hierarchies


Step 4: W3C TraceContext Propagation


Step 5: Micrometer Metrics


Step 6: Structured Logging with SLF4J + Logback


Step 7: JVM Metrics Concepts


Step 8: Capstone — OTel Spans + Micrometer

📸 Verified Output:


Summary

Concept
API/Class
Purpose

Tracer provider

SdkTracerProvider

Root trace configuration

Span creation

tracer.spanBuilder()

Start a trace segment

Span context

makeCurrent() / Scope

Parent-child linking

Span events

span.addEvent()

Record interesting moments

Span attributes

span.setAttribute()

Structured metadata

Span exporter

SpanExporter

Send spans to backend

W3C propagation

traceparent header

Cross-service trace IDs

Counter

Counter.builder()

Monotonic count

Timer

Timer.builder()

Duration distribution

Gauge

Gauge.builder()

Current value snapshot

MDC

MDC.put()

Log/trace correlation

Last updated