Skip to content

Commit 2343dbb

Browse files
authored
Add validation heartbeat metric (#15)
1 parent 3d3027f commit 2343dbb

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/metrics/DefaultMetricsReporter.java

+13-4
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@ public class DefaultMetricsReporter implements MetricsReporter {
1616

1717
@Override
1818
public void reportViolation(OpenApiViolation violation) {
19-
String violationMetricName = buildMetricName(".error");
20-
metricsClient.increment(violationMetricName, createTagsForViolation(violation));
19+
metricsClient.increment(buildMetricName(".error"), createTagsForViolation(violation));
2120
}
2221

2322
@Override
2423
public void reportStartup(boolean isValidationEnabled) {
25-
String startupMetricName = buildMetricName(".startup");
26-
metricsClient.increment(startupMetricName, createTagsForStartup(isValidationEnabled));
24+
metricsClient.increment(buildMetricName(".startup"), createTagsForStartup(isValidationEnabled));
25+
}
26+
27+
@Override
28+
public void reportValidationHeartbeat() {
29+
metricsClient.increment(buildMetricName(".validation_heartbeat"), createTagsForValidation());
2730
}
2831

2932
private String buildMetricName(String suffix) {
@@ -53,6 +56,12 @@ private MetricTag[] createTagsForStartup(boolean isValidationEnabled) {
5356
return tags.toArray(MetricTag[]::new);
5457
}
5558

59+
private MetricTag[] createTagsForValidation() {
60+
var tags = new ArrayList<MetricTag>();
61+
addAdditionalTags(tags);
62+
return tags.toArray(MetricTag[]::new);
63+
}
64+
5665
private void addAdditionalTags(ArrayList<MetricTag> tags) {
5766
if (configuration.getMetricAdditionalTags() != null) {
5867
tags.addAll(configuration.getMetricAdditionalTags());

openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/metrics/MetricsReporter.java

+2
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,6 @@ public interface MetricsReporter {
66
void reportViolation(OpenApiViolation violation);
77

88
void reportStartup(boolean isValidationEnabled);
9+
10+
void reportValidationHeartbeat();
911
}

openapi-validation-core/src/main/java/com/getyourguide/openapi/validation/core/OpenApiRequestValidator.java

+16
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,14 @@
1919

2020
@Slf4j
2121
public class OpenApiRequestValidator {
22+
public static final int METRIC_REPORT_VALIDATION_HEARTBEAT_FREQUENCY_MILLIS = 60 * 60 * 1000; // 1h
23+
2224
private final ThreadPoolExecutor threadPoolExecutor;
2325
private final OpenApiInteractionValidatorWrapper validator;
2426
private final ValidationReportHandler validationReportHandler;
27+
private final MetricsReporter metricsReporter;
28+
29+
private long lastReportValidationDateTime = 0;
2530

2631
public OpenApiRequestValidator(
2732
ThreadPoolExecutor threadPoolExecutor,
@@ -33,6 +38,7 @@ public OpenApiRequestValidator(
3338
this.threadPoolExecutor = threadPoolExecutor;
3439
this.validator = new OpenApiInteractionValidatorFactory().build(specificationFilePath, configuration);
3540
this.validationReportHandler = validationReportHandler;
41+
this.metricsReporter = metricsReporter;
3642

3743
metricsReporter.reportStartup(validator != null);
3844
}
@@ -62,6 +68,7 @@ public ValidationResult validateRequestObject(final RequestMetaData request, Str
6268
var simpleRequest = buildSimpleRequest(request, requestBody);
6369
var result = validator.validateRequest(simpleRequest);
6470
validationReportHandler.handleValidationReport(request, Direction.REQUEST, requestBody, result);
71+
reportValidationHeartbeat();
6572
return buildValidationResult(result);
6673
} catch (Exception e) {
6774
log.error("Could not validate request", e);
@@ -99,6 +106,7 @@ public ValidationResult validateResponseObject(
99106
responseBuilder.build()
100107
);
101108
validationReportHandler.handleValidationReport(request, Direction.RESPONSE, responseBody, result);
109+
reportValidationHeartbeat();
102110
return buildValidationResult(result);
103111
} catch (Exception e) {
104112
log.error("Could not validate response", e);
@@ -117,4 +125,12 @@ private ValidationResult buildValidationResult(ValidationReport validationReport
117125

118126
return ValidationResult.INVALID;
119127
}
128+
129+
private synchronized void reportValidationHeartbeat() {
130+
var currentTimeMillis = System.currentTimeMillis();
131+
if (lastReportValidationDateTime + METRIC_REPORT_VALIDATION_HEARTBEAT_FREQUENCY_MILLIS < currentTimeMillis) {
132+
lastReportValidationDateTime = currentTimeMillis;
133+
metricsReporter.reportValidationHeartbeat();
134+
}
135+
}
120136
}

0 commit comments

Comments
 (0)