network.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package scrape
  2. import (
  3. "fmt"
  4. "github.com/opencost/opencost/core/pkg/clustercache"
  5. "github.com/opencost/opencost/core/pkg/log"
  6. "github.com/opencost/opencost/modules/collector-source/pkg/metric"
  7. "github.com/opencost/opencost/modules/collector-source/pkg/scrape/target"
  8. )
  9. // Network Metrics
  10. const (
  11. KubecostPodNetworkEgressBytesTotal = "kubecost_pod_network_egress_bytes_total"
  12. KubecostPodNetworkIngressBytesTotal = "kubecost_pod_network_ingress_bytes_total"
  13. )
  14. func newNetworkScraper(
  15. releaseName string,
  16. port int,
  17. clusterCache clustercache.ClusterCache,
  18. updater metric.MetricUpdater,
  19. ) Scraper {
  20. tp := NewNetworkTargetProvider(releaseName, port, clusterCache)
  21. return newNetworkTargetScraper(tp, updater)
  22. }
  23. func newNetworkTargetScraper(provider target.TargetProvider, updater metric.MetricUpdater) *TargetScraper {
  24. return newTargetScrapper(
  25. provider,
  26. updater,
  27. []string{
  28. KubecostPodNetworkEgressBytesTotal,
  29. KubecostPodNetworkIngressBytesTotal,
  30. },
  31. true)
  32. }
  33. type NetworkTargetProvider struct {
  34. releaseName string
  35. port int
  36. clusterCache clustercache.ClusterCache
  37. }
  38. func NewNetworkTargetProvider(releaseName string, port int, clusterCache clustercache.ClusterCache) *NetworkTargetProvider {
  39. return &NetworkTargetProvider{
  40. releaseName: releaseName,
  41. port: port,
  42. clusterCache: clusterCache,
  43. }
  44. }
  45. func (n *NetworkTargetProvider) GetTargets() []target.ScrapeTarget {
  46. pods := n.clusterCache.GetAllPods()
  47. var targets []target.ScrapeTarget
  48. for _, pod := range pods {
  49. instance := pod.Labels["app.kubernetes.io/instance"]
  50. name := pod.Labels["app.kubernetes.io/name"]
  51. if name == "network-costs" && instance == "kubecost" && pod.Status.Phase == "Running" {
  52. log.Debugf("Network: found target for http://%s:%d/metrics", pod.Status.PodIP, n.port)
  53. t := target.NewUrlTarget(fmt.Sprintf("http://%s:%d/metrics", pod.Status.PodIP, n.port))
  54. targets = append(targets, t)
  55. }
  56. }
  57. return targets
  58. }