Ismael,

Based on the streams user demand for registering their sensors and metrics we 
decided to expose the metrics registry. I'm not a fan of replicating a ton of 
code and add yet another layer/interface that does the same thing that the 
existing Metrics class and I think the methods are pretty basic (e.g., we do 
need 'removeSensor'). 

I can look into a subsequent JIRA to fix style issues such as your point 4 
(remove 'get') directly on the Metrics class.

Thanks
Eno


> On 8 Jan 2017, at 14:42, Ismael Juma <ism...@juma.me.uk> wrote:
> 
> Thanks for updating the KIP to include the Metrics API that we are now
> exposing, very helpful! Looking at it, do we really want to expose it to
> users? The API seems to have grown organically (as an internal API) and
> doesn't look particularly user-friendly to me. Questions I have:
> 
> 1. `metricName` and `sensor` have a huge number of overloads. We usually
> try to avoid that in public APIs by using a class that encapsulates the
> parameters. Also, `inactiveSensorExpirationTimeSeconds` doesn't make sense
> for clients since the thread that purges inactive sensors is only enabled
> in the broker.
> 2. Do we want to expose `removeSensor`?
> 3. Do we want to expose `addReporter`?
> 4. We typically have methods without `get` as accessors, but here we have
> `getSensor` for the accessor and `sensor` is really `getOrCreateSensor`.
> Maybe it's justified based the typical usage (but it would be good to
> confirm)?
> 5. I didn't understand the comment about why an interface wouldn't work. If
> it's a MetricsRegistry interface, it could live in the clients module
> (outside Streams as you said), but that is not necessarily an issue as far
> as I can see.
> 
> Thanks,
> Ismael
> 
> P.S. Here's the list of methods grouped and without javadoc to make it
> easier to see what I mean:
> 
> //metricName overloads
> public MetricName metricName(String name, String group, String description,
> Map<String, String> tags);
> public MetricName metricName(String name, String group, String description);
> public MetricName metricName(String name, String group);
> public MetricName metricName(String name, String group, String description,
> String... keyValue);
> public MetricName metricName(String name, String group, Map<String, String>
> tags);
> 
> //sensor overloads
> public Sensor sensor(String name);
> public Sensor sensor(String name, Sensor.RecordLevel recordLevel);
> public Sensor sensor(String name, Sensor... parents);
> public Sensor sensor(String name, Sensor.RecordLevel recordLevel, Sensor...
> parents);
> public synchronized Sensor sensor(String name, MetricConfig config,
> Sensor... parents);
> public synchronized Sensor sensor(String name, MetricConfig config,
> Sensor.RecordLevel recordLevel, Sensor... parents);
> public synchronized Sensor sensor(String name, MetricConfig config,
> Sensor.RecordLevel recordLevel, Sensor... parents);
> public synchronized Sensor sensor(String name, MetricConfig config, long
> inactiveSensorExpirationTimeSeconds, Sensor.RecordLevel recordLevel,
> Sensor... parents);
> 
> public MetricConfig config();
> 
> public Sensor getSensor(String name);
> 
> public void removeSensor(String name);
> 
> public void addMetric(MetricName metricName, Measurable measurable);
> public synchronized void addMetric(MetricName metricName, MetricConfig
> config, Measurable measurable);
> public synchronized KafkaMetric removeMetric(MetricName metricName);
> 
> public synchronized void addReporter(MetricsReporter reporter);
> 
> public Map<MetricName, KafkaMetric> metrics();
> 
> public KafkaMetric metric(MetricName metricName);
> 
> On Sat, Jan 7, 2017 at 12:15 AM, Eno Thereska <eno.there...@gmail.com>
> wrote:
> 
>> Ok, I'll list all the methods in the Metrics class for completion. An
>> interface won't work since it will have to reside outside of streams
>> unfortunately.
>> 
>> Thanks
>> Eno
>>> On 6 Jan 2017, at 23:54, Ismael Juma <ism...@juma.me.uk> wrote:
>>> 
>>> Hi Guozhang,
>>> 
>>> I understand the requirement and I don't have an issue with that. My
>> point
>>> is that the `Metrics` registry API is becoming public via this KIP so we
>>> should ensure that it's suitable. It may make sense to introduce an
>>> interface (say MetricsRegistry) that exposes a reasonable subset (do we
>>> want to expose `removeSensor` for example?). This is relatively
>>> straightforward and little additional code.
>>> 
>>> Ismael
>>> 
>>> On Fri, Jan 6, 2017 at 11:29 PM, Guozhang Wang <wangg...@gmail.com>
>> wrote:
>>> 
>>>> Unlike Producer and Consumer, Streams users may likely to add their own
>>>> sensors depending on their apps and that is the main reason we added
>>>> facilities to let them register customized "throughput" "latency" and
>> any
>>>> generic sensors.
>>>> 
>>>> I think Eno has thought about just adding an API in StreamsMetrics to
>>>> register any sensors, which will be directly translated into a
>>>> `metrics.sensor` call. In the end he decided to just expose the registry
>>>> itself since the functions itself seem just like duplicating the same
>>>> `sensor` functions in `Metrics`.
>>>> 
>>>> 
>>>> 
>>>> Guozhang
>>>> 
>>>> On Fri, Jan 6, 2017 at 2:16 PM, Ismael Juma <ism...@juma.me.uk> wrote:
>>>> 
>>>>> Thanks for the explanation Eno. The KIP did mention that the metrics
>>>>> registry would be exposed, yes. What is missing is that the registry is
>>>> not
>>>>> currently exposed by anything else. Traditionally, we list all public
>>>> APIs
>>>>> created by a KIP, which is effectively true for the registry in this
>>>> case.
>>>>> Did we consider using an interface instead of the concrete class? It
>>>> seems
>>>>> that a lot of these things were discussed in the PR, so it would be
>> good
>>>> to
>>>>> have a summary in the KIP too.
>>>>> 
>>>>> Ismael
>>>>> 
>>>>> On Fri, Jan 6, 2017 at 9:10 PM, Eno Thereska <eno.there...@gmail.com>
>>>>> wrote:
>>>>> 
>>>>>> So the KIP proposes exposing the metrics registry (second paragraph
>>>> under
>>>>>> motivation). The community has indicated that they would like to 1.
>>>>> access
>>>>>> all the metrics and 2. register their own. We provide some helper
>>>>>> interfaces for them to register throughput and latency metrics, but
>>>>>> ultimately we felt it's best for them to have access to the full
>>>> registry
>>>>>> as well. This is because application code is now intertwined with the
>>>>>> streams library and we don't want to limit the kinds of metrics they
>>>>> might
>>>>>> want to register, nor do we necessarily want to provide yet another
>>>>> wrapper
>>>>>> around Metrics.
>>>>>> 
>>>>>> Thanks,
>>>>>> Eno
>>>>>> 
>>>>>>> On 6 Jan 2017, at 20:34, Ismael Juma <ism...@juma.me.uk> wrote:
>>>>>>> 
>>>>>>> Thanks for the KIP. Sounds useful. One thing that wasn't made clear
>>>> is
>>>>>> that
>>>>>>> we are exposing `Metrics` as a public class for the first time.
>>>> Neither
>>>>>> the
>>>>>>> consumer or producer expose it at the moment. Do we want to expose
>>>> the
>>>>>>> whole class or would it be better to expose a more limited interface?
>>>>>>> 
>>>>>>> Ismael
>>>>>>> 
>>>>>>> On Sat, Dec 31, 2016 at 4:26 AM, Aarti Gupta <aartigup...@gmail.com>
>>>>>> wrote:
>>>>>>> 
>>>>>>>> Hi all,
>>>>>>>> 
>>>>>>>> I would like to start the discussion on KIP-104: Granular Sensors
>>>> for
>>>>>>>> Streams
>>>>>>>> <https://cwiki.apache.org/confluence/display/KAFKA/KIP-
>>>>>>>> 104%3A+Granular+Sensors+for+Streams?src=contextnavchildmode>
>>>>>>>> 
>>>>>>>> *https://cwiki.apache.org/confluence/pages/viewpage.
>>>>>> action?pageId=67636480
>>>>>>>> <https://cwiki.apache.org/confluence/pages/viewpage.
>>>>>> action?pageId=67636480
>>>>>>>>> *
>>>>>>>> 
>>>>>>>> Looking forward to your feedback.
>>>>>>>> 
>>>>>>>> Thanks,
>>>>>>>> Aarti and Eno
>>>>>>>> 
>>>>>> 
>>>>>> 
>>>>> 
>>>> 
>>>> 
>>>> 
>>>> --
>>>> -- Guozhang
>>>> 
>> 
>> 

Reply via email to