
Explore observability with OpenTelemetry by building a full stack using Prometheus, Loki, Tempo, and Grafana, instrumenting metrics, logs, and traces across a distributed system.
Align expectations for mastering OpenTelemetry and practical observability, learn to instrument applications, propagate context, and interpret telemetry with hands-on labs using Prometheus, Loki, Tempo, and Grafana.
Windows users install an Ubuntu environment from the Microsoft Store, enable WSL, and work inside a Linux-like VM with Windows–Linux file system interoperability, including using explorer.exe to access Windows folders.
Explore Windows Subsystem for Linux features to seamlessly share files between Windows and Ubuntu, connect via VS Code, and run Linux commands from a Windows terminal.
Navigate the course codebase to access app-versions, front-end and worker projects, and labs, and learn to set up environments and install dependencies for instrumenting applications with compose and Kubernetes resources.
Explore the foundations of observability and how metrics, logs, and traces provide visibility, including histograms with percentiles, trace IDs, spans, SLIs, SLOs, SLAs, the four golden signals, and error budgets.
Explore observability as understanding a distributed system's behavior through external signals, learn the difference from monitoring, and discover how instrumentation reveals root causes across microservices.
Explore metrics as quantitative measurements that reveal how many, how fast, and how much a system performs, with counters, gauges, and histograms capturing latency and distribution.
Explore how histograms capture distributions with buckets and counts, using latency as an example. Interpret percentiles (p95, p99, p99.9) to understand outliers and user experience.
Explore how logs capture discrete events with raw details, compare human readable and machine readable (structured) logs, and learn log levels from debug to fatal for observability.
Explore traces and spans to map a complete request journey across services, tracking the trace ID, attributes, and parent span IDs, including external calls like the Stripe API.
Combine metrics, logs, and traces to understand system health and locate failures quickly. Use metrics for alerts and capacity planning, traces to pinpoint origins, and logs for detailed context.
Selects and measures carefully chosen, user-facing service level indicators to quantify availability and latency, ensuring dashboards reflect the complete user experience.
Define service level objectives (SLOs) as internal targets for SLIs, such as availability or latency, forming an internal commitment to service quality. They are not external SLAs.
Define service level agreements as contractual commitments that set external expectations while aligning with internal SLOs and SLIs, using buffers to avoid breaching customers' contracts.
Explore error budgets and risk management in observability, linking SLIs and SLOs to outages, downtime calculations, and when to push or pause risky deployments for reliability.
Explore the four golden signals—latency, traffic, errors, and saturation—and learn to measure response time, percentiles, demand, failure rates, and resource utilization to assess service health.
Set up the OpenTelemetry observability stack with docker and kubernetes, deploy Prometheus, Loki, Tempo, and Grafana, and trace telemetry flow from the app to Grafana through the backends.
Prometheus is a pull-based time-series database for metrics, scraped from services with labels. Use PromQL for rates, aggregations, and percentiles, and feed Grafana via the OpenTelemetry collector.
Deploy Prometheus with Docker Compose to explore metrics, configure Prometheus, and run basic PromQL queries in an observability stack. Create a root-compose.yaml to orchestrate services and verify targets.
Configure a Prometheus lab by creating Prometheus.yaml with schema validation, set a 15-second scrape interval, define targets, and set up a compose observability stack with persistent storage and port mapping.
Launch and verify Prometheus with Docker Compose, exploring observability stacks, Prometheus UI, and key metrics such as scrape duration and HTTP requests.
Deploy Loki locally and configure it similar to Prometheus, including ingestor and storage settings, set up docker-compose, add Loki as a Prometheus scrape target, and verify metrics.
Deploy Loki locally using docker compose by creating LokiConfig.yaml and extending Compose.observability.yaml. Verify readiness, inspect metrics, and prepare Prometheus to scrape Loki's components.
Connect Loki to Prometheus by adding a Loki scraping target in docker-compose, restart Prometheus, and verify Loki is healthy and actively scraped for metrics.
Explore Loki metrics in PromQL by examining the up-query, log ingestion rate, and rate calculations over time, including how scraping every 15 seconds yields a time-matrix of values.
Explore Tempo, a tracing backend that stores traces cost-effectively at scale. Indexing trace IDs and labels, compressing span contents, and enabling TraceQL queries with OpenTelemetry context propagation.
Deploy Tempo to your observability stack by configuring Tempo to receive traces via OpenTelemetry protocol over gRPC and HTTP, and extend the observability compose to run Tempo with Docker Compose.
Create Tempo-config.yaml and add Tempo to the observability compose, configure bind mounts and data volumes, then start containers and verify metrics and ready endpoints with Prometheus scraping.
Deploy Grafana as the visualization layer, and configure data sources for Prometheus, Loki, and Tempo. Start the Grafana service with Docker Compose, verify dashboards, and explore Prometheus metrics.
Deploy grafana by creating grafana-datasources.yaml, updating the observability compose, and validating Grafana, Prometheus, Loki, and Tempo data sources through docker-compose and the Grafana dashboard.
Deploy a multi-service translation app to observe end-to-end workflows with OpenTelemetry. Configure a TypeScript front-end, Python worker, and Redis queue with server-sent events for real-time updates.
Deploy a translation app locally using compose.app.yaml and a Redis-backed queue, with front end and worker on port 3001. Observe job handling and results flow for open telemetry and observability.
Explore a full-stack architecture for a translation app. OpenTelemetry collects metrics, logs, and traces from a front-end, redis queue, and Python worker, feeding Prometheus, Tempo, and Loki for Grafana visualization.
Explore the fundamentals and motivation of OpenTelemetry, and how APIs, SDKs, automatic and manual instrumentation, the collector, and semantic conventions enable out-of-the-box metrics and standardized telemetry.
OpenTelemetry offers a vendor-neutral observability framework to generate traces, metrics, and logs from your code. Instrument once and switch backends with API, SDKs, automatic instrumentation, and the collector.
Explore the OpenTelemetry APIs and SDKs, distinguishing stable interfaces from evolving implementations, and learn how APIs define spans and metrics while SDKs implement them, including batching, sampling, and exporters.
Learn how automatic instrumentation in OpenTelemetry provides telemetry for popular frameworks, then extend with manual instrumentation to add business context—spans, attributes, and metrics—enhancing observability for your applications.
Discover the OpenTelemetry collector, a vendor-agnostic data pipeline with receivers, processors, and exporters, deployable as agent or gateway to route, transform, and export telemetry to multiple backends.
Set up a local development environment for OpenTelemetry observability by migrating to development and production docker compose files with hot reloading for front-end and worker services.
Set up development and production docker compose files by duplicating compose.yaml into compose.prod.yaml and compose.dev.yaml, decoupling images from app configuration, and validating with docker compose up and hot reloading.
Explore how the OpenTelemetry collector centralizes telemetry by using receivers, pipelines, and exporters to forward data to backends like Prometheus, tempo, and Loki.
Deploy the OpenTelemetry Collector in a hands-on lab, building a configuration with OTLP receivers for traces, metrics, and logs, and configuring processors and exporters (Tempo, Prometheus, Loki) in Docker Compose.
Test and monitor the OpenTelemetry Collector by sending traces with a curl post, then verify in Tempo and inspect metrics in Prometheus via Grafana queries.
Run a hands-on lab to generate five traces with an AI companion, verify end-to-end data flow from OpenTelemetry Collector to Tempo via Grafana, and note metrics export limitations.
Expose internal OpenTelemetry collector metrics by adding a Prometheus telemetry endpoint, configure a scrape job, and validate metrics in Prometheus and Grafana.
Explore how the OpenTelemetry SDK enables metrics instrumentation, from creating counters and in-memory aggregations to periodic exporting via the collector toward Prometheus scraping.
Configure the node OpenTelemetry SDK and auto-instrumentation to export metrics via a periodic reader to the OpenTelemetry collector, validating the Prometheus-style metrics endpoint.
Instrument a sample app with custom OpenTelemetry metrics by creating metrics.ts, defining monotonic counters and duration histograms for translation requests, enqueued jobs, and validation errors.
Test and instrument the app by building the frontend, running docker-compose, and exploring custom metrics in Prometheus and Grafana, including translation requests totals, language counts, and error types.
Explore how traces flow end-to-end from client requests through a node express server to the collector using the OpenTelemetry SDK, with auto and manual instrumentation.
Learn to auto instrument a front-end for tracing by generating spans for HTTP requests and Redis operations, configure a trace exporter, deploy, and verify traces in Grafana Tempo.
Install and configure the OTLPHTTP exporter to enable auto instrumentation of traces for the translation front-end. Rebuild and run front-end container, generate requests, and view traces in Grafana tempo.
Conduct a hands-on lab to manually instrument traces by creating a tracer and spans such as translation session and validate request, set attributes, and verify in Grafana.
Engage in a hands-on lab on open telemetry by creating a tracer and active spans to instrument a translation endpoint, validate requests, enqueue translation jobs, and observe traces in Grafana.
Walks through debugging an instrumented front-end, tracing errors in a validation flow, and fixing a bug by capturing the active span return value to prevent unsafe continuation.
Refactor instrumentation code by adding a setSpanError helper and a centralized validateTranslationRequest function, improving OpenTelemetry tracing and error handling.
Explore how the OpenTelemetry SDK instruments logs, auto-injects trace and span IDs, and exports them from the collector to Loki via OTLP, with WinStone logging and manual instrumentation.
Instrument logs with auto instrumentation to inject trace and span IDs for log-to-trace correlation in Grafana. Replace console logs with logger calls and export logs via otlp-http for Loki, OpenTelemetry.
Apply auto instrumentation for logs with a Winston logger and OTLP log exporter, migrate console logs to structured attributes, and run the front-end to observe observability in the Grafana dashboard.
Test deployment by looping curl requests to generate translations and then review Grafana logs and Tempo traces, using the trace ID to retrieve trace information.
Apply manual instrumentation to the front-end by logging events such as validation failures, translation sessions, and SSE activity, verify trace and span IDs, and study logs with the AI companion.
Instrument the frontend with manual log statements using an AI assistant, applying snake case and open telemetry semantic conventions to produce meaningful, searchable logs and traces.
Configure Grafana data sources with stable UIDs to enable log-trace correlation between Loki, Tempo, and OpenTelemetry traces, using derived fields to map trace IDs and service names.
Configure and explore log-trace correlations in a hands-on lab, integrating Grafana with Loki, Prometheus, and Tempo, and learn to jump between logs and traces for end-to-end observability.
Refactor the front-end instrumentation to remove hard-coded service names and endpoints, replacing them with environment variables auto-configured by OpenTelemetry, and apply the same for the worker service before deployment.
Refactor configuration for OpenTelemetry observability by replacing hardcoded endpoints with environment variables via docker compose, wiring OTLP traces, metrics, and logs, and standardizing export intervals.
Instrument the distributed system end-to-end with Python worker auto instrumentation, collecting metrics, logs, and traces while enabling distributed context propagation to unify front-end and worker telemetry for Loki.
Apply worker logs auto-instrumentation by configuring OpenTelemetry logs with environment-based resources, a batch log record processor, and otlp exporters, then deploy and visualize logs in Grafana Loki.
Instrument a worker to send traces to the OpenTelemetry collector using auto-instrumentation, configure a traces pipeline for Redis operations to produce spans in Grafana Tempo, deploy and verify.
OpenTelemetry for observability lab demonstrates auto-instrumenting a worker by updating instrumentation.py, configuring trace pipeline components, deploying with docker compose, and validating traces in Grafana.
Welcome to OpenTelemetry for Observability: The Complete Course! Are you ready to take full control of your distributed systems and build the production-grade observability platform your applications deserve? This course is designed to take you from observability fundamentals to a fully instrumented, Kubernetes-deployed system - using OpenTelemetry, Prometheus, Loki, Tempo, and Grafana.
Why Learn OpenTelemetry and Observability?
Modern software systems are distributed, dynamic, and complex. When something breaks in production, you need answers fast — and the difference between a five-minute fix and a five-hour outage often comes down to how well your system is instrumented. Here is why mastering OpenTelemetry and observability is essential right now:
OpenTelemetry Is the Industry Standard for Telemetry: OpenTelemetry is a CNCF-graduated project and the vendor-neutral standard for generating and collecting observability data. It is rapidly replacing proprietary instrumentation SDKs across the industry. Learning OpenTelemetry means your instrumentation code is portable across any backend - Prometheus, Grafana Cloud, Datadog, Honeycomb, and beyond - without rewriting a single line.
Metrics, Logs, and Traces Are No Longer Optional: Observability is not a nice-to-have anymore. Engineering organizations operating distributed systems rely on correlated metrics, logs, and traces to detect issues, diagnose root causes, and validate reliability targets. Teams that instrument their systems correctly ship with confidence.
Prometheus and Grafana Are the Backbone of Cloud-Native Observability: Prometheus is the de facto standard for metrics collection in Kubernetes environments. Grafana is the leading visualization and exploration platform across all three signal types. Together with Loki for logs and Tempo for traces, they form a complete open-source observability stack that is production-proven at scale (and entirely free to use!).
Distributed Tracing Solves the Problems Metrics Alone Cannot: When a request fails or slows down in a system with multiple services, metrics tell you something is wrong, but traces tell you exactly where and why. OpenTelemetry distributed tracing gives you end-to-end visibility across service boundaries, including asynchronous message queue patterns where traditional tracing tools fall short.
High Market Demand for Observability Skills: As organizations shift to microservices, platform engineering, and SRE practices, the demand for engineers who understand SLIs, SLOs, error budgets, and modern instrumentation is accelerating. Observability expertise consistently differentiates candidates for senior DevOps, platform, and SRE roles.
By investing time in this course, you are building one of the most practical and transferable skill sets in modern software engineering: skills that apply regardless of the language, framework, or cloud provider your team uses.
Why Should You Choose This Course?
This course goes far beyond a surface-level introduction to OpenTelemetry. You will build and instrument a real distributed application end-to-end, using the same tools and workflows used in production environments today.
Learn by Doing with Extensive Hands-On Labs: Every concept in this course is immediately followed by a practical lab. You will instrument real code, deploy real infrastructure, and debug real issues. I provide the task, give you space to try it yourself, and then walk through the solution step by step.
Instrument a Real Distributed Application: We do not instrument a toy "Hello World" app. The course target is a distributed translation application with a Node.js frontend, a Python background worker, and a Redis queue. This multi-language, asynchronous architecture represents the kind of real-world complexity where observability truly matters.
Complete Coverage of All Three Observability Signals: Most courses focus on one signal type. This course covers metrics, logs, and traces in equal depth, including both automatic and manual instrumentation for each, applied to both services in the system.
Distributed Context Propagation Across Async Boundaries: One of the most challenging and most valuable skills in observability engineering is connecting traces across services that communicate asynchronously. This course tackles that challenge directly, walking you through bidirectional context propagation across a message queue so that a single end-to-end trace spans the entire system.
AI-Assisted Workflows Integrated Throughout: From auditing Kubernetes manifests to diagnosing deployment bugs, the course integrates AI tooling in a practical and realistic way. You will see how to use AI assistants to accelerate instrumentation, improve manifest quality, and speed up root cause analysis.
Kubernetes Deployment Included: The course does not stop at local development. You will migrate the full application and observability stack to Kubernetes using Kustomize, deploy to a live cluster, and verify that all three observability signals are flowing correctly in a real production-like environment.
Which Skills Will You Acquire During This Course?
As you progress through the lectures and labs, you will gain a comprehensive set of observability and instrumentation skills, including:
Building an Observability Stack from Scratch: You will deploy and connect Prometheus, Loki, Tempo, and Grafana, configure the OpenTelemetry Collector as a centralized telemetry pipeline, and verify that the full stack is operational before writing a single line of instrumentation code.
Defining Reliability Targets with SLIs, SLOs, and SLAs: You will learn to define user-centric Service Level Indicators, set Service Level Objectives as internal reliability targets, understand the difference between SLOs and contractual SLAs, and use error budgets to make informed decisions about deployment velocity versus stability.
Applying OpenTelemetry Automatic Instrumentation: You will enable automatic instrumentation for Node.js and Python services to capture framework-level metrics, logs, and traces with minimal code changes, giving you broad observability coverage as a starting point for both services.
Creating Custom Metrics with Counters and Histograms: You will implement manual metrics instrumentation to capture domain-specific business events that automatic instrumentation cannot surface. You will add dimensional labels to your metrics and explore them in Prometheus using PromQL.
Building Custom Spans for Business Logic Tracing: You will create manual OpenTelemetry spans to trace business-level operations inside your services, set span attributes and error status, and manage span lifecycle correctly to produce accurate, informative traces visible in Grafana Tempo.
Configuring Structured Logging with Trace Context Injection: You will replace unstructured log output with structured logging integrated with the OpenTelemetry SDK so that every log entry automatically carries trace context. You will then configure log-trace correlation in Grafana for one-click navigation between a log entry and its corresponding trace.
Implementing Distributed Context Propagation: You will manually inject and extract trace context across an asynchronous message queue boundary to connect frontend and worker spans into a single end-to-end trace. You will implement the full round trip and verify the complete trace in Grafana Tempo.
Using the Exporter Pattern for Third-Party Services: You will deploy a Redis exporter as a sidecar to collect operational metrics from Redis, which has no native OpenTelemetry support, and expose those metrics to Prometheus. This pattern applies to any third-party service in your stack.
Deploying to Kubernetes with Kustomize: You will write Kubernetes manifests for the full application and observability stack, manage multi-namespace configuration with Kustomize, deploy to a local cluster, diagnose and fix telemetry collection bugs, and verify end-to-end signal flow through a live Kubernetes environment.
Get ready to build the observability platform your distributed systems deserve. Whether you are an engineer who has never written a span in your life or a practitioner looking to master OpenTelemetry properly, this course will give you the depth, the practice, and the confidence to instrument any system, in any language, on any platform. Let's get started!