Filippo Giunchedi has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/382728 )

Change subject: Collect APC info
......................................................................


Collect APC info

Bug: T177196
Change-Id: Iedc940d14ac8dfb20b19a36d81bcd23b4db84038
---
M hhvm_exporter/exporter.py
M test/test_collector.py
2 files changed, 76 insertions(+), 1 deletion(-)

Approvals:
  Giuseppe Lavagetto: Looks good to me, but someone else must approve
  Elukey: Looks good to me, but someone else must approve
  jenkins-bot: Verified
  Filippo Giunchedi: Looks good to me, approved



diff --git a/hhvm_exporter/exporter.py b/hhvm_exporter/exporter.py
index 498c385..16dc1ac 100644
--- a/hhvm_exporter/exporter.py
+++ b/hhvm_exporter/exporter.py
@@ -16,6 +16,7 @@
 import argparse
 import datetime
 import logging
+import re
 import sys
 import time
 
@@ -36,10 +37,22 @@
         self.url = admin_url
 
     def _fetch_json(self, url):
+        response = self._fetch_url(url)
+        if response is not None:
+            return response.json()
+        return response
+
+    def _fetch_text(self, url):
+        response = self._fetch_url(url)
+        if response is not None:
+            return response.text
+        return response
+
+    def _fetch_url(self, url):
         try:
             response = requests.get(url, timeout=2)
             response.raise_for_status()
-            return response.json()
+            return response
         except (requests.ConnectionError,
                 requests.Timeout,
                 requests.HTTPError,
@@ -60,6 +73,10 @@
         for metric in self._collect_status(status_data):
             yield metric
 
+        apc_info = self._fetch_text(self.url + '/dump-apc-info')
+        for metric in self._collect_apc(apc_info):
+            yield metric
+
         up = GaugeMetricFamily('hhvm_up', 'HHVM admin interface is up')
         if not all([status_data, memory_data, health_data]):
             up.add_metric([], 0)
@@ -68,6 +85,54 @@
 
         yield up
 
+    def _collect_apc(self, data):
+        if data is None:
+            raise StopIteration()
+
+        metrics = {
+            'value_size': GaugeMetricFamily('hhvm_apc_value_bytes',
+                                            'Memory usage from all live 
values'),
+            'key_size': GaugeMetricFamily('hhvm_apc_key_bytes',
+                                          'Memory usage from all keys'),
+            'mapped_to_file_data_size': GaugeMetricFamily(
+                                        'hhvm_apc_mmap_bytes',
+                                        'Bytes stored in the paged out memory 
file'),
+            'in_memory_primed_data_size': GaugeMetricFamily(
+                                        'hhvm_apc_memory_primed_bytes',
+                                        'Bytes that were primed and went into 
memory'),
+
+            'entries_count': GaugeMetricFamily('hhvm_apc_key_count',
+                                               'Number of keys (entries)'),
+            'primed_entries_count': 
GaugeMetricFamily('hhvm_apc_key_primed_count',
+                                                      'Number of primed keys'),
+            'in_memory_primed_entries_count': GaugeMetricFamily(
+                                              
'hhvm_apc_key_primed_memory_count',
+                                              'Number of primed keys live (in 
memory)'),
+            'pending_deletes_via_treadmill_size': GaugeMetricFamily(
+                                                  
'hhvm_apc_pending_delete_bytes',
+                                                  'Bytes pending deletion via 
treadmill'),
+        }
+
+        for line in data.splitlines():
+            if ':' not in line:
+                continue
+            key, value = re.split(': *', line, 1)
+            metric_name = key.lower().replace(' ', '_')
+
+            metric_family = metrics.get(metric_name)
+            if metric_name is None:
+                log.warn('Unknown metric %r from line %r', metric_name, line)
+                continue
+
+            try:
+                value = float(value)
+            except ValueError:
+                value = float('nan')
+            metric_family.add_metric([], value)
+
+        for metric in metrics.values():
+            yield metric
+
     def _collect_health(self, data):
         if data is None:
             raise StopIteration()
diff --git a/test/test_collector.py b/test/test_collector.py
index 3b15352..555d505 100644
--- a/test/test_collector.py
+++ b/test/test_collector.py
@@ -44,5 +44,15 @@
         self.assertMetricEqual(
             [x.name for x in self.c._collect_health({})], expected_names)
 
+    def testCollectAPC(self):
+        expected_names = [
+            'hhvm_apc_value_bytes', 'hhvm_apc_key_bytes',
+            'hhvm_apc_mmap_bytes', 'hhvm_apc_memory_primed_bytes',
+            'hhvm_apc_key_count', 'hhvm_apc_key_primed_count',
+            'hhvm_apc_key_primed_memory_count',
+            'hhvm_apc_pending_delete_bytes']
+        self.assertMetricEqual(
+            [x.name for x in self.c._collect_apc('')], expected_names)
+
     def assertMetricEqual(self, actual, expected):
         return self.assertListEqual(sorted(actual), sorted(expected))

-- 
To view, visit https://gerrit.wikimedia.org/r/382728
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Iedc940d14ac8dfb20b19a36d81bcd23b4db84038
Gerrit-PatchSet: 1
Gerrit-Project: operations/software/hhvm_exporter
Gerrit-Branch: master
Gerrit-Owner: Filippo Giunchedi <[email protected]>
Gerrit-Reviewer: Elukey <[email protected]>
Gerrit-Reviewer: Filippo Giunchedi <[email protected]>
Gerrit-Reviewer: Giuseppe Lavagetto <[email protected]>
Gerrit-Reviewer: Muehlenhoff <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to