用于 Http2 的 Instrument Jetty HttpClient

Instrument Jetty HttpClient for Http2

我正在使用 Jetty 的 http2client 同步调用我的服务器,我的示例程序如下,

客户端部分

Security.addProvider(new OpenSSLProvider());
SslContextFactory sslContextFactory = new SslContextFactory(true);
sslContextFactory.setProvider("Conscrypt");
sslContextFactory.setProtocol("TLSv1.3");
HTTP2Client http2Client = new HTTP2Client();
http2Client.setConnectTimeout(5000);
http2Client.setIdleTimeout(5000);

HttpClient httpClient = new org.eclipse.jetty.client.HttpClient(new HttpClientTransportOverHTTP2(http2Client), sslContextFactory);
httpClient.setMaxConnectionsPerDestination(20);
httpClient.setMaxRequestsQueuedPerDestination(100);
httpClient.setConnectTimeout(5000);
httpClient.addBean(sslContextFactory);
httpClient.start();

请求零件

Request request = httpClient.POST("my url goes here");
request.header(HttpHeader.CONTENT_TYPE, "application/json");
request.content(new StringContentProvider("xmlRequest PayLoad goes here","utf-8"));
ContentResponse response = request.send();
String res = new String(response.getContent());

我需要进行检测以获取指标,例如每个目的地的连接数、每个连接的请求数、失败的事务数等。

我的应用程序运行在限制使用 wireshark 或任何其他 tcp 工具的服务器中。所以我需要在 java 内获取这些数据。启用码头的调试日志是不可行的,因为它会写入 GB 的数据。

有没有办法通过一些实用程序或 java 反射来获取这些指标?

提前致谢

http2Client.setMaxConcurrentPushedStreams(1000);

这太大了,服务器不太可能推送 1000 个并发 流。

http2Client.setConnectTimeout(30);

http2Client.setIdleTimeout(5);

超时以毫秒为单位,因此这些值太小了。 我还建议空闲超时值大于 5000 毫秒,通常 20000-30000 更好。

String res = new String(response.getContent());

这是错误的,因为您没有考虑响应字符集。 请改用 response.getContentAsString().

至于指标,您可以使用 JMX 并使用 JMX 控制台(或通过标准 JMX API)提取大量指标。 要为 HttpClient 设置 JMX,您可以这样做:

MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
MBeanContainer mbeanContainer = new MBeanContainer(mbeanServer);
httpClient.addBean(mbeanContainer);

上面的代码会将 HttpClient 组件导出到 JMX,您可以在其中查询各种组件以获得您感兴趣的指标。