2
0

pvmetrics_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package metrics
  2. import (
  3. "testing"
  4. "github.com/opencost/opencost/core/pkg/clustercache"
  5. "github.com/prometheus/client_golang/prometheus"
  6. dto "github.com/prometheus/client_model/go"
  7. v1 "k8s.io/api/core/v1"
  8. "k8s.io/apimachinery/pkg/api/resource"
  9. "k8s.io/apimachinery/pkg/types"
  10. )
  11. func collectPVMetrics(collector KubePVCollector) []prometheus.Metric {
  12. ch := make(chan prometheus.Metric, 10)
  13. go func() {
  14. defer close(ch)
  15. collector.Collect(ch)
  16. }()
  17. var metrics []prometheus.Metric
  18. for metric := range ch {
  19. metrics = append(metrics, metric)
  20. }
  21. return metrics
  22. }
  23. func TestKubePVCollector_Describe(t *testing.T) {
  24. collector := KubePVCollector{metricsConfig: MetricsConfig{}}
  25. ch := make(chan *prometheus.Desc, 5)
  26. go func() {
  27. defer close(ch)
  28. collector.Describe(ch)
  29. }()
  30. count := 0
  31. for range ch {
  32. count++
  33. }
  34. if count != 3 {
  35. t.Errorf("Expected 3 metrics described, got %d", count)
  36. }
  37. }
  38. func TestKubePVCollector_Collect(t *testing.T) {
  39. storageSize := resource.MustParse("10Gi")
  40. pv := &clustercache.PersistentVolume{
  41. UID: types.UID("test-pv-uid"),
  42. Name: "test-pv",
  43. Spec: v1.PersistentVolumeSpec{
  44. Capacity: v1.ResourceList{
  45. v1.ResourceStorage: storageSize,
  46. },
  47. },
  48. Status: v1.PersistentVolumeStatus{
  49. Phase: v1.VolumeBound,
  50. },
  51. }
  52. cache := NewFakePVCache([]*clustercache.PersistentVolume{pv})
  53. collector := KubePVCollector{
  54. KubeClusterCache: cache,
  55. metricsConfig: MetricsConfig{},
  56. }
  57. metrics := collectPVMetrics(collector)
  58. if len(metrics) != 7 { // 1 capacity + 5 phase + 1 info
  59. t.Errorf("Expected 7 metrics, got %d", len(metrics))
  60. }
  61. // Verify UID label exists in metrics
  62. for _, metric := range metrics {
  63. var m dto.Metric
  64. if err := metric.Write(&m); err != nil {
  65. t.Errorf("Error writing metric: %v", err)
  66. }
  67. hasUID := false
  68. for _, label := range m.Label {
  69. if *label.Name == "uid" && *label.Value == "test-pv-uid" {
  70. hasUID = true
  71. break
  72. }
  73. }
  74. if !hasUID {
  75. t.Error("Metric missing UID label")
  76. }
  77. }
  78. }
  79. func TestKubePVMetrics_UIDLabel(t *testing.T) {
  80. metric := newKubePVCapacityBytesMetric(
  81. "test_metric", "test-pv", "test-uid", 1000.0,
  82. )
  83. var m dto.Metric
  84. if err := metric.Write(&m); err != nil {
  85. t.Fatalf("Error writing metric: %v", err)
  86. }
  87. // Verify UID label exists
  88. for _, label := range m.Label {
  89. if *label.Name == "uid" && *label.Value == "test-uid" {
  90. return
  91. }
  92. }
  93. t.Error("UID label not found in metric")
  94. }
  95. type FakePVCache struct {
  96. clustercache.ClusterCache
  97. pvs []*clustercache.PersistentVolume
  98. }
  99. func (f FakePVCache) GetAllPersistentVolumes() []*clustercache.PersistentVolume {
  100. return f.pvs
  101. }
  102. func NewFakePVCache(pvs []*clustercache.PersistentVolume) FakePVCache {
  103. return FakePVCache{
  104. pvs: pvs,
  105. }
  106. }