dcgm.go 1.9 KB

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