|
|
|
@ -1,5 +1,5 @@
|
|
|
|
|
/*
|
|
|
|
|
* Copyright 2012-2019 the original author or authors.
|
|
|
|
|
* Copyright 2012-2020 the original author or authors.
|
|
|
|
|
*
|
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
@ -16,14 +16,19 @@
|
|
|
|
|
|
|
|
|
|
package org.springframework.boot.actuate.autoconfigure.metrics.export.wavefront;
|
|
|
|
|
|
|
|
|
|
import java.time.Duration;
|
|
|
|
|
|
|
|
|
|
import com.wavefront.sdk.common.WavefrontSender;
|
|
|
|
|
import com.wavefront.sdk.direct.ingestion.WavefrontDirectIngestionClient.Builder;
|
|
|
|
|
import io.micrometer.core.instrument.Clock;
|
|
|
|
|
import io.micrometer.core.ipc.http.HttpUrlConnectionSender;
|
|
|
|
|
import io.micrometer.core.instrument.config.MissingRequiredConfigurationException;
|
|
|
|
|
import io.micrometer.wavefront.WavefrontConfig;
|
|
|
|
|
import io.micrometer.wavefront.WavefrontMeterRegistry;
|
|
|
|
|
|
|
|
|
|
import org.springframework.boot.actuate.autoconfigure.metrics.CompositeMeterRegistryAutoConfiguration;
|
|
|
|
|
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
|
|
|
|
|
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
|
|
|
|
|
import org.springframework.boot.actuate.autoconfigure.metrics.export.wavefront.WavefrontProperties.Sender;
|
|
|
|
|
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
|
|
|
|
|
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
|
|
|
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
|
|
|
@ -32,21 +37,25 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
|
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
|
|
|
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
|
|
|
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
|
|
|
|
import org.springframework.boot.context.properties.PropertyMapper;
|
|
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
|
|
import org.springframework.util.StringUtils;
|
|
|
|
|
import org.springframework.util.unit.DataSize;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* {@link EnableAutoConfiguration Auto-configuration} for exporting metrics to Wavefront.
|
|
|
|
|
*
|
|
|
|
|
* @author Jon Schneider
|
|
|
|
|
* @author Artsiom Yudovin
|
|
|
|
|
* @author Stephane Nicoll
|
|
|
|
|
* @since 2.0.0
|
|
|
|
|
*/
|
|
|
|
|
@Configuration(proxyBeanMethods = false)
|
|
|
|
|
@AutoConfigureBefore({ CompositeMeterRegistryAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class })
|
|
|
|
|
@AutoConfigureAfter(MetricsAutoConfiguration.class)
|
|
|
|
|
@ConditionalOnBean(Clock.class)
|
|
|
|
|
@ConditionalOnClass(WavefrontMeterRegistry.class)
|
|
|
|
|
@ConditionalOnClass({ WavefrontMeterRegistry.class, WavefrontSender.class })
|
|
|
|
|
@ConditionalOnProperty(prefix = "management.metrics.export.wavefront", name = "enabled", havingValue = "true",
|
|
|
|
|
matchIfMissing = true)
|
|
|
|
|
@EnableConfigurationProperties(WavefrontProperties.class)
|
|
|
|
@ -66,10 +75,38 @@ public class WavefrontMetricsExportAutoConfiguration {
|
|
|
|
|
|
|
|
|
|
@Bean
|
|
|
|
|
@ConditionalOnMissingBean
|
|
|
|
|
public WavefrontMeterRegistry wavefrontMeterRegistry(WavefrontConfig wavefrontConfig, Clock clock) {
|
|
|
|
|
return WavefrontMeterRegistry.builder(wavefrontConfig).clock(clock).httpClient(
|
|
|
|
|
new HttpUrlConnectionSender(this.properties.getConnectTimeout(), this.properties.getReadTimeout()))
|
|
|
|
|
.build();
|
|
|
|
|
public WavefrontSender wavefrontSender(WavefrontConfig wavefrontConfig) {
|
|
|
|
|
if (!StringUtils.hasText(wavefrontConfig.apiToken())) {
|
|
|
|
|
throw new MissingRequiredConfigurationException(
|
|
|
|
|
"apiToken must be set whenever publishing directly to the Wavefront API");
|
|
|
|
|
}
|
|
|
|
|
return createWavefrontSender(wavefrontConfig);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Bean
|
|
|
|
|
@ConditionalOnMissingBean
|
|
|
|
|
public WavefrontMeterRegistry wavefrontMeterRegistry(WavefrontConfig wavefrontConfig, Clock clock,
|
|
|
|
|
WavefrontSender wavefrontSender) {
|
|
|
|
|
return WavefrontMeterRegistry.builder(wavefrontConfig).clock(clock).wavefrontSender(wavefrontSender).build();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private WavefrontSender createWavefrontSender(WavefrontConfig wavefrontConfig) {
|
|
|
|
|
Builder builder = new Builder(getWavefrontReportingUri(wavefrontConfig.uri()), wavefrontConfig.apiToken());
|
|
|
|
|
PropertyMapper mapper = PropertyMapper.get().alwaysApplyingWhenNonNull();
|
|
|
|
|
Sender sender = this.properties.getSender();
|
|
|
|
|
mapper.from(sender.getMaxQueueSize()).to(builder::maxQueueSize);
|
|
|
|
|
mapper.from(sender.getBatchSize()).to(builder::batchSize);
|
|
|
|
|
mapper.from(sender.getFlushInterval()).asInt(Duration::getSeconds).to(builder::flushIntervalSeconds);
|
|
|
|
|
mapper.from(sender.getMessageSize()).asInt(DataSize::toBytes).to(builder::messageSizeBytes);
|
|
|
|
|
return builder.build();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String getWavefrontReportingUri(String uri) {
|
|
|
|
|
// proxy reporting is now http reporting on newer wavefront proxies.
|
|
|
|
|
if (uri.startsWith("proxy")) {
|
|
|
|
|
return "http" + uri.substring(5);
|
|
|
|
|
}
|
|
|
|
|
return uri;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|