调试信息
编辑调试信息编辑
来自 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() ) );
在某些环境中可能无法访问 TCP 统计信息收集,例如 Azure 应用服务。在这种情况下,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
后,线程池线程的统计信息现在将包含在响应和调试信息中。