Debug information
editDebug information
editEvery response from Elasticsearch.Net and NEST contains a DebugInformation
property
that provides a human readable description of what happened during the request for both successful and
failed requests
var response = client.Search<Project>(s => s .Query(q => q .MatchAll() ) ); response.DebugInformation.Should().Contain("Valid NEST response");
This can be useful in tracking down numerous problems and can also be useful when filing an issue on the GitHub repository.
Request and response bytes
editBy default, the request and response bytes are not available within the debug information, but
can be enabled globally on Connection Settings by setting DisableDirectStreaming
. This
disables direct streaming of
- the serialized request type to the request stream
- the response stream to a deserialized response type
var connectionPool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); var settings = new ConnectionSettings(connectionPool) .DisableDirectStreaming(); var client = new ElasticClient(settings);
or on a per request basis
var response = client.Search<Project>(s => s .RequestConfiguration(r => r .DisableDirectStreaming() ) .Query(q => q .MatchAll() ) );
Configuring DisableDirectStreaming
on an individual request takes precedence over
any global configuration.
There is typically a performance and allocation cost associated with disabling direct streaming since both the request and response bytes must be buffered in memory, to allow them to be exposed on the response call details.
TCP statistics
editIt can often be useful to see the statistics for active TCP connections, particularly when trying to diagnose issues with the client. The client can collect the states of active TCP connections just before making a request, and expose these on the response and in the debug information.
Similarly to DisableDirectStreaming
, TCP statistics can be collected for every request
by configuring on ConnectionSettings
var connectionPool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); var settings = new ConnectionSettings(connectionPool) .EnableTcpStats(); var client = new ElasticClient(settings);
or on a per request basis
var response = client.Search<Project>(s => s .RequestConfiguration(r => r .EnableTcpStats() ) .Query(q => q .MatchAll() ) ); var debugInformation = response.DebugInformation;
With EnableTcpStats
set, the states of active TCP connections will now be included
on the response and in the debug information.
The client includes a TcpStats
class to help with retrieving more detail about active TCP connections should it be
required
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() ) );
Retrieve details about active TCP connections, including local and remote addresses and ports |
|
Retrieve statistics about IPv4 |
|
Retrieve statistics about IPv6 |
Collecting TCP statistics may not be accessible in all environments, for example, Azure App Services.
When this is the case, TcpStats.GetActiveTcpConnections()
returns null
.
ThreadPool statistics
editIt can often be useful to see the statistics for thread pool threads, particularly when trying to diagnose issues with the client. The client can collect statistics for both worker threads and asynchronous I/O threads, and expose these on the response and in debug information.
Similar to collecting TCP statistics, ThreadPool statistics can be collected for all requests
by configuring EnableThreadPoolStats
on ConnectionSettings
var connectionPool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); var settings = new ConnectionSettings(connectionPool) .EnableThreadPoolStats(); var client = new ElasticClient(settings);
or on a per request basis
var response = client.Search<Project>(s => s .RequestConfiguration(r => r .EnableThreadPoolStats() ) .Query(q => q .MatchAll() ) ); var debugInformation = response.DebugInformation;
With EnableThreadPoolStats
set, the statistics of thread pool threads will now be included
on the response and in the debug information.