|
| 1 | +from typing import Optional |
| 2 | + |
1 | 3 | from notebook.notebookapp import NotebookApp |
2 | 4 | from prometheus_client import Gauge |
3 | | -from tornado import gen |
4 | | -from typing import Optional |
5 | 5 |
|
6 | | -from nbresuse.metrics import cpu_metrics |
7 | | -from nbresuse.metrics import CPUMetrics |
8 | | -from nbresuse.metrics import memory_metrics |
9 | | -from nbresuse.metrics import MemoryMetrics |
| 6 | +from nbresuse.metrics import PSUtilMetricsLoader |
10 | 7 |
|
11 | 8 | try: |
12 | 9 | # Traitlets >= 4.3.3 |
13 | 10 | from traitlets import Callable |
14 | 11 | except ImportError: |
15 | 12 | from .utils import Callable |
16 | 13 |
|
17 | | -TOTAL_MEMORY_USAGE = Gauge("total_memory_usage", "counter for total memory usage", []) |
18 | 14 |
|
19 | | -MAX_MEMORY_USAGE = Gauge("max_memory_usage", "counter for max memory usage", []) |
20 | | - |
21 | | -TOTAL_CPU_USAGE = Gauge("total_cpu_usage", "counter for total cpu usage", []) |
| 15 | +class PrometheusHandler(Callable): |
| 16 | + def __init__(self, metricsloader: PSUtilMetricsLoader): |
| 17 | + super().__init__() |
| 18 | + self.metricsloader = metricsloader |
| 19 | + self.config = metricsloader.config |
| 20 | + self.session_manager = metricsloader.nbapp.session_manager |
22 | 21 |
|
23 | | -MAX_CPU_USAGE = Gauge("max_cpu_usage", "counter for max cpu usage", []) |
| 22 | + self.TOTAL_MEMORY_USAGE = Gauge( |
| 23 | + "total_memory_usage", "counter for total memory usage", [] |
| 24 | + ) |
| 25 | + self.MAX_MEMORY_USAGE = Gauge( |
| 26 | + "max_memory_usage", "counter for max memory usage", [] |
| 27 | + ) |
24 | 28 |
|
| 29 | + self.TOTAL_CPU_USAGE = Gauge( |
| 30 | + "total_cpu_usage", "counter for total cpu usage", [] |
| 31 | + ) |
| 32 | + self.MAX_CPU_USAGE = Gauge("max_cpu_usage", "counter for max cpu usage", []) |
25 | 33 |
|
26 | | -class PrometheusHandler(Callable): |
27 | | - def __init__(self, nbapp: NotebookApp): |
28 | | - super().__init__() |
29 | | - self.config = nbapp.web_app.settings["nbresuse_display_config"] |
30 | | - self.session_manager = nbapp.session_manager |
31 | | - |
32 | | - @gen.coroutine |
33 | | - def __call__(self, *args, **kwargs): |
34 | | - metrics = self.apply_memory_limits(memory_metrics()) |
35 | | - if metrics is not None: |
36 | | - TOTAL_MEMORY_USAGE.set(metrics.current_memory) |
37 | | - MAX_MEMORY_USAGE.set(metrics.max_memory) |
| 34 | + async def __call__(self, *args, **kwargs): |
| 35 | + memory_metric_values = self.metricsloader.memory_metrics() |
| 36 | + if memory_metric_values is not None: |
| 37 | + self.TOTAL_MEMORY_USAGE.set(memory_metric_values["memory_info_rss"]) |
| 38 | + self.MAX_MEMORY_USAGE.set(self.apply_memory_limit(memory_metric_values)) |
38 | 39 | if self.config.track_cpu_percent: |
39 | | - metrics = self.apply_cpu_limits(cpu_metrics()) |
40 | | - if metrics is not None: |
41 | | - TOTAL_CPU_USAGE.set(metrics.cpu_usage) |
42 | | - MAX_CPU_USAGE.set(metrics.cpu_max) |
| 40 | + cpu_metric_values = self.metricsloader.cpu_metrics() |
| 41 | + if cpu_metric_values is not None: |
| 42 | + self.TOTAL_CPU_USAGE.set(cpu_metric_values["cpu_percent"]) |
| 43 | + self.MAX_CPU_USAGE.set(self.apply_cpu_limit(cpu_metric_values)) |
43 | 44 |
|
44 | | - def apply_memory_limits(self, metrics: Optional[MemoryMetrics]) -> Optional[MemoryMetrics]: |
45 | | - if metrics is not None: |
| 45 | + def apply_memory_limit(self, memory_metric_values) -> Optional[int]: |
| 46 | + if memory_metric_values is None: |
| 47 | + return None |
| 48 | + else: |
46 | 49 | if callable(self.config.mem_limit): |
47 | | - metrics.max_memory = self.config.mem_limit(rss=metrics.max_memory) |
| 50 | + return self.config.mem_limit( |
| 51 | + rss=memory_metric_values["memory_info_rss"] |
| 52 | + ) |
48 | 53 | elif self.config.mem_limit > 0: # mem_limit is an Int |
49 | | - metrics.max_memory = self.config.mem_limit |
50 | | - return metrics |
51 | | - |
52 | | - def apply_cpu_limits(self, metrics: Optional[CPUMetrics]) -> Optional[CPUMetrics]: |
53 | | - if metrics is not None: |
54 | | - if self.config.cpu_limit > 0: |
55 | | - metrics.cpu_max = self.config.cpu_limit |
56 | | - return metrics |
| 54 | + return self.config.mem_limit |
| 55 | + else: |
| 56 | + return memory_metric_values["virtual_memory_total"] |
| 57 | + |
| 58 | + def apply_cpu_limit(self, cpu_metric_values) -> Optional[float]: |
| 59 | + if cpu_metric_values is None: |
| 60 | + return None |
| 61 | + else: |
| 62 | + if callable(self.config.cpu_limit): |
| 63 | + return self.config.cpu_limit( |
| 64 | + cpu_percent=cpu_metric_values["cpu_percent"] |
| 65 | + ) |
| 66 | + elif self.config.cpu_limit > 0.0: # cpu_limit is a Float |
| 67 | + return self.config.cpu_limit |
| 68 | + else: |
| 69 | + return 100.0 * cpu_metric_values["cpu_count"] |
0 commit comments