From e92d2f819dd5223dbf1e1b5ee0c5657e046f2658 Mon Sep 17 00:00:00 2001 From: emdneto <9735060+emdneto@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:02:21 -0300 Subject: [PATCH 1/7] add capture to open file descriptors in system metrics instrumentation --- .../instrumentation/system_metrics/__init__.py | 18 ++++++++++++++++++ .../tests/test_system_metrics.py | 14 +++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py index 6342d287d5..0bbe2ed472 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py @@ -117,6 +117,7 @@ "process.runtime.thread_count": None, "process.runtime.cpu.utilization": None, "process.runtime.context_switches": ["involuntary", "voluntary"], + "process.open_file_descriptor.count": None, } if sys.platform == "darwin": @@ -169,6 +170,7 @@ def __init__( self._runtime_thread_count_labels = self._labels.copy() self._runtime_cpu_utilization_labels = self._labels.copy() self._runtime_context_switches_labels = self._labels.copy() + self._open_file_descriptor_count_labels = self._labels.copy() def instrumentation_dependencies(self) -> Collection[str]: return _instruments @@ -395,9 +397,25 @@ def _instrument(self, **kwargs): unit="switches", ) + if "process.open_file_descriptor.count" in self._config: + self._meter.create_observable_counter( + name=f"process.{self._python_implementation}.open_file_descriptor.count", + callbacks=[self._get_open_file_descriptors], + description="Number of open file descriptors", + ) + def _uninstrument(self, **__): pass + def _get_open_file_descriptors( + self, options: CallbackOptions + ) -> Iterable[Observation]: + """Observer callback for Number of file descriptors in use by the process""" + yield Observation( + self._proc.num_fds(), + self._open_file_descriptor_count_labels.copy(), + ) + def _get_system_cpu_time( self, options: CallbackOptions ) -> Iterable[Observation]: diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py index 3986a32c16..063fa5cbcd 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py @@ -118,12 +118,13 @@ def test_system_metrics_instrument(self): f"process.runtime.{self.implementation}.thread_count", f"process.runtime.{self.implementation}.context_switches", f"process.runtime.{self.implementation}.cpu.utilization", + f"process.{self.implementation}.open_file_descriptor.count", ] if self.implementation == "pypy": self.assertEqual(len(metric_names), 20) else: - self.assertEqual(len(metric_names), 21) + self.assertEqual(len(metric_names), 22) observer_names.append( f"process.runtime.{self.implementation}.gc_count", ) @@ -842,3 +843,14 @@ def test_runtime_cpu_percent(self, mock_process_cpu_percent): self._test_metrics( f"process.runtime.{self.implementation}.cpu.utilization", expected ) + + @mock.patch("psutil.Process.num_fds") + def test_open_file_descriptor_count(self, mock_process_num_fds): + mock_process_num_fds.configure_mock(**{"return_value": 3}) + + expected = [_SystemMetricsResult({}, 3)] + self._test_metrics( + f"process.{self.implementation}.open_file_descriptor.count", + expected, + ) + mock_process_num_fds.assert_called() From b42a73af08854e02fd3d07628ace3da5020ca00c Mon Sep 17 00:00:00 2001 From: emdneto <9735060+emdneto@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:07:30 -0300 Subject: [PATCH 2/7] fix meter type --- .../opentelemetry/instrumentation/system_metrics/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py index 0bbe2ed472..a586340a54 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py @@ -398,7 +398,7 @@ def _instrument(self, **kwargs): ) if "process.open_file_descriptor.count" in self._config: - self._meter.create_observable_counter( + self._meter.create_observable_up_down_counter( name=f"process.{self._python_implementation}.open_file_descriptor.count", callbacks=[self._get_open_file_descriptors], description="Number of open file descriptors", From fbcd17589343e735dcd77a2e772b487622b29c61 Mon Sep 17 00:00:00 2001 From: emdneto <9735060+emdneto@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:14:49 -0300 Subject: [PATCH 3/7] fix pypy test --- .../tests/test_system_metrics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py index 063fa5cbcd..b934ae8029 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py @@ -122,7 +122,7 @@ def test_system_metrics_instrument(self): ] if self.implementation == "pypy": - self.assertEqual(len(metric_names), 20) + self.assertEqual(len(metric_names), 21) else: self.assertEqual(len(metric_names), 22) observer_names.append( From 8acd2c1b2d413a076532cc109f8b993a21ef5ad0 Mon Sep 17 00:00:00 2001 From: emdneto <9735060+emdneto@users.noreply.github.com> Date: Tue, 2 Jul 2024 12:34:41 -0300 Subject: [PATCH 4/7] add changelog entry --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b5031bc905..9af1255aad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#2631](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2631)) - `opentelemetry-instrumentation-system-metrics` Permit to use psutil 6.0+. ([#2630](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2630)) +- `opentelemetry-instrumentation-system-metrics` Add support for capture open file descriptors + ([#2652](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2652)) ### Breaking changes From 61bf05b71951cca655cae8f9323b1ad36b37b05d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Em=C3=ADdio=20Neto?= <9735060+emdneto@users.noreply.github.com> Date: Tue, 2 Jul 2024 16:53:17 -0300 Subject: [PATCH 5/7] Update instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py Co-authored-by: Leighton Chen --- .../opentelemetry/instrumentation/system_metrics/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py index a586340a54..cfbfd6c077 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py @@ -401,7 +401,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_up_down_counter( name=f"process.{self._python_implementation}.open_file_descriptor.count", callbacks=[self._get_open_file_descriptors], - description="Number of open file descriptors", + description="Number of file descriptors in use by the process.", ) def _uninstrument(self, **__): From f02cb687973f83a6637eb04dbaad7b49917115c8 Mon Sep 17 00:00:00 2001 From: emdneto <9735060+emdneto@users.noreply.github.com> Date: Wed, 3 Jul 2024 15:50:36 -0300 Subject: [PATCH 6/7] remove runtiem prefix --- .../opentelemetry/instrumentation/system_metrics/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py index cfbfd6c077..b7ffb25431 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py @@ -399,7 +399,7 @@ def _instrument(self, **kwargs): if "process.open_file_descriptor.count" in self._config: self._meter.create_observable_up_down_counter( - name=f"process.{self._python_implementation}.open_file_descriptor.count", + name="process.open_file_descriptor.count", callbacks=[self._get_open_file_descriptors], description="Number of file descriptors in use by the process.", ) From 02add2f130cdf66995d3b19e0add72358e1a505a Mon Sep 17 00:00:00 2001 From: emdneto <9735060+emdneto@users.noreply.github.com> Date: Wed, 3 Jul 2024 16:02:48 -0300 Subject: [PATCH 7/7] update tests --- .../tests/test_system_metrics.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py index b934ae8029..1d6f08892e 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py @@ -118,7 +118,7 @@ def test_system_metrics_instrument(self): f"process.runtime.{self.implementation}.thread_count", f"process.runtime.{self.implementation}.context_switches", f"process.runtime.{self.implementation}.cpu.utilization", - f"process.{self.implementation}.open_file_descriptor.count", + "process.open_file_descriptor.count", ] if self.implementation == "pypy": @@ -850,7 +850,7 @@ def test_open_file_descriptor_count(self, mock_process_num_fds): expected = [_SystemMetricsResult({}, 3)] self._test_metrics( - f"process.{self.implementation}.open_file_descriptor.count", + "process.open_file_descriptor.count", expected, ) mock_process_num_fds.assert_called()