Skip to content

Commit

Permalink
Allow base units from meters to be used in CloudWatch meter registry (m…
Browse files Browse the repository at this point in the history
  • Loading branch information
izeye authored and shakuzen committed Sep 5, 2019
1 parent dfa3662 commit 67675b0
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -56,6 +59,17 @@
*/
@Deprecated
public class CloudWatchMeterRegistry extends StepMeterRegistry {

private static final Map<String, StandardUnit> STANDARD_UNIT_BY_LOWERCASE_VALUE;

static {
Map<String, StandardUnit> 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);
Expand Down Expand Up @@ -165,15 +179,15 @@ private Stream<MetricDatum> gaugeData(Gauge gauge) {
}

private Stream<MetricDatum> 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
Stream<MetricDatum> timerData(Timer timer) {
Stream.Builder<MetricDatum> 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())));
Expand All @@ -186,7 +200,7 @@ Stream<MetricDatum> summaryData(DistributionSummary summary) {
Stream.Builder<MetricDatum> 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()));
Expand All @@ -211,7 +225,7 @@ private Stream<MetricDatum> timeGaugeData(TimeGauge gauge) {

// VisibleForTesting
Stream<MetricDatum> 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();
}
Expand All @@ -223,7 +237,7 @@ Stream<MetricDatum> functionTimerData(FunctionTimer timer) {
// we can't know anything about max and percentiles originating from a function timer
Stream.Builder<MetricDatum> 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())));
}
Expand All @@ -239,16 +253,21 @@ Stream<MetricDatum> 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;
}
Expand All @@ -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
Expand All @@ -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<Dimension> toDimensions(List<Tag> tags) {
return tags.stream()
.map(tag -> new Dimension().withName(tag.getKey()).withValue(tag.getValue()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -53,6 +56,19 @@
* @author Pierre-Yves B.
*/
public class CloudWatchMeterRegistry extends StepMeterRegistry {

private static final Map<String, StandardUnit> STANDARD_UNIT_BY_LOWERCASE_VALUE;

static {
Map<String, StandardUnit> 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);
Expand Down Expand Up @@ -158,15 +174,15 @@ private Stream<MetricDatum> gaugeData(Gauge gauge) {
}

private Stream<MetricDatum> 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
Stream<MetricDatum> timerData(Timer timer) {
Stream.Builder<MetricDatum> 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())));
Expand All @@ -179,7 +195,7 @@ Stream<MetricDatum> summaryData(DistributionSummary summary) {
Stream.Builder<MetricDatum> 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()));
Expand All @@ -203,7 +219,7 @@ private Stream<MetricDatum> timeGaugeData(TimeGauge gauge) {

// VisibleForTesting
Stream<MetricDatum> 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();
}
Expand All @@ -215,7 +231,7 @@ Stream<MetricDatum> functionTimerData(FunctionTimer timer) {
// we can't know anything about max and percentiles originating from a function timer
Stream.Builder<MetricDatum> 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())));
}
Expand All @@ -231,16 +247,21 @@ Stream<MetricDatum> 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;
}
Expand All @@ -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();
}

Expand All @@ -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<Dimension> toDimensions(List<Tag> tags) {
return tags.stream()
.map(tag -> Dimension.builder().name(tag.getKey()).value(tag.getValue()).build())
Expand Down

0 comments on commit 67675b0

Please sign in to comment.