I can see the point that all of a sudden exposing the internal Metrics class 
might be too big a bite to take in this KIP, since the Metrics class might have 
to be cleaned up further. I was perhaps naively assuming it's good since it has 
been reviewed when it was first introduced into Kafka. Furthermore, that class 
brings in a whole bunch of other stuff, such as Min/Avg. They are all simple 
things, but others might argue differently.

An intermediate alternative would be to not expose the Metrics class for now. 
Users can still get a read-only Map of all the streams metrics, as they do in 
the Producer/Consumer classes. Furthermore, we already have helper functions to 
help users add throughput and latency metrics and that could be a good enough 
step for now. So:

- Metrics registry()
+ public Map<MetricName, ? extends Metric> readOnlyRegistry()

Ideally either vote on the previous approach or add a note to this discuss 
thread please since we're getting close to the feature freeze deadline.

Thanks
Eno

> On 8 Jan 2017, at 15:06, Eno Thereska <eno.there...@gmail.com> wrote:
> 
> 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