Add PlatformCollector to collect information about the platform (#152) · pythonAI/client_python@91171a0 · GitHub
Skip to content

Commit 91171a0

Browse files
mortenljbrian-brazil
authored andcommitted
Add PlatformCollector to collect information about the platform (prometheus#152)
Add PlatformCollector to collect information about the platform Python, machine and system information is collected once at startup, and exposed as labels on a metric with value 1.
1 parent c2e4bda commit 91171a0

4 files changed

Lines changed: 138 additions & 0 deletions

File tree

README.md

Lines changed: 7 additions & 0 deletions

prometheus_client/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from . import core
44
from . import exposition
55
from . import process_collector
6+
from . import platform_collector
67

78
__all__ = ['Counter', 'Gauge', 'Summary', 'Histogram']
89
# http://stackoverflow.com/questions/19913653/no-unicode-in-all-for-a-packages-init
@@ -31,6 +32,9 @@
3132
ProcessCollector = process_collector.ProcessCollector
3233
PROCESS_COLLECTOR = process_collector.PROCESS_COLLECTOR
3334

35+
PlatformCollector = platform_collector.PlatformCollector
36+
PLATFORM_COLLECTOR = platform_collector.PLATFORM_COLLECTOR
37+
3438

3539
if __name__ == '__main__':
3640
c = Counter('cc', 'A counter')
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8
3+
from __future__ import unicode_literals
4+
5+
import platform as pf
6+
7+
from . import core
8+
9+
10+
class PlatformCollector(object):
11+
"""Collector for python platform information"""
12+
13+
def __init__(self, registry=core.REGISTRY, platform=None):
14+
self._platform = pf if platform is None else platform
15+
info = self._info()
16+
system = self._platform.system()
17+
if system == "Java":
18+
info.update(self._java())
19+
self._metrics = [
20+
self._add_metric("python_info", "Python platform information", info)
21+
]
22+
if registry:
23+
registry.register(self)
24+
25+
def collect(self):
26+
return self._metrics
27+
28+
@staticmethod
29+
def _add_metric(name, documentation, data):
30+
labels = data.keys()
31+
values = [data[k] for k in labels]
32+
g = core.GaugeMetricFamily(name, documentation, labels=labels)
33+
g.add_metric(values, 1)
34+
return g
35+
36+
def _info(self):
37+
major, minor, patchlevel = self._platform.python_version_tuple()
38+
return {
39+
"version": self._platform.python_version(),
40+
"implementation": self._platform.python_implementation(),
41+
"major": major,
42+
"minor": minor,
43+
"patchlevel": patchlevel
44+
}
45+
46+
def _java(self):
47+
java_version, _, vminfo, osinfo = self._platform.java_ver()
48+
vm_name, vm_release, vm_vendor = vminfo
49+
return {
50+
"jvm_version": java_version,
51+
"jvm_release": vm_release,
52+
"jvm_vendor": vm_vendor,
53+
"jvm_name": vm_name
54+
}
55+
56+
57+
PLATFORM_COLLECTOR = PlatformCollector()
58+
"""PlatformCollector in default Registry REGISTRY"""

tests/test_platform_collector.py

Lines changed: 69 additions & 0 deletions

0 commit comments

Comments
 (0)