Skip to content

Commit cf031f6

Browse files
committed
start instrument implementation
1 parent 7960f83 commit cf031f6

File tree

17 files changed

+796
-11
lines changed

17 files changed

+796
-11
lines changed

dd-java-agent/agent-otel/otel-shim/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ minimumBranchCoverage = 0.0
66
dependencies {
77
// minimum OpenTelemetry API version this shim is compatible with
88
compileOnly group: 'io.opentelemetry', name: 'opentelemetry-api', version: '1.47.0'
9-
109
implementation project(':internal-api')
10+
compileOnly "com.google.auto.value:auto-value-annotations:1.6"
11+
annotationProcessor "com.google.auto.value:auto-value:1.6"
1112
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package datadog.opentelemetry.shim.metrics;
2+
3+
abstract class Instrument {
4+
private final MetricStreamIdentity metricStreamIdentity;
5+
6+
Instrument(MetricStreamIdentity metricStreamIdentity) {
7+
this.metricStreamIdentity = metricStreamIdentity;
8+
}
9+
10+
final MetricStreamIdentity getMetricStreamIdentity() {
11+
return metricStreamIdentity;
12+
}
13+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package datadog.opentelemetry.shim.metrics;
2+
3+
public class InstrumentBuilder {
4+
5+
private final String instrumentName;
6+
private final InstrumentType instrumentType;
7+
private final InstrumentValueType instrumentValueType;
8+
private final OtelMeter otelMeter;
9+
private String description = "";
10+
private String unit = "";
11+
12+
public InstrumentBuilder(
13+
OtelMeter meter,
14+
String instrumentName,
15+
InstrumentType instrumentType,
16+
InstrumentValueType instrumentValueType) {
17+
this.instrumentName = instrumentName;
18+
this.instrumentType = instrumentType;
19+
this.instrumentValueType = instrumentValueType;
20+
this.otelMeter = meter;
21+
}
22+
23+
public InstrumentBuilder setDescription(String description) {
24+
this.description = description;
25+
return this;
26+
}
27+
28+
public InstrumentBuilder setUnit(String unit) {
29+
this.unit = unit;
30+
return this;
31+
}
32+
33+
@FunctionalInterface
34+
interface SynchronousInstrumentConstructor<T extends Instrument> {
35+
T createInstrument(OtelMeter otelMeter, MetricStreamIdentity metricsStreamIdentity);
36+
}
37+
38+
<T extends Instrument> T buildSynchronousInstrument(
39+
SynchronousInstrumentConstructor<T> synchronousInstrumentConstructor) {
40+
MetricStreamIdentity metricStreamIdentity = newMetricStreamIdentity();
41+
// to do: add a storage in createInstrument
42+
return synchronousInstrumentConstructor.createInstrument(otelMeter, metricStreamIdentity);
43+
}
44+
45+
@FunctionalInterface
46+
interface SwapBuilder<T> {
47+
T newBuilder(OtelMeter otelMeter, String instrumentName, String description, String unit);
48+
}
49+
50+
<T> T swapBuilder(SwapBuilder<T> swapper) {
51+
return swapper.newBuilder(otelMeter, instrumentName, description, unit);
52+
}
53+
54+
private MetricStreamIdentity newMetricStreamIdentity() {
55+
return MetricStreamIdentity.create(
56+
instrumentName, description, unit, instrumentType, instrumentValueType);
57+
}
58+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package datadog.opentelemetry.shim.metrics;
2+
3+
public enum InstrumentType {
4+
COUNTER,
5+
UP_DOWN_COUNTER,
6+
HISTOGRAM,
7+
OBSERVABLE_COUNTER,
8+
OBSERVABLE_UP_DOWN_COUNTER,
9+
OBSERVABLE_GAUGE,
10+
GAUGE
11+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package datadog.opentelemetry.shim.metrics;
2+
3+
public enum InstrumentValueType {
4+
LONG,
5+
DOUBLE
6+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package datadog.opentelemetry.shim.metrics;
2+
3+
import com.google.auto.value.AutoValue;
4+
5+
@AutoValue
6+
public abstract class MetricStreamIdentity {
7+
public static MetricStreamIdentity create(
8+
String instrumentName,
9+
String description,
10+
String unit,
11+
InstrumentType instrumentType,
12+
InstrumentValueType instrumentValueType) {
13+
return new AutoValue_MetricStreamIdentity(
14+
instrumentName, description, unit, instrumentType, instrumentValueType);
15+
}
16+
17+
MetricStreamIdentity() {}
18+
19+
public abstract String instrumentName();
20+
21+
public abstract String description();
22+
23+
public abstract String unit();
24+
25+
public abstract InstrumentType instrumentType();
26+
27+
public abstract InstrumentValueType instrumentValueType();
28+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package datadog.opentelemetry.shim.metrics;
2+
3+
import io.opentelemetry.api.common.Attributes;
4+
import io.opentelemetry.api.metrics.DoubleCounter;
5+
import io.opentelemetry.api.metrics.DoubleCounterBuilder;
6+
import io.opentelemetry.api.metrics.ObservableDoubleCounter;
7+
import io.opentelemetry.api.metrics.ObservableDoubleMeasurement;
8+
import io.opentelemetry.context.Context;
9+
import java.util.function.Consumer;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
12+
13+
public class OtelDoubleCounter extends Instrument implements DoubleCounter {
14+
15+
private static final Logger LOGGER = LoggerFactory.getLogger(OtelDoubleCounter.class);
16+
17+
final OtelMeter otelMeter;
18+
19+
OtelDoubleCounter(OtelMeter otelMeter, MetricStreamIdentity metricStreamIdentity) {
20+
super(metricStreamIdentity);
21+
LOGGER.info("creating a new OtelDoubleCounter");
22+
this.otelMeter = otelMeter;
23+
/// this.storage = storage;
24+
}
25+
26+
@Override
27+
public void add(double value) {
28+
if (value < 0) {
29+
LOGGER.info(
30+
"Counters can only increase. Instrument "
31+
+ getMetricStreamIdentity().instrumentName()
32+
+ " has recorded a negative value.");
33+
return;
34+
}
35+
LOGGER.info("(not) adding {} to the OtelDoubleCounter", value);
36+
}
37+
38+
@Override
39+
public void add(double value, Attributes attributes) {}
40+
41+
@Override
42+
public void add(double value, Attributes attributes, Context context) {}
43+
44+
static class OtelDoubleCounterBuilder implements DoubleCounterBuilder {
45+
private static final Logger LOGGER = LoggerFactory.getLogger(OtelDoubleCounterBuilder.class);
46+
InstrumentBuilder builder;
47+
48+
OtelDoubleCounterBuilder(
49+
OtelMeter otelMeter, String instrumentName, String description, String unit) {
50+
this.builder =
51+
new InstrumentBuilder(
52+
otelMeter, instrumentName, InstrumentType.COUNTER, InstrumentValueType.DOUBLE)
53+
.setUnit(unit)
54+
.setDescription(description);
55+
}
56+
57+
@Override
58+
public DoubleCounterBuilder setDescription(String description) {
59+
builder.setDescription(description);
60+
return this;
61+
}
62+
63+
@Override
64+
public DoubleCounterBuilder setUnit(String unit) {
65+
builder.setUnit(unit);
66+
return this;
67+
}
68+
69+
@Override
70+
public DoubleCounter build() {
71+
return builder.buildSynchronousInstrument(OtelDoubleCounter::new);
72+
}
73+
74+
@Override
75+
public ObservableDoubleCounter buildWithCallback(
76+
Consumer<ObservableDoubleMeasurement> consumer) {
77+
return null;
78+
}
79+
80+
@Override
81+
public ObservableDoubleMeasurement buildObserver() {
82+
return DoubleCounterBuilder.super.buildObserver();
83+
}
84+
}
85+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package datadog.opentelemetry.shim.metrics;
2+
3+
import io.opentelemetry.api.common.Attributes;
4+
import io.opentelemetry.api.metrics.DoubleGauge;
5+
import io.opentelemetry.api.metrics.DoubleGaugeBuilder;
6+
import io.opentelemetry.api.metrics.LongGaugeBuilder;
7+
import io.opentelemetry.api.metrics.ObservableDoubleGauge;
8+
import io.opentelemetry.api.metrics.ObservableDoubleMeasurement;
9+
import io.opentelemetry.context.Context;
10+
import java.util.function.Consumer;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
13+
14+
public class OtelDoubleGauge extends Instrument implements DoubleGauge {
15+
private static final Logger LOGGER = LoggerFactory.getLogger(OtelDoubleGauge.class);
16+
17+
final OtelMeter otelMeter;
18+
19+
OtelDoubleGauge(OtelMeter otelMeter, MetricStreamIdentity metricStreamIdentity) {
20+
super(metricStreamIdentity);
21+
LOGGER.info("creating a new OtelDoubleGauge");
22+
this.otelMeter = otelMeter;
23+
/// this.storage = storage;
24+
}
25+
26+
@Override
27+
public void set(double value) {
28+
LOGGER.info("(not) setting {} in OtelDoubleGauge", value);
29+
}
30+
31+
@Override
32+
public void set(double value, Attributes attributes) {}
33+
34+
@Override
35+
public void set(double value, Attributes attributes, Context context) {}
36+
37+
static class OtelDoubleGaugeBuilder implements DoubleGaugeBuilder {
38+
private static final Logger LOGGER = LoggerFactory.getLogger(OtelDoubleGaugeBuilder.class);
39+
InstrumentBuilder builder;
40+
41+
public OtelDoubleGaugeBuilder(OtelMeter otelMeter, String instrumentName) {
42+
this.builder =
43+
new InstrumentBuilder(
44+
otelMeter, instrumentName, InstrumentType.GAUGE, InstrumentValueType.DOUBLE);
45+
}
46+
47+
// If a unit is not provided or the unit is null, this must be treated as an empty string.
48+
@Override
49+
public OtelDoubleGaugeBuilder setUnit(String unit) {
50+
builder.setUnit(unit);
51+
return this;
52+
}
53+
54+
@Override
55+
public OtelDoubleGaugeBuilder setDescription(String description) {
56+
builder.setDescription(description);
57+
return this;
58+
}
59+
60+
@Override
61+
public LongGaugeBuilder ofLongs() {
62+
return builder.swapBuilder(OtelLongGauge.OtelLongGaugeBuilder::new);
63+
}
64+
65+
@Override
66+
public ObservableDoubleGauge buildWithCallback(Consumer<ObservableDoubleMeasurement> consumer) {
67+
return null;
68+
}
69+
70+
@Override
71+
public ObservableDoubleMeasurement buildObserver() {
72+
return DoubleGaugeBuilder.super.buildObserver();
73+
}
74+
75+
@Override
76+
public DoubleGauge build() {
77+
return builder.buildSynchronousInstrument(OtelDoubleGauge::new);
78+
}
79+
}
80+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package datadog.opentelemetry.shim.metrics;
2+
3+
import io.opentelemetry.api.common.Attributes;
4+
import io.opentelemetry.api.metrics.DoubleHistogram;
5+
import io.opentelemetry.api.metrics.DoubleHistogramBuilder;
6+
import io.opentelemetry.api.metrics.LongHistogramBuilder;
7+
import io.opentelemetry.context.Context;
8+
import java.util.List;
9+
import org.slf4j.Logger;
10+
import org.slf4j.LoggerFactory;
11+
12+
public class OtelDoubleHistogram extends Instrument implements DoubleHistogram {
13+
private static final Logger LOGGER = LoggerFactory.getLogger(OtelDoubleHistogram.class);
14+
15+
final OtelMeter otelMeter;
16+
17+
OtelDoubleHistogram(OtelMeter otelMeter, MetricStreamIdentity metricStreamIdentity) {
18+
super(metricStreamIdentity);
19+
LOGGER.info("creating a new OtelDoubleHistogram");
20+
this.otelMeter = otelMeter;
21+
/// this.storage = storage;
22+
}
23+
24+
@Override
25+
public void record(double value) {
26+
LOGGER.info("(not) recording {} to the OtelDoubleHistogram", value);
27+
}
28+
29+
@Override
30+
public void record(double value, Attributes attributes) {}
31+
32+
@Override
33+
public void record(double value, Attributes attributes, Context context) {}
34+
35+
static class OtelDoubleHistogramBuilder implements DoubleHistogramBuilder {
36+
private static final Logger LOGGER = LoggerFactory.getLogger(OtelDoubleHistogramBuilder.class);
37+
InstrumentBuilder builder;
38+
39+
public OtelDoubleHistogramBuilder(OtelMeter otelMeter, String instrumentName) {
40+
this.builder =
41+
new InstrumentBuilder(
42+
otelMeter, instrumentName, InstrumentType.HISTOGRAM, InstrumentValueType.DOUBLE);
43+
}
44+
45+
@Override
46+
public OtelDoubleHistogramBuilder setUnit(String unit) {
47+
builder.setUnit(unit);
48+
return this;
49+
}
50+
51+
@Override
52+
public OtelDoubleHistogramBuilder setDescription(String description) {
53+
builder.setDescription(description);
54+
return this;
55+
}
56+
57+
@Override
58+
public DoubleHistogramBuilder setExplicitBucketBoundariesAdvice(List<Double> bucketBoundaries) {
59+
return DoubleHistogramBuilder.super.setExplicitBucketBoundariesAdvice(bucketBoundaries);
60+
}
61+
62+
@Override
63+
public LongHistogramBuilder ofLongs() {
64+
return builder.swapBuilder(OtelLongHistogram.OtelLongHistogramBuilder::new);
65+
}
66+
67+
@Override
68+
public DoubleHistogram build() {
69+
return builder.buildSynchronousInstrument(OtelDoubleHistogram::new);
70+
}
71+
}
72+
}

0 commit comments

Comments
 (0)