Skip to content

feat(tracing): add DiagnosticSource bridge for automatic instrumentation #16

@CalvinAllen

Description

@CalvinAllen

Summary

Create a bridge to automatically capture telemetry from .NET's DiagnosticSource events. Many .NET libraries (HttpClient, SqlClient, etc.) emit diagnostic events that can be converted to OpenTelemetry spans.

Background

.NET has a built-in DiagnosticSource system that libraries use to emit events:

  • HttpClient emits request/response events
  • SqlClient emits query events
  • Many other libraries participate

Currently this data is lost unless explicitly subscribed to.

Proposed API

var config = new TelemetryConfiguration
{
    // Enable automatic DiagnosticSource bridging
    EnableDiagnosticSourceBridge = true,
    
    // Or selectively enable specific sources
    DiagnosticSources = new[]
    {
        "HttpHandlerDiagnosticListener",
        "SqlClientDiagnosticListener"
    }
};

// Or configure at runtime
VsixTelemetry.SubscribeToDiagnosticSource("MyCustomSource");
VsixTelemetry.SubscribeToDiagnosticSource("HttpHandlerDiagnosticListener", 
    filter: evt => evt.Name.StartsWith("System.Net.Http"));

Events to Bridge

HttpClient

  • System.Net.Http.HttpRequestOut.Start → Span start
  • System.Net.Http.HttpRequestOut.Stop → Span end with status
  • Add: URL, method, status code, duration

SqlClient (if used)

  • System.Data.SqlClient.WriteCommandBefore → Span start
  • System.Data.SqlClient.WriteCommandAfter → Span end
  • Add: Database, command type, (sanitized) query

Implementation Notes

  • Use DiagnosticListener.AllListeners to discover sources
  • Implement IObserver<DiagnosticListener> for subscription
  • Map diagnostic events to OpenTelemetry span operations
  • Handle event payload extraction via reflection or known types
  • Consider performance impact of reflection

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions