001/** 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019package org.apache.hadoop.metrics2.lib; 020 021import org.apache.commons.lang3.StringUtils; 022import org.apache.hadoop.hbase.metrics.Histogram; 023import org.apache.hadoop.hbase.metrics.Interns; 024import org.apache.hadoop.hbase.metrics.Snapshot; 025import org.apache.hadoop.hbase.metrics.impl.HistogramImpl; 026import org.apache.hadoop.metrics2.MetricHistogram; 027import org.apache.hadoop.metrics2.MetricsInfo; 028import org.apache.hadoop.metrics2.MetricsRecordBuilder; 029import org.apache.yetus.audience.InterfaceAudience; 030 031/** 032 * A histogram implementation that runs in constant space, and exports to hadoop2's metrics2 system. 033 */ 034@InterfaceAudience.Private 035public class MutableHistogram extends MutableMetric implements MetricHistogram { 036 protected HistogramImpl histogram; 037 protected final String name; 038 protected final String desc; 039 040 public MutableHistogram(MetricsInfo info) { 041 this(info.name(), info.description()); 042 } 043 044 public MutableHistogram(String name, String description) { 045 this.name = StringUtils.capitalize(name); 046 this.desc = StringUtils.uncapitalize(description); 047 this.histogram = new HistogramImpl(); 048 } 049 050 public void add(final long val) { 051 histogram.update(val); 052 } 053 054 public long getMax() { 055 return histogram.getMax(); 056 } 057 058 @Override 059 public synchronized void snapshot(MetricsRecordBuilder metricsRecordBuilder, boolean all) { 060 snapshot(name, desc, histogram, metricsRecordBuilder, all); 061 } 062 063 public static void snapshot(String name, String desc, Histogram histogram, 064 MetricsRecordBuilder metricsRecordBuilder, boolean all) { 065 // Get a reference to the old histogram. 066 Snapshot snapshot = histogram.snapshot(); 067 if (snapshot != null) { 068 updateSnapshotMetrics(name, desc, histogram, snapshot, metricsRecordBuilder); 069 } 070 } 071 072 protected static void updateSnapshotMetrics(String name, String desc, Histogram histogram, 073 Snapshot snapshot, MetricsRecordBuilder metricsRecordBuilder) { 074 metricsRecordBuilder.addCounter(Interns.info(name + NUM_OPS_METRIC_NAME, desc), 075 histogram.getCount()); 076 metricsRecordBuilder.addGauge(Interns.info(name + MIN_METRIC_NAME, desc), snapshot.getMin()); 077 metricsRecordBuilder.addGauge(Interns.info(name + MAX_METRIC_NAME, desc), snapshot.getMax()); 078 metricsRecordBuilder.addGauge(Interns.info(name + MEAN_METRIC_NAME, desc), snapshot.getMean()); 079 080 metricsRecordBuilder.addGauge(Interns.info(name + TWENTY_FIFTH_PERCENTILE_METRIC_NAME, desc), 081 snapshot.get25thPercentile()); 082 metricsRecordBuilder.addGauge(Interns.info(name + MEDIAN_METRIC_NAME, desc), 083 snapshot.getMedian()); 084 metricsRecordBuilder.addGauge(Interns.info(name + SEVENTY_FIFTH_PERCENTILE_METRIC_NAME, desc), 085 snapshot.get75thPercentile()); 086 metricsRecordBuilder.addGauge(Interns.info(name + NINETIETH_PERCENTILE_METRIC_NAME, desc), 087 snapshot.get90thPercentile()); 088 metricsRecordBuilder.addGauge(Interns.info(name + NINETY_FIFTH_PERCENTILE_METRIC_NAME, desc), 089 snapshot.get95thPercentile()); 090 metricsRecordBuilder.addGauge(Interns.info(name + NINETY_EIGHTH_PERCENTILE_METRIC_NAME, desc), 091 snapshot.get98thPercentile()); 092 metricsRecordBuilder.addGauge(Interns.info(name + NINETY_NINETH_PERCENTILE_METRIC_NAME, desc), 093 snapshot.get99thPercentile()); 094 metricsRecordBuilder.addGauge( 095 Interns.info(name + NINETY_NINE_POINT_NINETH_PERCENTILE_METRIC_NAME, desc), 096 snapshot.get999thPercentile()); 097 } 098}