dotnet/yarp · error · ArgumentException
The consumer must implement at least one I*TelemetryConsumer
Error message
The consumer must implement at least one I*TelemetryConsumer interface.
What it means
AddTelemetryConsumer(object consumer) inspects the passed instance against every I*TelemetryConsumer interface (IHttpClientTelemetryConsumer, ISocketsTelemetryConsumer, INetSecurityTelemetryConsumer, etc.) and registers it for each one it implements. If none match, implementsAny stays false and it throws ArgumentException(paramName: consumer), because there is nothing to listen for.
Source
Thrown at src/TelemetryConsumption/TelemetryConsumptionExtensions.cs:79
services.TryAddEnumerable(ServiceDescriptor.Singleton(nameResolutionTelemetryConsumer));
implementsAny = true;
}
if (consumer is INetSecurityTelemetryConsumer netSecurityTelemetryConsumer)
{
services.TryAddEnumerable(ServiceDescriptor.Singleton(netSecurityTelemetryConsumer));
implementsAny = true;
}
if (consumer is ISocketsTelemetryConsumer socketsTelemetryConsumer)
{
services.TryAddEnumerable(ServiceDescriptor.Singleton(socketsTelemetryConsumer));
implementsAny = true;
}
if (!implementsAny)
{
throw new ArgumentException("The consumer must implement at least one I*TelemetryConsumer interface.", nameof(consumer));
}
services.AddTelemetryListeners();
return services;
}
/// <summary>
/// Registers a <typeparamref name="TConsumer"/> singleton for every I*TelemetryConsumer interface it implements.
/// </summary>
public static IServiceCollection AddTelemetryConsumer<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TConsumer>(this IServiceCollection services)
where TConsumer : class
{
var implementsAny = false;
if (typeof(IWebSocketsTelemetryConsumer).IsAssignableFrom(typeof(TConsumer)))
{
services.AddSingleton(services => (IWebSocketsTelemetryConsumer)services.GetRequiredService<TConsumer>());View on GitHub (pinned to bd11867bee)
Solutions
- Make the consumer implement at least one I*TelemetryConsumer interface (e.g. IHttpClientTelemetryConsumer).
- If the consumer only handles metrics, call AddMetricsConsumer instead of AddTelemetryConsumer.
- Prefer the generic AddTelemetryConsumer<TConsumer>() so the interface requirement is clearer, though it still validates at runtime.
Example fix
// before
public class MyConsumer { ... }
services.AddTelemetryConsumer(new MyConsumer());
// after
public class MyConsumer : IHttpClientTelemetryConsumer { ... }
services.AddTelemetryConsumer(new MyConsumer()); Defensive patterns
Strategy: type-guard
Validate before calling
static bool ImplementsAnyTelemetryConsumer(object c) =>
c is IHttpClientTelemetryConsumer
|| c is ISocketsTelemetryConsumer
|| c is INetSecurityTelemetryConsumer;
if (ImplementsAnyTelemetryConsumer(consumer))
services.AddTelemetryConsumer(consumer); Type guard
static bool ImplementsAnyTelemetryConsumer(object c) =>
c is IHttpClientTelemetryConsumer
|| c is ISocketsTelemetryConsumer
|| c is INetSecurityTelemetryConsumer; Prevention
- Use the generic AddTelemetryConsumer<TConsumer>() with a class that has the interface so intent is explicit.
- Keep telemetry consumers and metrics consumers in separate folders/namespaces to avoid passing one to the other's overload.
- Add a unit test asserting each consumer type implements the expected interface.
When it happens
Trigger: Calling services.AddTelemetryConsumer(someObject) where someObject's type does not implement any of the I*TelemetryConsumer interfaces, e.g. passing a plain class or a metrics-only consumer to the telemetry overload.
Common situations: Calling AddTelemetryConsumer with a class that only implements IMetricsConsumer<...> (wrong overload, should be AddMetricsConsumer); passing a consumer whose interfaces live in a different namespace; refactor that dropped the interface from the class declaration.
Related errors
- TConsumer must implement at least one I*TelemetryConsumer in
- The consumer must implement at least one IMetricsConsumer in
- TConsumer must implement at least one IMetricsConsumer inter
- A consumer may not be null
- The transform contains more parameters than expected: {strin
AI-assisted analysis of dotnet/yarp@bd11867bee (2026-08-13).
Data as JSON: /api/errors/e2401a913131d43e.
Report an issue: GitHub.