Status

Current state: Under Discussion

Discussion thread: TODO 

JIRA: TODO 

Please keep the discussion on the mailing list rather than commenting on the wiki (wiki discussions get unwieldy fast).

Motivation

KIP-714 introduced the ClientTelemetryReceiver interface to enable MetricsReporter instances running on brokers to collect client telemetry metrics. Typically a reporter stores metrics it receives in a "metrics registry" and exposes them in a format suitable for the external monitoring system is built for. This is exactly what JmxReporter does. Kafka clients and brokers explicitly delete their metrics when they are not used anymore. However for client telemetry metrics there isn't an explicit deletion mechanism.

Clients send their telemetry metrics at a regular interval, configured via telemetry subscriptions. Reporters are not aware of this push interval. Without the interval and an explicit deletion mechanism, reporters don't know when to clear client telemetry metrics and stop exposing them. This makes it hard to not expose stale metrics. Having uncertainty in metrics is a major problem as operators rely on them to manage their clusters.

Public Interfaces

package org.apache.kafka.server.telemetry;

import org.apache.kafka.server.authorizer.AuthorizableRequestContext;


public interface ClientTelemetryContext extends AuthorizableRequestContext {

    int pushInterval();

    AuthorizableRequestContext authorizableRequestContext();
}

Proposed Changes

Compatibility, Deprecation, and Migration Plan

The new method has a default implementation so it should not break existing classes implementing ClientTelemetryReceiver.

Implementations that want to benefit from the new context need to override both the new and old exportMetrics() methods. The body for the old method can be the following for example, since it won't be called if void exportMetrics(ClientTelemetryContext context, ClientTelemetryPayload payload) is also implemented.

public void exportMetrics(AuthorizableRequestContext context, ClientTelemetryPayload payload) {
    throw new IllegalStateException("Should not be called");
}


Test Plan

Adequate unit and integration tests will be added to ensure ClientTelemetryReceiver implementations use the old or new contexts.

Rejected Alternatives

N/A