Skip to content

Commit 9b26e20

Browse files
committed
DEVX-460 make metrics more precise for values below 0 ms
1 parent 5354193 commit 9b26e20

File tree

3 files changed

+23
-20
lines changed

3 files changed

+23
-20
lines changed

commercetools/commercetools-monitoring-datadog/src/main/java/com/commercetools/monitoring/datadog/statsd/DatadogResponseSerializer.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public DatadogResponseSerializer(final ResponseSerializer serializer, final Stat
3333
public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response, Class<O> outputType) {
3434
Instant start = Instant.now();
3535
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
36-
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
36+
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
3737
this.statsDClient.recordHistogramValue(PREFIX + "." + JSON_DESERIALIZATION, durationInMillis,
3838
format("%s:%s", RESPONSE_BODY_TYPE, outputType.getCanonicalName()));
3939
return result;
@@ -43,7 +43,7 @@ public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response,
4343
public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response, JavaType outputType) {
4444
Instant start = Instant.now();
4545
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
46-
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
46+
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
4747
this.statsDClient.recordHistogramValue(PREFIX + "." + JSON_DESERIALIZATION, durationInMillis,
4848
format("%s:%s", RESPONSE_BODY_TYPE, outputType.toString()));
4949
return result;
@@ -53,7 +53,7 @@ public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response,
5353
public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response, TypeReference<O> outputType) {
5454
Instant start = Instant.now();
5555
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
56-
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
56+
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
5757
this.statsDClient.recordHistogramValue(PREFIX + "." + JSON_DESERIALIZATION, durationInMillis,
5858
format("%s:%s", RESPONSE_BODY_TYPE, outputType.getType().getTypeName()));
5959
return result;
@@ -63,7 +63,7 @@ public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response,
6363
public byte[] toJsonByteArray(Object value) throws JsonProcessingException {
6464
Instant start = Instant.now();
6565
byte[] result = serializer.toJsonByteArray(value);
66-
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
66+
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
6767
this.statsDClient.recordHistogramValue(PREFIX + "." + JSON_SERIALIZATION, durationInMillis,
6868
format("%s:%s", REQUEST_BODY_TYPE, value.getClass().getCanonicalName()));
6969
return result;

commercetools/commercetools-monitoring-newrelic/src/main/java/com/commercetools/monitoring/newrelic/NewrelicResponseSerializer.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,35 +28,35 @@ public NewrelicResponseSerializer(final ResponseSerializer serializer) {
2828
public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response, Class<O> outputType) {
2929
Instant start = Instant.now();
3030
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
31-
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
32-
NewRelic.recordResponseTimeMetric(PREFIX + JSON_DESERIALIZATION, durationInMillis);
31+
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;;
32+
NewRelic.recordMetric(PREFIX + JSON_DESERIALIZATION, (float) durationInMillis);
3333
return result;
3434
}
3535

3636
@Override
3737
public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response, JavaType outputType) {
3838
Instant start = Instant.now();
3939
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
40-
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
41-
NewRelic.recordResponseTimeMetric(PREFIX + JSON_DESERIALIZATION, durationInMillis);
40+
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;;
41+
NewRelic.recordMetric(PREFIX + JSON_DESERIALIZATION, (float) durationInMillis);
4242
return result;
4343
}
4444

4545
@Override
4646
public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response, TypeReference<O> outputType) {
4747
Instant start = Instant.now();
4848
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
49-
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
50-
NewRelic.recordResponseTimeMetric(PREFIX + JSON_DESERIALIZATION, durationInMillis);
49+
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;;
50+
NewRelic.recordMetric(PREFIX + JSON_DESERIALIZATION, (float) durationInMillis);
5151
return result;
5252
}
5353

5454
@Override
5555
public byte[] toJsonByteArray(Object value) throws JsonProcessingException {
5656
Instant start = Instant.now();
5757
byte[] result = serializer.toJsonByteArray(value);
58-
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
59-
NewRelic.recordResponseTimeMetric(PREFIX + JSON_SERIALIZATION, durationInMillis);
58+
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;;
59+
NewRelic.recordMetric(PREFIX + JSON_SERIALIZATION, (float) durationInMillis);
6060
return result;
6161
}
6262

commercetools/commercetools-monitoring-opentelemetry/src/main/java/com/commercetools/monitoring/opentelemetry/OpenTelemetryResponseSerializer.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.opentelemetry.api.OpenTelemetry;
1212
import io.opentelemetry.api.common.AttributeKey;
1313
import io.opentelemetry.api.common.Attributes;
14+
import io.opentelemetry.api.metrics.DoubleHistogram;
1415
import io.opentelemetry.api.metrics.LongHistogram;
1516
import io.opentelemetry.api.metrics.Meter;
1617
import io.vrap.rmf.base.client.ApiHttpResponse;
@@ -29,8 +30,8 @@
2930
public class OpenTelemetryResponseSerializer implements ResponseSerializer {
3031
private final ResponseSerializer serializer;
3132

32-
private final LongHistogram serializerHistogram;
33-
private final LongHistogram deserializerHistogram;
33+
private final DoubleHistogram serializerHistogram;
34+
private final DoubleHistogram deserializerHistogram;
3435

3536
public OpenTelemetryResponseSerializer(final ResponseSerializer serializer, final OpenTelemetry otel) {
3637
this(serializer, otel, OpenTelemetryInfo.PREFIX);
@@ -41,11 +42,9 @@ public OpenTelemetryResponseSerializer(final ResponseSerializer serializer, fina
4142
this.serializer = serializer;
4243
Meter meter = otel.meterBuilder(OpenTelemetryResponseSerializer.class.getPackage().getName()).build();
4344
serializerHistogram = meter.histogramBuilder(prefix + "." + OpenTelemetryInfo.JSON_SERIALIZATION)
44-
.ofLongs()
4545
.setUnit(OpenTelemetryInfo.UNIT_MS)
4646
.build();
4747
deserializerHistogram = meter.histogramBuilder(prefix + "." + OpenTelemetryInfo.JSON_DESERIALIZATION)
48-
.ofLongs()
4948
.setUnit(OpenTelemetryInfo.UNIT_MS)
5049
.build();
5150

@@ -57,7 +56,8 @@ public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response,
5756
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
5857
Attributes attributes = Attributes.of(AttributeKey.stringKey(OpenTelemetryInfo.RESPONSE_BODY_TYPE),
5958
outputType.getCanonicalName());
60-
deserializerHistogram.record(Duration.between(start, Instant.now()).toMillis(), attributes);
59+
double durationMs = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
60+
deserializerHistogram.record(durationMs, attributes);
6161
return result;
6262
}
6363

@@ -67,7 +67,8 @@ public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response,
6767
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
6868
Attributes attributes = Attributes.of(AttributeKey.stringKey(OpenTelemetryInfo.RESPONSE_BODY_TYPE),
6969
outputType.toString());
70-
deserializerHistogram.record(Duration.between(start, Instant.now()).toMillis(), attributes);
70+
double duration = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
71+
deserializerHistogram.record(duration, attributes);
7172
return result;
7273
}
7374

@@ -77,7 +78,8 @@ public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response,
7778
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
7879
Attributes attributes = Attributes.of(AttributeKey.stringKey(OpenTelemetryInfo.RESPONSE_BODY_TYPE),
7980
outputType.getType().getTypeName());
80-
deserializerHistogram.record(Duration.between(start, Instant.now()).toMillis(), attributes);
81+
double duration = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
82+
deserializerHistogram.record(duration, attributes);
8183
return result;
8284
}
8385

@@ -87,7 +89,8 @@ public byte[] toJsonByteArray(Object value) throws JsonProcessingException {
8789
byte[] result = serializer.toJsonByteArray(value);
8890
Attributes attributes = Attributes.of(AttributeKey.stringKey(OpenTelemetryInfo.REQUEST_BODY_TYPE),
8991
value.getClass().getCanonicalName());
90-
serializerHistogram.record(Duration.between(start, Instant.now()).toMillis(), attributes);
92+
double duration = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
93+
serializerHistogram.record(duration, attributes);
9194
return result;
9295

9396
}

0 commit comments

Comments
 (0)