OkHttpClient 仪表化
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"));
构建器允许更改默认的 ObservationConvention
,如下所示。
// Setting up instrumentation with custom convention
MyConvention myConvention = new MyConvention();
client = new OkHttpClient.Builder()
.addInterceptor(defaultInterceptorBuilder()
.observationConvention(new StandardizedOkHttpObservationConvention(myConvention))
.build())
.build();
OkHttpClient 指标
Micrometer 支持通过 EventListener
将指标绑定到 OkHttpClient
。
你可以通过添加 OkHttpMetricsEventListener
来从 OkHttpClient
收集指标,如下所示:
OkHttpClient client = new OkHttpClient.Builder()
.eventListener(OkHttpMetricsEventListener.builder(registry, "okhttp.requests")
.tags(Tags.of("foo", "bar"))
.build())
.build();
备注
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();
注意
示例可能会触发标签基数爆炸,因为 URI 路径本身被用作标签值。