Skip to content

Send sample-rate and throttling information with startup metric #28

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,15 @@ public void reportViolation(OpenApiViolation violation) {
}

@Override
public void reportStartup(boolean isValidationEnabled) {
metricsClient.increment(buildMetricName(".startup"), createTagsForStartup(isValidationEnabled));
public void reportStartup(
boolean isValidationEnabled,
double sampleRate,
int validationReportThrottleWaitSeconds
) {
metricsClient.increment(
buildMetricName(".startup"),
createTagsForStartup(isValidationEnabled, sampleRate, validationReportThrottleWaitSeconds)
);
}

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

private MetricTag[] createTagsForStartup(boolean isValidationEnabled) {
private MetricTag[] createTagsForStartup(
boolean isValidationEnabled,
double sampleRate,
int validationReportThrottleWaitSeconds
) {
var tags = new ArrayList<MetricTag>();

tags.add(new MetricTag("validation_enabled", String.valueOf(isValidationEnabled)));
tags.add(new MetricTag("sample_rate", String.valueOf(sampleRate)));
tags.add(new MetricTag("throttling", String.valueOf(validationReportThrottleWaitSeconds)));
addAdditionalTags(tags);

return tags.toArray(MetricTag[]::new);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@
public interface MetricsReporter {
void reportViolation(OpenApiViolation violation);

void reportStartup(boolean isValidationEnabled);
void reportStartup(boolean isValidationEnabled, double sampleRate, int validationReportThrottleWaitSeconds);
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@

public class DefaultTrafficSelector implements TrafficSelector {

private static final double SAMPLE_RATE_DEFAULT = 0.001; // 1.0 = 100%

private final double sampleRate;
private final Set<String> excludedPaths;
private final List<ExcludedHeader> excludedHeaders;
Expand All @@ -23,13 +21,13 @@ public DefaultTrafficSelector(Double sampleRate, Set<String> excludedPaths, List
}

public DefaultTrafficSelector(
Double sampleRate,
double sampleRate,
Set<String> excludedPaths,
List<ExcludedHeader> excludedHeaders,
Boolean shouldFailOnRequestViolation,
Boolean shouldFailOnResponseViolation
) {
this.sampleRate = sampleRate != null ? sampleRate : SAMPLE_RATE_DEFAULT;
this.sampleRate = sampleRate;
this.excludedPaths = excludedPaths != null ? excludedPaths : Set.of();
this.excludedHeaders = excludedHeaders != null ? excludedHeaders : Collections.emptyList();
this.shouldFailOnRequestViolation = shouldFailOnRequestViolation != null ? shouldFailOnRequestViolation : false;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.getyourguide.openapi.validation.core;

import lombok.Builder;
import lombok.Getter;

@Builder
@Getter
public class OpenApiRequestValidationConfiguration {
private double sampleRate;
private int validationReportThrottleWaitSeconds;
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,18 @@ public OpenApiRequestValidator(
ThreadPoolExecutor threadPoolExecutor,
ValidationReportHandler validationReportHandler,
MetricsReporter metricsReporter,
OpenApiInteractionValidatorWrapper validator
OpenApiInteractionValidatorWrapper validator,
OpenApiRequestValidationConfiguration configuration
) {
this.threadPoolExecutor = threadPoolExecutor;
this.validator = validator;
this.validationReportHandler = validationReportHandler;

metricsReporter.reportStartup(validator != null);
metricsReporter.reportStartup(
validator != null,
configuration.getSampleRate(),
configuration.getValidationReportThrottleWaitSeconds()
);
}

public boolean isReady() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ public void setup() {
threadPoolExecutor,
validationReportHandler,
metricsReporter,
validator
validator,
mock()
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.getyourguide.openapi.validation.api.exclusions.ExcludedHeader;
import com.getyourguide.openapi.validation.api.log.LogLevel;
import com.getyourguide.openapi.validation.api.metrics.MetricTag;
import com.getyourguide.openapi.validation.core.OpenApiRequestValidationConfiguration;
import com.getyourguide.openapi.validation.util.CommaSeparatedStringsUtil;
import java.util.Arrays;
import java.util.Collections;
Expand All @@ -25,6 +26,7 @@
@Setter
public class OpenApiValidationApplicationProperties {
public static final String PROPERTY_PREFIX = "openapi.validation";
private static final double SAMPLE_RATE_DEFAULT = 0.001; // 1.0 = 100%

private Double sampleRate;
private String specificationFilePath;
Expand All @@ -37,6 +39,14 @@ public class OpenApiValidationApplicationProperties {
private Boolean shouldFailOnRequestViolation;
private Boolean shouldFailOnResponseViolation;

public double getSampleRate() {
return sampleRate != null ? sampleRate : SAMPLE_RATE_DEFAULT;
}

public int getValidationReportThrottleWaitSeconds() {
return validationReportThrottleWaitSeconds != null ? validationReportThrottleWaitSeconds : 0;
}

public List<MetricTag> getValidationReportMetricAdditionalTags() {
if (validationReportMetricAdditionalTags == null) {
return null;
Expand Down Expand Up @@ -73,4 +83,11 @@ public List<ExcludedHeader> getExcludedHeaders() {
.filter(Objects::nonNull)
.toList();
}

public OpenApiRequestValidationConfiguration toOpenApiRequestValidationConfiguration() {
return OpenApiRequestValidationConfiguration.builder()
.sampleRate(getSampleRate())
.validationReportThrottleWaitSeconds(getValidationReportThrottleWaitSeconds())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,7 @@ public class LibraryAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public ValidationReportThrottler requestBasedThrottleHelper() {
if (properties.getValidationReportThrottleWaitSeconds() == null
|| properties.getValidationReportThrottleWaitSeconds() == 0) {
if (properties.getValidationReportThrottleWaitSeconds() == 0) {
return new ValidationReportThrottlerNone();
}
return new RequestBasedValidationReportThrottler(properties.getValidationReportThrottleWaitSeconds());
Expand Down Expand Up @@ -117,7 +116,8 @@ public OpenApiRequestValidator openApiRequestValidator(
validationReportHandler,
metricsReporter,
new OpenApiInteractionValidatorFactory()
.build(properties.getSpecificationFilePath(), validatorConfiguration)
.build(properties.getSpecificationFilePath(), validatorConfiguration),
properties.toOpenApiRequestValidationConfiguration()
);
}
}