Remove LabelSet from Observer API (#1008)

* Remove the LabelSet parameter on the DoubleCounter non-bound usage.

* remove LabelSet from the Observer API
This commit is contained in:
John Watson 2020-03-13 09:33:34 -07:00 committed by GitHub
parent 4d2a9f2bde
commit e248ea7ad7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 43 additions and 51 deletions

View File

@ -81,6 +81,6 @@ public interface DoubleObserver extends Observer<ResultDoubleObserver> {
/** The result for the {@link io.opentelemetry.metrics.Observer.Callback}. */
interface ResultDoubleObserver {
void observe(double value, LabelSet labelSet);
void observe(double value, String... keyValueLabelPairs);
}
}

View File

@ -81,6 +81,6 @@ public interface LongObserver extends Observer<ResultLongObserver> {
/** The result for the {@link io.opentelemetry.metrics.Observer.Callback}. */
interface ResultLongObserver {
void observe(long value, LabelSet labelSet);
void observe(long value, String... keyValueLabelPairs);
}
}

View File

@ -17,7 +17,6 @@
package io.opentelemetry.contrib.metrics.runtime;
import io.opentelemetry.OpenTelemetry;
import io.opentelemetry.metrics.LabelSet;
import io.opentelemetry.metrics.LongObserver;
import io.opentelemetry.metrics.LongObserver.ResultLongObserver;
import io.opentelemetry.metrics.Meter;
@ -65,9 +64,10 @@ public final class GarbageCollector {
.setLabelKeys(Collections.singletonList(GC_LABEL_KEY))
.setMonotonic(true)
.build();
final List<LabelSet> labelSets = new ArrayList<>(garbageCollectors.size());
final List<String[]> labelSets = new ArrayList<>(garbageCollectors.size());
for (final GarbageCollectorMXBean gc : garbageCollectors) {
labelSets.add(meter.createLabelSet(GC_LABEL_KEY, gc.getName()));
String[] label = {GC_LABEL_KEY, gc.getName()};
labelSets.add(label);
}
gcMetric.setCallback(

View File

@ -17,7 +17,6 @@
package io.opentelemetry.contrib.metrics.runtime;
import io.opentelemetry.OpenTelemetry;
import io.opentelemetry.metrics.LabelSet;
import io.opentelemetry.metrics.LongObserver;
import io.opentelemetry.metrics.LongObserver.ResultLongObserver;
import io.opentelemetry.metrics.Meter;
@ -79,16 +78,14 @@ public final class MemoryPools {
.setLabelKeys(Arrays.asList(TYPE_LABEL_KEY, AREA_LABEL_KEY))
.setMonotonic(false)
.build();
final LabelSet usedHeap = meter.createLabelSet(TYPE_LABEL_KEY, USED, AREA_LABEL_KEY, HEAP);
final LabelSet usedNonHeap =
meter.createLabelSet(TYPE_LABEL_KEY, USED, AREA_LABEL_KEY, NON_HEAP);
final LabelSet committedHeap =
meter.createLabelSet(TYPE_LABEL_KEY, COMMITTED, AREA_LABEL_KEY, HEAP);
final LabelSet committedNonHeap =
meter.createLabelSet(TYPE_LABEL_KEY, COMMITTED, AREA_LABEL_KEY, NON_HEAP);
final String[] usedHeap = new String[] {TYPE_LABEL_KEY, USED, AREA_LABEL_KEY, HEAP};
final String[] usedNonHeap = new String[] {TYPE_LABEL_KEY, USED, AREA_LABEL_KEY, NON_HEAP};
final String[] committedHeap = new String[] {TYPE_LABEL_KEY, COMMITTED, AREA_LABEL_KEY, HEAP};
final String[] committedNonHeap =
new String[] {TYPE_LABEL_KEY, COMMITTED, AREA_LABEL_KEY, NON_HEAP};
// TODO: Decide if max is needed or not. May be derived with some approximation from max(used).
final LabelSet maxHeap = meter.createLabelSet(TYPE_LABEL_KEY, MAX, AREA_LABEL_KEY, HEAP);
final LabelSet maxNonHeap = meter.createLabelSet(TYPE_LABEL_KEY, MAX, AREA_LABEL_KEY, NON_HEAP);
final String[] maxHeap = new String[] {TYPE_LABEL_KEY, MAX, AREA_LABEL_KEY, HEAP};
final String[] maxNonHeap = new String[] {TYPE_LABEL_KEY, MAX, AREA_LABEL_KEY, NON_HEAP};
areaMetric.setCallback(
new LongObserver.Callback<ResultLongObserver>() {
@Override
@ -116,14 +113,14 @@ public final class MemoryPools {
.setLabelKeys(Arrays.asList(TYPE_LABEL_KEY, POOL_LABEL_KEY))
.setMonotonic(false)
.build();
final List<LabelSet> usedLabelSets = new ArrayList<>(poolBeans.size());
final List<LabelSet> committedLabelSets = new ArrayList<>(poolBeans.size());
final List<LabelSet> maxLabelSets = new ArrayList<>(poolBeans.size());
final List<String[]> usedLabelSets = new ArrayList<>(poolBeans.size());
final List<String[]> committedLabelSets = new ArrayList<>(poolBeans.size());
final List<String[]> maxLabelSets = new ArrayList<>(poolBeans.size());
for (final MemoryPoolMXBean pool : poolBeans) {
usedLabelSets.add(meter.createLabelSet(TYPE_LABEL_KEY, USED, POOL_LABEL_KEY, pool.getName()));
usedLabelSets.add(new String[] {TYPE_LABEL_KEY, USED, POOL_LABEL_KEY, pool.getName()});
committedLabelSets.add(
meter.createLabelSet(TYPE_LABEL_KEY, COMMITTED, POOL_LABEL_KEY, pool.getName()));
maxLabelSets.add(meter.createLabelSet(TYPE_LABEL_KEY, MAX, POOL_LABEL_KEY, pool.getName()));
new String[] {TYPE_LABEL_KEY, COMMITTED, POOL_LABEL_KEY, pool.getName()});
maxLabelSets.add(new String[] {TYPE_LABEL_KEY, MAX, POOL_LABEL_KEY, pool.getName()});
}
poolMetric.setCallback(
new Callback<ResultLongObserver>() {

View File

@ -16,7 +16,6 @@
package io.opentelemetry.sdk.metrics;
import io.opentelemetry.metrics.LabelSet;
import io.opentelemetry.sdk.metrics.data.MetricData;
import java.util.List;
import java.util.Map;
@ -25,7 +24,7 @@ import java.util.concurrent.locks.ReentrantLock;
abstract class AbstractInstrumentWithBinding<B extends AbstractBoundInstrument>
extends AbstractInstrument {
private final ConcurrentHashMap<LabelSet, B> boundLabels;
private final ConcurrentHashMap<LabelSetSdk, B> boundLabels;
private final ReentrantLock collectLock;
AbstractInstrumentWithBinding(
@ -41,7 +40,7 @@ abstract class AbstractInstrumentWithBinding<B extends AbstractBoundInstrument>
// Cannot make this "bind" because of a Java problem if we make this class also implement the
// InstrumentWithBinding then the subclass will fail to compile because of different "bind"
// signature. This is a good trade-off.
final B bindInternal(LabelSet labelSet) {
final B bindInternal(LabelSetSdk labelSet) {
B binding = boundLabels.get(labelSet);
if (binding != null && binding.bind()) {
// At this moment it is guaranteed that the Bound is in the map and will not be removed.
@ -75,7 +74,7 @@ abstract class AbstractInstrumentWithBinding<B extends AbstractBoundInstrument>
collectLock.lock();
try {
Batcher batcher = getActiveBatcher();
for (Map.Entry<LabelSet, B> entry : boundLabels.entrySet()) {
for (Map.Entry<LabelSetSdk, B> entry : boundLabels.entrySet()) {
boolean unmappedEntry = entry.getValue().tryUnmap();
if (unmappedEntry) {
// If able to unmap then remove the record from the current Map. This can race with the

View File

@ -16,7 +16,6 @@
package io.opentelemetry.sdk.metrics;
import io.opentelemetry.metrics.LabelSet;
import io.opentelemetry.sdk.metrics.aggregator.Aggregator;
import io.opentelemetry.sdk.metrics.data.MetricData;
import java.util.List;
@ -42,7 +41,7 @@ final class ActiveBatcher implements Batcher {
}
@Override
public void batch(LabelSet labelSet, Aggregator aggregator, boolean mappedAggregator) {
public void batch(LabelSetSdk labelSet, Aggregator aggregator, boolean mappedAggregator) {
batcher.batch(labelSet, aggregator, mappedAggregator);
}

View File

@ -29,7 +29,6 @@ import io.opentelemetry.metrics.LongMeasure;
* <p>TODO: Add an async queue processing to process batch records.
*/
final class BatchRecorderSdk implements BatchRecorder {
private final LabelSetSdk labelSet;
BatchRecorderSdk(String... keyValuePairs) {

View File

@ -16,7 +16,6 @@
package io.opentelemetry.sdk.metrics;
import io.opentelemetry.metrics.LabelSet;
import io.opentelemetry.sdk.metrics.aggregator.Aggregator;
import io.opentelemetry.sdk.metrics.data.MetricData;
import java.util.List;
@ -28,7 +27,7 @@ import java.util.List;
*
* <p>The only thread safe method in this class is {@link #getAggregator()}. An entire collection
* cycle must be protected by a lock. A collection cycle is defined by multiple calls to {@link
* #batch(LabelSet, Aggregator, boolean)} followed by one {@link #completeCollectionCycle()};
* #batch(LabelSetSdk, Aggregator, boolean)} followed by one {@link #completeCollectionCycle()};
*/
interface Batcher {
@ -43,13 +42,13 @@ interface Batcher {
* Batches multiple entries together that are part of the same metric. It may remove labels from
* the LabelSet and merge aggregations together.
*
* @param labelSet the {@link LabelSet} associated with this {@code Aggregator}.
* @param labelSet the {@link LabelSetSdk} associated with this {@code Aggregator}.
* @param aggregator the {@link Aggregator} used to aggregate individual events for the given
* {@code LabelSet}.
* @param mappedAggregator {@code true} if the {@code Aggregator} is still in used by a binding.
* If {@code false} the {@code Batcher} can reuse the {@code Aggregator} instance.
*/
void batch(LabelSet labelSet, Aggregator aggregator, boolean mappedAggregator);
void batch(LabelSetSdk labelSet, Aggregator aggregator, boolean mappedAggregator);
/**
* Ends the current collection cycle and returns the list of metrics batched in this Batcher.

View File

@ -16,7 +16,6 @@
package io.opentelemetry.sdk.metrics;
import io.opentelemetry.metrics.LabelSet;
import io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
import io.opentelemetry.sdk.metrics.aggregator.Aggregator;
@ -63,7 +62,7 @@ final class Batchers {
}
@Override
public void batch(LabelSet labelSet, Aggregator aggregator, boolean mappedAggregator) {}
public void batch(LabelSetSdk labelSet, Aggregator aggregator, boolean mappedAggregator) {}
@Override
public List<MetricData> completeCollectionCycle() {
@ -104,8 +103,9 @@ final class Batchers {
}
@Override
public final void batch(LabelSet labelSet, Aggregator aggregator, boolean unmappedAggregator) {
Map<String, String> labels = ((LabelSetSdk) labelSet).getLabels();
public final void batch(
LabelSetSdk labelSet, Aggregator aggregator, boolean unmappedAggregator) {
Map<String, String> labels = labelSet.getLabels();
Aggregator currentAggregator = aggregatorMap.get(labels);
if (currentAggregator == null) {
// This aggregator is not mapped, we can use this instance.

View File

@ -49,7 +49,7 @@ final class DoubleCounterSdk extends AbstractCounter<BoundInstrument> implements
@Override
public BoundInstrument bind(LabelSet labelSet) {
return bindInternal(labelSet);
return bindInternal((LabelSetSdk) labelSet);
}
@Override

View File

@ -49,7 +49,7 @@ final class DoubleMeasureSdk extends AbstractMeasure<BoundInstrument> implements
@Override
public BoundInstrument bind(LabelSet labelSet) {
return bindInternal(labelSet);
return bindInternal((LabelSetSdk) labelSet);
}
@Override

View File

@ -18,7 +18,6 @@ package io.opentelemetry.sdk.metrics;
import io.opentelemetry.internal.Utils;
import io.opentelemetry.metrics.DoubleObserver;
import io.opentelemetry.metrics.LabelSet;
import io.opentelemetry.sdk.metrics.aggregator.Aggregator;
import io.opentelemetry.sdk.metrics.common.InstrumentValueType;
import io.opentelemetry.sdk.metrics.data.MetricData;
@ -95,13 +94,14 @@ final class DoubleObserverSdk extends AbstractObserver implements DoubleObserver
}
@Override
public void observe(double value, LabelSet labelSet) {
public void observe(double value, String... keyValueLabelPairs) {
if (monotonic && value < 0) {
throw new IllegalArgumentException("monotonic observers can only record positive values");
}
Aggregator aggregator = activeBatcher.getAggregator();
aggregator.recordDouble(value);
activeBatcher.batch(labelSet, aggregator, /* mappedAggregator= */ false);
activeBatcher.batch(
LabelSetSdk.create(keyValueLabelPairs), aggregator, /* mappedAggregator= */ false);
}
}
}

View File

@ -49,7 +49,7 @@ final class LongCounterSdk extends AbstractCounter<BoundInstrument> implements L
@Override
public BoundInstrument bind(LabelSet labelSet) {
return bindInternal(labelSet);
return bindInternal((LabelSetSdk) labelSet);
}
@Override

View File

@ -45,8 +45,7 @@ final class LongMeasureSdk extends AbstractMeasure<BoundInstrument> implements L
@Override
public BoundInstrument bind(LabelSet labelSet) {
return bindInternal(labelSet);
return bindInternal((LabelSetSdk) labelSet);
}
@Override

View File

@ -17,7 +17,6 @@
package io.opentelemetry.sdk.metrics;
import io.opentelemetry.internal.Utils;
import io.opentelemetry.metrics.LabelSet;
import io.opentelemetry.metrics.LongObserver;
import io.opentelemetry.sdk.metrics.aggregator.Aggregator;
import io.opentelemetry.sdk.metrics.common.InstrumentValueType;
@ -95,13 +94,14 @@ final class LongObserverSdk extends AbstractObserver implements LongObserver {
}
@Override
public void observe(long value, LabelSet labelSet) {
public void observe(long value, String... keyValueLabelPairs) {
if (monotonic && value < 0) {
throw new IllegalArgumentException("monotonic observers can only record positive values");
}
Aggregator aggregator = activeBatcher.getAggregator();
aggregator.recordLong(value);
activeBatcher.batch(labelSet, aggregator, /* mappedAggregator= */ false);
activeBatcher.batch(
LabelSetSdk.create(keyValueLabelPairs), aggregator, /* mappedAggregator= */ false);
}
}
}

View File

@ -116,7 +116,7 @@ public class AbstractCounterBuilderTest {
@Override
public TestBoundCounter bind(LabelSet labelSet) {
return bindInternal(labelSet);
return bindInternal((LabelSetSdk) labelSet);
}
}

View File

@ -117,7 +117,7 @@ public class AbstractMeasureBuilderTest {
@Override
public TestBoundMeasure bind(LabelSet labelSet) {
return bindInternal(labelSet);
return bindInternal((LabelSetSdk) labelSet);
}
}

View File

@ -57,7 +57,7 @@ public class DoubleObserverSdkTest {
public void update(ResultDoubleObserver result) {
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage("monotonic observers can only record positive values");
result.observe(-45.0, testSdk.createLabelSet());
result.observe(-45.0);
}
});
doubleObserver.collectAll();

View File

@ -57,7 +57,7 @@ public class LongObserverSdkTest {
public void update(ResultLongObserver result) {
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage("monotonic observers can only record positive values");
result.observe(-45, testSdk.createLabelSet());
result.observe(-45);
}
});
longObserver.collectAll();