servicemetrics.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package metrics
  2. import (
  3. "github.com/opencost/opencost/core/pkg/clustercache"
  4. "github.com/opencost/opencost/core/pkg/util/promutil"
  5. "github.com/prometheus/client_golang/prometheus"
  6. dto "github.com/prometheus/client_model/go"
  7. )
  8. //--------------------------------------------------------------------------
  9. // KubecostServiceCollector
  10. //--------------------------------------------------------------------------
  11. // KubecostServiceCollector is a prometheus collector that generates service sourced metrics.
  12. type KubecostServiceCollector struct {
  13. KubeClusterCache clustercache.ClusterCache
  14. metricsConfig MetricsConfig
  15. }
  16. // Describe sends the super-set of all possible descriptors of metrics
  17. // collected by this Collector.
  18. func (sc KubecostServiceCollector) Describe(ch chan<- *prometheus.Desc) {
  19. disabledMetrics := sc.metricsConfig.GetDisabledMetricsMap()
  20. if _, disabled := disabledMetrics["service_selector_labels"]; disabled {
  21. return
  22. }
  23. ch <- prometheus.NewDesc("service_selector_labels", "service selector labels", []string{}, nil)
  24. }
  25. // Collect is called by the Prometheus registry when collecting metrics.
  26. func (sc KubecostServiceCollector) Collect(ch chan<- prometheus.Metric) {
  27. disabledMetrics := sc.metricsConfig.GetDisabledMetricsMap()
  28. if _, disabled := disabledMetrics["service_selector_labels"]; disabled {
  29. return
  30. }
  31. svcs := sc.KubeClusterCache.GetAllServices()
  32. for _, svc := range svcs {
  33. serviceName := svc.Name
  34. serviceNS := svc.Namespace
  35. serviceUID := string(svc.UID)
  36. labels, values := promutil.KubeLabelsToLabels(promutil.SanitizeLabels(svc.SpecSelector))
  37. if len(labels) > 0 {
  38. m := newServiceSelectorLabelsMetric(serviceName, serviceNS, "service_selector_labels", labels, values, serviceUID)
  39. ch <- m
  40. }
  41. }
  42. }
  43. //--------------------------------------------------------------------------
  44. // ServiceSelectorLabelsMetric
  45. //--------------------------------------------------------------------------
  46. // ServiceSelectorLabelsMetric is a prometheus.Metric used to encode service selector labels
  47. type ServiceSelectorLabelsMetric struct {
  48. fqName string
  49. help string
  50. labelNames []string
  51. labelValues []string
  52. serviceName string
  53. namespace string
  54. uid string
  55. }
  56. // Creates a new ServiceMetric, implementation of prometheus.Metric
  57. func newServiceSelectorLabelsMetric(name, namespace, fqname string, labelNames, labelvalues []string, uid string) ServiceSelectorLabelsMetric {
  58. return ServiceSelectorLabelsMetric{
  59. fqName: fqname,
  60. labelNames: labelNames,
  61. labelValues: labelvalues,
  62. help: "service_selector_labels Service Selector Labels",
  63. serviceName: name,
  64. namespace: namespace,
  65. uid: uid,
  66. }
  67. }
  68. // Desc returns the descriptor for the Metric. This method idempotently
  69. // returns the same descriptor throughout the lifetime of the Metric.
  70. func (s ServiceSelectorLabelsMetric) Desc() *prometheus.Desc {
  71. l := prometheus.Labels{
  72. "service": s.serviceName,
  73. "namespace": s.namespace,
  74. "uid": s.uid,
  75. }
  76. return prometheus.NewDesc(s.fqName, s.help, s.labelNames, l)
  77. }
  78. // Write encodes the Metric into a "Metric" Protocol Buffer data
  79. // transmission object.
  80. func (s ServiceSelectorLabelsMetric) Write(m *dto.Metric) error {
  81. h := float64(1)
  82. m.Gauge = &dto.Gauge{
  83. Value: &h,
  84. }
  85. var labels []*dto.LabelPair
  86. for i := range s.labelNames {
  87. labels = append(labels, &dto.LabelPair{
  88. Name: &s.labelNames[i],
  89. Value: &s.labelValues[i],
  90. })
  91. }
  92. labels = append(labels, &dto.LabelPair{
  93. Name: toStringPtr("namespace"),
  94. Value: &s.namespace,
  95. })
  96. labels = append(labels, &dto.LabelPair{
  97. Name: toStringPtr("service"),
  98. Value: &s.serviceName,
  99. })
  100. labels = append(labels, &dto.LabelPair{
  101. Name: toStringPtr("uid"),
  102. Value: &s.uid,
  103. })
  104. m.Label = labels
  105. return nil
  106. }