pvcmetrics_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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 collectMetrics(collector KubePVCCollector) []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 TestKubePVCCollector_Describe(t *testing.T) {
  24. collector := KubePVCCollector{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 != 2 {
  35. t.Errorf("Expected 2 metrics described, got %d", count)
  36. }
  37. }
  38. func TestKubePVCCollector_Collect(t *testing.T) {
  39. storageSize := resource.MustParse("1Gi")
  40. pvc := &clustercache.PersistentVolumeClaim{
  41. UID: types.UID("test-uid"),
  42. Name: "test-pvc",
  43. Namespace: "default",
  44. Spec: v1.PersistentVolumeClaimSpec{
  45. Resources: v1.VolumeResourceRequirements{
  46. Requests: v1.ResourceList{v1.ResourceStorage: storageSize},
  47. },
  48. },
  49. }
  50. cache := NewFakePVCCache([]*clustercache.PersistentVolumeClaim{pvc})
  51. collector := KubePVCCollector{
  52. KubeClusterCache: cache,
  53. metricsConfig: MetricsConfig{},
  54. }
  55. metrics := collectMetrics(collector)
  56. if len(metrics) != 2 {
  57. t.Errorf("Expected 2 metrics, got %d", len(metrics))
  58. }
  59. // Verify UID label exists in metrics
  60. for _, metric := range metrics {
  61. var m dto.Metric
  62. if err := metric.Write(&m); err != nil {
  63. t.Errorf("Error writing metric: %v", err)
  64. }
  65. hasUID := false
  66. for _, label := range m.Label {
  67. if *label.Name == "uid" && *label.Value == "test-uid" {
  68. hasUID = true
  69. break
  70. }
  71. }
  72. if !hasUID {
  73. t.Error("Metric missing UID label")
  74. }
  75. }
  76. }
  77. func TestKubePVCMetrics_UIDLabel(t *testing.T) {
  78. metric := newKubePVCResourceRequestsStorageBytesMetric(
  79. "test_metric", "test-pvc", "test-namespace", "test-uid", 1000.0,
  80. )
  81. var m dto.Metric
  82. if err := metric.Write(&m); err != nil {
  83. t.Fatalf("Error writing metric: %v", err)
  84. }
  85. // Verify UID label exists
  86. for _, label := range m.Label {
  87. if *label.Name == "uid" && *label.Value == "test-uid" {
  88. return
  89. }
  90. }
  91. t.Error("UID label not found in metric")
  92. }
  93. type FakePVCCache struct {
  94. clustercache.ClusterCache
  95. pvcs []*clustercache.PersistentVolumeClaim
  96. }
  97. func (f FakePVCCache) GetAllPersistentVolumeClaims() []*clustercache.PersistentVolumeClaim {
  98. return f.pvcs
  99. }
  100. func NewFakePVCCache(pvcs []*clustercache.PersistentVolumeClaim) FakePVCCache {
  101. return FakePVCCache{
  102. pvcs: pvcs,
  103. }
  104. }