Skip to content
This repository has been archived by the owner on Dec 23, 2023. It is now read-only.

Commit

Permalink
Metrics: Add Cumulative APIs. (#1848)
Browse files Browse the repository at this point in the history
  • Loading branch information
songy23 authored Apr 19, 2019
1 parent d62a2e7 commit 8a86284
Show file tree
Hide file tree
Showing 12 changed files with 1,262 additions and 6 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
- Support constant labels in Gauge APIs.
- Add an option to allow users to override the default "opencensus_task" metric label in Stackdriver Stats Exporter.
- Allow setting custom namespace in Prometheus exporter.
- Add Cumulative (`DoubleCumulative`, `LongCumulative`, `DerivedDoubleCumulative`, `DerivedLongCumulative`) APIs.

## 0.20.0 - 2019-03-28
- Add OpenCensus Java OC-Agent Trace Exporter.
Expand Down
152 changes: 152 additions & 0 deletions api/src/main/java/io/opencensus/metrics/DerivedDoubleCumulative.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
/*
* Copyright 2019, OpenCensus Authors
*
* 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 io.opencensus.metrics;

import io.opencensus.common.ToDoubleFunction;
import io.opencensus.internal.Utils;
import java.lang.ref.WeakReference;
import java.util.List;
import javax.annotation.concurrent.ThreadSafe;

/*>>>
import org.checkerframework.checker.nullness.qual.Nullable;
*/

/**
* Derived Double Cumulative metric, to report cumulative measurement of a double value. Cumulative
* values can go up or stay the same, but can never go down. Cumulative values cannot be negative.
*
* <p>Example: Create a Cumulative with an object and a callback function.
*
* <pre>{@code
* class YourClass {
*
* private static final MetricRegistry metricRegistry = Metrics.getMetricRegistry();
*
* List<LabelKey> labelKeys = Arrays.asList(LabelKey.create("Name", "desc"));
* List<LabelValue> labelValues = Arrays.asList(LabelValue.create("Inbound"));
*
* DerivedDoubleCumulative cumulative = metricRegistry.addDerivedDoubleCumulative(
* "processed_jobs", "Processed jobs in a queue", "1", labelKeys);
*
* QueueManager queueManager = new QueueManager();
* cumulative.createTimeSeries(labelValues, queueManager,
* new ToDoubleFunction<QueueManager>() {
* {@literal @}Override
* public double applyAsDouble(QueueManager queue) {
* return queue.size();
* }
* });
*
* void doWork() {
* // Your code here.
* }
* }
*
* }</pre>
*
* @since 0.21
*/
@ThreadSafe
public abstract class DerivedDoubleCumulative {
/**
* Creates a {@code TimeSeries}. The value of a single point in the TimeSeries is observed from a
* callback function. This function is invoked whenever metrics are collected, meaning the
* reported value is up-to-date. It keeps a {@link WeakReference} to the object and it is the
* user's responsibility to manage the lifetime of the object.
*
* @param labelValues the list of label values.
* @param obj the state object from which the function derives a measurement.
* @param function the function to be called.
* @param <T> the type of the object upon which the function derives a measurement.
* @throws NullPointerException if {@code labelValues} is null OR any element of {@code
* labelValues} is null OR {@code function} is null.
* @throws IllegalArgumentException if different time series with the same labels already exists
* OR if number of {@code labelValues}s are not equal to the label keys.
* @since 0.21
*/
public abstract <T> void createTimeSeries(
List<LabelValue> labelValues,
/*@Nullable*/ T obj,
ToDoubleFunction</*@Nullable*/ T> function);

/**
* Removes the {@code TimeSeries} from the cumulative metric, if it is present.
*
* @param labelValues the list of label values.
* @throws NullPointerException if {@code labelValues} is null.
* @since 0.21
*/
public abstract void removeTimeSeries(List<LabelValue> labelValues);

/**
* Removes all {@code TimeSeries} from the cumulative metric.
*
* @since 0.21
*/
public abstract void clear();

/**
* Returns the no-op implementation of the {@code DerivedDoubleCumulative}.
*
* @return the no-op implementation of the {@code DerivedDoubleCumulative}.
* @since 0.21
*/
static DerivedDoubleCumulative newNoopDerivedDoubleCumulative(
String name, String description, String unit, List<LabelKey> labelKeys) {
return NoopDerivedDoubleCumulative.create(name, description, unit, labelKeys);
}

/** No-op implementations of DerivedDoubleCumulative class. */
private static final class NoopDerivedDoubleCumulative extends DerivedDoubleCumulative {
private final int labelKeysSize;

static NoopDerivedDoubleCumulative create(
String name, String description, String unit, List<LabelKey> labelKeys) {
return new NoopDerivedDoubleCumulative(name, description, unit, labelKeys);
}

/** Creates a new {@code NoopDerivedDoubleCumulative}. */
NoopDerivedDoubleCumulative(
String name, String description, String unit, List<LabelKey> labelKeys) {
Utils.checkNotNull(name, "name");
Utils.checkNotNull(description, "description");
Utils.checkNotNull(unit, "unit");
Utils.checkListElementNotNull(Utils.checkNotNull(labelKeys, "labelKeys"), "labelKey");
labelKeysSize = labelKeys.size();
}

@Override
public <T> void createTimeSeries(
List<LabelValue> labelValues,
/*@Nullable*/ T obj,
ToDoubleFunction</*@Nullable*/ T> function) {
Utils.checkListElementNotNull(Utils.checkNotNull(labelValues, "labelValues"), "labelValue");
Utils.checkArgument(
labelKeysSize == labelValues.size(), "Label Keys and Label Values don't have same size.");
Utils.checkNotNull(function, "function");
}

@Override
public void removeTimeSeries(List<LabelValue> labelValues) {
Utils.checkNotNull(labelValues, "labelValues");
}

@Override
public void clear() {}
}
}
150 changes: 150 additions & 0 deletions api/src/main/java/io/opencensus/metrics/DerivedLongCumulative.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
/*
* Copyright 2019, OpenCensus Authors
*
* 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 io.opencensus.metrics;

import io.opencensus.common.ToLongFunction;
import io.opencensus.internal.Utils;
import java.lang.ref.WeakReference;
import java.util.List;
import javax.annotation.concurrent.ThreadSafe;

/*>>>
import org.checkerframework.checker.nullness.qual.Nullable;
*/

/**
* Derived Long Cumulative metric, to report cumulative measurement of an int64 value. Cumulative
* values can go up or stay the same, but can never go down. Cumulative values cannot be negative.
*
* <p>Example: Create a Cumulative with an object and a callback function.
*
* <pre>{@code
* class YourClass {
*
* private static final MetricRegistry metricRegistry = Metrics.getMetricRegistry();
*
* List<LabelKey> labelKeys = Arrays.asList(LabelKey.create("Name", "desc"));
* List<LabelValue> labelValues = Arrays.asList(LabelValue.create("Inbound"));
*
* DerivedLongCumulative cumulative = metricRegistry.addDerivedLongCumulative(
* "processed_jobs", "Total processed jobs in a queue", "1", labelKeys);
*
* QueueManager queueManager = new QueueManager();
* cumulative.createTimeSeries(labelValues, queueManager,
* new ToLongFunction<QueueManager>() {
* {@literal @}Override
* public long applyAsLong(QueueManager queue) {
* return queue.size();
* }
* });
*
* void doWork() {
* // Your code here.
* }
* }
*
* }</pre>
*
* @since 0.21
*/
@ThreadSafe
public abstract class DerivedLongCumulative {
/**
* Creates a {@code TimeSeries}. The value of a single point in the TimeSeries is observed from a
* callback function. This function is invoked whenever metrics are collected, meaning the
* reported value is up-to-date. It keeps a {@link WeakReference} to the object and it is the
* user's responsibility to manage the lifetime of the object.
*
* @param labelValues the list of label values.
* @param obj the state object from which the function derives a measurement.
* @param function the function to be called.
* @param <T> the type of the object upon which the function derives a measurement.
* @throws NullPointerException if {@code labelValues} is null OR any element of {@code
* labelValues} is null OR {@code function} is null.
* @throws IllegalArgumentException if different time series with the same labels already exists
* OR if number of {@code labelValues}s are not equal to the label keys.
* @since 0.21
*/
public abstract <T> void createTimeSeries(
List<LabelValue> labelValues, /*@Nullable*/ T obj, ToLongFunction</*@Nullable*/ T> function);

/**
* Removes the {@code TimeSeries} from the cumulative metric, if it is present.
*
* @param labelValues the list of label values.
* @throws NullPointerException if {@code labelValues} is null.
* @since 0.21
*/
public abstract void removeTimeSeries(List<LabelValue> labelValues);

/**
* Removes all {@code TimeSeries} from the cumulative metric.
*
* @since 0.21
*/
public abstract void clear();

/**
* Returns the no-op implementation of the {@code DerivedLongCumulative}.
*
* @return the no-op implementation of the {@code DerivedLongCumulative}.
* @since 0.21
*/
static DerivedLongCumulative newNoopDerivedLongCumulative(
String name, String description, String unit, List<LabelKey> labelKeys) {
return NoopDerivedLongCumulative.create(name, description, unit, labelKeys);
}

/** No-op implementations of DerivedLongCumulative class. */
private static final class NoopDerivedLongCumulative extends DerivedLongCumulative {
private final int labelKeysSize;

static NoopDerivedLongCumulative create(
String name, String description, String unit, List<LabelKey> labelKeys) {
return new NoopDerivedLongCumulative(name, description, unit, labelKeys);
}

/** Creates a new {@code NoopDerivedLongCumulative}. */
NoopDerivedLongCumulative(
String name, String description, String unit, List<LabelKey> labelKeys) {
Utils.checkNotNull(name, "name");
Utils.checkNotNull(description, "description");
Utils.checkNotNull(unit, "unit");
Utils.checkListElementNotNull(Utils.checkNotNull(labelKeys, "labelKeys"), "labelKey");
labelKeysSize = labelKeys.size();
}

@Override
public <T> void createTimeSeries(
List<LabelValue> labelValues,
/*@Nullable*/ T obj,
ToLongFunction</*@Nullable*/ T> function) {
Utils.checkListElementNotNull(Utils.checkNotNull(labelValues, "labelValues"), "labelValue");
Utils.checkArgument(
labelKeysSize == labelValues.size(), "Label Keys and Label Values don't have same size.");
Utils.checkNotNull(function, "function");
}

@Override
public void removeTimeSeries(List<LabelValue> labelValues) {
Utils.checkNotNull(labelValues, "labelValues");
}

@Override
public void clear() {}
}
}
Loading

0 comments on commit 8a86284

Please sign in to comment.