OpenTelemetry#
OpenTelemetry is an open-source observability framework designed to provide a unified standard for collecting and exporting telemetry data such as traces, metrics, and logs. It aims to make observability a built-in feature of software development, simplifying the integration and standardization of telemetry data across various services. For more details, you can read the official OpenTelemetry documentation.
Tracing#
Tracing is a form of observability that tracks the flow of requests as they move through various services in a distributed system. It provides insights into the interactions between services, highlighting performance bottlenecks and errors. The result of implementing tracing is a detailed map of the service interactions, often visualized as a trace diagram. This helps developers understand the behavior and performance of their applications. For an in-depth explanation, refer to the OpenTelemetry tracing specification.
Visualized via Grafana and Tempo
This trace is derived from this relationship between handlers:
FastStream Tracing#
OpenTelemetry tracing support in FastStream adheres to the semantic conventions for messaging systems.
To add a trace to your broker, you need to:
-
Install
FastStream
withopentelemetry-sdk
-
Configure
TracerProvider
-
Add
TelemetryMiddleware
to your broker
Exporting#
To export traces, you must select and configure an exporter yourself:
- opentelemetry-exporter-jaeger to export to Jaeger
- opentelemetry-exporter-otlp for export via gRPC or HTTP
InMemorySpanExporter
fromopentelemetry.sdk.trace.export.in_memory_span_exporter
for local tests
There are other exporters.
Configuring the export of traces via opentelemetry-exporter-otlp
:
Visualization#
To visualize traces, you can send them to a backend system that supports distributed tracing, such as Jaeger, Zipkin, or Grafana Tempo. These systems provide a user interface to visualize and analyze traces.
- Jaeger: You can run Jaeger using Docker and configure your OpenTelemetry middleware to send traces to Jaeger. For more details, see the Jaeger documentation.
- Zipkin: Similar to Jaeger, you can run Zipkin using Docker and configure the OpenTelemetry middleware accordingly. For more details, see the Zipkin documentation.
- Grafana Tempo: Grafana Tempo is a high-scale distributed tracing backend. You can configure OpenTelemetry to export traces to Tempo, which can then be visualized using Grafana. For more details, see the Grafana Tempo documentation.
Context propagation#
Quite often it is necessary to communicate with other services and to propagate the trace context, you can use the CurrentSpan object and follow the example:
Full example#
To see how to set up, visualize, and configure tracing for FastStream services, go to example.
An example includes:
- Three
FastStream
services - Exporting traces to
Grafana Tempo
viagRPC
- Visualization of traces via
Grafana
- Collecting metrics and exporting using
Prometheus
Grafana dashboard
for metrics- Examples with custom spans
- Configured
docker-compose
with the entire infrastructure
Visualized via Grafana and Tempo
Baggage#
OpenTelemetry Baggage is a context propagation mechanism that allows you to pass custom metadata or key-value pairs across service boundaries, providing additional context for distributed tracing and observability.
FastStream Baggage#
FastStream provides a convenient abstraction over baggage that allows you to:
- Initialize the baggage
- Propagate baggage through headers
- Modify the baggage
- Stop propagating baggage
Example#
To initialize the baggage and start distributing it, follow this example:
All interaction with baggage at the consumption level occurs through the CurrentBaggage object, which is automatically substituted from the context:
Note
If you consume messages in batches, then the baggage from each message will be merged into the common baggage available through the get_all
method, but you can still get a list of all the baggage from the batch using the get_all_batch
method.