/** * Register a compound statistic with this sensor which yields multiple measurable quantities (like a histogram) * @param stat The stat to register * @param config The configuration for this stat. If null then the stat will use the default configuration for this * sensor. * @return true if stat is added to sensor, false if sensor is expired */ public synchronized boolean add(CompoundStat stat, MetricConfig config) { if (hasExpired()) return false; this.stats.add(Utils.notNull(stat)); Object lock = metricLock(); for (NamedMeasurable m : stat.stats()) { final KafkaMetric metric = new KafkaMetric(lock, m.name(), m.stat(), config == null ? this.config : config, time); if (!metrics.containsKey(metric.metricName())) { registry.registerMetric(metric); metrics.put(metric.metricName(), metric); } } return true; }
@Override public List<NamedMeasurable> stats() { List<NamedMeasurable> ms = new ArrayList<NamedMeasurable>(this.percentiles.length); for (Percentile percentile : this.percentiles) { final double pct = percentile.percentile(); ms.add(new NamedMeasurable(percentile.name(), new Measurable() { public double measure(MetricConfig config, long now) { return value(config, now, pct / 100.0); } })); } return ms; }
@Override public List<NamedMeasurable> stats() { List<NamedMeasurable> ms = new ArrayList<NamedMeasurable>(this.percentiles.length); for (Percentile percentile : this.percentiles) { final double pct = percentile.percentile(); ms.add(new NamedMeasurable(percentile.name(), new Measurable() { public double measure(MetricConfig config, long now) { return value(config, now, pct / 100.0); } })); } return ms; }
/** * Register a compound statistic with this sensor which yields multiple measurable quantities (like a histogram) * @param stat The stat to register * @param config The configuration for this stat. If null then the stat will use the default configuration for this * sensor. */ public synchronized void add(CompoundStat stat, MetricConfig config) { this.stats.add(Utils.notNull(stat)); for (NamedMeasurable m : stat.stats()) { KafkaMetric metric = new KafkaMetric(this, m.name(), m.stat(), config == null ? this.config : config, time); this.registry.registerMetric(metric); this.metrics.add(metric); } }
@Test public void testBooleanFrequencies() { MetricName metricTrue = name("true"); MetricName metricFalse = name("false"); Frequencies frequencies = Frequencies.forBooleanValues(metricFalse, metricTrue); final NamedMeasurable falseMetric = frequencies.stats().get(0); final NamedMeasurable trueMetric = frequencies.stats().get(1); // Record 2 windows worth of values for (int i = 0; i != 25; ++i) { frequencies.record(config, 0.0, time.milliseconds()); } for (int i = 0; i != 75; ++i) { frequencies.record(config, 1.0, time.milliseconds()); } assertEquals(0.25, falseMetric.stat().measure(config, time.milliseconds()), DELTA); assertEquals(0.75, trueMetric.stat().measure(config, time.milliseconds()), DELTA); // Record 2 more windows worth of values for (int i = 0; i != 40; ++i) { frequencies.record(config, 0.0, time.milliseconds()); } for (int i = 0; i != 60; ++i) { frequencies.record(config, 1.0, time.milliseconds()); } assertEquals(0.40, falseMetric.stat().measure(config, time.milliseconds()), DELTA); assertEquals(0.60, trueMetric.stat().measure(config, time.milliseconds()), DELTA); }
@Override public List<NamedMeasurable> stats() { List<NamedMeasurable> ms = new ArrayList<>(frequencies.length); for (Frequency frequency : frequencies) { final double center = frequency.centerValue(); ms.add(new NamedMeasurable(frequency.name(), new Measurable() { public double measure(MetricConfig config, long now) { return frequency(config, now, center); } })); } return ms; }
@Override public List<NamedMeasurable> stats() { return Arrays.asList( new NamedMeasurable(totalMetricName, total), new NamedMeasurable(rateMetricName, rate)); }