Add `active_users` metric

This change exposes a new metric called `active_users`.
This metric indicates the number of active users; a user is considered
active when its inactivity period is not greater than the value
defined in the `cache."@PLUGIN@.users_cache".maxAge`.

The metric uses the `users_cache` of the
track-and-disable-inactive-users-1.3.groovy plugin to allow exposure
of this value to the various monitoring and observability stacks.

Bug: Issue 370937461
Change-Id: Iaa1a78a7435f80508eeeceb6df762f6c789a0bdc
diff --git a/admin/track-and-disable-inactive-users-1.3.groovy b/admin/track-and-disable-inactive-users-1.3.groovy
index f1d9b49..a591aef 100644
--- a/admin/track-and-disable-inactive-users-1.3.groovy
+++ b/admin/track-and-disable-inactive-users-1.3.groovy
@@ -19,6 +19,7 @@
 import com.google.gerrit.extensions.annotations.*
 import com.google.gerrit.extensions.events.*
 import com.google.gerrit.extensions.registration.*
+import com.google.gerrit.metrics.*
 import com.google.gerrit.lifecycle.*
 import com.google.gerrit.server.*
 import com.google.gerrit.server.account.*
@@ -34,6 +35,23 @@
 
 import static java.util.concurrent.TimeUnit.*
 
+@Singleton
+class ActiveUsersMetric {
+
+  static final NAME = "active_users"
+  static final DESCRIPTION = "Number of active users"
+
+  @Inject
+  public ActiveUsersMetric(MetricMaker metrics, @Named(TrackActiveUsersCache.NAME) Cache<Integer, Long> trackActiveUsersCache){
+    metrics.newCallbackMetric(
+      NAME,
+      Long.class,
+      new Description(DESCRIPTION).setGauge().setUnit("users"),
+      { -> trackActiveUsersCache.size() }
+    );
+  }
+}
+
 class TrackActiveUsersCache extends CacheModule {
   static final NAME = "users_cache"
   static final DEFAULT_CACHE_TTL = Duration.ofDays(90)
@@ -203,6 +221,7 @@
   @Override
   void configure() {
     install(new TrackActiveUsersCache())
+    bind(ActiveUsersMetric.class).asEagerSingleton()
     listener().to(AutoDisableInactiveUsersListener)
     DynamicSet.bind(binder(), CacheRemovalListener).to(AutoDisableInactiveUsersEvictionListener)
 
diff --git a/admin/track-and-disable-inactive-users.md b/admin/track-and-disable-inactive-users.md
index c569d0b..e622c41 100644
--- a/admin/track-and-disable-inactive-users.md
+++ b/admin/track-and-disable-inactive-users.md
@@ -42,3 +42,11 @@
 
    If a time unit suffix is not specified, `hours` is assumed.
    Default: 90 days
+
+Metrics
+---------------------
+Currently, the metrics exposed are the following:
+
+```groovy_track_and_disable_inactive_users_active_users```
+:  Indicates the number of active users.
+   A user is considered active when its inactivity period is not greater than `cache."@PLUGIN@.users_cache".maxAge` .
\ No newline at end of file