Metrics
Both IndexWriterConfig and IndexSearcherConfig accept an IMetricsCollector. The default (NullMetricsCollector.Instance) records nothing.
DefaultMetricsCollector
In-process collector with Interlocked counters:
using Rowles.LeanCorpus.Diagnostics;
var metrics = new DefaultMetricsCollector();
var config = new IndexSearcherConfig { Metrics = metrics };
// ... run searches ...
MetricsSnapshot snap = metrics.GetSnapshot();
Console.WriteLine($"Searches: {snap.SearchCount}, avg: {snap.SearchAvgMs}ms");
Console.WriteLine($"Cache hit rate: {snap.CacheHitRate:P0}");
Snapshot fields
SearchCount, SearchTotalMs, SearchMaxMs, SearchAvgMs, CacheHits, CacheMisses, CacheHitRate, FlushCount, FlushTotalMs, MergeCount, MergeSegments, MergeTotalMs, CommitCount, CommitTotalMs, HnswSearchCount, HnswSearchTotalMs, HnswNodesVisited, HnswBuildCount, HnswBuildTotalMs, HnswNodesBuilt, and a LatencyHistogram with buckets at <1, <5, <10, <50, <100, <500, <1000, >=1000 ms.
MeterMetricsCollector
Publishes through System.Diagnostics.Metrics under the meter name Rowles.LeanCorpus. See OpenTelemetry.
Custom
Implement IMetricsCollector to forward into Prometheus, StatsD, etc.