Skip to content

Commit

Permalink
[FLINK-11692][metrics] Add proxy support to datadog reporter
Browse files Browse the repository at this point in the history
  • Loading branch information
scott-mitchell authored and zentol committed Mar 20, 2019
1 parent 96fd4c5 commit 2f2790c
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 6 deletions.
4 changes: 4 additions & 0 deletions docs/monitoring/metrics.md
Original file line number Diff line number Diff line change
Expand Up @@ -760,6 +760,8 @@ Parameters:

- `apikey` - the Datadog API key
- `tags` - (optional) the global tags that will be applied to metrics when sending to Datadog. Tags should be separated by comma only
- `proxyHost` - (optional) The proxy host to use when sending to Datadog.
- `proxyPort` - (optional) The proxy port to use when sending to Datadog, defaults to 8080.

Example configuration:

Expand All @@ -768,6 +770,8 @@ Example configuration:
metrics.reporter.dghttp.class: org.apache.flink.metrics.datadog.DatadogHttpReporter
metrics.reporter.dghttp.apikey: xxx
metrics.reporter.dghttp.tags: myflinkapp,prod
metrics.reporter.dghttp.proxyHost: my.web.proxy.com
metrics.reporter.dghttp.proxyPort: 8080

{% endhighlight %}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.concurrent.TimeUnit;

/**
Expand All @@ -51,23 +53,39 @@ public class DatadogHttpClient {
private final OkHttpClient client;
private final String apiKey;

public DatadogHttpClient(String dgApiKey) {
private final String proxyHost;
private final int proxyPort;

public DatadogHttpClient(String dgApiKey, String dgProxyHost, int dgProxyPort) {
if (dgApiKey == null || dgApiKey.isEmpty()) {
throw new IllegalArgumentException("Invalid API key:" + dgApiKey);
}

apiKey = dgApiKey;
proxyHost = dgProxyHost;
proxyPort = dgProxyPort;

Proxy proxy = getProxy();

client = new OkHttpClient.Builder()
.connectTimeout(TIMEOUT, TimeUnit.SECONDS)
.writeTimeout(TIMEOUT, TimeUnit.SECONDS)
.readTimeout(TIMEOUT, TimeUnit.SECONDS)
.proxy(proxy)
.build();

seriesUrl = String.format(SERIES_URL_FORMAT, apiKey);
validateUrl = String.format(VALIDATE_URL_FORMAT, apiKey);
validateApiKey();
}

Proxy getProxy() {
if (proxyHost == null) {
return Proxy.NO_PROXY;
} else {
return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort));
}
}

private void validateApiKey() {
Request r = new Request.Builder().url(validateUrl).get().build();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ public class DatadogHttpReporter implements MetricReporter, Scheduled {
private List<String> configTags;

public static final String API_KEY = "apikey";
public static final String PROXY_HOST = "proxyHost";
public static final String PROXY_PORT = "proxyPort";
public static final String TAGS = "tags";

@Override
Expand Down Expand Up @@ -102,7 +104,11 @@ public void notifyOfRemovedMetric(Metric metric, String metricName, MetricGroup

@Override
public void open(MetricConfig config) {
client = new DatadogHttpClient(config.getString(API_KEY, null));
String apiKey = config.getString(API_KEY, null);
String proxyHost = config.getString(PROXY_HOST, null);
Integer proxyPort = config.getInteger(PROXY_PORT, 8080);

client = new DatadogHttpClient(apiKey, proxyHost, proxyPort);
LOGGER.info("Configured DatadogHttpReporter");

configTags = getTagsFromConfig(config.getString(TAGS, ""));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,25 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.api.support.membermodification.MemberMatcher;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.Arrays;
import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

/**
* Tests for the DatadogHttpClient.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(DMetric.class)
@PrepareForTest({DMetric.class, DatadogHttpClient.class})
@PowerMockIgnore("javax.net.ssl.*")
public class DatadogHttpClientTest {

private static List<String> tags = Arrays.asList("tag1", "tag2");
Expand All @@ -53,14 +59,37 @@ public void mockSystemMillis() {
PowerMockito.when(DMetric.getUnixEpochTimestamp()).thenReturn(MOCKED_SYSTEM_MILLIS);
}