调试信息编辑

来自 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 的统计信息

在某些环境中可能无法访问 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 后,线程池线程的统计信息现在将包含在响应和调试信息中。