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 java.util.concurrent.atomic.AtomicLongArray;
22
23 import org.apache.hadoop.hbase.classification.InterfaceAudience;
24 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
25
26
27
28
29 @InterfaceAudience.Private
30 public abstract class MetricMutableRangeHistogram extends MetricMutableHistogram {
31
32 public MetricMutableRangeHistogram(String name, String description) {
33 super(name, description);
34 }
35
36
37
38
39 public abstract String getRangeType();
40
41
42
43
44 public abstract long[] getRange();
45
46
47
48
49 public abstract AtomicLongArray getRangeVals();
50
51 @Override
52 public void add(final long val) {
53 super.add(val);
54 updateBand(val);
55 }
56
57 private void updateBand(final long val) {
58 int i;
59 for (i=0; i<getRange().length && val > getRange()[i]; i++);
60 getRangeVals().incrementAndGet(i);
61 }
62
63 @Override
64 public void snapshot(MetricsRecordBuilder metricsRecordBuilder, boolean all) {
65 if (all || changed()) {
66 clearChanged();
67 updateSnapshotMetrics(metricsRecordBuilder);
68 updateSnapshotRangeMetrics(metricsRecordBuilder);
69 }
70 }
71
72 public void updateSnapshotRangeMetrics(MetricsRecordBuilder metricsRecordBuilder) {
73 long prior = 0;
74 for (int i = 0; i < getRange().length; i++) {
75 long val = getRangeVals().get(i);
76 if (val > 0) {
77 metricsRecordBuilder
78 .addCounter(name + "_" + getRangeType() + "_" + prior + "-" + getRange()[i], "", val);
79 }
80 prior = getRange()[i];
81 }
82 long val = getRangeVals().get(getRange().length);
83 if (val > 0) {
84 metricsRecordBuilder.addCounter(
85 name + "_" + getRangeType() + "_" + getRange()[getRange().length - 1] + "-inf", "",
86 getRangeVals().get(getRange().length));
87 }
88 }
89 }