-
Notifications
You must be signed in to change notification settings - Fork 102
/
Copy pathprometheus.py
74 lines (65 loc) · 2.85 KB
/
prometheus.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
from typing import Optional
from prometheus_client import Gauge
from jupyter_resource_usage.metrics import PSUtilMetricsLoader
try:
# Traitlets >= 4.3.3
from traitlets import Callable
except ImportError:
from .utils import Callable
class PrometheusHandler(Callable):
def __init__(self, metricsloader: PSUtilMetricsLoader):
super().__init__()
self.metricsloader = metricsloader
self.config = metricsloader.config
self.session_manager = metricsloader.server_app.session_manager
gauge_names = [
"total_memory",
"max_memory",
"total_cpu",
"max_cpu",
"max_disk",
"current_disk",
]
for name in gauge_names:
phrase = name + "_usage"
gauge = Gauge(phrase, "counter for " + phrase.replace("_", " "), [])
setattr(self, phrase.upper(), gauge)
async def __call__(self, *args, **kwargs):
memory_metric_values = self.metricsloader.memory_metrics()
if memory_metric_values is not None:
self.TOTAL_MEMORY_USAGE.set(memory_metric_values["memory_info_rss"])
self.MAX_MEMORY_USAGE.set(self.apply_memory_limit(memory_metric_values))
if self.config.track_cpu_percent:
cpu_metric_values = self.metricsloader.cpu_metrics()
if cpu_metric_values is not None:
self.TOTAL_CPU_USAGE.set(cpu_metric_values["cpu_percent"])
self.MAX_CPU_USAGE.set(self.apply_cpu_limit(cpu_metric_values))
if self.config.track_disk_usage:
disk_metric_values = self.metricsloader.disk_metrics()
if disk_metric_values is not None:
self.CURRENT_DISK_USAGE.set(disk_metric_values["disk_usage_used"])
self.MAX_DISK_USAGE.set(disk_metric_values["disk_usage_total"])
def apply_memory_limit(self, memory_metric_values) -> Optional[int]:
if memory_metric_values is None:
return None
else:
if callable(self.config.mem_limit):
return self.config.mem_limit(
rss=memory_metric_values["memory_info_rss"]
)
elif self.config.mem_limit > 0: # mem_limit is an Int
return self.config.mem_limit
else:
return memory_metric_values["virtual_memory_total"]
def apply_cpu_limit(self, cpu_metric_values) -> Optional[float]:
if cpu_metric_values is None:
return None
else:
if callable(self.config.cpu_limit):
return self.config.cpu_limit(
cpu_percent=cpu_metric_values["cpu_percent"]
)
elif self.config.cpu_limit > 0.0: # cpu_limit is a Float
return self.config.cpu_limit
else:
return 100.0 * cpu_metric_values["cpu_count"]