test_exporter.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from datetime import datetime, timezone
  2. from types import SimpleNamespace
  3. from unittest.mock import patch
  4. import pytest
  5. from gpustack.exporter.exporter import MetricExporter
  6. from gpustack.schemas.models import ModelInstanceStateEnum
  7. def _sample_value(metrics, metric_name):
  8. for metric in metrics:
  9. if metric.name == metric_name:
  10. assert len(metric.samples) == 1
  11. return metric.samples[0].value
  12. raise AssertionError(f"Metric {metric_name} not found")
  13. def _sample_labels(metrics, metric_name):
  14. for metric in metrics:
  15. if metric.name == metric_name:
  16. assert len(metric.samples) == 1
  17. return metric.samples[0].labels
  18. raise AssertionError(f"Metric {metric_name} not found")
  19. @pytest.mark.asyncio
  20. async def test_model_instance_restart_metrics_are_collected():
  21. exporter = MetricExporter(SimpleNamespace(metrics_port=10161))
  22. latest_restart_time = datetime(2026, 4, 17, 8, 30, tzinfo=timezone.utc)
  23. instance = SimpleNamespace(
  24. worker_id=2,
  25. worker_name="worker-2",
  26. name="qwen-1",
  27. state=ModelInstanceStateEnum.RUNNING,
  28. restart_count=3,
  29. last_restart_time=latest_restart_time,
  30. )
  31. model = SimpleNamespace(
  32. id=10,
  33. name="qwen",
  34. backend="vllm",
  35. backend_version="0.8.0",
  36. source="huggingface",
  37. model_source_key="Qwen/Qwen2.5-0.5B-Instruct",
  38. replicas=1,
  39. ready_replicas=1,
  40. instances=[instance],
  41. )
  42. cluster = SimpleNamespace(
  43. id=1,
  44. name="default",
  45. provider="docker",
  46. state="ready",
  47. cluster_workers=[],
  48. cluster_models=[model],
  49. )
  50. with patch("gpustack.exporter.exporter.Cluster.all", return_value=[cluster]):
  51. metrics = await exporter._collect_metrics(session=SimpleNamespace())
  52. assert _sample_value(metrics, "gpustack:model_instance_restart_count") == 3
  53. assert (
  54. _sample_value(metrics, "gpustack:model_instance_latest_restart_time")
  55. == latest_restart_time.timestamp()
  56. )
  57. assert _sample_labels(metrics, "gpustack:model_instance_restart_count") == {
  58. "cluster_id": "1",
  59. "cluster_name": "default",
  60. "worker_id": "2",
  61. "worker_name": "worker-2",
  62. "model_id": "10",
  63. "model_name": "qwen",
  64. "model_instance_name": "qwen-1",
  65. }