blob: 8674a0435ac7798dd9783e18d5984caf3f817de5 [file] [view]
---
title: Telemetry Devices
parent: Reference
nav_order: 45
---
# Telemetry Devices
Apache Solr Orbit includes telemetry devices for collecting server-side metrics. Six devices are **always enabled** and collect metrics automatically without any flags. One additional device (`disk-io`) runs automatically on provisioned pipelines. Eight further devices can be enabled on demand with `--telemetry`.
Both Solr 9.x (JSON format) and Solr 10.x (Prometheus text format) are supported. Format detection is automatic via the HTTP `Content-Type` header.
---
## solr-jvm-stats
Collects JVM statistics from each Solr node via the Solr metrics API.
**Always active.** No `--telemetry` flag required.
**Metrics collected:**
| Metric | Unit | Description |
|--------|------|-------------|
| `jvm_heap_used_bytes` | bytes | JVM heap memory currently used |
| `jvm_heap_max_bytes` | bytes | Maximum JVM heap size |
| `jvm_gc_count` | count | Total GC collections across all collectors |
| `jvm_gc_time_ms` | ms | Total GC wall time across all collectors |
| `jvm_gc_young_count` | count | Young-generation GC collection count |
| `jvm_gc_young_time_ms` | ms | Young-generation GC wall time |
| `jvm_gc_old_count` | count | Old-generation GC collection count |
| `jvm_gc_old_time_ms` | ms | Old-generation GC wall time |
| `jvm_thread_count` | count | Current JVM thread count |
| `jvm_thread_peak_count` | count | Peak JVM thread count since startup |
| `jvm_buffer_pool_direct_bytes` | bytes | Direct byte buffer pool memory used |
| `jvm_buffer_pool_mapped_bytes` | bytes | Memory-mapped buffer pool memory used |
---
## solr-node-stats
Collects Solr node-level and OS statistics.
**Always active.** No `--telemetry` flag required.
**Metrics collected:**
| Metric | Unit | Description |
|--------|------|-------------|
| `cpu_usage_percent` | % | Process CPU load (0100) |
| `os_memory_free_bytes` | bytes | Free physical OS memory |
| `node_file_descriptors_open` | count | Currently open file descriptors |
| `node_file_descriptors_max` | count | Maximum allowed file descriptors |
| `node_http_requests_total` | count | Total HTTP requests processed by Jetty |
| `query_handler_requests_total` | count | Total `/select` query handler requests |
| `query_handler_errors_total` | count | Total `/select` query handler errors |
| `query_handler_avg_latency_ms` | ms | Rolling average `/select` request latency |
---
## solr-collection-stats
Collects per-collection document count, segment count, and deleted doc count.
**Always active.** No `--telemetry` flag required.
**Metrics collected** (all tagged with `collection` metadata):
| Metric | Unit | Description |
|--------|------|-------------|
| `num_docs` | docs | Current document count |
| `num_deleted_docs` | docs | Number of deleted (soft-deleted) documents |
| `segment_count` | count | Number of Lucene segments |
| `index_size_bytes` | bytes | Total index size on disk |
**Notes:** Collection stats are polled every 30 seconds by default. Override with `--telemetry-params collection-stats-sample-interval:60`. Uses both the Collections API and the Luke request handler (`/admin/luke`) for full statistics.
---
## solr-query-stats
Collects query latency percentiles and filter cache hit ratio.
**Always active.** No `--telemetry` flag required.
**Metrics collected:**
| Metric | Unit | Description |
|--------|------|-------------|
| `query_latency_p50_ms` | ms | 50th percentile `/select` request latency |
| `query_latency_p99_ms` | ms | 99th percentile `/select` request latency |
| `query_latency_p999_ms` | ms | 99.9th percentile `/select` request latency |
| `query_requests_total` | count | Total `/select` handler request count |
| `query_errors_total` | count | Total `/select` handler error count |
| `query_cache_hit_ratio` | ratio | Filter cache hit ratio (0.01.0) |
---
## solr-indexing-stats
Collects update handler and merge metrics.
**Always active.** No `--telemetry` flag required.
**Metrics collected:**
| Metric | Unit | Description |
|--------|------|-------------|
| `indexing_requests_total` | count | Total `/update` handler requests |
| `indexing_errors_total` | count | Total `/update` handler errors |
| `indexing_avg_time_ms` | ms | Rolling average `/update` request time |
| `index_merge_major_running` | count | Currently running major merges |
| `index_merge_minor_running` | count | Currently running minor merges |
---
## solr-cache-stats
Collects hit/miss/eviction and memory statistics for the three primary Solr caches.
**Always active.** No `--telemetry` flag required.
**Metrics collected** (all tagged with `cache` metadata: `queryResultCache`, `filterCache`, `documentCache`):
| Metric | Unit | Description |
|--------|------|-------------|
| `cache_hits_total` | count | Cache hits since Solr start |
| `cache_inserts_total` | count | Cache inserts since Solr start |
| `cache_evictions_total` | count | Cache evictions since Solr start |
| `cache_memory_bytes` | bytes | RAM used by this cache |
| `cache_hit_ratio` | ratio | Hit ratio (0.01.0) |
---
## Always-on provisioned-pipeline device
The following device activates automatically when using the `docker` or `from-distribution` pipeline. It cannot be disabled and does not need to be listed in `--telemetry`.
### disk-io
Measures disk I/O consumed by the Solr process during the benchmark run.
**Pipeline:** `docker` or `from-distribution` (always active; not available on `benchmark-only`)
| Metric | Unit | Description |
|--------|------|-------------|
| `disk_io_read_bytes` | bytes | Bytes read by the Solr process |
| `disk_io_write_bytes` | bytes | Bytes written by the Solr process |
---
## Optional devices
Optional devices must be explicitly requested with `--telemetry <name>`. REST-based optional
devices work with all pipelines. JVM/process devices inject flags into `SOLR_OPTS` before Solr
starts and require the `docker` or `from-distribution` pipeline they are silently skipped on
`benchmark-only`.
---
### segment-stats
Captures per-collection segment statistics via the Solr Luke request handler.
**Pipeline:** All pipelines
**Enable:** `--telemetry segment-stats`
Collected on benchmark stop. Results are written to `segment_stats.log` in the benchmark log directory.
| Metric (in log file) | Description |
|----------------------|-------------|
| `numDocs` | Current document count |
| `maxDoc` | Maximum doc ID (includes deleted docs) |
| `deletedDocs` | Number of soft-deleted documents |
| `segmentCount` | Number of Lucene segments |
| `sizeInBytes` | Total index size on disk |
---
### shard-stats
Polls CLUSTERSTATUS and Core STATUS for each shard leader and records per-shard metrics. Skipped silently on standalone (non-SolrCloud) Solr.
**Pipeline:** All pipelines
**Enable:** `--telemetry shard-stats`
| Metric | Unit | Description |
|--------|------|-------------|
| `shard_{name}_num_docs` | count | Document count for the named shard |
| `shard_{name}_size_bytes` | bytes | Index size for the named shard |
The default poll interval is 60 seconds. Override with `--telemetry-params shard-stats-sample-interval:30`.
---
### cluster-environment-info
Records Solr version, JVM version, and hardware info as run metadata. Called once at benchmark start.
**Pipeline:** All pipelines
**Enable:** `--telemetry cluster-environment-info`
| Metadata key | Description |
|--------------|-------------|
| `distribution_version` | Solr version string (e.g. `9.7.0`) |
| `jvm_version` | JVM version (e.g. `21.0.1`) |
| `jvm_vendor` | JVM vendor name (e.g. `OpenJDK 21`) |
| `cpu_logical_cores` | Number of logical CPU cores on the node |
| `cluster_node_count` | Number of live SolrCloud nodes |
---
### jfr
Enables Java Flight Recorder. Injects `-XX:StartFlightRecording=...` into `SOLR_OPTS`.
**Pipeline:** `docker` or `from-distribution` only
**Enable:** `--telemetry jfr`
The flight recording is written to `profile.jfr` in the benchmark log directory. Requires OpenJDK 11 or later. To use a custom recording template, pass `--telemetry-params recording-template:/path/to/template.jfc`.
---
### gc
Enables GC logging (Java 9+ `-Xlog:` format). Injects the GC log flags into `SOLR_OPTS`.
**Pipeline:** `docker` or `from-distribution` only
**Enable:** `--telemetry gc`
GC output is written to `gc.log` in the benchmark log directory. The default log configuration is `gc*=info,safepoint=info,age*=trace`. Override with `--telemetry-params gc-log-config:gc*=debug`.
---
### jit
Enables JIT compiler logging. Injects `-XX:+LogCompilation` and related flags into `SOLR_OPTS`.
**Pipeline:** `docker` or `from-distribution` only
**Enable:** `--telemetry jit`
JIT output is written to `jit.log` in the benchmark log directory.
---
### heapdump
Captures a heap dump (`jmap -dump`) from the Solr JVM when the benchmark finishes.
**Pipeline:** `docker` or `from-distribution` only
**Enable:** `--telemetry heapdump`
The heap dump is written to `heap_at_exit_{pid}.hprof` in the benchmark log directory. On Docker pipelines, `docker exec` is used automatically.
---
## Using multiple devices
The six always-on devices collect metrics automatically no flags required:
```bash
# Always-on devices activate without any --telemetry flag:
solr-orbit run \
--pipeline benchmark-only \
--target-hosts localhost:8983 \
--workload nyc_taxis
```
Add optional REST devices on any pipeline:
```bash
solr-orbit run \
--pipeline benchmark-only \
--target-hosts localhost:8983 \
--workload nyc_taxis \
--telemetry segment-stats,shard-stats,cluster-environment-info
```
Add JVM profiling devices on provisioned pipelines:
```bash
solr-orbit run \
--pipeline docker \
--distribution-version 9.10.1 \
--workload nyc_taxis \
--telemetry gc,jfr
```
## Telemetry output location
Telemetry metrics are written to the metrics store alongside all other benchmark metrics. When using the filesystem store, they are recorded in `metrics.jsonl` in the test run directory (`~/.solr-orbit/benchmarks/test-runs/<run-id>/`). See [Filesystem Metrics Store](metrics/filesystem-metrics-store.html) for the file format.