首页 > 解决方案 > Spring boot千分尺datadog套接字连接错误

问题描述

我正在为我的 spring boot 2 rest api 创建一些自定义指标。我添加了所需的千分尺和数据狗依赖项。我的办公机器在代理后面工作。我通过 spring boot 插件设置了代理。

-Dhttp.proxyHost=xxxx.proxy.com
-Dhttp.proxyPort=xxxx

下面在我的 application.properties 文件中。management.metrics.export.datadog.apiKey=mykey

management.metrics.export.datadog.uri=https://app.datadoghq.com

management.metrics.export.datadog.enabled=true

management.metrics.export.datadog.step=10s

但我得到了套接字连接超时。

   [datadog-metrics-publisher] 10 Apr 2020 16:51:39,552 WARN  DatadogMeterRegistry [{}]: java.net.SocketTimeoutException: connect timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:606)
    at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:666)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:264)
    at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:367)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:191)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:177)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1340)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1315)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:264)
    at io.micrometer.core.ipc.http.HttpUrlConnectionSender.send(HttpUrlConnectionSender.java:96)
    at io.micrometer.core.ipc.http.HttpSender$Request$Builder.send(HttpSender.java:284)
    at io.micrometer.datadog.DatadogMeterRegistry.publish(DatadogMeterRegistry.java:141)
    at io.micrometer.core.instrument.push.PushMeterRegistry.publishSafely(PushMeterRegistry.java:48)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)

据我调试 io.micrometer.core.ipc.http.HttpUrlConnectionSender.send 方法失​​败,我不知道千分尺数据狗如何获取代理详细信息。

千分尺医生说

management.metrics.export.datadog.uri=https://app.datadoghq.com # URI to ship metrics to. If you need to publish metrics to an internal proxy en-route to Datadog, you can define the location of the proxy with this.

但我不明白这是什么意思?我应该用我的代理 url 替换这个 url 还是代理有任何特定的 uri 模式?我正在使用弹簧启动 2.2.4.RELEASE

标签: spring-bootdatadogspring-micrometer

解决方案


如果您尝试连接到 Datadog 的 HTTPS URL(https://app.datadoghq.com在您的示例中),那么您需要设置https.proxyHost系统属性以使其生效 -http.proxyHost适用于 HTTP URLs[1]。这些是系统范围的设置,如果 a未传递给其构造函数,则默认HttpSender( )将使用这些设置。HttpUrlConnectionSenderProxy

千分尺医生说

management.metrics.export.datadog.uri=https://app.datadoghq.com # URI to ship metrics to. If you need to publish metrics to an internal proxy en-route to Datadog, you can define the location of the proxy with this.

但我不明白这是什么意思?我应该用我的代理 url 替换这个 url 还是代理有任何特定的 uri 模式?

这是指您将配置为在内部网络上接收 Datadog 流量的不同类型的代理,并将其转发到网络外部的 Datadog。如果您使用的是 HTTP 代理,那么您应该使用系统属性或HttpSender配置您的 HTTP 代理的 an(例如 anHttpUrlConnectionSender并将 a 传递Proxy给它的构造函数)。

您可以使用其配置HttpSenderDatadogMeterRegistry定义Builder。如果你Bean在一个@Configuration类中公开它,Spring Boot 将在其自动配置中使用它。例如:

@Bean
public DatadogMeterRegistry datadogMeterRegistry(DatadogConfig config, Clock clock) {
    HttpSender httpSender = new HttpUrlConnectionSender(config.connectTimeout(), config.readTimeout(), new Proxy(Proxy.Type.HTTP, new InetSocketAddress("myproxy", 8080)));
    return DatadogMeterRegistry.builder(config).clock(clock).httpClient(httpSender).build();
}

[1] https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html


推荐阅读