调试信息
编辑调试信息
编辑Elasticsearch.Net 和 NEST 的每个响应都包含一个 DebugInformation
属性,该属性提供了对请求期间发生情况(成功和失败请求)的人类可读描述。
var response = client.Search<Project>(s => s .Query(q => q .MatchAll() ) ); response.DebugInformation.Should().Contain("Valid NEST response");
这在追踪许多问题时非常有用,在 GitHub 代码库上提交 问题 时也很有用。
请求和响应字节
编辑默认情况下,请求和响应字节在调试信息中不可用,但可以通过在连接设置中设置 DisableDirectStreaming
来全局启用。这将禁用对以下内容的直接流式传输:
- 序列化请求类型到请求流
- 响应流到反序列化的响应类型
var connectionPool = new SingleNodeConnectionPool(new Uri("https://127.0.0.1:9200")); var settings = new ConnectionSettings(connectionPool) .DisableDirectStreaming(); var client = new ElasticClient(settings);
或在每个请求的基础上
var response = client.Search<Project>(s => s .RequestConfiguration(r => r .DisableDirectStreaming() ) .Query(q => q .MatchAll() ) );
对单个请求配置 DisableDirectStreaming
比任何全局配置都具有优先级。
禁用直接流式传输通常会带来性能和分配成本,因为请求和响应字节必须缓存在内存中,才能在响应调用详细信息中显示它们。
TCP 统计信息
编辑查看活动 TCP 连接的统计信息通常很有用,尤其是在尝试诊断客户端问题时。客户端可以在发出请求之前收集活动 TCP 连接的状态,并在响应和调试信息中显示这些状态。
与 DisableDirectStreaming
类似,可以通过在 ConnectionSettings
上进行配置来为每个请求收集 TCP 统计信息。
var connectionPool = new SingleNodeConnectionPool(new Uri("https://127.0.0.1:9200")); var settings = new ConnectionSettings(connectionPool) .EnableTcpStats(); var client = new ElasticClient(settings);
或在每个请求的基础上
var response = client.Search<Project>(s => s .RequestConfiguration(r => r .EnableTcpStats() ) .Query(q => q .MatchAll() ) ); var debugInformation = response.DebugInformation;
设置 EnableTcpStats
后,活动 TCP 连接的状态现在将包含在响应和调试信息中。
客户端包含一个 TcpStats
类,如果需要,可以帮助检索有关活动 TCP 连接的更多详细信息。
var tcpStatistics = TcpStats.GetActiveTcpConnections(); var ipv4Stats = TcpStats.GetTcpStatistics(NetworkInterfaceComponent.IPv4); var ipv6Stats = TcpStats.GetTcpStatistics(NetworkInterfaceComponent.IPv6); var response = client.Search<Project>(s => s .Query(q => q .MatchAll() ) );
在某些环境中(例如 Azure 应用服务)可能无法访问 TCP 统计信息收集。在这种情况下,TcpStats.GetActiveTcpConnections()
返回 null
。
线程池统计信息
编辑查看线程池线程的统计信息通常很有用,尤其是在尝试诊断客户端问题时。客户端可以收集工作线程和异步 I/O 线程的统计信息,并在响应和调试信息中显示这些信息。
与收集 TCP 统计信息类似,可以通过在 ConnectionSettings
上配置 EnableThreadPoolStats
来为所有请求收集线程池统计信息。
var connectionPool = new SingleNodeConnectionPool(new Uri("https://127.0.0.1:9200")); var settings = new ConnectionSettings(connectionPool) .EnableThreadPoolStats(); var client = new ElasticClient(settings);
或在每个请求的基础上
var response = client.Search<Project>(s => s .RequestConfiguration(r => r .EnableThreadPoolStats() ) .Query(q => q .MatchAll() ) ); var debugInformation = response.DebugInformation;
设置 EnableThreadPoolStats
后,线程池线程的统计信息现在将包含在响应和调试信息中。