diagnostics_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package metric
  2. import (
  3. "fmt"
  4. "testing"
  5. "time"
  6. "github.com/kubecost/events"
  7. "github.com/opencost/opencost/modules/collector-source/pkg/event"
  8. )
  9. func TestDiagnosticsModule_ScrapeDiagnostics(t *testing.T) {
  10. module := NewDiagnosticsModule()
  11. // dispatch some faux scrape events
  12. events.Dispatch(event.ScrapeEvent{
  13. ScraperName: event.NetworkCostsScraperName,
  14. Targets: 10,
  15. Errors: []error{},
  16. })
  17. events.Dispatch(event.ScrapeEvent{
  18. ScraperName: event.KubernetesClusterScraperName,
  19. ScrapeType: event.NodeScraperType,
  20. Targets: 8,
  21. Errors: []error{
  22. fmt.Errorf("failed to scrape node 'foo'"),
  23. fmt.Errorf("failed to scrape node 'bar'"),
  24. },
  25. })
  26. time.Sleep(500 * time.Millisecond)
  27. networkDiagnosticDetails, err := module.DiagnosticsDetails(NetworkCostsScraperDiagnosticID)
  28. if err != nil {
  29. t.Fatalf("unexpected error: %s", err)
  30. return
  31. }
  32. stats := networkDiagnosticDetails["stats"].(map[string]any)
  33. errors := networkDiagnosticDetails["errors"].([]string)
  34. label := networkDiagnosticDetails["label"].(string)
  35. statsTotal := stats["total"].(int)
  36. statsSuccess := stats["success"].(int)
  37. statsFail := stats["fail"].(int)
  38. if statsTotal != 10 {
  39. t.Fatalf("expected networkCostsDetails[\"stats\"][\"total\"] to equal 10, got: %d", statsTotal)
  40. return
  41. }
  42. if statsSuccess != 10 {
  43. t.Fatalf("expected networkCostsDetails[\"stats\"][\"success\"] to equal 10, got: %d", statsSuccess)
  44. return
  45. }
  46. if statsFail != 0 {
  47. t.Fatalf("expected networkCostsDetails[\"stats\"][\"fail\"] to equal 0, got: %d", statsFail)
  48. return
  49. }
  50. if len(errors) != 0 {
  51. t.Fatalf("expected len(networkCostsDetails[\"errors\"]) to equal 0, got: %d", len(errors))
  52. return
  53. }
  54. if len(label) == 0 {
  55. t.Fatalf("expected len(networkCostsDetails[\"label\"]) to be non-zero. Got 0.")
  56. return
  57. }
  58. nodeScrapeDetails, err := module.DiagnosticsDetails(KubernetesNodesScraperDiagnosticID)
  59. if err != nil {
  60. t.Fatalf("unexpected error: %s", err)
  61. return
  62. }
  63. stats = nodeScrapeDetails["stats"].(map[string]any)
  64. errors = nodeScrapeDetails["errors"].([]string)
  65. label = nodeScrapeDetails["label"].(string)
  66. statsTotal = stats["total"].(int)
  67. statsSuccess = stats["success"].(int)
  68. statsFail = stats["fail"].(int)
  69. if statsTotal != 8 {
  70. t.Fatalf("expected nodeScrapeDetails[\"stats\"][\"total\"] to equal 8, got: %d", statsTotal)
  71. return
  72. }
  73. if statsSuccess != 6 {
  74. t.Fatalf("expected nodeScrapeDetails[\"stats\"][\"success\"] to equal 6, got: %d", statsSuccess)
  75. return
  76. }
  77. if statsFail != 2 {
  78. t.Fatalf("expected nodeScrapeDetails[\"stats\"][\"fail\"] to equal 2, got: %d", statsFail)
  79. return
  80. }
  81. if len(errors) != 2 {
  82. t.Fatalf("expected len(nodeScrapeDetails[\"errors\"]) to equal 2, got: %d", len(errors))
  83. return
  84. }
  85. if len(label) == 0 {
  86. t.Fatalf("expected len(nodeScrapeDetails[\"label\"]) to be non-zero. Got 0.")
  87. return
  88. }
  89. }
  90. func TestDiagnosticsModule_ScrapeDiagnosticsWithSameScraperName(t *testing.T) {
  91. module := NewDiagnosticsModule()
  92. // dispatch some faux scrape events with same scraper name
  93. events.Dispatch(event.ScrapeEvent{
  94. ScraperName: event.KubernetesClusterScraperName,
  95. ScrapeType: event.NodeScraperType,
  96. Targets: 8,
  97. Errors: []error{
  98. fmt.Errorf("failed to scrape node 'foo'"),
  99. fmt.Errorf("failed to scrape node 'bar'"),
  100. },
  101. })
  102. events.Dispatch(event.ScrapeEvent{
  103. ScraperName: event.KubernetesClusterScraperName,
  104. ScrapeType: event.PodScraperType,
  105. Targets: 8,
  106. Errors: []error{
  107. fmt.Errorf("failed to scrape node 'foo'"),
  108. fmt.Errorf("failed to scrape node 'bar'"),
  109. },
  110. })
  111. time.Sleep(500 * time.Millisecond)
  112. // for both the diagnostics, if they remain unregistered even after an event was dispatched getting the details would raise an error
  113. _, err := module.DiagnosticsDetails(KubernetesNodesScraperDiagnosticID)
  114. if err != nil {
  115. t.Fatalf("unexpected error: %s", err)
  116. return
  117. }
  118. _, err = module.DiagnosticsDetails(KubernetesPodsScraperDiagnosticID)
  119. if err != nil {
  120. t.Fatalf("unexpected error: %s", err)
  121. return
  122. }
  123. }