diff --git a/implementations/micrometer-registry-cloudwatch/src/main/java/io/micrometer/cloudwatch/CloudWatchMeterRegistry.java b/implementations/micrometer-registry-cloudwatch/src/main/java/io/micrometer/cloudwatch/CloudWatchMeterRegistry.java index f2af3039a7..e00d154d52 100644 --- a/implementations/micrometer-registry-cloudwatch/src/main/java/io/micrometer/cloudwatch/CloudWatchMeterRegistry.java +++ b/implementations/micrometer-registry-cloudwatch/src/main/java/io/micrometer/cloudwatch/CloudWatchMeterRegistry.java @@ -34,8 +34,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadFactory; @@ -56,6 +59,17 @@ */ @Deprecated public class CloudWatchMeterRegistry extends StepMeterRegistry { + + private static final Map STANDARD_UNIT_BY_LOWERCASE_VALUE; + + static { + Map standardUnitByLowercaseValue = new HashMap<>(); + for (StandardUnit standardUnit : StandardUnit.values()) { + standardUnitByLowercaseValue.put(standardUnit.toString().toLowerCase(), standardUnit); + } + STANDARD_UNIT_BY_LOWERCASE_VALUE = Collections.unmodifiableMap(standardUnitByLowercaseValue); + } + private final CloudWatchConfig config; private final AmazonCloudWatchAsync amazonCloudWatchAsync; private final Logger logger = LoggerFactory.getLogger(CloudWatchMeterRegistry.class); @@ -165,7 +179,7 @@ private Stream gaugeData(Gauge gauge) { } private Stream counterData(Counter counter) { - return Stream.of(metricDatum(counter.getId(), "count", "count", counter.count())); + return Stream.of(metricDatum(counter.getId(), "count", StandardUnit.Count, counter.count())); } // VisibleForTesting @@ -173,7 +187,7 @@ Stream timerData(Timer timer) { Stream.Builder metrics = Stream.builder(); metrics.add(metricDatum(timer.getId(), "sum", getBaseTimeUnit().name(), timer.totalTime(getBaseTimeUnit()))); long count = timer.count(); - metrics.add(metricDatum(timer.getId(), "count", "count", count)); + metrics.add(metricDatum(timer.getId(), "count", StandardUnit.Count, count)); if (count > 0) { metrics.add(metricDatum(timer.getId(), "avg", getBaseTimeUnit().name(), timer.mean(getBaseTimeUnit()))); metrics.add(metricDatum(timer.getId(), "max", getBaseTimeUnit().name(), timer.max(getBaseTimeUnit()))); @@ -186,7 +200,7 @@ Stream summaryData(DistributionSummary summary) { Stream.Builder metrics = Stream.builder(); metrics.add(metricDatum(summary.getId(), "sum", summary.totalAmount())); long count = summary.count(); - metrics.add(metricDatum(summary.getId(), "count", "count", count)); + metrics.add(metricDatum(summary.getId(), "count", StandardUnit.Count, count)); if (count > 0) { metrics.add(metricDatum(summary.getId(), "avg", summary.mean())); metrics.add(metricDatum(summary.getId(), "max", summary.max())); @@ -211,7 +225,7 @@ private Stream timeGaugeData(TimeGauge gauge) { // VisibleForTesting Stream functionCounterData(FunctionCounter counter) { - MetricDatum metricDatum = metricDatum(counter.getId(), "count", "count", counter.count()); + MetricDatum metricDatum = metricDatum(counter.getId(), "count", StandardUnit.Count, counter.count()); if (metricDatum == null) { return Stream.empty(); } @@ -223,7 +237,7 @@ Stream functionTimerData(FunctionTimer timer) { // we can't know anything about max and percentiles originating from a function timer Stream.Builder metrics = Stream.builder(); double count = timer.count(); - metrics.add(metricDatum(timer.getId(), "count", "count", count)); + metrics.add(metricDatum(timer.getId(), "count", StandardUnit.Count, count)); if (count > 0) { metrics.add(metricDatum(timer.getId(), "avg", timer.mean(getBaseTimeUnit()))); } @@ -239,16 +253,21 @@ Stream metricData(Meter m) { @Nullable private MetricDatum metricDatum(Meter.Id id, double value) { - return metricDatum(id, null, null, value); + return metricDatum(id, null, id.getBaseUnit(), value); } @Nullable private MetricDatum metricDatum(Meter.Id id, @Nullable String suffix, double value) { - return metricDatum(id, suffix, null, value); + return metricDatum(id, suffix, id.getBaseUnit(), value); } @Nullable private MetricDatum metricDatum(Meter.Id id, @Nullable String suffix, @Nullable String unit, double value) { + return metricDatum(id, suffix, toStandardUnit(unit), value); + } + + @Nullable + private MetricDatum metricDatum(Meter.Id id, @Nullable String suffix, StandardUnit standardUnit, double value) { if (Double.isNaN(value)) { return null; } @@ -259,7 +278,7 @@ private MetricDatum metricDatum(Meter.Id id, @Nullable String suffix, @Nullable .withDimensions(toDimensions(tags)) .withTimestamp(timestamp) .withValue(CloudWatchUtils.clampMetricValue(value)) - .withUnit(toStandardUnit(unit)); + .withUnit(standardUnit); } // VisibleForTesting @@ -272,19 +291,10 @@ private StandardUnit toStandardUnit(@Nullable String unit) { if (unit == null) { return StandardUnit.None; } - switch (unit.toLowerCase()) { - case "bytes": - return StandardUnit.Bytes; - case "milliseconds": - return StandardUnit.Milliseconds; - case "count": - return StandardUnit.Count; - default: - return StandardUnit.None; - } + StandardUnit standardUnit = STANDARD_UNIT_BY_LOWERCASE_VALUE.get(unit.toLowerCase()); + return standardUnit != null ? standardUnit : StandardUnit.None; } - private List toDimensions(List tags) { return tags.stream() .map(tag -> new Dimension().withName(tag.getKey()).withValue(tag.getValue())) diff --git a/implementations/micrometer-registry-cloudwatch2/src/main/java/io/micrometer/cloudwatch2/CloudWatchMeterRegistry.java b/implementations/micrometer-registry-cloudwatch2/src/main/java/io/micrometer/cloudwatch2/CloudWatchMeterRegistry.java index 1204032838..2ab3cb7f26 100644 --- a/implementations/micrometer-registry-cloudwatch2/src/main/java/io/micrometer/cloudwatch2/CloudWatchMeterRegistry.java +++ b/implementations/micrometer-registry-cloudwatch2/src/main/java/io/micrometer/cloudwatch2/CloudWatchMeterRegistry.java @@ -34,7 +34,10 @@ import org.slf4j.LoggerFactory; import java.time.Instant; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadFactory; @@ -53,6 +56,19 @@ * @author Pierre-Yves B. */ public class CloudWatchMeterRegistry extends StepMeterRegistry { + + private static final Map STANDARD_UNIT_BY_LOWERCASE_VALUE; + + static { + Map standardUnitByLowercaseValue = new HashMap<>(); + for (StandardUnit standardUnit : StandardUnit.values()) { + if (standardUnit != StandardUnit.UNKNOWN_TO_SDK_VERSION) { + standardUnitByLowercaseValue.put(standardUnit.toString().toLowerCase(), standardUnit); + } + } + STANDARD_UNIT_BY_LOWERCASE_VALUE = Collections.unmodifiableMap(standardUnitByLowercaseValue); + } + private final CloudWatchConfig config; private final CloudWatchAsyncClient cloudWatchAsyncClient; private final Logger logger = LoggerFactory.getLogger(CloudWatchMeterRegistry.class); @@ -158,7 +174,7 @@ private Stream gaugeData(Gauge gauge) { } private Stream counterData(Counter counter) { - return Stream.of(metricDatum(counter.getId(), "count", "count", counter.count())); + return Stream.of(metricDatum(counter.getId(), "count", StandardUnit.COUNT, counter.count())); } // VisibleForTesting @@ -166,7 +182,7 @@ Stream timerData(Timer timer) { Stream.Builder metrics = Stream.builder(); metrics.add(metricDatum(timer.getId(), "sum", getBaseTimeUnit().name(), timer.totalTime(getBaseTimeUnit()))); long count = timer.count(); - metrics.add(metricDatum(timer.getId(), "count", "count", count)); + metrics.add(metricDatum(timer.getId(), "count", StandardUnit.COUNT, count)); if (count > 0) { metrics.add(metricDatum(timer.getId(), "avg", getBaseTimeUnit().name(), timer.mean(getBaseTimeUnit()))); metrics.add(metricDatum(timer.getId(), "max", getBaseTimeUnit().name(), timer.max(getBaseTimeUnit()))); @@ -179,7 +195,7 @@ Stream summaryData(DistributionSummary summary) { Stream.Builder metrics = Stream.builder(); metrics.add(metricDatum(summary.getId(), "sum", summary.totalAmount())); long count = summary.count(); - metrics.add(metricDatum(summary.getId(), "count", "count", count)); + metrics.add(metricDatum(summary.getId(), "count", StandardUnit.COUNT, count)); if (count > 0) { metrics.add(metricDatum(summary.getId(), "avg", summary.mean())); metrics.add(metricDatum(summary.getId(), "max", summary.max())); @@ -203,7 +219,7 @@ private Stream timeGaugeData(TimeGauge gauge) { // VisibleForTesting Stream functionCounterData(FunctionCounter counter) { - MetricDatum metricDatum = metricDatum(counter.getId(), "count", "count", counter.count()); + MetricDatum metricDatum = metricDatum(counter.getId(), "count", StandardUnit.COUNT, counter.count()); if (metricDatum == null) { return Stream.empty(); } @@ -215,7 +231,7 @@ Stream functionTimerData(FunctionTimer timer) { // we can't know anything about max and percentiles originating from a function timer Stream.Builder metrics = Stream.builder(); double count = timer.count(); - metrics.add(metricDatum(timer.getId(), "count", "count", count)); + metrics.add(metricDatum(timer.getId(), "count", StandardUnit.COUNT, count)); if (count > 0) { metrics.add(metricDatum(timer.getId(), "avg", timer.mean(getBaseTimeUnit()))); } @@ -231,16 +247,21 @@ Stream metricData(Meter m) { @Nullable private MetricDatum metricDatum(Meter.Id id, double value) { - return metricDatum(id, null, null, value); + return metricDatum(id, null, id.getBaseUnit(), value); } @Nullable private MetricDatum metricDatum(Meter.Id id, @Nullable String suffix, double value) { - return metricDatum(id, suffix, null, value); + return metricDatum(id, suffix, id.getBaseUnit(), value); } @Nullable private MetricDatum metricDatum(Meter.Id id, @Nullable String suffix, @Nullable String unit, double value) { + return metricDatum(id, suffix, toStandardUnit(unit), value); + } + + @Nullable + private MetricDatum metricDatum(Meter.Id id, @Nullable String suffix, StandardUnit standardUnit, double value) { if (Double.isNaN(value)) { return null; } @@ -251,7 +272,7 @@ private MetricDatum metricDatum(Meter.Id id, @Nullable String suffix, @Nullable .dimensions(toDimensions(tags)) .timestamp(timestamp) .value(CloudWatchUtils.clampMetricValue(value)) - .unit(toStandardUnit(unit)) + .unit(standardUnit) .build(); } @@ -265,19 +286,10 @@ private StandardUnit toStandardUnit(@Nullable String unit) { if (unit == null) { return StandardUnit.NONE; } - switch (unit.toLowerCase()) { - case "bytes": - return StandardUnit.BYTES; - case "milliseconds": - return StandardUnit.MILLISECONDS; - case "count": - return StandardUnit.COUNT; - default: - return StandardUnit.NONE; - } + StandardUnit standardUnit = STANDARD_UNIT_BY_LOWERCASE_VALUE.get(unit.toLowerCase()); + return standardUnit != null ? standardUnit : StandardUnit.UNKNOWN_TO_SDK_VERSION; } - private List toDimensions(List tags) { return tags.stream() .map(tag -> Dimension.builder().name(tag.getKey()).value(tag.getValue()).build())