调试信息

编辑

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

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

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

这对于追踪许多问题很有用,并且在 GitHub 存储库上提交 issue 时也很有用。

请求和响应字节

编辑

默认情况下,请求和响应字节在调试信息中不可用,但可以通过设置 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

ThreadPool 统计信息

编辑

查看线程池线程的统计信息通常很有用,尤其是在尝试诊断客户端问题时。客户端可以收集工作线程和异步 I/O 线程的统计信息,并在响应和调试信息中公开这些信息。

与收集 TCP 统计信息类似,可以通过在 ConnectionSettings 上配置 EnableThreadPoolStats 来为所有请求收集 ThreadPool 统计信息

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