Tiny add routing key distribution metrics (#16847)

This commit is contained in:
fzyzcjy
2026-01-10 12:06:40 +08:00
committed by GitHub
parent 1f9d4795a9
commit 3ed3b7ef7c
3 changed files with 111 additions and 1 deletions
+50
View File
@@ -11,6 +11,10 @@ from prometheus_client.parser import text_string_to_metric_families
from prometheus_client.samples import Sample
from sglang.srt.environ import envs
from sglang.srt.metrics.collector import (
ROUTING_KEY_REQ_COUNT_BUCKET_BOUNDS,
compute_routing_key_stats,
)
from sglang.srt.utils import kill_process_tree
from sglang.test.test_utils import (
DEFAULT_TIMEOUT_FOR_SERVER_LAUNCH,
@@ -144,10 +148,28 @@ class TestEnableMetrics(CustomTestCase):
"sglang:e2e_request_latency_seconds",
"sglang:http_requests_active",
"sglang:routing_keys_active",
"sglang:num_unique_running_routing_keys",
"sglang:routing_key_running_req_count",
"sglang:routing_key_all_req_count",
]
for metric in essential_metrics:
self.assertIn(metric, metrics_text, f"Missing metric: {metric}")
# Verify routing key GaugeHistogram buckets
expected_buckets = len(ROUTING_KEY_REQ_COUNT_BUCKET_BOUNDS) + 1
for metric_name in [
"sglang:routing_key_running_req_count",
"sglang:routing_key_all_req_count",
]:
gt_le_pairs = set()
for sample in metrics.get(metric_name, []):
gt_le_pairs.add((sample.labels.get("gt"), sample.labels.get("le")))
self.assertEqual(
len(gt_le_pairs),
expected_buckets,
f"{metric_name}: Expected {expected_buckets} buckets, got {len(gt_le_pairs)}",
)
self.assertIn(f'model_name="{_MODEL_NAME}"', metrics_text)
self.assertIn("_sum{", metrics_text)
self.assertIn("_count{", metrics_text)
@@ -185,5 +207,33 @@ def _check_metrics_positive(test_case, metrics, metrics_to_check):
test_case.assertGreater(value, 0, f"{metric_name} {labels}")
class TestComputeRoutingKeyStats(unittest.TestCase):
def test_empty(self):
num_unique, req_counts = compute_routing_key_stats([])
self.assertEqual(num_unique, 0)
self.assertEqual(req_counts, [])
def test_all_none(self):
num_unique, req_counts = compute_routing_key_stats([None, None, None])
self.assertEqual(num_unique, 0)
self.assertEqual(req_counts, [])
def test_with_none(self):
num_unique, req_counts = compute_routing_key_stats([None, "key1", None])
self.assertEqual(num_unique, 1)
self.assertEqual(req_counts, [1])
def test_single_key_multiple_reqs(self):
num_unique, req_counts = compute_routing_key_stats(["key1"] * 5)
self.assertEqual(num_unique, 1)
self.assertEqual(req_counts, [5])
def test_distribution(self):
routing_keys = ["key1"] * 5 + ["key2"] * 1 + ["key3"] * 15 + ["key4"] * 250
num_unique, req_counts = compute_routing_key_stats(routing_keys)
self.assertEqual(num_unique, 4)
self.assertEqual(sorted(req_counts), [1, 5, 15, 250])
if __name__ == "__main__":
unittest.main()