Skip to content

Commit 5a0614a

Browse files
authored
Merge pull request #772 from commercetools/DEVX-460_use_double_for_metrics
DEVX-460 make metrics more precise for values below 0 ms
2 parents 5bc31b1 + 903d93b commit 5a0614a

File tree

4 files changed

+28
-21
lines changed

4 files changed

+28
-21
lines changed

.git-blame-ignore-revs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ d0129c1095216d5c830900c8a6223ef5d4274de1
55
4bc5c823b8ebf5a00491c7e63e1ea49d29bf5ee7
66
352051999507bd78542e177d67ce1548a0752691
77
bbe9f971763ca1b27687a6a51067a385a0d23b04
8+
de95c481329aa8b821e6e71ac35c1b8bc67e3e86

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: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,35 +28,39 @@ 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+
;
33+
NewRelic.recordMetric(PREFIX + JSON_DESERIALIZATION, (float) durationInMillis);
3334
return result;
3435
}
3536

3637
@Override
3738
public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response, JavaType outputType) {
3839
Instant start = Instant.now();
3940
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
40-
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
41-
NewRelic.recordResponseTimeMetric(PREFIX + JSON_DESERIALIZATION, durationInMillis);
41+
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
42+
;
43+
NewRelic.recordMetric(PREFIX + JSON_DESERIALIZATION, (float) durationInMillis);
4244
return result;
4345
}
4446

4547
@Override
4648
public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response, TypeReference<O> outputType) {
4749
Instant start = Instant.now();
4850
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
49-
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
50-
NewRelic.recordResponseTimeMetric(PREFIX + JSON_DESERIALIZATION, durationInMillis);
51+
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
52+
;
53+
NewRelic.recordMetric(PREFIX + JSON_DESERIALIZATION, (float) durationInMillis);
5154
return result;
5255
}
5356

5457
@Override
5558
public byte[] toJsonByteArray(Object value) throws JsonProcessingException {
5659
Instant start = Instant.now();
5760
byte[] result = serializer.toJsonByteArray(value);
58-
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
59-
NewRelic.recordResponseTimeMetric(PREFIX + JSON_SERIALIZATION, durationInMillis);
61+
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
62+
;
63+
NewRelic.recordMetric(PREFIX + JSON_SERIALIZATION, (float) durationInMillis);
6064
return result;
6165
}
6266

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

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +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.LongHistogram;
14+
import io.opentelemetry.api.metrics.DoubleHistogram;
1515
import io.opentelemetry.api.metrics.Meter;
1616
import io.vrap.rmf.base.client.ApiHttpResponse;
1717
import io.vrap.rmf.base.client.ResponseSerializer;
@@ -29,8 +29,8 @@
2929
public class OpenTelemetryResponseSerializer implements ResponseSerializer {
3030
private final ResponseSerializer serializer;
3131

32-
private final LongHistogram serializerHistogram;
33-
private final LongHistogram deserializerHistogram;
32+
private final DoubleHistogram serializerHistogram;
33+
private final DoubleHistogram deserializerHistogram;
3434

3535
public OpenTelemetryResponseSerializer(final ResponseSerializer serializer, final OpenTelemetry otel) {
3636
this(serializer, otel, OpenTelemetryInfo.PREFIX);
@@ -41,11 +41,9 @@ public OpenTelemetryResponseSerializer(final ResponseSerializer serializer, fina
4141
this.serializer = serializer;
4242
Meter meter = otel.meterBuilder(OpenTelemetryResponseSerializer.class.getPackage().getName()).build();
4343
serializerHistogram = meter.histogramBuilder(prefix + "." + OpenTelemetryInfo.JSON_SERIALIZATION)
44-
.ofLongs()
4544
.setUnit(OpenTelemetryInfo.UNIT_MS)
4645
.build();
4746
deserializerHistogram = meter.histogramBuilder(prefix + "." + OpenTelemetryInfo.JSON_DESERIALIZATION)
48-
.ofLongs()
4947
.setUnit(OpenTelemetryInfo.UNIT_MS)
5048
.build();
5149

@@ -57,7 +55,8 @@ public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response,
5755
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
5856
Attributes attributes = Attributes.of(AttributeKey.stringKey(OpenTelemetryInfo.RESPONSE_BODY_TYPE),
5957
outputType.getCanonicalName());
60-
deserializerHistogram.record(Duration.between(start, Instant.now()).toMillis(), attributes);
58+
double durationMs = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
59+
deserializerHistogram.record(durationMs, attributes);
6160
return result;
6261
}
6362

@@ -67,7 +66,8 @@ public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response,
6766
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
6867
Attributes attributes = Attributes.of(AttributeKey.stringKey(OpenTelemetryInfo.RESPONSE_BODY_TYPE),
6968
outputType.toString());
70-
deserializerHistogram.record(Duration.between(start, Instant.now()).toMillis(), attributes);
69+
double duration = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
70+
deserializerHistogram.record(duration, attributes);
7171
return result;
7272
}
7373

@@ -77,7 +77,8 @@ public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response,
7777
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
7878
Attributes attributes = Attributes.of(AttributeKey.stringKey(OpenTelemetryInfo.RESPONSE_BODY_TYPE),
7979
outputType.getType().getTypeName());
80-
deserializerHistogram.record(Duration.between(start, Instant.now()).toMillis(), attributes);
80+
double duration = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
81+
deserializerHistogram.record(duration, attributes);
8182
return result;
8283
}
8384

@@ -87,7 +88,8 @@ public byte[] toJsonByteArray(Object value) throws JsonProcessingException {
8788
byte[] result = serializer.toJsonByteArray(value);
8889
Attributes attributes = Attributes.of(AttributeKey.stringKey(OpenTelemetryInfo.REQUEST_BODY_TYPE),
8990
value.getClass().getCanonicalName());
90-
serializerHistogram.record(Duration.between(start, Instant.now()).toMillis(), attributes);
91+
double duration = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
92+
serializerHistogram.record(duration, attributes);
9193
return result;
9294

9395
}

0 commit comments

Comments
 (0)