Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions solrorbit/telemetry.py
Original file line number Diff line number Diff line change
Expand Up @@ -990,8 +990,17 @@ class SolrCollectionStats(SolrTelemetryDevice):
human_name = "Solr Collection Stats"
help = "Per-collection: doc count, deleted docs, index size, and segment count (30 s interval)"

def __init__(self, admin_client, metrics_store,
collections: list = None, sample_interval_s: float = 30.0):
def __init__(self, admin_client, metrics_store, telemetry_params=None, collections: list = None):
"""
:param telemetry_params: May optionally specify
``collection-stats-sample-interval``: positive number, seconds between polls. Default: 30.
"""
sample_interval_s = (telemetry_params or {}).get("collection-stats-sample-interval", 30)
if sample_interval_s <= 0:
raise exceptions.SystemSetupError(
"The telemetry parameter 'collection-stats-sample-interval' must be greater than zero "
f"but was {sample_interval_s}."
)
super().__init__(admin_client, metrics_store, sample_interval_s)
self._collections = collections

Expand Down
2 changes: 1 addition & 1 deletion solrorbit/worker_coordinator/worker_coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -932,7 +932,7 @@ def _create_solr_telemetry_devices(self, clients):
return [
telemetry.SolrJvmStats(sc, self.metrics_store),
telemetry.SolrNodeStats(sc, self.metrics_store),
telemetry.SolrCollectionStats(sc, self.metrics_store),
telemetry.SolrCollectionStats(sc, self.metrics_store, telemetry_params),
telemetry.SolrQueryStats(sc, self.metrics_store),
telemetry.SolrIndexingStats(sc, self.metrics_store),
telemetry.SolrCacheStats(sc, self.metrics_store),
Expand Down
11 changes: 11 additions & 0 deletions tests/unit/solr/test_telemetry.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import unittest
from unittest.mock import MagicMock

from solrorbit import exceptions
from solrorbit.telemetry import (
SolrCacheStats,
SolrCollectionStats,
Expand Down Expand Up @@ -394,6 +395,16 @@ def test_luke_stats_on_error_no_crash(self):
device = SolrCollectionStats(client, MagicMock(), collections=["coll"])
device._collect() # must not raise

def test_rejects_non_positive_sample_interval(self):
for interval in (0, -5):
with self.assertRaisesRegex(exceptions.SystemSetupError, "collection-stats-sample-interval"):
SolrCollectionStats(MagicMock(), MagicMock(), {"collection-stats-sample-interval": interval})

def test_sample_interval_from_telemetry_params(self):
self.assertEqual(30, SolrCollectionStats(MagicMock(), MagicMock())._sample_interval)
device = SolrCollectionStats(MagicMock(), MagicMock(), {"collection-stats-sample-interval": 7})
self.assertEqual(7, device._sample_interval)


# ---------------------------------------------------------------------------
# SolrQueryStats
Expand Down
15 changes: 15 additions & 0 deletions tests/worker_coordinator/worker_coordinator_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,21 @@ def test_creates_cluster_environment_info_device(self):
self.assertEqual(1, len(env_info))
self.assertIs(sc, env_info[0].admin_client)

def test_collection_stats_uses_sample_interval_param(self):
# pylint: disable=import-outside-toplevel
from solrorbit import telemetry
from solrorbit.client import SolrClient

self.cfg.add(config.Scope.applicationOverride, "telemetry", "params", {"collection-stats-sample-interval": 7})
target = self.create_test_worker_coordinator_target()
d = worker_coordinator.WorkerCoordinator(target, self.cfg, client_factory_class=WorkerCoordinatorTests.StaticClientFactory)

devices = d._create_solr_telemetry_devices({"default": mock.MagicMock(spec=SolrClient)})

collection_stats = [device for device in devices if isinstance(device, telemetry.SolrCollectionStats)]
self.assertEqual(1, len(collection_stats))
self.assertEqual(7, collection_stats[0]._sample_interval)

def test_client_reaches_join_point_others_still_executing(self):
target = self.create_test_worker_coordinator_target()
d = worker_coordinator.WorkerCoordinator(target, self.cfg, client_factory_class=WorkerCoordinatorTests.StaticClientFactory)
Expand Down
Loading