targetscraper.go 1.7 KB

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