OpenTelemetry integration for WorkflowForge providing distributed tracing, metrics collection, and observability instrumentation for comprehensive workflow monitoring and debugging.
$ dotnet add package WorkflowForge.Extensions.Observability.OpenTelemetry
Distributed tracing extension for WorkflowForge with OpenTelemetry integration for comprehensive observability.
This extension internalizes OpenTelemetry with ILRepack. This means:
dotnet add package WorkflowForge.Extensions.Observability.OpenTelemetry
Requires: .NET Standard 2.0 or later
using WorkflowForge.Extensions.Observability.OpenTelemetry;
using OpenTelemetry;
using OpenTelemetry.Trace;
// Configure OpenTelemetry
var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource("WorkflowForge")
.AddConsoleExporter()
.AddJaegerExporter(options =>
{
options.AgentHost = "localhost";
options.AgentPort = 6831;
})
.Build();
// Create foundry with tracing
using var foundry = WorkflowForge.CreateFoundry("TracedWorkflow");
var tracer = tracerProvider.GetTracer("WorkflowForge");
// Operations will create spans
await smith.ForgeAsync(workflow, foundry);
var tracerProvider = Sdk.CreateTracerProviderBuilder()
.AddSource("WorkflowForge")
.AddConsoleExporter()
.AddJaegerExporter(options =>
{
options.AgentHost = "localhost";
options.AgentPort = 6831;
})
.Build();
using var foundry = WorkflowForge.CreateFoundry("TracedWorkflow");
var tracer = tracerProvider.GetTracer("WorkflowForge");
await smith.ForgeAsync(workflow, foundry);
See Configuration Guide for complete options.
.AddJaegerExporter(options =>
{
options.AgentHost = "localhost";
options.AgentPort = 6831;
})
.AddZipkinExporter(options =>
{
options.Endpoint = new Uri("http://localhost:9411/api/v2/spans");
})
.AddOtlpExporter(options =>
{
options.Endpoint = new Uri("http://localhost:4317");
})
.AddConsoleExporter()
WorkflowForge creates the following span hierarchy:
Workflow: OrderProcessing
├─ Operation: ValidateOrder (12µs)
├─ Operation: ChargePayment (145µs)
├─ Operation: ReserveInventory (87µs)
└─ Operation: CreateShipment (234µs)
Each span includes:
using var span = tracer.StartActiveSpan("CustomOperation");
span.SetAttribute("order.id", orderId);
span.SetAttribute("customer.id", customerId);
try
{
// ... operation logic ...
span.SetStatus(Status.Ok);
}
catch (Exception ex)
{
span.SetStatus(Status.Error);
span.RecordException(ex);
throw;
}
WorkflowForge automatically propagates trace context across:
View traces in: