Change to metrics to keep track of when the metric value was first set

This CL also adds IncrementableMetric#reset() methods to allow resetting the
value and start timestamp of IncrementableMetrics.

This is necessary because some backends, like Stackdriver, use non-monotonic
changes in cumulative metric values to detect timeseries restarts. Tracking and
re-setting the start timestamp allows users to track mostly monotonic metrics
which may have non-monotonic discontinuities.

See https://cloud.google.com/monitoring/api/ref_v3/rest/v3/TimeSeries#Point for
more details.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=130795229
This commit is contained in:
shikhman 2016-08-19 14:56:35 -07:00 committed by Ben McIlwain
parent b6eaba08eb
commit 91f8b6da38
7 changed files with 192 additions and 26 deletions

View file

@ -23,9 +23,9 @@ package google.registry.monitoring.metrics;
public interface IncrementableMetric extends Metric<Long> {
/**
* Increments a metric by 1 for the given set of label values.
* Increments a metric by 1 for the given label values.
*
* Use this method rather than {@link IncrementableMetric#incrementBy(long, String...)} if the
* <p>Use this method rather than {@link IncrementableMetric#incrementBy(long, String...)} if the
* increment value is zero, as it will be slightly more performant.
*
* <p>If the metric is undefined for given label values, it will be incremented from zero.
@ -37,7 +37,7 @@ public interface IncrementableMetric extends Metric<Long> {
void increment(String... labelValues);
/**
* Increments a metric by the given non-negative offset for the given set of label values.
* Increments a metric by the given non-negative offset for the given label values.
*
* <p>If the metric is undefined for given label values, it will be incremented from zero.
*
@ -48,4 +48,20 @@ public interface IncrementableMetric extends Metric<Long> {
* @throws IllegalArgumentException if the offset is negative.
*/
void incrementBy(long offset, String... labelValues);
/**
* Resets the value and start timestamp of the metric for the given label values.
*
* <p>This is useful if the counter is tracking a value that is reset as part of a retrying
* transaction, for example.
*/
void reset(String... labelValues);
/**
* Atomically resets the value and start timestamp of the metric for all label values.
*
* <p>This is useful if the counter is tracking values that are reset as part of a retrying
* transaction, for example.
*/
void reset();
}