TickerQTickerQ

TickerQ.OpenTelemetry

Distributed tracing and structured logging for TickerQ jobs.

TickerQ.Instrumentation.OpenTelemetry adds Activity-based distributed tracing and structured ILogger logging for every job execution.

Install

dotnet add package TickerQ.Instrumentation.OpenTelemetry

Register

Chain .AddOpenTelemetryInstrumentation() on TickerOptionsBuilder:

Program.cs
builder.Services.AddTickerQ(opt =>
{
    opt.AddOpenTelemetryInstrumentation();
});

Wire up the OpenTelemetry SDK

Add the "TickerQ" activity source to your tracing pipeline:

Program.cs
builder.Services.AddOpenTelemetry()
    .WithTracing(tracing =>
    {
        tracing.AddSource("TickerQ");  // activity source name
        tracing.AddOtlpExporter();     // or Jaeger, Zipkin, etc.
    });

The activity source name is "TickerQ" (version 1.0.0). This is what you pass to AddSource().


What gets traced

Each job execution creates a main activity span with child spans for lifecycle events:

Job execution span

TagValue
tickerq.job.idJob GUID
tickerq.job.typeTimeTicker or CronTickerOccurrence
tickerq.job.functionRegistered function name
tickerq.job.priorityNormal, High, Low, or LongRunning
tickerq.job.machineNode identifier
tickerq.job.retriesMax retry count
tickerq.job.parent_idParent job ID (if chained)
tickerq.job.run_conditionRun condition (if chained)

Lifecycle event spans

Span nameWhenExtra tags
tickerq.job.enqueuedJob queuedjob.enqueued_from (caller location)
tickerq.job.completedSuccessfuljob.execution_time_ms, job.success, status = OK
tickerq.job.failedExceptionjob.retry_count, job.error_type, job.error_message, status = ERROR
tickerq.job.cancelledCancelledjob.cancellation_reason, status = ERROR
tickerq.job.skippedSkippedjob.skip_reason
tickerq.seeding.startedSeeding beginsseeding.type, seeding.environment
tickerq.seeding.completedSeeding doneseeding.type, seeding.environment

Logging

In addition to Activity tracing, every event is also logged via ILogger with structured properties. You get traces and logs from a single registration.


Full example

Program.cs
builder.Services.AddTickerQ(opt =>
{
    opt.AddOpenTelemetryInstrumentation();
});

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing =>
    {
        tracing.AddSource("TickerQ");
        tracing.AddOtlpExporter(o => o.Endpoint = new Uri("http://localhost:4317"));
    });

Compatible with any OpenTelemetry-compatible backend: Jaeger, Zipkin, OTLP, Azure Monitor, Datadog, Grafana Tempo, etc.

On this page