You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
3.9 KiB

  1. use prometheus::{GaugeVec, IntGaugeVec, Opts, Registry};
  2. use prometheus::core::{Atomic, GenericGaugeVec};
  3. use redis::{Commands, FromRedisValue};
  4. use crate::client_manager::{ClientManager, RedisConnection};
  5. use crate::helpers::get_last_requests_time;
  6. use crate::metrics::MetricsProvider;
  7. use crate::models::TrackerInfo;
  8. fn update_gauge_from_redis<A: Atomic<T=T>, T: FromRedisValue>(
  9. con: &mut RedisConnection,
  10. project: &str,
  11. redis_key: &str,
  12. metric: &GenericGaugeVec<A>,
  13. ) -> color_eyre::Result<()> {
  14. let key = format!("{project}:{redis_key}");
  15. let val: Option<T> = con.get(&key)?;
  16. if let Some(v) = val {
  17. let m = metric.get_metric_with_label_values(&[project])?;
  18. m.set(v);
  19. }
  20. Ok(())
  21. }
  22. pub struct ProjectMetrics {
  23. registry: Registry,
  24. item_request_serve_rate: GaugeVec,
  25. reclaim_serve_rate: GaugeVec,
  26. reclaim_rate: GaugeVec,
  27. requests_processed: IntGaugeVec,
  28. requests_granted: IntGaugeVec,
  29. item_fail_rate: GaugeVec,
  30. rtt: GaugeVec,
  31. rtt_real: GaugeVec,
  32. rtt_count: IntGaugeVec,
  33. }
  34. impl ProjectMetrics {
  35. pub fn new() -> color_eyre::Result<Self> {
  36. let registry = Registry::new_custom(Some("at_tracker".to_string()), None)?;
  37. let s = Self {
  38. registry,
  39. item_request_serve_rate: GaugeVec::new(Opts::new("item_request_serve_rate", "item_request_serve_rate"), &["project"])?,
  40. reclaim_serve_rate: GaugeVec::new(Opts::new("reclaim_serve_rate", "reclaim_serve_rate"), &["project"])?,
  41. reclaim_rate: GaugeVec::new(Opts::new("reclaim_rate", "reclaim_rate"), &["project"])?,
  42. requests_processed: IntGaugeVec::new(Opts::new("requests_processed", "requests_processed"), &["project"])?,
  43. requests_granted: IntGaugeVec::new(Opts::new("requests_granted", "requests_granted"), &["project"])?,
  44. item_fail_rate: GaugeVec::new(Opts::new("item_fail_rate", "item_fail_rate"), &["project"])?,
  45. rtt: GaugeVec::new(Opts::new("rtt", "rtt"), &["project"])?,
  46. rtt_real: GaugeVec::new(Opts::new("rtt_real", "rtt_real"), &["project"])?,
  47. rtt_count: IntGaugeVec::new(Opts::new("rtt_count", "rtt_count"), &["project"])?,
  48. };
  49. s.registry.register(Box::new(s.item_request_serve_rate.clone()))?;
  50. s.registry.register(Box::new(s.reclaim_serve_rate.clone()))?;
  51. s.registry.register(Box::new(s.reclaim_rate.clone()))?;
  52. s.registry.register(Box::new(s.requests_processed.clone()))?;
  53. s.registry.register(Box::new(s.requests_granted.clone()))?;
  54. s.registry.register(Box::new(s.item_fail_rate.clone()))?;
  55. Ok(s)
  56. }
  57. }
  58. impl MetricsProvider for ProjectMetrics {
  59. fn get_registry(&self) -> color_eyre::Result<&Registry> {
  60. Ok(&self.registry)
  61. }
  62. fn update(&self, client_mgr: &ClientManager, project: &str, info: &TrackerInfo) -> color_eyre::Result<()> {
  63. let mut con = client_mgr.get_connection_from_tracker(info)?;
  64. update_gauge_from_redis(&mut con, project, "item_request_serve_rate", &self.item_request_serve_rate)?;
  65. update_gauge_from_redis(&mut con, project, "reclaim_serve_rate", &self.reclaim_serve_rate)?;
  66. update_gauge_from_redis(&mut con, project, "reclaim_rate", &self.reclaim_rate)?;
  67. update_gauge_from_redis(&mut con, project, "item_fail_rate", &self.item_fail_rate)?;
  68. update_gauge_from_redis(&mut con, project, "rtt", &self.rtt)?;
  69. update_gauge_from_redis(&mut con, project, "rtt_real", &self.rtt_real)?;
  70. update_gauge_from_redis(&mut con, project, "rtt_count", &self.rtt_count)?;
  71. let t = get_last_requests_time()?;
  72. let rp_key = format!("requests_processed:{t}");
  73. update_gauge_from_redis(&mut con, project, &rp_key, &self.requests_processed)?;
  74. let rg_key = format!("requests_granted:{t}");
  75. update_gauge_from_redis(&mut con, project, &rg_key, &self.requests_granted)?;
  76. Ok(())
  77. }
  78. fn get_metric_type_name(&self) -> &str {
  79. "project"
  80. }
  81. }