targetscraper.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package scrape
  2. import (
  3. "github.com/opencost/opencost/core/pkg/log"
  4. "github.com/opencost/opencost/modules/collector-source/pkg/metric"
  5. "github.com/opencost/opencost/modules/collector-source/pkg/scrape/parser"
  6. "github.com/opencost/opencost/modules/collector-source/pkg/scrape/target"
  7. )
  8. type TargetScraper struct {
  9. targetProvider target.TargetProvider
  10. metricUpdater metric.MetricUpdater
  11. metricNames map[string]struct{} // filter for which metrics will be processed
  12. includeMetrics bool // toggle to make metrics an include or exclude list
  13. }
  14. func newTargetScrapper(provider target.TargetProvider, updater metric.MetricUpdater, metricNames []string, includeMetrics bool) *TargetScraper {
  15. metricSet := make(map[string]struct{})
  16. for _, metricName := range metricNames {
  17. metricSet[metricName] = struct{}{}
  18. }
  19. return &TargetScraper{
  20. targetProvider: provider,
  21. metricUpdater: updater,
  22. metricNames: metricSet,
  23. includeMetrics: includeMetrics,
  24. }
  25. }
  26. func (s *TargetScraper) Scrape() {
  27. targets := s.targetProvider.GetTargets()
  28. for _, target := range targets {
  29. f, err := target.Load()
  30. if err != nil {
  31. log.Errorf("failed to scrape target: %s", err.Error())
  32. continue
  33. }
  34. results, err := parser.Parse(f)
  35. if err != nil {
  36. log.Errorf("failed to parse target: %s", err.Error())
  37. continue
  38. }
  39. for _, result := range results {
  40. // filter metrics to be processed by name
  41. if _, ok := s.metricNames[result.Name]; ok != s.includeMetrics {
  42. continue
  43. }
  44. s.metricUpdater.Update(result.Name, result.Labels, result.Value, result.Timestamp, nil)
  45. }
  46. }
  47. }