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

  1. Make the consumer implement at least one I*TelemetryConsumer interface (e.g. IHttpClientTelemetryConsumer).
  2. If the consumer only handles metrics, call AddMetricsConsumer instead of AddTelemetryConsumer.
  3. 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

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


AI-assisted analysis of dotnet/yarp@bd11867bee (2026-08-13). Data as JSON: /api/errors/e2401a913131d43e. Report an issue: GitHub.