157 lines
5.4 KiB
Java
157 lines
5.4 KiB
Java
// Copyright (C) 2015 The Android Open Source Project
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package com.google.gerrit.metrics;
|
|
|
|
import com.google.common.base.Supplier;
|
|
import com.google.common.collect.ImmutableSet;
|
|
import com.google.gerrit.extensions.registration.RegistrationHandle;
|
|
import java.util.Set;
|
|
|
|
/** Factory to create metrics for monitoring. */
|
|
public abstract class MetricMaker {
|
|
/**
|
|
* Metric whose value increments during the life of the process.
|
|
*
|
|
* @param name field name
|
|
* @param desc field description
|
|
* @return counter
|
|
*/
|
|
public abstract Counter0 newCounter(String name, Description desc);
|
|
|
|
public abstract <F1> Counter1<F1> newCounter(String name, Description desc, Field<F1> field1);
|
|
|
|
public abstract <F1, F2> Counter2<F1, F2> newCounter(
|
|
String name, Description desc, Field<F1> field1, Field<F2> field2);
|
|
|
|
public abstract <F1, F2, F3> Counter3<F1, F2, F3> newCounter(
|
|
String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3);
|
|
|
|
/**
|
|
* Metric recording time spent on an operation.
|
|
*
|
|
* @param name field name
|
|
* @param desc field description
|
|
* @return timer
|
|
*/
|
|
public abstract Timer0 newTimer(String name, Description desc);
|
|
|
|
public abstract <F1> Timer1<F1> newTimer(String name, Description desc, Field<F1> field1);
|
|
|
|
public abstract <F1, F2> Timer2<F1, F2> newTimer(
|
|
String name, Description desc, Field<F1> field1, Field<F2> field2);
|
|
|
|
public abstract <F1, F2, F3> Timer3<F1, F2, F3> newTimer(
|
|
String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3);
|
|
|
|
/**
|
|
* Metric recording statistical distribution of values.
|
|
*
|
|
* @param name field name
|
|
* @param desc field description
|
|
* @return histogram
|
|
*/
|
|
public abstract Histogram0 newHistogram(String name, Description desc);
|
|
|
|
public abstract <F1> Histogram1<F1> newHistogram(String name, Description desc, Field<F1> field1);
|
|
|
|
public abstract <F1, F2> Histogram2<F1, F2> newHistogram(
|
|
String name, Description desc, Field<F1> field1, Field<F2> field2);
|
|
|
|
public abstract <F1, F2, F3> Histogram3<F1, F2, F3> newHistogram(
|
|
String name, Description desc, Field<F1> field1, Field<F2> field2, Field<F3> field3);
|
|
|
|
/**
|
|
* Constant value that does not change.
|
|
*
|
|
* @param name unique name of the metric.
|
|
* @param value only value of the metric.
|
|
* @param desc description of the metric.
|
|
*/
|
|
public <V> void newConstantMetric(String name, V value, Description desc) {
|
|
desc.setConstant();
|
|
|
|
@SuppressWarnings("unchecked")
|
|
Class<V> type = (Class<V>) value.getClass();
|
|
CallbackMetric0<V> metric = newCallbackMetric(name, type, desc);
|
|
newTrigger(metric, () -> metric.set(value));
|
|
}
|
|
|
|
/**
|
|
* Instantaneous reading of a value.
|
|
*
|
|
* <pre>
|
|
* metricMaker.newCallbackMetric("memory",
|
|
* new Description("Total bytes of memory used")
|
|
* .setGauge()
|
|
* .setUnit(Units.BYTES),
|
|
* new Supplier<Long>() {
|
|
* public Long get() {
|
|
* return Runtime.getRuntime().totalMemory();
|
|
* }
|
|
* });
|
|
* </pre>
|
|
*
|
|
* @param name unique name of the metric.
|
|
* @param valueClass type of value recorded by the metric.
|
|
* @param desc description of the metric.
|
|
* @param trigger function to compute the value of the metric.
|
|
*/
|
|
public <V> void newCallbackMetric(
|
|
String name, Class<V> valueClass, Description desc, Supplier<V> trigger) {
|
|
CallbackMetric0<V> metric = newCallbackMetric(name, valueClass, desc);
|
|
newTrigger(metric, () -> metric.set(trigger.get()));
|
|
}
|
|
|
|
/**
|
|
* Instantaneous reading of a single value.
|
|
*
|
|
* @param name field name
|
|
* @param valueClass field type
|
|
* @param desc field description
|
|
* @return callback
|
|
*/
|
|
public abstract <V> CallbackMetric0<V> newCallbackMetric(
|
|
String name, Class<V> valueClass, Description desc);
|
|
|
|
public abstract <F1, V> CallbackMetric1<F1, V> newCallbackMetric(
|
|
String name, Class<V> valueClass, Description desc, Field<F1> field1);
|
|
|
|
/**
|
|
* Connect logic to populate a previously created {@link CallbackMetric}.
|
|
*
|
|
* @param metric1 previously created callback
|
|
* @param trigger trigger to connect
|
|
* @return registration handle
|
|
*/
|
|
public RegistrationHandle newTrigger(CallbackMetric<?> metric1, Runnable trigger) {
|
|
return newTrigger(ImmutableSet.<CallbackMetric<?>>of(metric1), trigger);
|
|
}
|
|
|
|
public RegistrationHandle newTrigger(
|
|
CallbackMetric<?> metric1, CallbackMetric<?> metric2, Runnable trigger) {
|
|
return newTrigger(ImmutableSet.of(metric1, metric2), trigger);
|
|
}
|
|
|
|
public RegistrationHandle newTrigger(
|
|
CallbackMetric<?> metric1,
|
|
CallbackMetric<?> metric2,
|
|
CallbackMetric<?> metric3,
|
|
Runnable trigger) {
|
|
return newTrigger(ImmutableSet.of(metric1, metric2, metric3), trigger);
|
|
}
|
|
|
|
public abstract RegistrationHandle newTrigger(Set<CallbackMetric<?>> metrics, Runnable trigger);
|
|
}
|