| 187 | |
| 188 | impl MetricActiveUsers { |
| 189 | pub fn refresh(&mut self, now_ns: u64) { |
| 190 | let mut hourly_active: u64 = 0; |
| 191 | let mut daily_active: u64 = 0; |
| 192 | let mut weekly_active: u64 = 0; |
| 193 | let mut montly_active: u64 = 0; |
| 194 | |
| 195 | for (_, last_active) in self.users_activity_log.iter() { |
| 196 | let elapsed_ns = now_ns.saturating_sub(*last_active); |
| 197 | if elapsed_ns < ONE_HOUR_NS { |
| 198 | hourly_active = hourly_active.saturating_add(1); |
| 199 | } |
| 200 | if elapsed_ns < ONE_DAY_NS { |
| 201 | daily_active = daily_active.saturating_add(1); |
| 202 | } |
| 203 | if elapsed_ns < ONE_WEEK_NS { |
| 204 | weekly_active = weekly_active.saturating_add(1); |
| 205 | } |
| 206 | if elapsed_ns < ONE_MONTH_NS { |
| 207 | montly_active = montly_active.saturating_add(1); |
| 208 | } |
| 209 | } |
| 210 | |
| 211 | self.set( |
| 212 | SERVICE_NAME, |
| 213 | &labels! { "time" => "hourly" }, |
| 214 | hourly_active as f64, |
| 215 | ); |
| 216 | self.set( |
| 217 | SERVICE_NAME, |
| 218 | &labels! { "time" => "daily" }, |
| 219 | daily_active as f64, |
| 220 | ); |
| 221 | self.set( |
| 222 | SERVICE_NAME, |
| 223 | &labels! { "time" => "weekly" }, |
| 224 | weekly_active as f64, |
| 225 | ); |
| 226 | self.set( |
| 227 | SERVICE_NAME, |
| 228 | &labels! { "time" => "monthly" }, |
| 229 | montly_active as f64, |
| 230 | ); |
| 231 | } |
| 232 | } |
| 233 | |
| 234 | impl ApplicationGaugeVecMetric<User> for MetricActiveUsers { |