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