telemetry.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package metrics
  2. import (
  3. "fmt"
  4. "sync"
  5. "github.com/kubecost/events"
  6. "github.com/prometheus/client_golang/prometheus"
  7. )
  8. var (
  9. once sync.Once
  10. dispatcher events.Dispatcher[HttpHandlerMetricEvent]
  11. // -- append new dispatchers here for new event types
  12. // prometheus metrics
  13. requestsCount *prometheus.CounterVec
  14. responseTime *prometheus.HistogramVec
  15. responseSize *prometheus.SummaryVec
  16. )
  17. // InitKubecostTelemetry registers kubecost application telemetry.
  18. func InitKubecostTelemetry(config *MetricsConfig) {
  19. // TODO(bolt): Check MetricsConfig for disabled metrics
  20. once.Do(func() {
  21. // register prometheus metrics
  22. requestsCount = prometheus.NewCounterVec(prometheus.CounterOpts{
  23. Name: "kubecost_http_requests_total",
  24. Help: "kubecost_http_requests_total Total number of HTTP requests",
  25. }, []string{"handler", "method", "code"})
  26. var buckets = []float64{0.001, 0.01, 0.1, 0.3, 0.6, 1, 3, 6, 9, 20, 30, 60, 90, 120, 240, 360, 720}
  27. responseTime = prometheus.NewHistogramVec(prometheus.HistogramOpts{
  28. Name: "kubecost_http_response_time_seconds",
  29. Help: "kubecost_http_response_time_seconds Response time in seconds",
  30. Buckets: buckets,
  31. }, []string{"handler", "method", "code"})
  32. responseSize = prometheus.NewSummaryVec(prometheus.SummaryOpts{
  33. Name: "kubecost_http_response_size_bytes",
  34. Help: "kubecost_http_response_size_bytes Response size in bytes",
  35. }, []string{"handler", "method", "code"})
  36. prometheus.MustRegister(requestsCount, responseTime, responseSize)
  37. // register event listeners
  38. dispatcher = events.GlobalDispatcherFor[HttpHandlerMetricEvent]()
  39. dispatcher.AddEventHandler(onHttpHandlerMetricEvent)
  40. // -- append new event handlers here
  41. })
  42. }
  43. // onHttpHandlerMetricEvent handles all incoming HttpHandlerMetricEvents
  44. func onHttpHandlerMetricEvent(event HttpHandlerMetricEvent) {
  45. code := fmt.Sprintf("%d", event.Code)
  46. requestsCount.WithLabelValues(event.Handler, event.Method, code).Inc()
  47. responseSize.WithLabelValues(event.Handler, event.Method, code).Observe(float64(event.ResponseSize))
  48. responseTime.WithLabelValues(event.Handler, event.Method, code).Observe(event.ResponseTime.Seconds())
  49. }