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

Reply via email to