Sure, updated the KIP for both.
Thanks
Eno
> On 9 Jan 2017, at 19:23, Guozhang Wang <wangg...@gmail.com> wrote:
>
> Thanks Eno, a couple of follow-up comments:
>
> 1. About `sensor()` functions, could we rename them to `addSensor()` to be
> consistent with other APIs? Also do we want to still add the "String
> scopeName, String entityName, String operationName" parameters to enforce
> the naming hierarchy or just let users to freely define their own Sensor
> name?
>
> 2. About `removeSensor`: for users to remove their registered sensors, the
> sensor name may not be known beforehand if they called `addLatencySensor`
> etc where the sensor name is internally created, plus they may need to
> remember the `Sensor` objects anyways in order to call its `recordXX()`
> functions, so would it be better to change the parameter to just `Sensor`
> instead of `String`?
>
>
> Guozhang
>
>
>
>
>
> On Mon, Jan 9, 2017 at 10:13 AM, Eno Thereska <eno.there...@gmail.com>
> wrote:
>
>> One hopefully final update to the KIP to re-add two methods for generic
>> sensor creation. Also the interface should have been marked unstable from
>> the beginning, so did that now.
>>
>> Thanks, and please vote if you haven't done so. The above changes
>> shouldn't trigger a re-vote since they are more conservative than what was
>> before.
>> Eno
>>> On 9 Jan 2017, at 10:31, Eno Thereska <eno.there...@gmail.com> wrote:
>>>
>>> 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
>>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>
>>
>>
>
>
> --
> -- Guozhang