Skip to content

Commit a5889a6

Browse files
authored
Add experimental synchronous gauge (#5506)
1 parent 43ee51c commit a5889a6

File tree

13 files changed

+902
-360
lines changed

13 files changed

+902
-360
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.extension.incubator.metrics;
7+
8+
import io.opentelemetry.api.common.Attributes;
9+
import javax.annotation.concurrent.ThreadSafe;
10+
11+
/** A gauge instrument that synchronously records {@code double} values. */
12+
@ThreadSafe
13+
public interface DoubleGauge {
14+
/**
15+
* Set the gauge value.
16+
*
17+
* @param value The current gauge value.
18+
*/
19+
void set(double value);
20+
21+
/**
22+
* Records a value with a set of attributes.
23+
*
24+
* @param value The current gauge value.
25+
* @param attributes A set of attributes to associate with the value.
26+
*/
27+
void set(double value, Attributes attributes);
28+
29+
// TODO(jack-berg): should we add overload with Context argument?
30+
}

extensions/incubator/src/main/java/io/opentelemetry/extension/incubator/metrics/ExtendedDoubleGaugeBuilder.java

+11
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@
1111
/** Extended {@link DoubleGaugeBuilder} with experimental APIs. */
1212
public interface ExtendedDoubleGaugeBuilder extends DoubleGaugeBuilder {
1313

14+
/**
15+
* Builds and returns a DoubleGauge instrument with the configuration.
16+
*
17+
* <p>NOTE: This produces a synchronous gauge which records gauge values as they occur. Most users
18+
* will want to instead register an {@link #buildWithCallback(Consumer)} to asynchronously observe
19+
* the value of the gauge when metrics are collected.
20+
*
21+
* @return The DoubleGauge instrument.
22+
*/
23+
DoubleGauge build();
24+
1425
/** Specify advice for gauge implementations. */
1526
default DoubleGaugeBuilder setAdvice(Consumer<DoubleGaugeAdviceConfigurer> adviceConsumer) {
1627
return this;

extensions/incubator/src/main/java/io/opentelemetry/extension/incubator/metrics/ExtendedLongGaugeBuilder.java

+11
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,17 @@
1111
/** Extended {@link LongGaugeBuilder} with experimental APIs. */
1212
public interface ExtendedLongGaugeBuilder extends LongGaugeBuilder {
1313

14+
/**
15+
* Builds and returns a LongGauge instrument with the configuration.
16+
*
17+
* <p>NOTE: This produces a synchronous gauge which records gauge values as they occur. Most users
18+
* will want to instead register an {@link #buildWithCallback(Consumer)} to asynchronously observe
19+
* the value of the gauge when metrics are collected.
20+
*
21+
* @return The LongGauge instrument.
22+
*/
23+
LongGauge build();
24+
1425
/** Specify advice for gauge implementations. */
1526
default LongGaugeBuilder setAdvice(Consumer<LongGaugeAdviceConfigurer> adviceConsumer) {
1627
return this;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.extension.incubator.metrics;
7+
8+
import io.opentelemetry.api.common.Attributes;
9+
import javax.annotation.concurrent.ThreadSafe;
10+
11+
/** A gauge instrument that synchronously records {@code long} values. */
12+
@ThreadSafe
13+
public interface LongGauge {
14+
/**
15+
* Set the gauge value.
16+
*
17+
* @param value The current gauge value.
18+
*/
19+
void set(long value);
20+
21+
/**
22+
* Records a value with a set of attributes.
23+
*
24+
* @param value The current gauge value.
25+
* @param attributes A set of attributes to associate with the value.
26+
*/
27+
void set(long value, Attributes attributes);
28+
29+
// TODO(jack-berg): should we add overload with Context argument?
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.metrics;
7+
8+
import io.opentelemetry.api.common.AttributeKey;
9+
import io.opentelemetry.api.common.Attributes;
10+
import io.opentelemetry.api.metrics.DoubleGaugeBuilder;
11+
import io.opentelemetry.api.metrics.LongGaugeBuilder;
12+
import io.opentelemetry.api.metrics.ObservableDoubleGauge;
13+
import io.opentelemetry.api.metrics.ObservableDoubleMeasurement;
14+
import io.opentelemetry.context.Context;
15+
import io.opentelemetry.extension.incubator.metrics.DoubleGauge;
16+
import io.opentelemetry.extension.incubator.metrics.DoubleGaugeAdviceConfigurer;
17+
import io.opentelemetry.extension.incubator.metrics.ExtendedDoubleGaugeBuilder;
18+
import io.opentelemetry.sdk.metrics.internal.descriptor.InstrumentDescriptor;
19+
import io.opentelemetry.sdk.metrics.internal.state.MeterProviderSharedState;
20+
import io.opentelemetry.sdk.metrics.internal.state.MeterSharedState;
21+
import io.opentelemetry.sdk.metrics.internal.state.WriteableMetricStorage;
22+
import java.util.List;
23+
import java.util.function.Consumer;
24+
25+
final class SdkDoubleGauge extends AbstractInstrument implements DoubleGauge {
26+
27+
private final WriteableMetricStorage storage;
28+
29+
private SdkDoubleGauge(InstrumentDescriptor descriptor, WriteableMetricStorage storage) {
30+
super(descriptor);
31+
this.storage = storage;
32+
}
33+
34+
@Override
35+
public void set(double increment, Attributes attributes) {
36+
storage.recordDouble(increment, attributes, Context.root());
37+
}
38+
39+
@Override
40+
public void set(double increment) {
41+
set(increment, Attributes.empty());
42+
}
43+
44+
static final class SdkDoubleGaugeBuilder extends AbstractInstrumentBuilder<SdkDoubleGaugeBuilder>
45+
implements ExtendedDoubleGaugeBuilder, DoubleGaugeAdviceConfigurer {
46+
47+
SdkDoubleGaugeBuilder(
48+
MeterProviderSharedState meterProviderSharedState,
49+
MeterSharedState meterSharedState,
50+
String name) {
51+
super(
52+
meterProviderSharedState,
53+
meterSharedState,
54+
// TODO: use InstrumentType.GAUGE when available
55+
InstrumentType.OBSERVABLE_GAUGE,
56+
InstrumentValueType.DOUBLE,
57+
name,
58+
"",
59+
DEFAULT_UNIT);
60+
}
61+
62+
@Override
63+
protected SdkDoubleGaugeBuilder getThis() {
64+
return this;
65+
}
66+
67+
@Override
68+
public SdkDoubleGauge build() {
69+
return buildSynchronousInstrument(SdkDoubleGauge::new);
70+
}
71+
72+
@Override
73+
public DoubleGaugeBuilder setAdvice(Consumer<DoubleGaugeAdviceConfigurer> adviceConsumer) {
74+
adviceConsumer.accept(this);
75+
return this;
76+
}
77+
78+
@Override
79+
public DoubleGaugeAdviceConfigurer setAttributes(List<AttributeKey<?>> attributes) {
80+
adviceBuilder.setAttributes(attributes);
81+
return this;
82+
}
83+
84+
@Override
85+
public LongGaugeBuilder ofLongs() {
86+
return swapBuilder(SdkLongGauge.SdkLongGaugeBuilder::new);
87+
}
88+
89+
@Override
90+
public ObservableDoubleGauge buildWithCallback(Consumer<ObservableDoubleMeasurement> callback) {
91+
// TODO: use InstrumentType.GAUGE when available
92+
return registerDoubleAsynchronousInstrument(InstrumentType.OBSERVABLE_GAUGE, callback);
93+
}
94+
95+
@Override
96+
public ObservableDoubleMeasurement buildObserver() {
97+
// TODO: use InstrumentType.GAUGE when available
98+
return buildObservableMeasurement(InstrumentType.OBSERVABLE_GAUGE);
99+
}
100+
}
101+
}

sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/SdkDoubleGaugeBuilder.java

-68
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.metrics;
7+
8+
import io.opentelemetry.api.common.AttributeKey;
9+
import io.opentelemetry.api.common.Attributes;
10+
import io.opentelemetry.api.metrics.LongGaugeBuilder;
11+
import io.opentelemetry.api.metrics.ObservableLongGauge;
12+
import io.opentelemetry.api.metrics.ObservableLongMeasurement;
13+
import io.opentelemetry.context.Context;
14+
import io.opentelemetry.extension.incubator.metrics.ExtendedLongGaugeBuilder;
15+
import io.opentelemetry.extension.incubator.metrics.LongGauge;
16+
import io.opentelemetry.extension.incubator.metrics.LongGaugeAdviceConfigurer;
17+
import io.opentelemetry.sdk.metrics.internal.descriptor.Advice;
18+
import io.opentelemetry.sdk.metrics.internal.descriptor.InstrumentDescriptor;
19+
import io.opentelemetry.sdk.metrics.internal.state.MeterProviderSharedState;
20+
import io.opentelemetry.sdk.metrics.internal.state.MeterSharedState;
21+
import io.opentelemetry.sdk.metrics.internal.state.WriteableMetricStorage;
22+
import java.util.List;
23+
import java.util.function.Consumer;
24+
25+
final class SdkLongGauge extends AbstractInstrument implements LongGauge {
26+
27+
private final WriteableMetricStorage storage;
28+
29+
private SdkLongGauge(InstrumentDescriptor descriptor, WriteableMetricStorage storage) {
30+
super(descriptor);
31+
this.storage = storage;
32+
}
33+
34+
@Override
35+
public void set(long increment, Attributes attributes) {
36+
storage.recordLong(increment, attributes, Context.root());
37+
}
38+
39+
@Override
40+
public void set(long increment) {
41+
set(increment, Attributes.empty());
42+
}
43+
44+
static final class SdkLongGaugeBuilder extends AbstractInstrumentBuilder<SdkLongGaugeBuilder>
45+
implements ExtendedLongGaugeBuilder, LongGaugeAdviceConfigurer {
46+
47+
SdkLongGaugeBuilder(
48+
MeterProviderSharedState meterProviderSharedState,
49+
MeterSharedState sharedState,
50+
String name,
51+
String description,
52+
String unit,
53+
Advice.AdviceBuilder adviceBuilder) {
54+
super(
55+
meterProviderSharedState,
56+
sharedState,
57+
// TODO: use InstrumentType.GAUGE when available
58+
InstrumentType.OBSERVABLE_GAUGE,
59+
InstrumentValueType.LONG,
60+
name,
61+
description,
62+
unit,
63+
adviceBuilder);
64+
}
65+
66+
@Override
67+
protected SdkLongGaugeBuilder getThis() {
68+
return this;
69+
}
70+
71+
@Override
72+
public SdkLongGauge build() {
73+
return buildSynchronousInstrument(SdkLongGauge::new);
74+
}
75+
76+
@Override
77+
public LongGaugeBuilder setAdvice(Consumer<LongGaugeAdviceConfigurer> adviceConsumer) {
78+
adviceConsumer.accept(this);
79+
return this;
80+
}
81+
82+
@Override
83+
public LongGaugeAdviceConfigurer setAttributes(List<AttributeKey<?>> attributes) {
84+
adviceBuilder.setAttributes(attributes);
85+
return this;
86+
}
87+
88+
@Override
89+
public ObservableLongGauge buildWithCallback(Consumer<ObservableLongMeasurement> callback) {
90+
// TODO: use InstrumentType.GAUGE when available
91+
return registerLongAsynchronousInstrument(InstrumentType.OBSERVABLE_GAUGE, callback);
92+
}
93+
94+
@Override
95+
public ObservableLongMeasurement buildObserver() {
96+
// TODO: use InstrumentType.GAUGE when available
97+
return buildObservableMeasurement(InstrumentType.OBSERVABLE_GAUGE);
98+
}
99+
}
100+
}

0 commit comments

Comments
 (0)