调试信息

编辑

Elasticsearch.Net 和 NEST 的每个响应都包含一个 DebugInformation 属性,该属性提供了对请求期间发生情况(成功和失败请求)的人类可读描述。

var response = client.Search<Project>(s => s
    .Query(q => q
        .MatchAll()
    )
);

response.DebugInformation.Should().Contain("Valid NEST response");

这在追踪许多问题时非常有用,在 GitHub 代码库上提交 问题 时也很有用。

请求和响应字节

编辑

默认情况下,请求和响应字节在调试信息中不可用,但可以通过在连接设置中设置 DisableDirectStreaming 来全局启用。这将禁用对以下内容的直接流式传输:

  1. 序列化请求类型到请求流
  2. 响应流到反序列化的响应类型
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);

所有请求收集 TCP 统计信息

或在每个请求的基础上

var response = client.Search<Project>(s => s
    .RequestConfiguration(r => r
        .EnableTcpStats() 
    )
    .Query(q => q
        .MatchAll()
    )
);

var debugInformation = response.DebugInformation;

仅对请求收集 TCP 统计信息

设置 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 连接的详细信息,包括本地和远程地址以及端口。

检索有关 IPv4 的统计信息。

检索有关 IPv6 的统计信息。

在某些环境中(例如 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 后,线程池线程的统计信息现在将包含在响应和调试信息中。