...
A new public facing method metricOrElseCreate
would getMetricOrElseCreate would be exposed. This would create a non-existing metric or create a return the Metric if it already exists. This way, users don't need to add extra logic to take respective actions in case of presence/absence of metrics. Note that this method takes care of synchronisation while updating/accessing metrics by concurrent threads.
...
Code Block | ||||
---|---|---|---|---|
| ||||
/** * Create or get an existing metric to monitor an object that implements MetricValueProvider. * This metric won't be associated with any sensor. This is a way to expose existing values as metrics. * This method takes care of synchronisation while updating/accessing metrics by concurrent threads. * * @param metricName The name of the metric * @param metricValueProvider The metric value provider associated with this metric * @return Existing KafkaMetric if already registered or else a newly created one */ public KafkaMetric metricOrElseCreategetMetricOrElseCreate(MetricName metricName, MetricConfig config, MetricValueProvider<?> metricValueProvider) { KafkaMetric metric = new KafkaMetric(new Object(), Objects.requireNonNull(metricName), Objects.requireNonNull(metricValueProvider), config == null ? this.config : config, time); KafkaMetric existingMetric = registerMetric(metric); return existingMetric == null ? metric : existingMetric; } |
...
Adding a new function above to the Metrics API. As part of this change, the
registerMetric
method's return type would be changed fromvoid
toKafkaMetric
. It would return a KafkaMetric object if the requested metric already exists or return null if not after creating/registering the metric. For backward compatibility reasons, any place currently which relied onIllegalArgumentException
would now instead check the output ofregisterMetric
and throw anIllegalArguementException
when the returned value ofregisterMetric
is non-null. This change would happen in =>Metrics.addMetric
, 2Sensor.add
methods. On the other hand,metricOrElseCreate
getMetricOrElseCreate method would simply return the object returned byregisterMetric if not null.
Code Block language java /** * Register a metric if not present or return an already existing metric otherwise. * When a metric is newly registered, this method returns null * * @param metric The KafkaMetric to register * @return KafkaMetric if the metric already exists, null otherwise */ synchronized KafkaMetric registerMetric(KafkaMetric metric) { MetricName metricName = metric.metricName(); if (this.metrics.containsKey(metricName)) { return this.metrics.get(metricName); } this.metrics.put(metricName, metric); for (MetricsReporter reporter : reporters) { try { reporter.metricChange(metric); } catch (Exception e) { log.error("Error when registering metric on " + reporter.getClass().getName(), e); } } log.trace("Registered metric named {}", metricName); return null; }
...