dcgm.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package scrape
  2. import (
  3. "fmt"
  4. "regexp"
  5. "github.com/opencost/opencost/core/pkg/clustercache"
  6. "github.com/opencost/opencost/core/pkg/log"
  7. "github.com/opencost/opencost/modules/collector-source/pkg/metric"
  8. "github.com/opencost/opencost/modules/collector-source/pkg/scrape/target"
  9. )
  10. var dcgmRegex = regexp.MustCompile("(?i)(.*dcgm-exporter.*)")
  11. func newDCGMScrapper(clusterCache clustercache.ClusterCache) Scraper {
  12. tp := newDCGMTargetProvider(clusterCache)
  13. return newDCGMTargetScraper(tp)
  14. }
  15. func newDCGMTargetScraper(provider target.TargetProvider) *TargetScraper {
  16. return newTargetScrapper(
  17. provider,
  18. []string{
  19. metric.DCGMFIPROFGRENGINEACTIVE,
  20. metric.DCGMFIDEVDECUTIL,
  21. },
  22. true)
  23. }
  24. type DCGMTargetProvider struct {
  25. clusterCache clustercache.ClusterCache
  26. }
  27. func newDCGMTargetProvider(clusterCache clustercache.ClusterCache) *DCGMTargetProvider {
  28. return &DCGMTargetProvider{
  29. clusterCache: clusterCache,
  30. }
  31. }
  32. func (p *DCGMTargetProvider) GetTargets() []target.ScrapeTarget {
  33. svcs := p.clusterCache.GetAllServices()
  34. var targets []target.ScrapeTarget
  35. for _, svc := range svcs {
  36. if svc.ClusterIP == "" || !isDCGM(svc.SpecSelector) {
  37. continue
  38. }
  39. port := 9400
  40. log.Debugf("DCGM: found target: http://%s:%d/metrics", svc.ClusterIP, port)
  41. t := target.NewUrlTarget(fmt.Sprintf("http://%s:%d/metrics", svc.ClusterIP, port))
  42. targets = append(targets, t)
  43. }
  44. return targets
  45. }
  46. func isDCGM(labels map[string]string) bool {
  47. keys := []string{
  48. "app",
  49. "app.kubernetes.io/name",
  50. "app.kubernetes.io/component",
  51. }
  52. for _, key := range keys {
  53. if value, ok := labels[key]; ok {
  54. if dcgmRegex.MatchString(value) {
  55. return true
  56. }
  57. }
  58. }
  59. return false
  60. }