1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.metrics2.lib;
20
21 import org.apache.commons.lang.StringUtils;
22 import org.apache.hadoop.hbase.classification.InterfaceAudience;
23 import org.apache.hadoop.hbase.metrics.Histogram;
24 import org.apache.hadoop.hbase.metrics.Interns;
25 import org.apache.hadoop.hbase.metrics.Snapshot;
26 import org.apache.hadoop.hbase.metrics.impl.HistogramImpl;
27 import org.apache.hadoop.metrics2.MetricHistogram;
28 import org.apache.hadoop.metrics2.MetricsInfo;
29 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
30
31
32
33
34 @InterfaceAudience.Private
35 public class MutableHistogram extends MutableMetric implements MetricHistogram {
36 protected HistogramImpl histogram;
37 protected final String name;
38 protected final String desc;
39
40 public MutableHistogram(MetricsInfo info) {
41 this(info.name(), info.description());
42 }
43
44 public MutableHistogram(String name, String description) {
45 this.name = StringUtils.capitalize(name);
46 this.desc = StringUtils.uncapitalize(description);
47 this.histogram = new HistogramImpl();
48 }
49
50 public void add(final long val) {
51 histogram.update(val);
52 }
53
54 public long getMax() {
55 return histogram.getMax();
56 }
57
58 @Override
59 public synchronized void snapshot(MetricsRecordBuilder metricsRecordBuilder, boolean all) {
60 snapshot(name, desc, histogram, metricsRecordBuilder, all);
61 }
62
63 public static void snapshot(String name, String desc, Histogram histogram,
64 MetricsRecordBuilder metricsRecordBuilder, boolean all) {
65
66 Snapshot snapshot = histogram.snapshot();
67 if (snapshot != null) {
68 updateSnapshotMetrics(name, desc, histogram, snapshot, metricsRecordBuilder);
69 }
70 }
71
72 protected static void updateSnapshotMetrics(String name, String desc, Histogram histogram,
73 Snapshot snapshot, MetricsRecordBuilder metricsRecordBuilder) {
74 metricsRecordBuilder.addCounter(Interns.info(name + NUM_OPS_METRIC_NAME, desc),
75 histogram.getCount());
76 metricsRecordBuilder.addGauge(Interns.info(name + MIN_METRIC_NAME, desc), snapshot.getMin());
77 metricsRecordBuilder.addGauge(Interns.info(name + MAX_METRIC_NAME, desc), snapshot.getMax());
78 metricsRecordBuilder.addGauge(Interns.info(name + MEAN_METRIC_NAME, desc), snapshot.getMean());
79
80 metricsRecordBuilder.addGauge(Interns.info(name + TWENTY_FIFTH_PERCENTILE_METRIC_NAME, desc),
81 snapshot.get25thPercentile());
82 metricsRecordBuilder.addGauge(Interns.info(name + MEDIAN_METRIC_NAME, desc),
83 snapshot.getMedian());
84 metricsRecordBuilder.addGauge(Interns.info(name + SEVENTY_FIFTH_PERCENTILE_METRIC_NAME, desc),
85 snapshot.get75thPercentile());
86 metricsRecordBuilder.addGauge(Interns.info(name + NINETIETH_PERCENTILE_METRIC_NAME, desc),
87 snapshot.get90thPercentile());
88 metricsRecordBuilder.addGauge(Interns.info(name + NINETY_FIFTH_PERCENTILE_METRIC_NAME, desc),
89 snapshot.get95thPercentile());
90 metricsRecordBuilder.addGauge(Interns.info(name + NINETY_EIGHTH_PERCENTILE_METRIC_NAME, desc),
91 snapshot.get98thPercentile());
92 metricsRecordBuilder.addGauge(Interns.info(name + NINETY_NINETH_PERCENTILE_METRIC_NAME, desc),
93 snapshot.get99thPercentile());
94 metricsRecordBuilder.addGauge(
95 Interns.info(name + NINETY_NINE_POINT_NINETH_PERCENTILE_METRIC_NAME, desc),
96 snapshot.get999thPercentile());
97 }
98 }