|
30 | 30 | "process.cpu.utilization": None, |
31 | 31 | "process.memory.usage": None, |
32 | 32 | "process.memory.virtual": None, |
| 33 | + "process.disk.io": ["read", "write"], |
33 | 34 | "process.open_file_descriptor.count": None, |
34 | 35 | "process.thread.count": None, |
35 | 36 | "process.runtime.memory": ["rss", "vms"], |
|
134 | 135 | "process.memory.virtual": None, |
135 | 136 | "process.open_file_descriptor.count": None, |
136 | 137 | "process.thread.count": None, |
| 138 | + "process.disk.io": ["read", "write"], |
137 | 139 | "process.runtime.memory": ["rss", "vms"], |
138 | 140 | "process.runtime.cpu.time": ["user", "system"], |
139 | 141 | "process.runtime.gc_count": None, |
@@ -208,6 +210,7 @@ def __init__( |
208 | 210 | self._cpu_utilization_labels = self._labels.copy() |
209 | 211 | self._memory_usage_labels = self._labels.copy() |
210 | 212 | self._memory_virtual_labels = self._labels.copy() |
| 213 | + self._process_disk_io_labels = self._labels.copy() |
211 | 214 | self._open_file_descriptor_count_labels = self._labels.copy() |
212 | 215 | self._thread_count_labels = self._labels.copy() |
213 | 216 |
|
@@ -459,6 +462,14 @@ def _instrument(self, **kwargs: Any): |
459 | 462 | description="Process threads count.", |
460 | 463 | ) |
461 | 464 |
|
| 465 | + if "process.disk.io" in self._config: |
| 466 | + self._meter.create_observable_counter( |
| 467 | + name="process.disk.io", |
| 468 | + callbacks=[self._get_process_disk_io], |
| 469 | + description="Disk bytes transferred for the process.", |
| 470 | + unit="By", |
| 471 | + ) |
| 472 | + |
462 | 473 | # FIXME: process.runtime keys are deprecated and will be removed in subsequent releases. |
463 | 474 | # When removing them, remember to clean also the callbacks and labels |
464 | 475 |
|
@@ -909,6 +920,27 @@ def _get_thread_count( |
909 | 920 | self._proc.num_threads(), self._thread_count_labels.copy() |
910 | 921 | ) |
911 | 922 |
|
| 923 | + def _get_process_disk_io( |
| 924 | + self, options: CallbackOptions |
| 925 | + ) -> Iterable[Observation]: |
| 926 | + """Observer callback for process disk IO""" |
| 927 | + try: |
| 928 | + proc_disk = self._proc.io_counters() |
| 929 | + except (AttributeError, NotImplementedError, PermissionError): |
| 930 | + # io_counters() is not available on all platforms (e.g. macOS) |
| 931 | + return |
| 932 | + for metric in self._config["process.disk.io"]: |
| 933 | + if metric == "read": |
| 934 | + self._process_disk_io_labels["direction"] = "read" |
| 935 | + yield Observation( |
| 936 | + proc_disk.read_bytes, self._process_disk_io_labels.copy() |
| 937 | + ) |
| 938 | + elif metric == "write": |
| 939 | + self._process_disk_io_labels["direction"] = "write" |
| 940 | + yield Observation( |
| 941 | + proc_disk.write_bytes, self._process_disk_io_labels.copy() |
| 942 | + ) |
| 943 | + |
912 | 944 | # runtime callbacks |
913 | 945 |
|
914 | 946 | def _get_runtime_memory( |
|
0 commit comments