| // 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.errorprone.annotations.CanIgnoreReturnValue; |
| 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. |
| * @return registration handle |
| */ |
| @CanIgnoreReturnValue |
| public <V> RegistrationHandle 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); |
| return 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. |
| * @return registration handle |
| */ |
| @CanIgnoreReturnValue |
| public <V> RegistrationHandle newCallbackMetric( |
| String name, Class<V> valueClass, Description desc, Supplier<V> trigger) { |
| CallbackMetric0<V> metric = newCallbackMetric(name, valueClass, desc); |
| return 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.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); |
| |
| /** |
| * Sanitize the given metric name. |
| * |
| * @param name the name to sanitize. |
| * @return sanitized version of the name. |
| */ |
| public String sanitizeMetricName(String name) { |
| return name; |
| } |
| } |