1import platform as pf
2from typing import Any, Iterable, Optional
3
4from .metrics_core import GaugeMetricFamily, Metric
5from .registry import Collector, CollectorRegistry, REGISTRY
6
7
8class PlatformCollector(Collector):
9 """Collector for python platform information"""
10
11 def __init__(self,
12 registry: Optional[CollectorRegistry] = REGISTRY,
13 platform: Optional[Any] = None,
14 ):
15 self._platform = pf if platform is None else platform
16 info = self._info()
17 system = self._platform.system()
18 if system == "Java":
19 info.update(self._java())
20 self._metrics = [
21 self._add_metric("python_info", "Python platform information", info)
22 ]
23 if registry:
24 registry.register(self)
25
26 def collect(self) -> Iterable[Metric]:
27 return self._metrics
28
29 @staticmethod
30 def _add_metric(name, documentation, data):
31 labels = data.keys()
32 values = [data[k] for k in labels]
33 g = GaugeMetricFamily(name, documentation, labels=labels)
34 g.add_metric(values, 1)
35 return g
36
37 def _info(self):
38 major, minor, patchlevel = self._platform.python_version_tuple()
39 return {
40 "version": self._platform.python_version(),
41 "implementation": self._platform.python_implementation(),
42 "major": major,
43 "minor": minor,
44 "patchlevel": patchlevel
45 }
46
47 def _java(self):
48 java_version, _, vminfo, osinfo = self._platform.java_ver()
49 vm_name, vm_release, vm_vendor = vminfo
50 return {
51 "jvm_version": java_version,
52 "jvm_release": vm_release,
53 "jvm_vendor": vm_vendor,
54 "jvm_name": vm_name
55 }
56
57
58PLATFORM_COLLECTOR = PlatformCollector()
59"""PlatformCollector in default Registry REGISTRY"""