dcgm.go 1.7 KB

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