Skip to content

Commit

Permalink
Merge pull request #772 from commercetools/DEVX-460_use_double_for_me…
Browse files Browse the repository at this point in the history
…trics

DEVX-460 make metrics more precise for values below 0 ms
  • Loading branch information
jenschude authored Dec 17, 2024
2 parents 5bc31b1 + 903d93b commit 5a0614a
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 21 deletions.
1 change: 1 addition & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ d0129c1095216d5c830900c8a6223ef5d4274de1
4bc5c823b8ebf5a00491c7e63e1ea49d29bf5ee7
352051999507bd78542e177d67ce1548a0752691
bbe9f971763ca1b27687a6a51067a385a0d23b04
de95c481329aa8b821e6e71ac35c1b8bc67e3e86
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public DatadogResponseSerializer(final ResponseSerializer serializer, final Stat
public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response, Class<O> outputType) {
Instant start = Instant.now();
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
this.statsDClient.recordHistogramValue(PREFIX + "." + JSON_DESERIALIZATION, durationInMillis,
format("%s:%s", RESPONSE_BODY_TYPE, outputType.getCanonicalName()));
return result;
Expand All @@ -43,7 +43,7 @@ public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response,
public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response, JavaType outputType) {
Instant start = Instant.now();
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
this.statsDClient.recordHistogramValue(PREFIX + "." + JSON_DESERIALIZATION, durationInMillis,
format("%s:%s", RESPONSE_BODY_TYPE, outputType.toString()));
return result;
Expand All @@ -53,7 +53,7 @@ public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response,
public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response, TypeReference<O> outputType) {
Instant start = Instant.now();
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
this.statsDClient.recordHistogramValue(PREFIX + "." + JSON_DESERIALIZATION, durationInMillis,
format("%s:%s", RESPONSE_BODY_TYPE, outputType.getType().getTypeName()));
return result;
Expand All @@ -63,7 +63,7 @@ public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response,
public byte[] toJsonByteArray(Object value) throws JsonProcessingException {
Instant start = Instant.now();
byte[] result = serializer.toJsonByteArray(value);
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
this.statsDClient.recordHistogramValue(PREFIX + "." + JSON_SERIALIZATION, durationInMillis,
format("%s:%s", REQUEST_BODY_TYPE, value.getClass().getCanonicalName()));
return result;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,35 +28,39 @@ public NewrelicResponseSerializer(final ResponseSerializer serializer) {
public <O> ApiHttpResponse<O> convertResponse(ApiHttpResponse<byte[]> response, Class<O> outputType) {
Instant start = Instant.now();
ApiHttpResponse<O> result = serializer.convertResponse(response, outputType);
long durationInMillis = Duration.between(start, Instant.now()).toMillis();
NewRelic.recordResponseTimeMetric(PREFIX + JSON_DESERIALIZATION, durationInMillis);
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
;
NewRelic.recordMetric(PREFIX + JSON_DESERIALIZATION, (float) durationInMillis);
return result;
}

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

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

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.LongHistogram;
import io.opentelemetry.api.metrics.DoubleHistogram;
import io.opentelemetry.api.metrics.Meter;
import io.vrap.rmf.base.client.ApiHttpResponse;
import io.vrap.rmf.base.client.ResponseSerializer;
Expand All @@ -29,8 +29,8 @@
public class OpenTelemetryResponseSerializer implements ResponseSerializer {
private final ResponseSerializer serializer;

private final LongHistogram serializerHistogram;
private final LongHistogram deserializerHistogram;
private final DoubleHistogram serializerHistogram;
private final DoubleHistogram deserializerHistogram;

public OpenTelemetryResponseSerializer(final ResponseSerializer serializer, final OpenTelemetry otel) {
this(serializer, otel, OpenTelemetryInfo.PREFIX);
Expand All @@ -41,11 +41,9 @@ public OpenTelemetryResponseSerializer(final ResponseSerializer serializer, fina
this.serializer = serializer;
Meter meter = otel.meterBuilder(OpenTelemetryResponseSerializer.class.getPackage().getName()).build();
serializerHistogram = meter.histogramBuilder(prefix + "." + OpenTelemetryInfo.JSON_SERIALIZATION)
.ofLongs()
.setUnit(OpenTelemetryInfo.UNIT_MS)
.build();
deserializerHistogram = meter.histogramBuilder(prefix + "." + OpenTelemetryInfo.JSON_DESERIALIZATION)
.ofLongs()
.setUnit(OpenTelemetryInfo.UNIT_MS)
.build();

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

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

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

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

}
Expand Down

0 comments on commit 5a0614a

Please sign in to comment.