Skip to content

Commit e2d50b3

Browse files
authored
Send sample-rate and throttling information with startup metric (#28)
1 parent 0ae7207 commit e2d50b3

File tree

8 files changed

+59
-14
lines changed

8 files changed

+59
-14
lines changed

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,15 @@ public void reportViolation(OpenApiViolation violation) {
2525
}
2626

2727
@Override
28-
public void reportStartup(boolean isValidationEnabled) {
29-
metricsClient.increment(buildMetricName(".startup"), createTagsForStartup(isValidationEnabled));
28+
public void reportStartup(
29+
boolean isValidationEnabled,
30+
double sampleRate,
31+
int validationReportThrottleWaitSeconds
32+
) {
33+
metricsClient.increment(
34+
buildMetricName(".startup"),
35+
createTagsForStartup(isValidationEnabled, sampleRate, validationReportThrottleWaitSeconds)
36+
);
3037
}
3138

3239
private String buildMetricName(String suffix) {
@@ -47,10 +54,16 @@ private MetricTag[] createTagsForViolation(OpenApiViolation violation) {
4754
return tags.toArray(MetricTag[]::new);
4855
}
4956

50-
private MetricTag[] createTagsForStartup(boolean isValidationEnabled) {
57+
private MetricTag[] createTagsForStartup(
58+
boolean isValidationEnabled,
59+
double sampleRate,
60+
int validationReportThrottleWaitSeconds
61+
) {
5162
var tags = new ArrayList<MetricTag>();
5263

5364
tags.add(new MetricTag("validation_enabled", String.valueOf(isValidationEnabled)));
65+
tags.add(new MetricTag("sample_rate", String.valueOf(sampleRate)));
66+
tags.add(new MetricTag("throttling", String.valueOf(validationReportThrottleWaitSeconds)));
5467
addAdditionalTags(tags);
5568

5669
return tags.toArray(MetricTag[]::new);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@
55
public interface MetricsReporter {
66
void reportViolation(OpenApiViolation violation);
77

8-
void reportStartup(boolean isValidationEnabled);
8+
void reportStartup(boolean isValidationEnabled, double sampleRate, int validationReportThrottleWaitSeconds);
99
}

openapi-validation-api/src/main/java/com/getyourguide/openapi/validation/api/selector/DefaultTrafficSelector.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@
1010

1111
public class DefaultTrafficSelector implements TrafficSelector {
1212

13-
private static final double SAMPLE_RATE_DEFAULT = 0.001; // 1.0 = 100%
14-
1513
private final double sampleRate;
1614
private final Set<String> excludedPaths;
1715
private final List<ExcludedHeader> excludedHeaders;
@@ -23,13 +21,13 @@ public DefaultTrafficSelector(Double sampleRate, Set<String> excludedPaths, List
2321
}
2422

2523
public DefaultTrafficSelector(
26-
Double sampleRate,
24+
double sampleRate,
2725
Set<String> excludedPaths,
2826
List<ExcludedHeader> excludedHeaders,
2927
Boolean shouldFailOnRequestViolation,
3028
Boolean shouldFailOnResponseViolation
3129
) {
32-
this.sampleRate = sampleRate != null ? sampleRate : SAMPLE_RATE_DEFAULT;
30+
this.sampleRate = sampleRate;
3331
this.excludedPaths = excludedPaths != null ? excludedPaths : Set.of();
3432
this.excludedHeaders = excludedHeaders != null ? excludedHeaders : Collections.emptyList();
3533
this.shouldFailOnRequestViolation = shouldFailOnRequestViolation != null ? shouldFailOnRequestViolation : false;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.getyourguide.openapi.validation.core;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
6+
@Builder
7+
@Getter
8+
public class OpenApiRequestValidationConfiguration {
9+
private double sampleRate;
10+
private int validationReportThrottleWaitSeconds;
11+
}

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,18 @@ public OpenApiRequestValidator(
2828
ThreadPoolExecutor threadPoolExecutor,
2929
ValidationReportHandler validationReportHandler,
3030
MetricsReporter metricsReporter,
31-
OpenApiInteractionValidatorWrapper validator
31+
OpenApiInteractionValidatorWrapper validator,
32+
OpenApiRequestValidationConfiguration configuration
3233
) {
3334
this.threadPoolExecutor = threadPoolExecutor;
3435
this.validator = validator;
3536
this.validationReportHandler = validationReportHandler;
3637

37-
metricsReporter.reportStartup(validator != null);
38+
metricsReporter.reportStartup(
39+
validator != null,
40+
configuration.getSampleRate(),
41+
configuration.getValidationReportThrottleWaitSeconds()
42+
);
3843
}
3944

4045
public boolean isReady() {

openapi-validation-core/src/test/java/com/getyourguide/openapi/validation/core/OpenApiRequestValidatorTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ public void setup() {
3636
threadPoolExecutor,
3737
validationReportHandler,
3838
metricsReporter,
39-
validator
39+
validator,
40+
mock()
4041
);
4142
}
4243

spring-boot-starter/spring-boot-starter-core/src/main/java/com/getyourguide/openapi/validation/OpenApiValidationApplicationProperties.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import com.getyourguide.openapi.validation.api.exclusions.ExcludedHeader;
66
import com.getyourguide.openapi.validation.api.log.LogLevel;
77
import com.getyourguide.openapi.validation.api.metrics.MetricTag;
8+
import com.getyourguide.openapi.validation.core.OpenApiRequestValidationConfiguration;
89
import com.getyourguide.openapi.validation.util.CommaSeparatedStringsUtil;
910
import java.util.Arrays;
1011
import java.util.Collections;
@@ -25,6 +26,7 @@
2526
@Setter
2627
public class OpenApiValidationApplicationProperties {
2728
public static final String PROPERTY_PREFIX = "openapi.validation";
29+
private static final double SAMPLE_RATE_DEFAULT = 0.001; // 1.0 = 100%
2830

2931
private Double sampleRate;
3032
private String specificationFilePath;
@@ -37,6 +39,14 @@ public class OpenApiValidationApplicationProperties {
3739
private Boolean shouldFailOnRequestViolation;
3840
private Boolean shouldFailOnResponseViolation;
3941

42+
public double getSampleRate() {
43+
return sampleRate != null ? sampleRate : SAMPLE_RATE_DEFAULT;
44+
}
45+
46+
public int getValidationReportThrottleWaitSeconds() {
47+
return validationReportThrottleWaitSeconds != null ? validationReportThrottleWaitSeconds : 0;
48+
}
49+
4050
public List<MetricTag> getValidationReportMetricAdditionalTags() {
4151
if (validationReportMetricAdditionalTags == null) {
4252
return null;
@@ -73,4 +83,11 @@ public List<ExcludedHeader> getExcludedHeaders() {
7383
.filter(Objects::nonNull)
7484
.toList();
7585
}
86+
87+
public OpenApiRequestValidationConfiguration toOpenApiRequestValidationConfiguration() {
88+
return OpenApiRequestValidationConfiguration.builder()
89+
.sampleRate(getSampleRate())
90+
.validationReportThrottleWaitSeconds(getValidationReportThrottleWaitSeconds())
91+
.build();
92+
}
7693
}

spring-boot-starter/spring-boot-starter-core/src/main/java/com/getyourguide/openapi/validation/autoconfigure/LibraryAutoConfiguration.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ public class LibraryAutoConfiguration {
4343
@Bean
4444
@ConditionalOnMissingBean
4545
public ValidationReportThrottler requestBasedThrottleHelper() {
46-
if (properties.getValidationReportThrottleWaitSeconds() == null
47-
|| properties.getValidationReportThrottleWaitSeconds() == 0) {
46+
if (properties.getValidationReportThrottleWaitSeconds() == 0) {
4847
return new ValidationReportThrottlerNone();
4948
}
5049
return new RequestBasedValidationReportThrottler(properties.getValidationReportThrottleWaitSeconds());
@@ -117,7 +116,8 @@ public OpenApiRequestValidator openApiRequestValidator(
117116
validationReportHandler,
118117
metricsReporter,
119118
new OpenApiInteractionValidatorFactory()
120-
.build(properties.getSpecificationFilePath(), validatorConfiguration)
119+
.build(properties.getSpecificationFilePath(), validatorConfiguration),
120+
properties.toOpenApiRequestValidationConfiguration()
121121
);
122122
}
123123
}

0 commit comments

Comments
 (0)