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.hadoop.hbase.classification.InterfaceAudience;
22 import org.apache.hadoop.hbase.metrics.Interns;
23 import org.apache.hadoop.hbase.metrics.Snapshot;
24 import org.apache.hadoop.metrics2.MetricHistogram;
25 import org.apache.hadoop.metrics2.MetricsInfo;
26 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
27
28
29
30 @InterfaceAudience.Private
31 public abstract class MutableRangeHistogram extends MutableHistogram implements MetricHistogram {
32
33 public MutableRangeHistogram(MetricsInfo info) {
34 this(info.name(), info.description());
35 }
36
37 public MutableRangeHistogram(String name, String description) {
38 this(name, description, Integer.MAX_VALUE << 2);
39 }
40
41 public MutableRangeHistogram(String name, String description, long expectedMax) {
42 super(name, description, expectedMax);
43 }
44
45
46
47
48 public abstract String getRangeType();
49
50
51
52
53 public abstract long[] getRanges();
54
55
56 @Override
57 public synchronized void snapshot(MetricsRecordBuilder metricsRecordBuilder, boolean all) {
58
59 Snapshot snapshot = histogram.snapshot();
60 if (snapshot != null) {
61 updateSnapshotMetrics(name, desc, histogram, snapshot, metricsRecordBuilder);
62 updateSnapshotRangeMetrics(metricsRecordBuilder, snapshot);
63 }
64 }
65
66 public void updateSnapshotRangeMetrics(MetricsRecordBuilder metricsRecordBuilder,
67 Snapshot snapshot) {
68 long priorRange = 0;
69 long cumNum = 0;
70
71 final long[] ranges = getRanges();
72 final String rangeType = getRangeType();
73 for (int i = 0; i < ranges.length - 1; i++) {
74 long val = snapshot.getCountAtOrBelow(ranges[i]);
75 if (val - cumNum > 0) {
76 metricsRecordBuilder.addCounter(
77 Interns.info(name + "_" + rangeType + "_" + priorRange + "-" + ranges[i], desc),
78 val - cumNum);
79 }
80 priorRange = ranges[i];
81 cumNum = val;
82 }
83 long val = histogram.getCount();
84 if (val - cumNum > 0) {
85 metricsRecordBuilder.addCounter(
86 Interns.info(name + "_" + rangeType + "_" + ranges[ranges.length - 1] + "-inf", desc),
87 val - cumNum);
88 }
89 }
90 }