device.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package kubemodel
  2. import (
  3. "time"
  4. "github.com/opencost/opencost/core/pkg/log"
  5. "github.com/opencost/opencost/core/pkg/model/kubemodel"
  6. "github.com/opencost/opencost/core/pkg/source"
  7. )
  8. func (km *KubeModel) computeDevices(kms *kubemodel.KubeModelSet, start, end time.Time) error {
  9. grp := source.NewQueryGroup()
  10. metrics := km.ds.Metrics()
  11. infoFuture := source.WithGroup(grp, metrics.QueryDCGMDeviceInfo(start, end))
  12. uptimeFuture := source.WithGroup(grp, metrics.QueryDCGMDeviceUptime(start, end))
  13. deviceMap := make(map[string]*kubemodel.Device)
  14. infoResult, _ := infoFuture.Await()
  15. for _, res := range infoResult {
  16. if res.UUID == "" {
  17. continue
  18. }
  19. if _, ok := deviceMap[res.UUID]; ok {
  20. continue
  21. }
  22. deviceMap[res.UUID] = &kubemodel.Device{
  23. UUID: res.UUID,
  24. Device: res.Device,
  25. ModelName: res.ModelName,
  26. }
  27. }
  28. uptimeResult, _ := uptimeFuture.Await()
  29. for _, res := range uptimeResult {
  30. d, ok := deviceMap[res.UUID]
  31. if !ok {
  32. log.Warnf("DCGM uptime result for unknown device UUID '%s'", res.UUID)
  33. continue
  34. }
  35. s, e := res.GetStartEnd(start, end, km.ds.Resolution())
  36. d.Start = s
  37. d.End = e
  38. }
  39. for _, device := range deviceMap {
  40. if err := kms.RegisterDevice(device); err != nil {
  41. log.Warnf("Failed to register device: %s", err.Error())
  42. }
  43. }
  44. return nil
  45. }