|
| 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