Thanks Ismael, Damian, I have updated KIP to go with the conservative option.

Eno
> On 9 Jan 2017, at 09:44, Ismael Juma <ism...@juma.me.uk> wrote:
> 
> Thanks Eno.
> 
> It is indeed a good point about additional classes that users would have to
> be able to construct in order to add metrics to a sensor. We have generally
> assumed those classes to be internal and have queued one of them
> (SimpleRate) for removal (KAFKA-4178). They are simple for the most part,
> as you said.
> 
> Exposing the metrics (maybe call it simply `metrics` since that's the name
> we use in the consumer and producer instead of `readOnlyRegistry`?) is fine
> by me as the conservative option.
> 
> If we think that access to the full registry is really important and others
> are fine with the current `Metrics` API, I won't stand in the way though.
> 
> Ismael
> 
> On Sun, Jan 8, 2017 at 8:45 PM, Eno Thereska <eno.there...@gmail.com> wrote:
> 
>> 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