跳到主要内容

OkHttpClient 仪表化

DeepSeek V3 中英对照 OkHttpClient OkHttpClient Instrumentation

Micrometer 支持通过观测和指标对 OkHttp Client 进行检测。

OkHttpClient 观察

下面你可以找到一个示例,展示如何使用 Micrometer Observation 来对 OkHttp 客户端进行监控。这意味着根据你的 Observation Handler 配置,你只需一次监控,就可以获得多种好处(例如指标、分布式追踪)。

// Setting up instrumentation
private OkHttpClient client = new OkHttpClient.Builder().addInterceptor(defaultInterceptorBuilder().build())
.build();

private OkHttpObservationInterceptor.Builder defaultInterceptorBuilder() {
return OkHttpObservationInterceptor.builder(observationRegistry, "okhttp.requests")
.tags(KeyValues.of("foo", "bar"))
.uriMapper(URI_MAPPER);
}

// Usage example
Request request = new Request.Builder().url(server.baseUrl()).build();

makeACall(client, request);

assertThat(registry.get("okhttp.requests")
.tags("foo", "bar", "status", "200", "uri", URI_EXAMPLE_VALUE, "target.host", "localhost", "target.port",
String.valueOf(server.port()), "target.scheme", "http")
.timer()
.count()).isEqualTo(1L);
assertThat(testHandler.context).isNotNull();
assertThat(testHandler.context.getAllKeyValues()).contains(KeyValue.of("foo", "bar"),
KeyValue.of("status", "200"));
java

构建器允许更改默认的 ObservationConvention,如下所示。

// Setting up instrumentation with custom convention
MyConvention myConvention = new MyConvention();
client = new OkHttpClient.Builder()
.addInterceptor(defaultInterceptorBuilder()
.observationConvention(new StandardizedOkHttpObservationConvention(myConvention))
.build())
.build();
java

OkHttpClient 指标

Micrometer 支持通过 EventListener 将指标绑定到 OkHttpClient

你可以通过添加 OkHttpMetricsEventListener 来从 OkHttpClient 收集指标,如下所示:

OkHttpClient client = new OkHttpClient.Builder()
.eventListener(OkHttpMetricsEventListener.builder(registry, "okhttp.requests")
.tags(Tags.of("foo", "bar"))
.build())
.build();
java
备注

uri 标签通常限制为 URI 模式,以防止标签基数爆炸,但 OkHttpClient 不提供 URI 模式。我们提供了 URI_PATTERN 头信息来支持 uri 标签,或者你可以配置一个 URI 映射器来为 uri 标签提供自定义的标签值。

要配置一个 URI 映射器,你可以使用 uriMapper(),如下所示:

OkHttpClient client = new OkHttpClient.Builder()
.eventListener(OkHttpMetricsEventListener.builder(registry, "okhttp.requests")
.uriMapper(req -> req.url().encodedPath())
.tags(Tags.of("foo", "bar"))
.build())
.build();
java
注意

示例可能会触发标签基数爆炸,因为 URI 路径本身被用作标签值。