network.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package scrape
  2. import (
  3. "context"
  4. "fmt"
  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. metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  9. "k8s.io/client-go/kubernetes"
  10. )
  11. // Network Metrics
  12. const (
  13. KubecostPodNetworkEgressBytesTotal = "kubecost_pod_network_egress_bytes_total"
  14. KubecostPodNetworkIngressBytesTotal = "kubecost_pod_network_ingress_bytes_total"
  15. )
  16. func newNetworkScraper(
  17. releaseName string,
  18. port int,
  19. k8s kubernetes.Interface,
  20. updater metric.MetricUpdater,
  21. ) Scraper {
  22. // TODO revert this
  23. //tp := NewNetworkTargetProvider(releaseName, port, k8s)
  24. tp := target.NewDefaultTargetProvider(
  25. target.NewUrlTarget("http://localhost:9111/metrics"),
  26. target.NewUrlTarget("http://localhost:9112/metrics"),
  27. target.NewUrlTarget("http://localhost:9113/metrics"),
  28. target.NewUrlTarget("http://localhost:9114/metrics"),
  29. target.NewUrlTarget("http://localhost:9115/metrics"),
  30. target.NewUrlTarget("http://localhost:9116/metrics"),
  31. target.NewUrlTarget("http://localhost:9117/metrics"),
  32. target.NewUrlTarget("http://localhost:9118/metrics"),
  33. target.NewUrlTarget("http://localhost:9119/metrics"),
  34. target.NewUrlTarget("http://localhost:9120/metrics"),
  35. )
  36. return newNetworkTargetScraper(tp, updater)
  37. }
  38. func newNetworkTargetScraper(provider target.TargetProvider, updater metric.MetricUpdater) *TargetScraper {
  39. return newTargetScrapper(
  40. provider,
  41. updater,
  42. []string{
  43. KubecostPodNetworkEgressBytesTotal,
  44. KubecostPodNetworkIngressBytesTotal,
  45. },
  46. true)
  47. }
  48. type NetworkTargetProvider struct {
  49. releaseName string
  50. port int
  51. kubeClientSet kubernetes.Interface
  52. }
  53. func NewNetworkTargetProvider(releaseName string, port int, k8s kubernetes.Interface) *NetworkTargetProvider {
  54. return &NetworkTargetProvider{
  55. releaseName: releaseName,
  56. port: port,
  57. kubeClientSet: k8s,
  58. }
  59. }
  60. func (n *NetworkTargetProvider) GetTargets() []target.ScrapeTarget {
  61. k8s := n.kubeClientSet
  62. pods, err := k8s.CoreV1().Pods("").List(context.Background(), metav1.ListOptions{
  63. LabelSelector: fmt.Sprintf("app=%s-network-costs", n.releaseName),
  64. })
  65. if err != nil {
  66. log.Errorf("NetworkTargetProvider: failed to retieve pods from kubernetes client: %s", err.Error())
  67. return nil
  68. }
  69. var targets []target.ScrapeTarget
  70. for _, pod := range pods.Items {
  71. t := target.NewUrlTarget(fmt.Sprintf("http://%s:%d/metrics", pod.Status.PodIP, n.port))
  72. targets = append(targets, t)
  73. }
  74. return targets
  75. }