OpenTelemetry.Instrumentation.ConfluentKafka
0.2.0-alpha.2
Prefix Reserved
dotnet add package OpenTelemetry.Instrumentation.ConfluentKafka --version 0.2.0-alpha.2
NuGet\Install-Package OpenTelemetry.Instrumentation.ConfluentKafka -Version 0.2.0-alpha.2
<PackageReference Include="OpenTelemetry.Instrumentation.ConfluentKafka" Version="0.2.0-alpha.2" />
<PackageVersion Include="OpenTelemetry.Instrumentation.ConfluentKafka" Version="0.2.0-alpha.2" />
<PackageReference Include="OpenTelemetry.Instrumentation.ConfluentKafka" />
paket add OpenTelemetry.Instrumentation.ConfluentKafka --version 0.2.0-alpha.2
#r "nuget: OpenTelemetry.Instrumentation.ConfluentKafka, 0.2.0-alpha.2"
#:package OpenTelemetry.Instrumentation.ConfluentKafka@0.2.0-alpha.2
#addin nuget:?package=OpenTelemetry.Instrumentation.ConfluentKafka&version=0.2.0-alpha.2&prerelease
#tool nuget:?package=OpenTelemetry.Instrumentation.ConfluentKafka&version=0.2.0-alpha.2&prerelease
Confluent.Kafka client instrumentation for OpenTelemetry
| Status | |
|---|---|
| Stability | Development |
| Code Owners | @g7ed6e |
Usage
To use the OpenTelemetry.Instrumentation.ConfluentKafka package, follow these
steps:
Install the package:
dotnet add package OpenTelemetry.Instrumentation.ConfluentKafka --prereleaseConfigure OpenTelemetry in your application:
using Confluent.Kafka; using OpenTelemetry.Metrics; using OpenTelemetry.Trace; var builder = Host.CreateApplicationBuilder(args); const string bootstrapServers = "localhost:9092"; builder.Services.AddSingleton(_ => { ProducerConfig producerConfig = new() { BootstrapServers = bootstrapServers }; return new InstrumentedProducerBuilder<string, string>(producerConfig); }); builder.Services.AddSingleton(_ => { ConsumerConfig consumerConfigA = new() { BootstrapServers = bootstrapServers, GroupId = "group-a", AutoOffsetReset = AutoOffsetReset.Earliest, EnablePartitionEof = true, }; return new InstrumentedConsumerBuilder<string, string>(consumerConfigA); }); builder.Services.AddOpenTelemetry() .WithTracing(tracing => { tracing.AddConsoleExporter() .AddOtlpExporter() // AddKafkaProducerInstrumentation and AddKafkaConsumerInstrumentation // are what enable Kafka traces. .AddKafkaProducerInstrumentation<string, string>() .AddKafkaConsumerInstrumentation<string, string>(); }) .WithMetrics(metering => { metering.AddConsoleExporter() .AddOtlpExporter() // AddKafkaProducerInstrumentation and AddKafkaConsumerInstrumentation // are what enable Kafka metrics. .AddKafkaProducerInstrumentation<string, string>() .AddKafkaConsumerInstrumentation<string, string>(); }); builder.Services.AddHostedService<ProduceConsumeHostedService>(); var app = builder.Build(); await app.RunAsync();
This will set up OpenTelemetry instrumentation for Confluent.Kafka producers and consumers, allowing you to collect and export telemetry data.
Metrics
The instrumentation is implemented based on the messaging metrics semantic conventions. The following metrics are produced:
| Name | Instrument Type | Unit | Description | Attributes |
|---|---|---|---|---|
messaging.client.operation.duration |
Histogram | s |
Duration of messaging operation initiated by a producer or consumer client. | messaging.operation.name, messaging.operation.type, messaging.system, messaging.destination.name[^1], messaging.destination.partition.id[^2], messaging.consumer.group.name[^3], error.type[^4] |
messaging.client.sent.messages |
Counter | {message} |
Number of messages producer attempted to send to the broker. | messaging.operation.name, messaging.operation.type, messaging.system, messaging.destination.name, messaging.destination.partition.id[^2], error.type[^4] |
messaging.client.consumed.messages |
Counter | {message} |
Number of messages that were delivered to the application. | messaging.operation.name, messaging.operation.type, messaging.system, messaging.destination.name[^1], messaging.destination.partition.id[^2], messaging.consumer.group.name[^3], error.type[^4] |
[^1]: messaging.destination.name is only included for consumer operations
when the topic partition is known (for example, it is omitted after a
PartitionEOF event that carries no topic partition).
[^2]: messaging.destination.partition.id is only included when the topic
partition is known.
[^3]: messaging.consumer.group.name is only included for consumer
operations, when a consumer group ID is configured.
[^4]: error.type is only included when an error occurs.
Runnable example
A complete end-to-end sample that produces and consumes messages with
instrumentation enabled is available in
examples/kafka. Follow that example's README to
start a local Kafka broker and see traces and metrics flowing to the
configured exporters.
Extending ConsumerBuilder or ProducerBuilder instances
To extend an already built ConsumerBuilder<TKey, TValue>
or ProducerBuilder<TKey, TValue>
instance with OpenTelemetry instrumentation, you can use the
AsInstrumentedConsumerBuilder
and AsInstrumentedProducerBuilder extension methods.
When you create dynamic producers or consumers outside a DI container,
OpenTelemetry instrumentation (metrics and traces) is disabled by default.
You must explicitly pass configuration options to enable it.
If you do not use the standard DI registration methods (such as
.AddKafkaProducerInstrumentation()
or .AddKafkaConsumerInstrumentation()), you must also manually call
.AddSource("OpenTelemetry.Instrumentation.ConfluentKafka") on your
TracerProviderBuilder
and .AddMeter("OpenTelemetry.Instrumentation.ConfluentKafka") on your
MeterProviderBuilder so that the providers can listen to the emitted signals.
Example for ConsumerBuilder<TKey, TValue>
using Confluent.Kafka;
using OpenTelemetry.Instrumentation.ConfluentKafka;
var consumerConfig = new ConsumerConfig
{
BootstrapServers = "localhost:9092",
GroupId = "my-group",
AutoOffsetReset = AutoOffsetReset.Earliest
};
var consumerBuilder = new ConsumerBuilder<string, string>(consumerConfig);
// Set various handlers and properties
consumerBuilder.SetErrorHandler((consumer, error) => Console.WriteLine($"Error: {error.Reason}"));
consumerBuilder.SetLogHandler((consumer, logMessage) => Console.WriteLine($"Log: {logMessage.Message}"));
consumerBuilder.SetStatisticsHandler((consumer, statistics) => Console.WriteLine($"Statistics: {statistics}"));
// Explicitly enable OpenTelemetry features for standalone usage
var telemetryOptions = new ConfluentKafkaInstrumentedConsumerBuilderOptions
{
EnableTraces = true,
EnableMetrics = true,
};
// Convert to InstrumentedConsumerBuilder with options
var instrumentedConsumerBuilder = consumerBuilder.AsInstrumentedConsumerBuilder(telemetryOptions);
// Build the consumer
var consumer = instrumentedConsumerBuilder.Build();
Example for ProducerBuilder<TKey, TValue>
using Confluent.Kafka;
using OpenTelemetry.Instrumentation.ConfluentKafka;
var producerConfig = new ProducerConfig
{
BootstrapServers = "localhost:9092"
};
var producerBuilder = new ProducerBuilder<string, string>(producerConfig);
// Set various handlers and properties
producerBuilder.SetErrorHandler((producer, error) => Console.WriteLine($"Error: {error.Reason}"));
producerBuilder.SetLogHandler((producer, logMessage) => Console.WriteLine($"Log: {logMessage.Message}"));
producerBuilder.SetStatisticsHandler((producer, statistics) => Console.WriteLine($"Statistics: {statistics}"));
// Explicitly enable OpenTelemetry features for standalone usage
var telemetryOptions = new ConfluentKafkaInstrumentedProducerBuilderOptions
{
EnableTraces = true,
EnableMetrics = true,
};
// Convert to InstrumentedProducerBuilder with options
var instrumentedProducerBuilder = producerBuilder.AsInstrumentedProducerBuilder(telemetryOptions);
// Build the producer
var producer = instrumentedProducerBuilder.Build();
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 was computed. net462 is compatible. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.6.2
- Confluent.Kafka (>= 2.4.0)
- Microsoft.Extensions.Options (>= 10.0.0)
- OpenTelemetry.Api.ProviderBuilderExtensions (>= 1.17.0 && < 2.0.0)
-
.NETStandard 2.0
- Confluent.Kafka (>= 2.4.0)
- Microsoft.Extensions.Options (>= 10.0.0)
- OpenTelemetry.Api.ProviderBuilderExtensions (>= 1.17.0 && < 2.0.0)
-
net10.0
- Confluent.Kafka (>= 2.4.0)
- Microsoft.Extensions.Options (>= 10.0.0)
- OpenTelemetry.Api.ProviderBuilderExtensions (>= 1.17.0 && < 2.0.0)
-
net8.0
- Confluent.Kafka (>= 2.4.0)
- Microsoft.Extensions.Options (>= 8.0.0)
- OpenTelemetry.Api.ProviderBuilderExtensions (>= 1.17.0 && < 2.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.2.0-alpha.2 | 308 | 7/17/2026 |
| 0.2.0-alpha.1 | 2,834 | 7/8/2026 |
| 0.1.0-alpha.7 | 7,814 | 5/29/2026 |
| 0.1.0-alpha.6 | 40,390 | 4/21/2026 |
| 0.1.0-alpha.5 | 74,287 | 1/21/2026 |
| 0.1.0-alpha.4 | 44,686 | 11/13/2025 |
| 0.1.0-alpha.3 | 2,458 | 10/23/2025 |
| 0.1.0-alpha.2 | 314,520 | 9/18/2024 |
| 0.1.0-alpha.1 | 754 | 9/16/2024 |