SLING-11091: expose the number of scheduled jobs as metric
diff --git a/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java b/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java
index 388b5cf..c3e963a 100644
--- a/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java
+++ b/src/main/java/org/apache/sling/event/impl/jobs/JobManagerImpl.java
@@ -67,6 +67,7 @@
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.component.annotations.ReferenceCardinality;
 import org.osgi.service.component.annotations.ReferencePolicyOption;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventAdmin;
@@ -75,6 +76,9 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.codahale.metrics.Gauge;
+import com.codahale.metrics.MetricRegistry;
+
 
 /**
  * Implementation of the job manager.
@@ -91,6 +95,8 @@
     })
 public class JobManagerImpl
     implements JobManager, EventHandler, Runnable {
+    
+    private static final String GAUGE_TOTAL_SCHEDULED_JOBS = "totalScheduledJobs";
 
     /** Default logger. */
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -116,6 +122,10 @@
 
     @Reference
     private StatisticsManager statisticsManager;
+    
+    
+    @Reference(target = "(name=sling)", cardinality = ReferenceCardinality.OPTIONAL)
+    private MetricRegistry metricRegistry;
 
     @Reference
     private QueueManager qManager;
@@ -134,6 +144,10 @@
     @Activate
     protected void activate(final BundleContext ctx, final Map<String, Object> props) throws LoginException {
         this.jobScheduler = new org.apache.sling.event.impl.jobs.scheduling.JobSchedulerImpl(this.configuration, this.scheduler, this);
+        if (metricRegistry != null) {
+            Gauge<Integer> sup = () -> jobScheduler.getTotalNumberOfScheduledJobs();
+            metricRegistry.gauge(GAUGE_TOTAL_SCHEDULED_JOBS, () -> sup);
+        }
         this.maintenanceTask = new CleanUpTask(this.configuration, this.jobScheduler);
 
         final Dictionary<String, Object> regProps = new Hashtable<>();
@@ -160,7 +174,9 @@
             this.changeListenerReg.unregister();
             this.changeListenerReg = null;
         }
-
+        if (metricRegistry != null) {
+            metricRegistry.remove(GAUGE_TOTAL_SCHEDULED_JOBS);
+        }
         this.jobScheduler.deactivate();
 
         this.maintenanceTask = null;
diff --git a/src/main/java/org/apache/sling/event/impl/jobs/scheduling/JobSchedulerImpl.java b/src/main/java/org/apache/sling/event/impl/jobs/scheduling/JobSchedulerImpl.java
index 4f7de0e..40d2039 100644
--- a/src/main/java/org/apache/sling/event/impl/jobs/scheduling/JobSchedulerImpl.java
+++ b/src/main/java/org/apache/sling/event/impl/jobs/scheduling/JobSchedulerImpl.java
@@ -455,6 +455,14 @@
         }
         return jobs;
     }
+    
+    /**
+     * Provide the total number of jobs registered in the system, irrespective of topics
+     * @return the total number of scheduled jobs
+     */
+    public int getTotalNumberOfScheduledJobs() {
+       return this.scheduledJobs.size(); 
+    }
 
     /**
      * Change the suspended flag for a scheduled job