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 > >>>>> > >>> > >>> > > > >