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, description, Integer.MAX_VALUE << 2);
46 }
47
48 protected MutableHistogram(String name, String description, long maxExpected) {
49 this.name = StringUtils.capitalize(name);
50 this.desc = StringUtils.uncapitalize(description);
51 this.histogram = new HistogramImpl();
52 }
53
54 public void add(final long val) {
55 histogram.update(val);
56 }
57
58 public long getMax() {
59 return histogram.getMax();
60 }
61
62 @Override
63 public synchronized void snapshot(MetricsRecordBuilder metricsRecordBuilder, boolean all) {
64 snapshot(name, desc, histogram, metricsRecordBuilder, all);
65 }
66
67 public static void snapshot(String name, String desc, Histogram histogram,
68 MetricsRecordBuilder metricsRecordBuilder, boolean all) {
69
70 Snapshot snapshot = histogram.snapshot();
71 if (snapshot != null) {
72 updateSnapshotMetrics(name, desc, histogram, snapshot, metricsRecordBuilder);
73 }
74 }
75
76 protected static void updateSnapshotMetrics(String name, String desc, Histogram histogram,
77 Snapshot snapshot, MetricsRecordBuilder metricsRecordBuilder) {
78 metricsRecordBuilder.addCounter(Interns.info(name + NUM_OPS_METRIC_NAME, desc),
79 histogram.getCount());
80 metricsRecordBuilder.addGauge(Interns.info(name + MIN_METRIC_NAME, desc), snapshot.getMin());
81 metricsRecordBuilder.addGauge(Interns.info(name + MAX_METRIC_NAME, desc), snapshot.getMax());
82 metricsRecordBuilder.addGauge(Interns.info(name + MEAN_METRIC_NAME, desc), snapshot.getMean());
83
84 metricsRecordBuilder.addGauge(Interns.info(name + TWENTY_FIFTH_PERCENTILE_METRIC_NAME, desc),
85 snapshot.get25thPercentile());
86 metricsRecordBuilder.addGauge(Interns.info(name + MEDIAN_METRIC_NAME, desc),
87 snapshot.getMedian());
88 metricsRecordBuilder.addGauge(Interns.info(name + SEVENTY_FIFTH_PERCENTILE_METRIC_NAME, desc),
89 snapshot.get75thPercentile());
90 metricsRecordBuilder.addGauge(Interns.info(name + NINETIETH_PERCENTILE_METRIC_NAME, desc),
91 snapshot.get90thPercentile());
92 metricsRecordBuilder.addGauge(Interns.info(name + NINETY_FIFTH_PERCENTILE_METRIC_NAME, desc),
93 snapshot.get95thPercentile());
94 metricsRecordBuilder.addGauge(Interns.info(name + NINETY_EIGHTH_PERCENTILE_METRIC_NAME, desc),
95 snapshot.get98thPercentile());
96 metricsRecordBuilder.addGauge(Interns.info(name + NINETY_NINETH_PERCENTILE_METRIC_NAME, desc),
97 snapshot.get99thPercentile());
98 metricsRecordBuilder.addGauge(
99 Interns.info(name + NINETY_NINE_POINT_NINETH_PERCENTILE_METRIC_NAME, desc),
100 snapshot.get999thPercentile());
101 }
102 }