dcgm.go 1.7 KB

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