Skip to content

Commit

Permalink
Send datadog metrics in double instead of long (#727)
Browse files Browse the repository at this point in the history
* Send datadog metrics in double instead of long

* spotless: Fix code style

* spotless: add commit to blame ignore revs file

---------

Co-authored-by: ct-sdks[bot] <153784748+ct-sdks[bot]@users.noreply.github.com>
  • Loading branch information
lojzatran and ct-sdks[bot] authored Sep 16, 2024
1 parent 29a3511 commit 7ad0289
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 17 deletions.
1 change: 1 addition & 0 deletions .git-blame-ignore-revs
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ a8ec45c8ea4ba559247b654d01b0d35b21a68865
430a1a0a5dd4efe78e21526c37bec9dbce036401
d0129c1095216d5c830900c8a6223ef5d4274de1
4bc5c823b8ebf5a00491c7e63e1ea49d29bf5ee7
352051999507bd78542e177d67ce1548a0752691
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public DatadogResponseSerializer(final ResponseSerializer serializer, final ApiC
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;
submitJsonDeserializationMetric(apiInstance, (double) durationInMillis, outputType.getCanonicalName());
return result;
}
Expand All @@ -48,26 +48,26 @@ 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();
submitJsonDeserializationMetric(apiInstance, (double) durationInMillis, outputType.toString());
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
submitJsonDeserializationMetric(apiInstance, durationInMillis, outputType.toString());
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();
submitJsonDeserializationMetric(apiInstance, (double) durationInMillis, outputType.getType().getTypeName());
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
submitJsonDeserializationMetric(apiInstance, durationInMillis, outputType.getType().getTypeName());
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();
submitJsonSerializationMetric(apiInstance, (double) durationInMillis, value.getClass().getCanonicalName());
double durationInMillis = Duration.between(start, Instant.now()).toNanos() / 1_000_000.0;
submitJsonSerializationMetric(apiInstance, durationInMillis, value.getClass().getCanonicalName());
return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,40 +30,40 @@ protected static void submitClientDurationMetric(final ApiHttpRequest request, f
final double durationInMillis, final ApiHttpResponse<byte[]> response) throws ApiException {
final String name = PREFIX + "." + CLIENT_DURATION;
final MetricIntakeType type = MetricIntakeType.UNSPECIFIED;
submitMetricWithHttpTags(name, durationInMillis, type, request, apiInstance, response);
submitMetricWithHttpTags(name, durationInMillis, type, "ms", request, apiInstance, response);
}

protected static void submitErrorRequestsMetric(final ApiHttpRequest request, final MetricsApi apiInstance,
final ApiHttpResponse<byte[]> response) throws ApiException {
final String name = PREFIX + "." + CLIENT_REQUEST_ERROR;
final MetricIntakeType count = MetricIntakeType.COUNT;
submitMetricWithHttpTags(name, 1.0, count, request, apiInstance, response);
submitMetricWithHttpTags(name, 1.0, count, "count", request, apiInstance, response);
}

protected static void submitTotalRequestsMetric(final ApiHttpRequest request, final MetricsApi apiInstance,
final ApiHttpResponse<byte[]> response) throws ApiException {
final String name = PREFIX + "." + CLIENT_REQUEST_TOTAL;
final MetricIntakeType count = MetricIntakeType.COUNT;
submitMetricWithHttpTags(name, 1.0, count, request, apiInstance, response);
submitMetricWithHttpTags(name, 1.0, count, "count", request, apiInstance, response);
}

private static void submitMetricWithHttpTags(final String name, final double value, final MetricIntakeType type,
final ApiHttpRequest request, final MetricsApi apiInstance, final ApiHttpResponse<byte[]> response)
throws ApiException {
final String unit, final ApiHttpRequest request, final MetricsApi apiInstance,
final ApiHttpResponse<byte[]> response) throws ApiException {
final List<String> tags = Arrays.asList(format("%s:%s", HTTP_RESPONSE_STATUS_CODE, response.getStatusCode()),
format("%s:%s", HTTP_REQUEST_METHOD, request.getMethod().name()),
format("%s:%s", SERVER_ADDRESS, request.getUri().getHost()));
if (request.getUri().getPort() > 0) {
tags.add(format("%s:%s", SERVER_PORT, request.getUri().getPort()));
}
submitMetric(apiInstance, name, value, type, tags);
submitMetric(apiInstance, name, value, type, unit, tags);
}

protected static void submitJsonSerializationMetric(final MetricsApi apiInstance, final double durationInMillis,
final String responseBodyType) {
try {
submitMetric(apiInstance, PREFIX + "." + JSON_SERIALIZATION, durationInMillis, MetricIntakeType.UNSPECIFIED,
Arrays.asList(format("%s:%s", RESPONSE_BODY_TYPE, responseBodyType)));
"ms", Arrays.asList(format("%s:%s", RESPONSE_BODY_TYPE, responseBodyType)));
}
catch (ApiException exception) {
logger.warn("Failed to submit commercetools json serialization metric", exception);
Expand All @@ -74,17 +74,18 @@ protected static void submitJsonDeserializationMetric(final MetricsApi apiInstan
final String requestBodyType) {
try {
submitMetric(apiInstance, PREFIX + "." + JSON_DESERIALIZATION, durationInMillis,
MetricIntakeType.UNSPECIFIED, Arrays.asList(format("%s:%s", REQUEST_BODY_TYPE, requestBodyType)));
MetricIntakeType.UNSPECIFIED, "ms", Arrays.asList(format("%s:%s", REQUEST_BODY_TYPE, requestBodyType)));
}
catch (ApiException exception) {
logger.warn("Failed to submit commercetools json deserialization metric", exception);
}
}

private static void submitMetric(final MetricsApi apiInstance, final String name, final double value,
final MetricIntakeType type, final List<String> tags) throws ApiException {
final MetricIntakeType type, final String unit, final List<String> tags) throws ApiException {
MetricPayload totalMetric = new MetricPayload().series(Collections.singletonList(new MetricSeries().metric(name)
.type(type)
.unit(unit)
.points(Collections.singletonList(
new MetricPoint().timestamp(OffsetDateTime.now().toInstant().getEpochSecond()).value(value)))
.tags(tags)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@
import com.commercetools.api.defaultconfig.ApiRootBuilder;
import com.commercetools.api.defaultconfig.ServiceRegion;

import com.commercetools.monitoring.datadog.DatadogMiddleware;
import com.commercetools.monitoring.datadog.DatadogResponseSerializer;
import com.datadog.api.client.ApiClient;
import io.vrap.rmf.base.client.*;
import io.vrap.rmf.base.client.oauth2.ClientCredentials;
import io.vrap.rmf.base.client.oauth2.TokenStorage;
Expand Down Expand Up @@ -58,7 +61,9 @@ private ProjectApiRoot meClient(ApiHttpClient client, Mono<WebSession> session)
ApiRootBuilder builder = ApiRootBuilder.of(client)
.withApiBaseUrl(ServiceRegion.GCP_EUROPE_WEST1.getApiUrl())
.withProjectKey(projectKey)
.withAnonymousRefreshFlow(credentials(), ServiceRegion.GCP_EUROPE_WEST1, storage);
.withAnonymousRefreshFlow(credentials(), ServiceRegion.GCP_EUROPE_WEST1, storage)
.withTelemetryMiddleware(new DatadogMiddleware(ApiClient.getDefaultApiClient()))
.withSerializer(new DatadogResponseSerializer(ResponseSerializer.of(), ApiClient.getDefaultApiClient()));

return builder.build(projectKey);
}
Expand Down

0 comments on commit 7ad0289

Please sign in to comment.