Implement NamingConvention support in Micrometer bridge (#5328)
* Implement NamingConvention support in Micrometer bridge * default naming convention
This commit is contained in:
parent
2cf853dba3
commit
956b5660de
|
@ -8,6 +8,7 @@ package io.opentelemetry.instrumentation.micrometer.v1_5;
|
||||||
import io.micrometer.core.instrument.Meter;
|
import io.micrometer.core.instrument.Meter;
|
||||||
import io.micrometer.core.instrument.Statistic;
|
import io.micrometer.core.instrument.Statistic;
|
||||||
import io.micrometer.core.instrument.Tag;
|
import io.micrometer.core.instrument.Tag;
|
||||||
|
import io.micrometer.core.instrument.config.NamingConvention;
|
||||||
import io.opentelemetry.api.common.AttributeKey;
|
import io.opentelemetry.api.common.AttributeKey;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.api.common.AttributesBuilder;
|
import io.opentelemetry.api.common.AttributesBuilder;
|
||||||
|
@ -17,18 +18,28 @@ final class Bridging {
|
||||||
|
|
||||||
private static final Cache<String, AttributeKey<String>> tagsCache = Cache.bounded(1024);
|
private static final Cache<String, AttributeKey<String>> tagsCache = Cache.bounded(1024);
|
||||||
|
|
||||||
static Attributes tagsAsAttributes(Meter.Id id) {
|
static Attributes tagsAsAttributes(Meter.Id id, NamingConvention namingConvention) {
|
||||||
Iterable<Tag> tags = id.getTagsAsIterable();
|
Iterable<Tag> tags = id.getTagsAsIterable();
|
||||||
if (!tags.iterator().hasNext()) {
|
if (!tags.iterator().hasNext()) {
|
||||||
return Attributes.empty();
|
return Attributes.empty();
|
||||||
}
|
}
|
||||||
AttributesBuilder builder = Attributes.builder();
|
AttributesBuilder builder = Attributes.builder();
|
||||||
for (Tag tag : tags) {
|
for (Tag tag : tags) {
|
||||||
builder.put(tagsCache.computeIfAbsent(tag.getKey(), AttributeKey::stringKey), tag.getValue());
|
String tagKey = namingConvention.tagKey(tag.getKey());
|
||||||
|
String tagValue = namingConvention.tagValue(tag.getValue());
|
||||||
|
builder.put(tagsCache.computeIfAbsent(tagKey, AttributeKey::stringKey), tagValue);
|
||||||
}
|
}
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static String name(Meter.Id id, NamingConvention namingConvention) {
|
||||||
|
return name(id.getName(), id, namingConvention);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String name(String name, Meter.Id id, NamingConvention namingConvention) {
|
||||||
|
return namingConvention.name(name, id.getType(), id.getBaseUnit());
|
||||||
|
}
|
||||||
|
|
||||||
static String description(Meter.Id id) {
|
static String description(Meter.Id id) {
|
||||||
String description = id.getDescription();
|
String description = id.getDescription();
|
||||||
return description == null ? "" : description;
|
return description == null ? "" : description;
|
||||||
|
@ -39,12 +50,13 @@ final class Bridging {
|
||||||
return baseUnit == null ? "1" : baseUnit;
|
return baseUnit == null ? "1" : baseUnit;
|
||||||
}
|
}
|
||||||
|
|
||||||
static String statisticInstrumentName(Meter.Id id, Statistic statistic) {
|
static String statisticInstrumentName(
|
||||||
|
Meter.Id id, Statistic statistic, NamingConvention namingConvention) {
|
||||||
String prefix = id.getName() + ".";
|
String prefix = id.getName() + ".";
|
||||||
// use "total_time" instead of "total" to avoid clashing with Statistic.TOTAL
|
// use "total_time" instead of "total" to avoid clashing with Statistic.TOTAL
|
||||||
String statisticStr =
|
String statisticStr =
|
||||||
statistic == Statistic.TOTAL_TIME ? "total_time" : statistic.getTagValueRepresentation();
|
statistic == Statistic.TOTAL_TIME ? "total_time" : statistic.getTagValueRepresentation();
|
||||||
return prefix + statisticStr;
|
return name(prefix + statisticStr, id, namingConvention);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Bridging() {}
|
private Bridging() {}
|
||||||
|
|
|
@ -7,10 +7,12 @@ package io.opentelemetry.instrumentation.micrometer.v1_5;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.baseUnit;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.baseUnit;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description;
|
||||||
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.name;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes;
|
||||||
|
|
||||||
import io.micrometer.core.instrument.Counter;
|
import io.micrometer.core.instrument.Counter;
|
||||||
import io.micrometer.core.instrument.Measurement;
|
import io.micrometer.core.instrument.Measurement;
|
||||||
|
import io.micrometer.core.instrument.config.NamingConvention;
|
||||||
import io.micrometer.core.instrument.util.MeterEquivalence;
|
import io.micrometer.core.instrument.util.MeterEquivalence;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.api.metrics.DoubleCounter;
|
import io.opentelemetry.api.metrics.DoubleCounter;
|
||||||
|
@ -28,16 +30,17 @@ final class OpenTelemetryCounter implements Counter, RemovableMeter {
|
||||||
|
|
||||||
private volatile boolean removed = false;
|
private volatile boolean removed = false;
|
||||||
|
|
||||||
OpenTelemetryCounter(Id id, Meter otelMeter) {
|
OpenTelemetryCounter(Id id, NamingConvention namingConvention, Meter otelMeter) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
|
||||||
|
this.attributes = tagsAsAttributes(id, namingConvention);
|
||||||
this.otelCounter =
|
this.otelCounter =
|
||||||
otelMeter
|
otelMeter
|
||||||
.counterBuilder(id.getName())
|
.counterBuilder(name(id, namingConvention))
|
||||||
.setDescription(description(id))
|
.setDescription(description(id))
|
||||||
.setUnit(baseUnit(id))
|
.setUnit(baseUnit(id))
|
||||||
.ofDoubles()
|
.ofDoubles()
|
||||||
.build();
|
.build();
|
||||||
this.attributes = tagsAsAttributes(id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -7,6 +7,7 @@ package io.opentelemetry.instrumentation.micrometer.v1_5;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.baseUnit;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.baseUnit;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description;
|
||||||
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.name;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.statisticInstrumentName;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.statisticInstrumentName;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes;
|
||||||
|
|
||||||
|
@ -15,6 +16,7 @@ import io.micrometer.core.instrument.Clock;
|
||||||
import io.micrometer.core.instrument.DistributionSummary;
|
import io.micrometer.core.instrument.DistributionSummary;
|
||||||
import io.micrometer.core.instrument.Measurement;
|
import io.micrometer.core.instrument.Measurement;
|
||||||
import io.micrometer.core.instrument.Statistic;
|
import io.micrometer.core.instrument.Statistic;
|
||||||
|
import io.micrometer.core.instrument.config.NamingConvention;
|
||||||
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
|
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
|
||||||
import io.micrometer.core.instrument.distribution.NoopHistogram;
|
import io.micrometer.core.instrument.distribution.NoopHistogram;
|
||||||
import io.micrometer.core.instrument.distribution.TimeWindowMax;
|
import io.micrometer.core.instrument.distribution.TimeWindowMax;
|
||||||
|
@ -41,6 +43,7 @@ final class OpenTelemetryDistributionSummary extends AbstractDistributionSummary
|
||||||
|
|
||||||
OpenTelemetryDistributionSummary(
|
OpenTelemetryDistributionSummary(
|
||||||
Id id,
|
Id id,
|
||||||
|
NamingConvention namingConvention,
|
||||||
Clock clock,
|
Clock clock,
|
||||||
DistributionStatisticConfig distributionStatisticConfig,
|
DistributionStatisticConfig distributionStatisticConfig,
|
||||||
double scale,
|
double scale,
|
||||||
|
@ -55,16 +58,16 @@ final class OpenTelemetryDistributionSummary extends AbstractDistributionSummary
|
||||||
}
|
}
|
||||||
max = new TimeWindowMax(clock, distributionStatisticConfig);
|
max = new TimeWindowMax(clock, distributionStatisticConfig);
|
||||||
|
|
||||||
this.attributes = tagsAsAttributes(id);
|
this.attributes = tagsAsAttributes(id, namingConvention);
|
||||||
this.otelHistogram =
|
this.otelHistogram =
|
||||||
otelMeter
|
otelMeter
|
||||||
.histogramBuilder(id.getName())
|
.histogramBuilder(name(id, namingConvention))
|
||||||
.setDescription(description(id))
|
.setDescription(description(id))
|
||||||
.setUnit(baseUnit(id))
|
.setUnit(baseUnit(id))
|
||||||
.build();
|
.build();
|
||||||
this.maxHandle =
|
this.maxHandle =
|
||||||
asyncInstrumentRegistry.buildGauge(
|
asyncInstrumentRegistry.buildGauge(
|
||||||
statisticInstrumentName(id, Statistic.MAX),
|
statisticInstrumentName(id, Statistic.MAX, namingConvention),
|
||||||
description(id),
|
description(id),
|
||||||
baseUnit(id),
|
baseUnit(id),
|
||||||
attributes,
|
attributes,
|
||||||
|
|
|
@ -7,10 +7,12 @@ package io.opentelemetry.instrumentation.micrometer.v1_5;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.baseUnit;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.baseUnit;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description;
|
||||||
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.name;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes;
|
||||||
|
|
||||||
import io.micrometer.core.instrument.FunctionCounter;
|
import io.micrometer.core.instrument.FunctionCounter;
|
||||||
import io.micrometer.core.instrument.Measurement;
|
import io.micrometer.core.instrument.Measurement;
|
||||||
|
import io.micrometer.core.instrument.config.NamingConvention;
|
||||||
import io.micrometer.core.instrument.util.MeterEquivalence;
|
import io.micrometer.core.instrument.util.MeterEquivalence;
|
||||||
import io.opentelemetry.instrumentation.api.internal.AsyncInstrumentRegistry;
|
import io.opentelemetry.instrumentation.api.internal.AsyncInstrumentRegistry;
|
||||||
import io.opentelemetry.instrumentation.api.internal.AsyncInstrumentRegistry.AsyncMeasurementHandle;
|
import io.opentelemetry.instrumentation.api.internal.AsyncInstrumentRegistry.AsyncMeasurementHandle;
|
||||||
|
@ -26,6 +28,7 @@ final class OpenTelemetryFunctionCounter<T> implements FunctionCounter, Removabl
|
||||||
|
|
||||||
OpenTelemetryFunctionCounter(
|
OpenTelemetryFunctionCounter(
|
||||||
Id id,
|
Id id,
|
||||||
|
NamingConvention namingConvention,
|
||||||
T obj,
|
T obj,
|
||||||
ToDoubleFunction<T> countFunction,
|
ToDoubleFunction<T> countFunction,
|
||||||
AsyncInstrumentRegistry asyncInstrumentRegistry) {
|
AsyncInstrumentRegistry asyncInstrumentRegistry) {
|
||||||
|
@ -33,7 +36,12 @@ final class OpenTelemetryFunctionCounter<T> implements FunctionCounter, Removabl
|
||||||
|
|
||||||
countMeasurementHandle =
|
countMeasurementHandle =
|
||||||
asyncInstrumentRegistry.buildDoubleCounter(
|
asyncInstrumentRegistry.buildDoubleCounter(
|
||||||
id.getName(), description(id), baseUnit(id), tagsAsAttributes(id), obj, countFunction);
|
name(id, namingConvention),
|
||||||
|
description(id),
|
||||||
|
baseUnit(id),
|
||||||
|
tagsAsAttributes(id, namingConvention),
|
||||||
|
obj,
|
||||||
|
countFunction);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -13,6 +13,7 @@ import static io.opentelemetry.instrumentation.micrometer.v1_5.TimeUnitHelper.ge
|
||||||
import io.micrometer.core.instrument.FunctionTimer;
|
import io.micrometer.core.instrument.FunctionTimer;
|
||||||
import io.micrometer.core.instrument.Measurement;
|
import io.micrometer.core.instrument.Measurement;
|
||||||
import io.micrometer.core.instrument.Statistic;
|
import io.micrometer.core.instrument.Statistic;
|
||||||
|
import io.micrometer.core.instrument.config.NamingConvention;
|
||||||
import io.micrometer.core.instrument.util.MeterEquivalence;
|
import io.micrometer.core.instrument.util.MeterEquivalence;
|
||||||
import io.micrometer.core.instrument.util.TimeUtils;
|
import io.micrometer.core.instrument.util.TimeUtils;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
|
@ -34,6 +35,7 @@ final class OpenTelemetryFunctionTimer<T> implements FunctionTimer, RemovableMet
|
||||||
|
|
||||||
OpenTelemetryFunctionTimer(
|
OpenTelemetryFunctionTimer(
|
||||||
Id id,
|
Id id,
|
||||||
|
NamingConvention namingConvention,
|
||||||
T obj,
|
T obj,
|
||||||
ToLongFunction<T> countFunction,
|
ToLongFunction<T> countFunction,
|
||||||
ToDoubleFunction<T> totalTimeFunction,
|
ToDoubleFunction<T> totalTimeFunction,
|
||||||
|
@ -44,9 +46,9 @@ final class OpenTelemetryFunctionTimer<T> implements FunctionTimer, RemovableMet
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.baseTimeUnit = baseTimeUnit;
|
this.baseTimeUnit = baseTimeUnit;
|
||||||
|
|
||||||
String countMeterName = statisticInstrumentName(id, Statistic.COUNT);
|
String countMeterName = statisticInstrumentName(id, Statistic.COUNT, namingConvention);
|
||||||
String totalTimeMeterName = statisticInstrumentName(id, Statistic.TOTAL_TIME);
|
String totalTimeMeterName = statisticInstrumentName(id, Statistic.TOTAL_TIME, namingConvention);
|
||||||
Attributes attributes = tagsAsAttributes(id);
|
Attributes attributes = tagsAsAttributes(id, namingConvention);
|
||||||
|
|
||||||
countMeasurementHandle =
|
countMeasurementHandle =
|
||||||
asyncInstrumentRegistry.buildLongCounter(
|
asyncInstrumentRegistry.buildLongCounter(
|
||||||
|
|
|
@ -7,10 +7,12 @@ package io.opentelemetry.instrumentation.micrometer.v1_5;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.baseUnit;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.baseUnit;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description;
|
||||||
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.name;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes;
|
||||||
|
|
||||||
import io.micrometer.core.instrument.Gauge;
|
import io.micrometer.core.instrument.Gauge;
|
||||||
import io.micrometer.core.instrument.Measurement;
|
import io.micrometer.core.instrument.Measurement;
|
||||||
|
import io.micrometer.core.instrument.config.NamingConvention;
|
||||||
import io.micrometer.core.instrument.util.MeterEquivalence;
|
import io.micrometer.core.instrument.util.MeterEquivalence;
|
||||||
import io.opentelemetry.instrumentation.api.internal.AsyncInstrumentRegistry;
|
import io.opentelemetry.instrumentation.api.internal.AsyncInstrumentRegistry;
|
||||||
import io.opentelemetry.instrumentation.api.internal.AsyncInstrumentRegistry.AsyncMeasurementHandle;
|
import io.opentelemetry.instrumentation.api.internal.AsyncInstrumentRegistry.AsyncMeasurementHandle;
|
||||||
|
@ -26,14 +28,21 @@ final class OpenTelemetryGauge<T> implements Gauge, RemovableMeter {
|
||||||
|
|
||||||
OpenTelemetryGauge(
|
OpenTelemetryGauge(
|
||||||
Id id,
|
Id id,
|
||||||
|
NamingConvention namingConvention,
|
||||||
@Nullable T obj,
|
@Nullable T obj,
|
||||||
ToDoubleFunction<T> objMetric,
|
ToDoubleFunction<T> objMetric,
|
||||||
AsyncInstrumentRegistry asyncInstrumentRegistry) {
|
AsyncInstrumentRegistry asyncInstrumentRegistry) {
|
||||||
|
|
||||||
this.id = id;
|
this.id = id;
|
||||||
|
|
||||||
gaugeMeasurementHandle =
|
gaugeMeasurementHandle =
|
||||||
asyncInstrumentRegistry.buildGauge(
|
asyncInstrumentRegistry.buildGauge(
|
||||||
id.getName(), description(id), baseUnit(id), tagsAsAttributes(id), obj, objMetric);
|
name(id, namingConvention),
|
||||||
|
description(id),
|
||||||
|
baseUnit(id),
|
||||||
|
tagsAsAttributes(id, namingConvention),
|
||||||
|
obj,
|
||||||
|
objMetric);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
package io.opentelemetry.instrumentation.micrometer.v1_5;
|
package io.opentelemetry.instrumentation.micrometer.v1_5;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description;
|
||||||
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.name;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.statisticInstrumentName;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.statisticInstrumentName;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.TimeUnitHelper.getUnitString;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.TimeUnitHelper.getUnitString;
|
||||||
|
@ -13,6 +14,7 @@ import static io.opentelemetry.instrumentation.micrometer.v1_5.TimeUnitHelper.ge
|
||||||
import io.micrometer.core.instrument.Clock;
|
import io.micrometer.core.instrument.Clock;
|
||||||
import io.micrometer.core.instrument.Measurement;
|
import io.micrometer.core.instrument.Measurement;
|
||||||
import io.micrometer.core.instrument.Statistic;
|
import io.micrometer.core.instrument.Statistic;
|
||||||
|
import io.micrometer.core.instrument.config.NamingConvention;
|
||||||
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
|
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
|
||||||
import io.micrometer.core.instrument.internal.DefaultLongTaskTimer;
|
import io.micrometer.core.instrument.internal.DefaultLongTaskTimer;
|
||||||
import io.micrometer.core.instrument.util.TimeUtils;
|
import io.micrometer.core.instrument.util.TimeUtils;
|
||||||
|
@ -36,6 +38,7 @@ final class OpenTelemetryLongTaskTimer extends DefaultLongTaskTimer implements R
|
||||||
|
|
||||||
OpenTelemetryLongTaskTimer(
|
OpenTelemetryLongTaskTimer(
|
||||||
Id id,
|
Id id,
|
||||||
|
NamingConvention namingConvention,
|
||||||
Clock clock,
|
Clock clock,
|
||||||
TimeUnit baseTimeUnit,
|
TimeUnit baseTimeUnit,
|
||||||
DistributionStatisticConfig distributionStatisticConfig,
|
DistributionStatisticConfig distributionStatisticConfig,
|
||||||
|
@ -47,17 +50,18 @@ final class OpenTelemetryLongTaskTimer extends DefaultLongTaskTimer implements R
|
||||||
|
|
||||||
this.otelHistogram =
|
this.otelHistogram =
|
||||||
otelMeter
|
otelMeter
|
||||||
.histogramBuilder(id.getName())
|
.histogramBuilder(name(id, namingConvention))
|
||||||
.setDescription(description(id))
|
.setDescription(description(id))
|
||||||
.setUnit(getUnitString(baseTimeUnit))
|
.setUnit(getUnitString(baseTimeUnit))
|
||||||
.build();
|
.build();
|
||||||
this.otelActiveTasksCounter =
|
this.otelActiveTasksCounter =
|
||||||
otelMeter
|
otelMeter
|
||||||
.upDownCounterBuilder(statisticInstrumentName(id, Statistic.ACTIVE_TASKS))
|
.upDownCounterBuilder(
|
||||||
|
statisticInstrumentName(id, Statistic.ACTIVE_TASKS, namingConvention))
|
||||||
.setDescription(description(id))
|
.setDescription(description(id))
|
||||||
.setUnit("tasks")
|
.setUnit("tasks")
|
||||||
.build();
|
.build();
|
||||||
this.attributes = tagsAsAttributes(id);
|
this.attributes = tagsAsAttributes(id, namingConvention);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -12,6 +12,7 @@ import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAt
|
||||||
|
|
||||||
import io.micrometer.core.instrument.Measurement;
|
import io.micrometer.core.instrument.Measurement;
|
||||||
import io.micrometer.core.instrument.Meter;
|
import io.micrometer.core.instrument.Meter;
|
||||||
|
import io.micrometer.core.instrument.config.NamingConvention;
|
||||||
import io.micrometer.core.instrument.util.MeterEquivalence;
|
import io.micrometer.core.instrument.util.MeterEquivalence;
|
||||||
import io.opentelemetry.api.common.Attributes;
|
import io.opentelemetry.api.common.Attributes;
|
||||||
import io.opentelemetry.instrumentation.api.internal.AsyncInstrumentRegistry;
|
import io.opentelemetry.instrumentation.api.internal.AsyncInstrumentRegistry;
|
||||||
|
@ -28,13 +29,16 @@ final class OpenTelemetryMeter implements Meter, RemovableMeter {
|
||||||
private final List<AsyncMeasurementHandle> measurementHandles;
|
private final List<AsyncMeasurementHandle> measurementHandles;
|
||||||
|
|
||||||
OpenTelemetryMeter(
|
OpenTelemetryMeter(
|
||||||
Id id, Iterable<Measurement> measurements, AsyncInstrumentRegistry asyncInstrumentRegistry) {
|
Id id,
|
||||||
|
NamingConvention namingConvention,
|
||||||
|
Iterable<Measurement> measurements,
|
||||||
|
AsyncInstrumentRegistry asyncInstrumentRegistry) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
Attributes attributes = tagsAsAttributes(id);
|
Attributes attributes = tagsAsAttributes(id, namingConvention);
|
||||||
|
|
||||||
List<AsyncMeasurementHandle> measurementHandles = new ArrayList<>();
|
List<AsyncMeasurementHandle> measurementHandles = new ArrayList<>();
|
||||||
for (Measurement measurement : measurements) {
|
for (Measurement measurement : measurements) {
|
||||||
String name = statisticInstrumentName(id, measurement.getStatistic());
|
String name = statisticInstrumentName(id, measurement.getStatistic(), namingConvention);
|
||||||
String description = description(id);
|
String description = description(id);
|
||||||
String baseUnit = baseUnit(id);
|
String baseUnit = baseUnit(id);
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ import io.micrometer.core.instrument.Measurement;
|
||||||
import io.micrometer.core.instrument.Meter;
|
import io.micrometer.core.instrument.Meter;
|
||||||
import io.micrometer.core.instrument.MeterRegistry;
|
import io.micrometer.core.instrument.MeterRegistry;
|
||||||
import io.micrometer.core.instrument.Timer;
|
import io.micrometer.core.instrument.Timer;
|
||||||
|
import io.micrometer.core.instrument.config.NamingConvention;
|
||||||
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
|
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
|
||||||
import io.micrometer.core.instrument.distribution.HistogramGauges;
|
import io.micrometer.core.instrument.distribution.HistogramGauges;
|
||||||
import io.micrometer.core.instrument.distribution.pause.PauseDetector;
|
import io.micrometer.core.instrument.distribution.pause.PauseDetector;
|
||||||
|
@ -59,17 +60,21 @@ public final class OpenTelemetryMeterRegistry extends MeterRegistry {
|
||||||
this.baseTimeUnit = baseTimeUnit;
|
this.baseTimeUnit = baseTimeUnit;
|
||||||
this.otelMeter = otelMeter;
|
this.otelMeter = otelMeter;
|
||||||
this.asyncInstrumentRegistry = AsyncInstrumentRegistry.getOrCreate(otelMeter);
|
this.asyncInstrumentRegistry = AsyncInstrumentRegistry.getOrCreate(otelMeter);
|
||||||
this.config().onMeterRemoved(OpenTelemetryMeterRegistry::onMeterRemoved);
|
|
||||||
|
this.config()
|
||||||
|
.namingConvention(NamingConvention.identity)
|
||||||
|
.onMeterRemoved(OpenTelemetryMeterRegistry::onMeterRemoved);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected <T> Gauge newGauge(Meter.Id id, @Nullable T obj, ToDoubleFunction<T> valueFunction) {
|
protected <T> Gauge newGauge(Meter.Id id, @Nullable T obj, ToDoubleFunction<T> valueFunction) {
|
||||||
return new OpenTelemetryGauge<>(id, obj, valueFunction, asyncInstrumentRegistry);
|
return new OpenTelemetryGauge<>(
|
||||||
|
id, config().namingConvention(), obj, valueFunction, asyncInstrumentRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Counter newCounter(Meter.Id id) {
|
protected Counter newCounter(Meter.Id id) {
|
||||||
return new OpenTelemetryCounter(id, otelMeter);
|
return new OpenTelemetryCounter(id, config().namingConvention(), otelMeter);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -77,7 +82,12 @@ public final class OpenTelemetryMeterRegistry extends MeterRegistry {
|
||||||
Meter.Id id, DistributionStatisticConfig distributionStatisticConfig) {
|
Meter.Id id, DistributionStatisticConfig distributionStatisticConfig) {
|
||||||
OpenTelemetryLongTaskTimer timer =
|
OpenTelemetryLongTaskTimer timer =
|
||||||
new OpenTelemetryLongTaskTimer(
|
new OpenTelemetryLongTaskTimer(
|
||||||
id, clock, getBaseTimeUnit(), distributionStatisticConfig, otelMeter);
|
id,
|
||||||
|
config().namingConvention(),
|
||||||
|
clock,
|
||||||
|
getBaseTimeUnit(),
|
||||||
|
distributionStatisticConfig,
|
||||||
|
otelMeter);
|
||||||
if (timer.isUsingMicrometerHistograms()) {
|
if (timer.isUsingMicrometerHistograms()) {
|
||||||
HistogramGauges.registerWithCommonFormat(timer, this);
|
HistogramGauges.registerWithCommonFormat(timer, this);
|
||||||
}
|
}
|
||||||
|
@ -92,6 +102,7 @@ public final class OpenTelemetryMeterRegistry extends MeterRegistry {
|
||||||
OpenTelemetryTimer timer =
|
OpenTelemetryTimer timer =
|
||||||
new OpenTelemetryTimer(
|
new OpenTelemetryTimer(
|
||||||
id,
|
id,
|
||||||
|
config().namingConvention(),
|
||||||
clock,
|
clock,
|
||||||
distributionStatisticConfig,
|
distributionStatisticConfig,
|
||||||
pauseDetector,
|
pauseDetector,
|
||||||
|
@ -109,7 +120,13 @@ public final class OpenTelemetryMeterRegistry extends MeterRegistry {
|
||||||
Meter.Id id, DistributionStatisticConfig distributionStatisticConfig, double scale) {
|
Meter.Id id, DistributionStatisticConfig distributionStatisticConfig, double scale) {
|
||||||
OpenTelemetryDistributionSummary distributionSummary =
|
OpenTelemetryDistributionSummary distributionSummary =
|
||||||
new OpenTelemetryDistributionSummary(
|
new OpenTelemetryDistributionSummary(
|
||||||
id, clock, distributionStatisticConfig, scale, otelMeter, asyncInstrumentRegistry);
|
id,
|
||||||
|
config().namingConvention(),
|
||||||
|
clock,
|
||||||
|
distributionStatisticConfig,
|
||||||
|
scale,
|
||||||
|
otelMeter,
|
||||||
|
asyncInstrumentRegistry);
|
||||||
if (distributionSummary.isUsingMicrometerHistograms()) {
|
if (distributionSummary.isUsingMicrometerHistograms()) {
|
||||||
HistogramGauges.registerWithCommonFormat(distributionSummary, this);
|
HistogramGauges.registerWithCommonFormat(distributionSummary, this);
|
||||||
}
|
}
|
||||||
|
@ -118,7 +135,8 @@ public final class OpenTelemetryMeterRegistry extends MeterRegistry {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Meter newMeter(Meter.Id id, Meter.Type type, Iterable<Measurement> measurements) {
|
protected Meter newMeter(Meter.Id id, Meter.Type type, Iterable<Measurement> measurements) {
|
||||||
return new OpenTelemetryMeter(id, measurements, asyncInstrumentRegistry);
|
return new OpenTelemetryMeter(
|
||||||
|
id, config().namingConvention(), measurements, asyncInstrumentRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -130,6 +148,7 @@ public final class OpenTelemetryMeterRegistry extends MeterRegistry {
|
||||||
TimeUnit totalTimeFunctionUnit) {
|
TimeUnit totalTimeFunctionUnit) {
|
||||||
return new OpenTelemetryFunctionTimer<>(
|
return new OpenTelemetryFunctionTimer<>(
|
||||||
id,
|
id,
|
||||||
|
config().namingConvention(),
|
||||||
obj,
|
obj,
|
||||||
countFunction,
|
countFunction,
|
||||||
totalTimeFunction,
|
totalTimeFunction,
|
||||||
|
@ -141,7 +160,8 @@ public final class OpenTelemetryMeterRegistry extends MeterRegistry {
|
||||||
@Override
|
@Override
|
||||||
protected <T> FunctionCounter newFunctionCounter(
|
protected <T> FunctionCounter newFunctionCounter(
|
||||||
Meter.Id id, T obj, ToDoubleFunction<T> countFunction) {
|
Meter.Id id, T obj, ToDoubleFunction<T> countFunction) {
|
||||||
return new OpenTelemetryFunctionCounter<>(id, obj, countFunction, asyncInstrumentRegistry);
|
return new OpenTelemetryFunctionCounter<>(
|
||||||
|
id, config().namingConvention(), obj, countFunction, asyncInstrumentRegistry);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
package io.opentelemetry.instrumentation.micrometer.v1_5;
|
package io.opentelemetry.instrumentation.micrometer.v1_5;
|
||||||
|
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.description;
|
||||||
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.name;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.statisticInstrumentName;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.statisticInstrumentName;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.Bridging.tagsAsAttributes;
|
||||||
import static io.opentelemetry.instrumentation.micrometer.v1_5.TimeUnitHelper.getUnitString;
|
import static io.opentelemetry.instrumentation.micrometer.v1_5.TimeUnitHelper.getUnitString;
|
||||||
|
@ -14,6 +15,7 @@ import io.micrometer.core.instrument.AbstractTimer;
|
||||||
import io.micrometer.core.instrument.Clock;
|
import io.micrometer.core.instrument.Clock;
|
||||||
import io.micrometer.core.instrument.Measurement;
|
import io.micrometer.core.instrument.Measurement;
|
||||||
import io.micrometer.core.instrument.Statistic;
|
import io.micrometer.core.instrument.Statistic;
|
||||||
|
import io.micrometer.core.instrument.config.NamingConvention;
|
||||||
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
|
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
|
||||||
import io.micrometer.core.instrument.distribution.NoopHistogram;
|
import io.micrometer.core.instrument.distribution.NoopHistogram;
|
||||||
import io.micrometer.core.instrument.distribution.TimeWindowMax;
|
import io.micrometer.core.instrument.distribution.TimeWindowMax;
|
||||||
|
@ -42,6 +44,7 @@ final class OpenTelemetryTimer extends AbstractTimer implements RemovableMeter {
|
||||||
|
|
||||||
OpenTelemetryTimer(
|
OpenTelemetryTimer(
|
||||||
Id id,
|
Id id,
|
||||||
|
NamingConvention namingConvention,
|
||||||
Clock clock,
|
Clock clock,
|
||||||
DistributionStatisticConfig distributionStatisticConfig,
|
DistributionStatisticConfig distributionStatisticConfig,
|
||||||
PauseDetector pauseDetector,
|
PauseDetector pauseDetector,
|
||||||
|
@ -58,16 +61,16 @@ final class OpenTelemetryTimer extends AbstractTimer implements RemovableMeter {
|
||||||
max = new TimeWindowMax(clock, distributionStatisticConfig);
|
max = new TimeWindowMax(clock, distributionStatisticConfig);
|
||||||
|
|
||||||
this.baseTimeUnit = baseTimeUnit;
|
this.baseTimeUnit = baseTimeUnit;
|
||||||
this.attributes = tagsAsAttributes(id);
|
this.attributes = tagsAsAttributes(id, namingConvention);
|
||||||
this.otelHistogram =
|
this.otelHistogram =
|
||||||
otelMeter
|
otelMeter
|
||||||
.histogramBuilder(id.getName())
|
.histogramBuilder(name(id, namingConvention))
|
||||||
.setDescription(description(id))
|
.setDescription(description(id))
|
||||||
.setUnit(getUnitString(baseTimeUnit))
|
.setUnit(getUnitString(baseTimeUnit))
|
||||||
.build();
|
.build();
|
||||||
this.maxHandle =
|
this.maxHandle =
|
||||||
asyncInstrumentRegistry.buildGauge(
|
asyncInstrumentRegistry.buildGauge(
|
||||||
statisticInstrumentName(id, Statistic.MAX),
|
statisticInstrumentName(id, Statistic.MAX, namingConvention),
|
||||||
description(id),
|
description(id),
|
||||||
getUnitString(baseTimeUnit),
|
getUnitString(baseTimeUnit),
|
||||||
attributes,
|
attributes,
|
||||||
|
|
|
@ -0,0 +1,253 @@
|
||||||
|
/*
|
||||||
|
* Copyright The OpenTelemetry Authors
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.opentelemetry.instrumentation.micrometer.v1_5;
|
||||||
|
|
||||||
|
import static io.opentelemetry.sdk.testing.assertj.MetricAssertions.assertThat;
|
||||||
|
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.attributeEntry;
|
||||||
|
|
||||||
|
import io.micrometer.core.instrument.Counter;
|
||||||
|
import io.micrometer.core.instrument.DistributionSummary;
|
||||||
|
import io.micrometer.core.instrument.Meter;
|
||||||
|
import io.micrometer.core.instrument.MeterRegistry;
|
||||||
|
import io.micrometer.core.instrument.Metrics;
|
||||||
|
import io.micrometer.core.instrument.Tags;
|
||||||
|
import io.micrometer.core.instrument.Timer;
|
||||||
|
import io.micrometer.core.instrument.config.NamingConvention;
|
||||||
|
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
|
||||||
|
import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.atomic.AtomicLong;
|
||||||
|
import org.junit.jupiter.api.AfterAll;
|
||||||
|
import org.junit.jupiter.api.BeforeAll;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.RegisterExtension;
|
||||||
|
|
||||||
|
@SuppressWarnings("PreferJavaTimeOverload")
|
||||||
|
class NamingConventionTest {
|
||||||
|
|
||||||
|
static final String INSTRUMENTATION_NAME = "io.opentelemetry.micrometer-1.5";
|
||||||
|
|
||||||
|
@RegisterExtension
|
||||||
|
static final InstrumentationExtension testing = LibraryInstrumentationExtension.create();
|
||||||
|
|
||||||
|
static MeterRegistry otelMeterRegistry;
|
||||||
|
|
||||||
|
@BeforeAll
|
||||||
|
public static void setUpRegistry() {
|
||||||
|
otelMeterRegistry = OpenTelemetryMeterRegistry.create(testing.getOpenTelemetry());
|
||||||
|
otelMeterRegistry
|
||||||
|
.config()
|
||||||
|
.namingConvention(
|
||||||
|
new NamingConvention() {
|
||||||
|
@Override
|
||||||
|
public String name(String name, Meter.Type type, String baseUnit) {
|
||||||
|
return "test." + name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String tagKey(String key) {
|
||||||
|
return "test." + key;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String tagValue(String value) {
|
||||||
|
return "test." + value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Metrics.addRegistry(otelMeterRegistry);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterAll
|
||||||
|
public static void tearDownRegistry() {
|
||||||
|
Metrics.removeRegistry(otelMeterRegistry);
|
||||||
|
}
|
||||||
|
|
||||||
|
final AtomicLong num = new AtomicLong(42);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void renameCounter() {
|
||||||
|
// when
|
||||||
|
Counter counter = Metrics.counter("renamedCounter", "tag", "value");
|
||||||
|
counter.increment();
|
||||||
|
|
||||||
|
// then
|
||||||
|
testing.waitAndAssertMetrics(
|
||||||
|
INSTRUMENTATION_NAME,
|
||||||
|
"test.renamedCounter",
|
||||||
|
metrics ->
|
||||||
|
metrics.anySatisfy(
|
||||||
|
metric ->
|
||||||
|
assertThat(metric)
|
||||||
|
.hasDoubleSum()
|
||||||
|
.points()
|
||||||
|
.satisfiesExactly(
|
||||||
|
point ->
|
||||||
|
assertThat(point)
|
||||||
|
.attributes()
|
||||||
|
.containsOnly(attributeEntry("test.tag", "test.value")))));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void renameDistributionSummary() {
|
||||||
|
// when
|
||||||
|
DistributionSummary summary = Metrics.summary("renamedSummary", "tag", "value");
|
||||||
|
summary.record(42);
|
||||||
|
|
||||||
|
// then
|
||||||
|
testing.waitAndAssertMetrics(
|
||||||
|
INSTRUMENTATION_NAME,
|
||||||
|
"test.renamedSummary",
|
||||||
|
metrics ->
|
||||||
|
metrics.anySatisfy(
|
||||||
|
metric ->
|
||||||
|
assertThat(metric)
|
||||||
|
.hasDoubleHistogram()
|
||||||
|
.points()
|
||||||
|
.satisfiesExactly(
|
||||||
|
point ->
|
||||||
|
assertThat(point)
|
||||||
|
.attributes()
|
||||||
|
.containsOnly(attributeEntry("test.tag", "test.value")))));
|
||||||
|
testing.waitAndAssertMetrics(
|
||||||
|
INSTRUMENTATION_NAME,
|
||||||
|
"test.renamedSummary.max",
|
||||||
|
metrics ->
|
||||||
|
metrics.anySatisfy(
|
||||||
|
metric ->
|
||||||
|
assertThat(metric)
|
||||||
|
.hasDoubleGauge()
|
||||||
|
.points()
|
||||||
|
.satisfiesExactly(
|
||||||
|
point ->
|
||||||
|
assertThat(point)
|
||||||
|
.attributes()
|
||||||
|
.containsOnly(attributeEntry("test.tag", "test.value")))));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void renameFunctionCounter() {
|
||||||
|
// when
|
||||||
|
Metrics.more().counter("renamedFunctionCounter", Tags.of("tag", "value"), num);
|
||||||
|
|
||||||
|
// then
|
||||||
|
testing.waitAndAssertMetrics(
|
||||||
|
INSTRUMENTATION_NAME,
|
||||||
|
"test.renamedFunctionCounter",
|
||||||
|
metrics ->
|
||||||
|
metrics.anySatisfy(
|
||||||
|
metric ->
|
||||||
|
assertThat(metric)
|
||||||
|
.hasDoubleSum()
|
||||||
|
.points()
|
||||||
|
.satisfiesExactly(
|
||||||
|
point ->
|
||||||
|
assertThat(point)
|
||||||
|
.attributes()
|
||||||
|
.containsOnly(attributeEntry("test.tag", "test.value")))));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void renameFunctionTimer() {
|
||||||
|
// when
|
||||||
|
Metrics.more()
|
||||||
|
.timer(
|
||||||
|
"renamedFunctionTimer",
|
||||||
|
Tags.of("tag", "value"),
|
||||||
|
num,
|
||||||
|
AtomicLong::longValue,
|
||||||
|
AtomicLong::doubleValue,
|
||||||
|
TimeUnit.SECONDS);
|
||||||
|
|
||||||
|
// then
|
||||||
|
testing.waitAndAssertMetrics(
|
||||||
|
INSTRUMENTATION_NAME,
|
||||||
|
"test.renamedFunctionTimer.count",
|
||||||
|
metrics ->
|
||||||
|
metrics.anySatisfy(
|
||||||
|
metric ->
|
||||||
|
assertThat(metric)
|
||||||
|
.hasLongSum()
|
||||||
|
.points()
|
||||||
|
.satisfiesExactly(
|
||||||
|
point ->
|
||||||
|
assertThat(point)
|
||||||
|
.attributes()
|
||||||
|
.containsOnly(attributeEntry("test.tag", "test.value")))));
|
||||||
|
testing.waitAndAssertMetrics(
|
||||||
|
INSTRUMENTATION_NAME,
|
||||||
|
"test.renamedFunctionTimer.total_time",
|
||||||
|
metrics ->
|
||||||
|
metrics.anySatisfy(
|
||||||
|
metric ->
|
||||||
|
assertThat(metric)
|
||||||
|
.hasDoubleSum()
|
||||||
|
.points()
|
||||||
|
.satisfiesExactly(
|
||||||
|
point ->
|
||||||
|
assertThat(point)
|
||||||
|
.attributes()
|
||||||
|
.containsOnly(attributeEntry("test.tag", "test.value")))));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void renameGauge() {
|
||||||
|
// when
|
||||||
|
Metrics.gauge("renamedGauge", Tags.of("tag", "value"), num);
|
||||||
|
|
||||||
|
// then
|
||||||
|
testing.waitAndAssertMetrics(
|
||||||
|
INSTRUMENTATION_NAME,
|
||||||
|
"test.renamedGauge",
|
||||||
|
metrics ->
|
||||||
|
metrics.anySatisfy(
|
||||||
|
metric ->
|
||||||
|
assertThat(metric)
|
||||||
|
.hasDoubleGauge()
|
||||||
|
.points()
|
||||||
|
.satisfiesExactly(
|
||||||
|
point ->
|
||||||
|
assertThat(point)
|
||||||
|
.attributes()
|
||||||
|
.containsOnly(attributeEntry("test.tag", "test.value")))));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void renameTimer() {
|
||||||
|
// when
|
||||||
|
Timer timer = Metrics.timer("renamedTimer", "tag", "value");
|
||||||
|
timer.record(10, TimeUnit.SECONDS);
|
||||||
|
|
||||||
|
// then
|
||||||
|
testing.waitAndAssertMetrics(
|
||||||
|
INSTRUMENTATION_NAME,
|
||||||
|
"test.renamedTimer",
|
||||||
|
metrics ->
|
||||||
|
metrics.anySatisfy(
|
||||||
|
metric ->
|
||||||
|
assertThat(metric)
|
||||||
|
.hasDoubleHistogram()
|
||||||
|
.points()
|
||||||
|
.satisfiesExactly(
|
||||||
|
point ->
|
||||||
|
assertThat(point)
|
||||||
|
.attributes()
|
||||||
|
.containsOnly(attributeEntry("test.tag", "test.value")))));
|
||||||
|
testing.waitAndAssertMetrics(
|
||||||
|
INSTRUMENTATION_NAME,
|
||||||
|
"test.renamedTimer.max",
|
||||||
|
metrics ->
|
||||||
|
metrics.anySatisfy(
|
||||||
|
metric ->
|
||||||
|
assertThat(metric)
|
||||||
|
.hasDoubleGauge()
|
||||||
|
.points()
|
||||||
|
.satisfiesExactly(
|
||||||
|
point ->
|
||||||
|
assertThat(point)
|
||||||
|
.attributes()
|
||||||
|
.containsOnly(attributeEntry("test.tag", "test.value")))));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue