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:
parent
4d2a9f2bde
commit
e248ea7ad7
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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>() {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ public class AbstractCounterBuilderTest {
|
|||
|
||||
@Override
|
||||
public TestBoundCounter bind(LabelSet labelSet) {
|
||||
return bindInternal(labelSet);
|
||||
return bindInternal((LabelSetSdk) labelSet);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ public class AbstractMeasureBuilderTest {
|
|||
|
||||
@Override
|
||||
public TestBoundMeasure bind(LabelSet labelSet) {
|
||||
return bindInternal(labelSet);
|
||||
return bindInternal((LabelSetSdk) labelSet);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
Loading…
Reference in New Issue