Report pipeline queue length on startup to statsd

So that graphs that use a pipeline gauge have some data to work
with, even if it's 0.

Change-Id: Ida46153d8ee27ab212949dc3d417bb4331512de6
diff --git a/tests/test_scheduler.py b/tests/test_scheduler.py
index 48baaef..7cb93ee 100644
--- a/tests/test_scheduler.py
+++ b/tests/test_scheduler.py
@@ -1070,6 +1070,14 @@
         self.assertReportedStat(
             'zuul.pipeline.gate.org.project.total_changes', value='1|c')
 
+    def test_initial_pipeline_gauges(self):
+        "Test that each pipeline reported its length on start"
+        pipeline_names = self.sched.layout.pipelines.keys()
+        self.assertNotEqual(len(pipeline_names), 0)
+        for name in pipeline_names:
+            self.assertReportedStat('zuul.pipeline.%s.current_changes' % name,
+                                    value='0|g')
+
     def test_duplicate_pipelines(self):
         "Test that a change matching multiple pipelines works"
 
diff --git a/zuul/scheduler.py b/zuul/scheduler.py
index 45e55fb..0e89b3c 100644
--- a/zuul/scheduler.py
+++ b/zuul/scheduler.py
@@ -470,6 +470,16 @@
             self._setupMerger()
             for trigger in self.triggers.values():
                 trigger.postConfig()
+            if statsd:
+                try:
+                    for pipeline in self.layout.pipelines.values():
+                        items = len(pipeline.getAllItems())
+                        # stats.gauges.zuul.pipeline.NAME.current_changes
+                        key = 'zuul.pipeline.%s' % pipeline.name
+                        statsd.gauge(key + '.current_changes', items)
+                except Exception:
+                    self.log.exception("Exception reporting initial "
+                                       "pipeline stats:")
             self._reconfigure = False
             self.reconfigure_complete_event.set()
         finally: