[ 
https://issues.apache.org/jira/browse/KAFKA-3494?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15271902#comment-15271902
 ] 

ASF GitHub Bot commented on KAFKA-3494:
---------------------------------------

GitHub user onurkaraman opened a pull request:

    https://github.com/apache/kafka/pull/1323

    KAFKA-3494: add metric id to client mbeans

    KafkaConsumer and KafkaProducer mbeans currently only have a client-id 
granularity. Client-id represents a logical name for an application.
    
    Given that quotas encourage reuse of client-ids, it's not unexpected to 
have multiple clients share the same client-id within the same jvm. When a 
later client gets instantiated with the same client-id as an earlier client in 
the same jvm, JmxReporter unregisters the original client's mbeans that collide 
with the new client's mbeans.
    
    This commit makes client mbeans have a metric-id granularity to prevent 
mbean collision and the original client mbean unregistration.

You can merge this pull request into a Git repository by running:

    $ git pull https://github.com/onurkaraman/kafka KAFKA-3494

Alternatively you can review and apply these changes as the patch at:

    https://github.com/apache/kafka/pull/1323.patch

To close this pull request, make a commit to your master/trunk branch
with (at least) the following in the commit message:

    This closes #1323
    
----
commit 40a0189e856ba42be396bd2694e5719e8e29631b
Author: Onur Karaman <okara...@linkedin.com>
Date:   2016-05-04T23:34:28Z

    add metric id to client mbeans
    
    KafkaConsumer and KafkaProducer mbeans currently only have a client-id 
granularity. Client-id represents a logical name for an application.
    
    Given that quotas encourage reuse of client-ids, it's not unexpected to 
have multiple clients share the same client-id within the same jvm. When a 
later client gets instantiated with the same client-id as an earlier client in 
the same jvm, JmxReporter unregisters the original client's mbeans that collide 
with the new client's mbeans.
    
    This commit makes client mbeans have a metric-id granularity to prevent 
mbean collision and the original client mbean unregistration.

----


> mbeans overwritten with identical clients on a single jvm
> ---------------------------------------------------------
>
>                 Key: KAFKA-3494
>                 URL: https://issues.apache.org/jira/browse/KAFKA-3494
>             Project: Kafka
>          Issue Type: Bug
>            Reporter: Onur Karaman
>
> Quotas today are implemented on a (client-id, broker) granularity. I think 
> one of the motivating factors for using a simple quota id was to allow for 
> flexibility in the granularity of the quota enforcement. For instance, entire 
> services can share the same id to get some form of (service, broker) 
> granularity quotas. From my understanding, client-id was chosen as the quota 
> id because it's a property that already exists on the clients and reusing it 
> had relatively low impact.
> Continuing the above example, let's say a service spins up multiple 
> KafkaConsumers in one jvm sharing the same client-id because they want those 
> consumers to be quotad as a single entity. Sharing client-ids within a single 
> jvm would cause problems in client metrics since the mbeans tags only go as 
> granular as the client-id.
> An easy example is kafka-metrics count. Here's a sample code snippet:
> {code}
> package org.apache.kafka.clients.consumer;
> import java.util.Collections;
> import java.util.Properties;
> import org.apache.kafka.common.TopicPartition;
> public class KafkaConsumerMetrics {
>     public static void main(String[] args) throws InterruptedException {
>         Properties properties = new Properties();
>         properties.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, 
> "localhost:9092");
>         properties.setProperty(ConsumerConfig.GROUP_ID_CONFIG, "test");
>         properties.setProperty(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, 
> "org.apache.kafka.common.serialization.StringDeserializer");
>         
> properties.setProperty(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, 
> "org.apache.kafka.common.serialization.StringDeserializer");
>         properties.setProperty(ConsumerConfig.CLIENT_ID_CONFIG, 
> "testclientid");
>         KafkaConsumer<String, String> kc1 = new KafkaConsumer<>(properties);
>         KafkaConsumer<String, String> kc2 = new KafkaConsumer<>(properties);
>         kc1.assign(Collections.singletonList(new TopicPartition("t1", 0)));
>         while (true) {
>             kc1.poll(1000);
>             System.out.println("kc1 metrics: " + kc1.metrics().size());
>             System.out.println("kc2 metrics: " + kc2.metrics().size());
>             Thread.sleep(1000);
>         }
>     }
> }
> {code}
> jconsole shows one mbean 
> kafka.consumer:type=kafka-metrics-count,client-id=testclientid consistently 
> with value 40.
> but stdout shows:
> {code}
> kc1 metrics: 69
> kc2 metrics: 40
> {code}
> I think the two possible solutions are:
> 1. add finer granularity to the mbeans to distinguish between the clients
> 2. require client ids to be unique per jvm like KafkaStreams has done



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to