Lab 13: Observability

Time: 60 minutes | Level: Architect | Docker: docker run -it --rm php:8.3-cli bash

Overview

Observability consists of three pillars: traces, metrics, and logs. This lab implements distributed tracing with OpenTelemetry PHP SDK, metrics collection concepts, and structured logging with Monolog.


Step 1: Setup

mkdir /tmp/otellab && cd /tmp/otellab

# Install OpenTelemetry SDK
composer require open-telemetry/sdk:^1.0 --no-interaction

# For logs
composer require monolog/monolog:^3.0 --no-interaction
<?php
require 'vendor/autoload.php';

use OpenTelemetry\SDK\Trace\TracerProvider;
use OpenTelemetry\SDK\Trace\SpanExporter\InMemoryExporter;
use OpenTelemetry\SDK\Trace\SpanProcessor\SimpleSpanProcessor;

// Quick check
$exporter = new InMemoryExporter();
$provider = new TracerProvider(new SimpleSpanProcessor($exporter));
$tracer   = $provider->getTracer('test');
$span     = $tracer->spanBuilder('hello')->startSpan();
$span->end();
$provider->shutdown();

echo "OpenTelemetry spans: " . count($exporter->getSpans()) . "\n";

📸 Verified Output:


Step 2: TracerProvider & Span Basics

📸 Verified Output:


Step 3: Context Propagation (W3C TraceContext)


Step 4: Span Processor & Batch Export


Step 5: Custom Metrics (Manual Instrumentation)


Step 6: Structured Logging with Monolog

📸 Verified Output:


Step 7: Tracing Middleware


Step 8: Capstone — Observability Bundle

📸 Verified Output:


Summary

Pillar
Tool
Key Concept

Tracing

OpenTelemetry SDK

TracerProviderTracerSpan

Span types

SpanKind

SERVER, CLIENT, PRODUCER, CONSUMER, INTERNAL

Propagation

W3C TraceContext

traceparent header

Metrics

Custom/Prometheus

Counter, Gauge, Histogram

Logging

Monolog

Structured JSON, processors

Export

InMemoryExporter

Dev/test; use OTLP for production

Span lifecycle

start()setAttribute()addEvent()end()

Error recording

recordException($e) + setStatus(ERROR)

Context

$span->activate()$scope->detach()

Current span context

Batch export

BatchSpanProcessor

Production performance

Last updated