From bd46edefdf9a13edb809a20483d9abfc14e4fb1a Mon Sep 17 00:00:00 2001 From: petertamuk Date: Fri, 5 Aug 2022 14:46:48 -0400 Subject: [PATCH 01/11] updated to remove directions from existing metrics. tests updated to match --- .../system_metrics/__init__.py | 371 +++++++++++----- .../tests/test_system_metrics.py | 417 ++++++++++++++---- 2 files changed, 590 insertions(+), 198 deletions(-) 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 1c7c90a3d4..69daa9abc7 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 @@ -91,13 +91,20 @@ "system.memory.utilization": ["used", "free", "cached"], "system.swap.usage": ["used", "free"], "system.swap.utilization": ["used", "free"], - "system.disk.io": ["read", "write"], - "system.disk.operations": ["read", "write"], - "system.disk.time": ["read", "write"], - "system.network.dropped.packets": ["transmit", "receive"], - "system.network.packets": ["transmit", "receive"], - "system.network.errors": ["transmit", "receive"], - "system.network.io": ["transmit", "receive"], + "system.disk.io.read": None, + "system.disk.io.write": None, + "system.disk.operations.read": None, + "system.disk.operations.write": None, + "system.disk.operation_time.read": None, + "system.disk.operation_time.write": None, + "system.network.dropped.transmit": None, + "system.network.dropped.receive": None, + "system.network.packets.transmit": None, + "system.network.packets.receive": None, + "system.network.errors.transmit": None, + "system.network.errors.receive": None, + "system.network.io.transmit": None, + "system.network.io.receive": None, "system.network.connections": ["family", "type"], "runtime.memory": ["rss", "vms"], "runtime.cpu.time": ["user", "system"], @@ -131,15 +138,22 @@ def __init__( self._system_swap_usage_labels = self._labels.copy() self._system_swap_utilization_labels = self._labels.copy() - self._system_disk_io_labels = self._labels.copy() - self._system_disk_operations_labels = self._labels.copy() - self._system_disk_time_labels = self._labels.copy() + self._system_disk_io_read_labels = self._labels.copy() + self._system_disk_io_write_labels = self._labels.copy() + self._system_disk_operations_read_labels = self._labels.copy() + self._system_disk_operations_write_labels = self._labels.copy() + self._system_disk_operation_time_read_labels = self._labels.copy() + self._system_disk_operation_time_write_labels = self._labels.copy() self._system_disk_merged_labels = self._labels.copy() - self._system_network_dropped_packets_labels = self._labels.copy() - self._system_network_packets_labels = self._labels.copy() - self._system_network_errors_labels = self._labels.copy() - self._system_network_io_labels = self._labels.copy() + self._system_network_dropped_transmit_labels = self._labels.copy() + self._system_network_dropped_receive_labels = self._labels.copy() + self._system_network_packets_transmit_labels = self._labels.copy() + self._system_network_packets_receive_labels = self._labels.copy() + self._system_network_errors_transmit_labels = self._labels.copy() + self._system_network_errors_receive_labels = self._labels.copy() + self._system_network_io_transmit_labels = self._labels.copy() + self._system_network_io_receive_labels = self._labels.copy() self._system_network_connections_labels = self._labels.copy() self._runtime_memory_labels = self._labels.copy() @@ -225,27 +239,51 @@ def _instrument(self, **kwargs): # value_type=int, # ) - if "system.disk.io" in self._config: + if "system.disk.io.read" in self._config: self._meter.create_observable_counter( - name="system.disk.io", - callbacks=[self._get_system_disk_io], - description="System disk IO", + name="system.disk.io.read", + callbacks=[self._get_system_disk_io_read], + description="System disk IO read", unit="bytes", ) - if "system.disk.operations" in self._config: + if "system.disk.io.write" in self._config: self._meter.create_observable_counter( - name="system.disk.operations", - callbacks=[self._get_system_disk_operations], - description="System disk operations", + name="system.disk.io.write", + callbacks=[self._get_system_disk_io_write], + description="System disk IO write", + unit="bytes", + ) + + if "system.disk.operations.read" in self._config: + self._meter.create_observable_counter( + name="system.disk.operations.read", + callbacks=[self._get_system_disk_operations_read], + description="System disk operations read", + unit="operations", + ) + + if "system.disk.operations.write" in self._config: + self._meter.create_observable_counter( + name="system.disk.operations.write", + callbacks=[self._get_system_disk_operations_write], + description="System disk operations write", unit="operations", ) - if "system.disk.time" in self._config: + if "system.disk.operation_time.read" in self._config: + self._meter.create_observable_counter( + name="system.disk.operation_time.read", + callbacks=[self._get_system_disk_operation_time_read], + description="System disk operation time read", + unit="seconds", + ) + + if "system.disk.operation_time.write" in self._config: self._meter.create_observable_counter( - name="system.disk.time", - callbacks=[self._get_system_disk_time], - description="System disk time", + name="system.disk.operation_time.write", + callbacks=[self._get_system_disk_operation_time_write], + description="System disk operation time write", unit="seconds", ) @@ -271,35 +309,67 @@ def _instrument(self, **kwargs): # TODO Filesystem information can be obtained with os.statvfs in Unix-like # OSs, how to do the same in Windows? - if "system.network.dropped.packets" in self._config: + if "system.network.dropped.transmit" in self._config: self._meter.create_observable_counter( - name="system.network.dropped_packets", - callbacks=[self._get_system_network_dropped_packets], - description="System network dropped_packets", + name="system.network.dropped.transmit", + callbacks=[self._get_system_network_dropped_transmit], + description="System network dropped packets transmit", unit="packets", ) - if "system.network.packets" in self._config: + if "system.network.dropped.receive" in self._config: self._meter.create_observable_counter( - name="system.network.packets", - callbacks=[self._get_system_network_packets], - description="System network packets", + name="system.network.dropped.receive", + callbacks=[self._get_system_network_dropped_receive], + description="System network dropped packets receive", unit="packets", ) - if "system.network.errors" in self._config: + if "system.network.packets.transmit" in self._config: + self._meter.create_observable_counter( + name="system.network.packets.transmit", + callbacks=[self._get_system_network_packets_transmit], + description="System network packets transmit", + unit="packets", + ) + + if "system.network.packets.receive" in self._config: + self._meter.create_observable_counter( + name="system.network.packets.receive", + callbacks=[self._get_system_network_packets_receive], + description="System network packets receive", + unit="packets", + ) + + if "system.network.errors.transmit" in self._config: + self._meter.create_observable_counter( + name="system.network.errors.transmit", + callbacks=[self._get_system_network_errors_transmit], + description="System network errors transmit", + unit="errors", + ) + + if "system.network.errors.receive" in self._config: self._meter.create_observable_counter( - name="system.network.errors", - callbacks=[self._get_system_network_errors], - description="System network errors", + name="system.network.errors.receive", + callbacks=[self._get_system_network_errors_receive], + description="System network errors receive", unit="errors", ) - if "system.network.io" in self._config: + if "system.network.io.transmit" in self._config: self._meter.create_observable_counter( - name="system.network.io", - callbacks=[self._get_system_network_io], - description="System network io", + name="system.network.io.transmit", + callbacks=[self._get_system_network_io_transmit], + description="System network io transmit", + unit="bytes", + ) + + if "system.network.io.receive" in self._config: + self._meter.create_observable_counter( + name="system.network.io.receive", + callbacks=[self._get_system_network_io_receive], + description="System network io receive", unit="bytes", ) @@ -424,47 +494,77 @@ def _get_system_swap_utilization( self._system_swap_utilization_labels.copy(), ) - def _get_system_disk_io( + def _get_system_disk_io_read( self, options: CallbackOptions ) -> Iterable[Observation]: - """Observer callback for disk IO""" + """Observer callback for disk IO read""" for device, counters in psutil.disk_io_counters(perdisk=True).items(): - for metric in self._config["system.disk.io"]: - if hasattr(counters, f"{metric}_bytes"): - self._system_disk_io_labels["device"] = device - self._system_disk_io_labels["direction"] = metric - yield Observation( - getattr(counters, f"{metric}_bytes"), - self._system_disk_io_labels.copy(), - ) + if hasattr(counters, "read_bytes"): + self._system_disk_io_read_labels["device"] = device + yield Observation( + getattr(counters, "read_bytes"), + self._system_disk_io_read_labels.copy(), + ) - def _get_system_disk_operations( + def _get_system_disk_io_write( self, options: CallbackOptions ) -> Iterable[Observation]: - """Observer callback for disk operations""" + """Observer callback for disk IO write""" for device, counters in psutil.disk_io_counters(perdisk=True).items(): - for metric in self._config["system.disk.operations"]: - if hasattr(counters, f"{metric}_count"): - self._system_disk_operations_labels["device"] = device - self._system_disk_operations_labels["direction"] = metric - yield Observation( - getattr(counters, f"{metric}_count"), - self._system_disk_operations_labels.copy(), - ) + if hasattr(counters, "write_bytes"): + self._system_disk_io_write_labels["device"] = device + yield Observation( + getattr(counters, "write_bytes"), + self._system_disk_io_write_labels.copy(), + ) - def _get_system_disk_time( + def _get_system_disk_operations_read( self, options: CallbackOptions ) -> Iterable[Observation]: - """Observer callback for disk time""" + """Observer callback for disk operations read""" for device, counters in psutil.disk_io_counters(perdisk=True).items(): - for metric in self._config["system.disk.time"]: - if hasattr(counters, f"{metric}_time"): - self._system_disk_time_labels["device"] = device - self._system_disk_time_labels["direction"] = metric - yield Observation( - getattr(counters, f"{metric}_time") / 1000, - self._system_disk_time_labels.copy(), - ) + if hasattr(counters, "read_count"): + self._system_disk_operations_read_labels["device"] = device + yield Observation( + getattr(counters, "read_count"), + self._system_disk_operations_read_labels.copy(), + ) + + def _get_system_disk_operations_write( + self, options: CallbackOptions + ) -> Iterable[Observation]: + """Observer callback for disk operations write""" + for device, counters in psutil.disk_io_counters(perdisk=True).items(): + if hasattr(counters, "write_count"): + self._system_disk_operations_write_labels["device"] = device + yield Observation( + getattr(counters, "write_count"), + self._system_disk_operations_write_labels.copy(), + ) + + def _get_system_disk_operation_time_read( + self, options: CallbackOptions + ) -> Iterable[Observation]: + """Observer callback for disk operation time read""" + for device, counters in psutil.disk_io_counters(perdisk=True).items(): + if hasattr(counters, "read_time"): + self._system_disk_operation_time_read_labels["device"] = device + yield Observation( + getattr(counters, "read_time") / 1000, + self._system_disk_operation_time_read_labels.copy(), + ) + + def _get_system_disk_operation_time_write( + self, options: CallbackOptions + ) -> Iterable[Observation]: + """Observer callback for disk operation time write""" + for device, counters in psutil.disk_io_counters(perdisk=True).items(): + if hasattr(counters, "write_time"): + self._system_disk_operation_time_write_labels["device"] = device + yield Observation( + getattr(counters, "write_time") / 1000, + self._system_disk_operation_time_write_labels.copy(), + ) def _get_system_disk_merged( self, options: CallbackOptions @@ -473,6 +573,8 @@ def _get_system_disk_merged( # FIXME The units in the spec is 1, it seems like it should be # operations or the value type should be Double + + # FIXME Metric should be system.disk.merged for device, counters in psutil.disk_io_counters(perdisk=True).items(): for metric in self._config["system.disk.time"]: @@ -484,72 +586,101 @@ def _get_system_disk_merged( self._system_disk_merged_labels.copy(), ) - def _get_system_network_dropped_packets( + def _get_system_network_dropped_transmit( + self, options: CallbackOptions + ) -> Iterable[Observation]: + """Observer callback for network dropped packets transmit""" + for device, counters in psutil.net_io_counters(pernic=True).items(): + if hasattr(counters, "dropout"): + self._system_network_dropped_transmit_labels["device"] = device + yield Observation( + getattr(counters, "dropout"), + self._system_network_dropped_transmit_labels.copy(), + ) + + def _get_system_network_dropped_receive( self, options: CallbackOptions ) -> Iterable[Observation]: - """Observer callback for network dropped packets""" + """Observer callback for network dropped packets receive""" + for device, counters in psutil.net_io_counters(pernic=True).items(): + if hasattr(counters, "dropin"): + self._system_network_dropped_receive_labels["device"] = device + yield Observation( + getattr(counters, "dropin"), + self._system_network_dropped_receive_labels.copy(), + ) + def _get_system_network_packets_transmit( + self, options: CallbackOptions + ) -> Iterable[Observation]: + """Observer callback for network packets transmit""" for device, counters in psutil.net_io_counters(pernic=True).items(): - for metric in self._config["system.network.dropped.packets"]: - in_out = {"receive": "in", "transmit": "out"}[metric] - if hasattr(counters, f"drop{in_out}"): - self._system_network_dropped_packets_labels[ - "device" - ] = device - self._system_network_dropped_packets_labels[ - "direction" - ] = metric - yield Observation( - getattr(counters, f"drop{in_out}"), - self._system_network_dropped_packets_labels.copy(), - ) + if hasattr(counters, "packets_sent"): + self._system_network_packets_transmit_labels["device"] = device + yield Observation( + getattr(counters, "packets_sent"), + self._system_network_packets_transmit_labels.copy(), + ) - def _get_system_network_packets( + def _get_system_network_packets_receive( self, options: CallbackOptions ) -> Iterable[Observation]: - """Observer callback for network packets""" + """Observer callback for network packets receive""" + for device, counters in psutil.net_io_counters(pernic=True).items(): + if hasattr(counters, "packets_recv"): + self._system_network_packets_receive_labels["device"] = device + yield Observation( + getattr(counters, "packets_recv"), + self._system_network_packets_receive_labels.copy(), + ) + def _get_system_network_errors_transmit( + self, options: CallbackOptions + ) -> Iterable[Observation]: + """Observer callback for network errors transmit""" for device, counters in psutil.net_io_counters(pernic=True).items(): - for metric in self._config["system.network.dropped.packets"]: - recv_sent = {"receive": "recv", "transmit": "sent"}[metric] - if hasattr(counters, f"packets_{recv_sent}"): - self._system_network_packets_labels["device"] = device - self._system_network_packets_labels["direction"] = metric - yield Observation( - getattr(counters, f"packets_{recv_sent}"), - self._system_network_packets_labels.copy(), - ) + if hasattr(counters, "errout"): + self._system_network_errors_transmit_labels["device"] = device + yield Observation( + getattr(counters, "errout"), + self._system_network_errors_transmit_labels.copy(), + ) - def _get_system_network_errors( + def _get_system_network_errors_receive( self, options: CallbackOptions ) -> Iterable[Observation]: - """Observer callback for network errors""" + """Observer callback for network errors receive""" for device, counters in psutil.net_io_counters(pernic=True).items(): - for metric in self._config["system.network.errors"]: - in_out = {"receive": "in", "transmit": "out"}[metric] - if hasattr(counters, f"err{in_out}"): - self._system_network_errors_labels["device"] = device - self._system_network_errors_labels["direction"] = metric - yield Observation( - getattr(counters, f"err{in_out}"), - self._system_network_errors_labels.copy(), - ) + if hasattr(counters, "errin"): + self._system_network_errors_receive_labels["device"] = device + yield Observation( + getattr(counters, "errin"), + self._system_network_errors_receive_labels.copy(), + ) - def _get_system_network_io( + def _get_system_network_io_transmit( self, options: CallbackOptions ) -> Iterable[Observation]: - """Observer callback for network IO""" + """Observer callback for network IO transmit""" + for device, counters in psutil.net_io_counters(pernic=True).items(): + if hasattr(counters, "bytes_sent"): + self._system_network_io_transmit_labels["device"] = device + yield Observation( + getattr(counters, "bytes_sent"), + self._system_network_io_transmit_labels.copy(), + ) + def _get_system_network_io_receive( + self, options: CallbackOptions + ) -> Iterable[Observation]: + """Observer callback for network IO receive""" for device, counters in psutil.net_io_counters(pernic=True).items(): - for metric in self._config["system.network.dropped.packets"]: - recv_sent = {"receive": "recv", "transmit": "sent"}[metric] - if hasattr(counters, f"bytes_{recv_sent}"): - self._system_network_io_labels["device"] = device - self._system_network_io_labels["direction"] = metric - yield Observation( - getattr(counters, f"bytes_{recv_sent}"), - self._system_network_io_labels.copy(), - ) + if hasattr(counters, "bytes_recv"): + self._system_network_io_receive_labels["device"] = device + yield Observation( + getattr(counters, "bytes_recv"), + self._system_network_io_receive_labels.copy(), + ) def _get_system_network_connections( self, options: CallbackOptions 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 04d7674dba..81cfae4d7a 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py @@ -75,7 +75,7 @@ def test_system_metrics_instrument(self): for scope_metrics in resource_metrics.scope_metrics: for metric in scope_metrics.metrics: metric_names.append(metric.name) - self.assertEqual(len(metric_names), 17) + self.assertEqual(len(metric_names), 24) observer_names = [ "system.cpu.time", @@ -84,13 +84,20 @@ def test_system_metrics_instrument(self): "system.memory.utilization", "system.swap.usage", "system.swap.utilization", - "system.disk.io", - "system.disk.operations", - "system.disk.time", - "system.network.dropped_packets", - "system.network.packets", - "system.network.errors", - "system.network.io", + "system.disk.io.read", + "system.disk.io.write", + "system.disk.operations.read", + "system.disk.operations.write", + "system.disk.operation_time.read", + "system.disk.operation_time.write", + "system.network.dropped.transmit", + "system.network.dropped.receive", + "system.network.packets.transmit", + "system.network.packets.receive", + "system.network.errors.transmit", + "system.network.errors.receive", + "system.network.io.transmit", + "system.network.io.receive", "system.network.connections", f"runtime.{self.implementation}.memory", f"runtime.{self.implementation}.cpu_time", @@ -278,7 +285,7 @@ def test_system_swap_utilization(self, mock_swap_memory): self._test_metrics("system.swap.utilization", expected) @mock.patch("psutil.disk_io_counters") - def test_system_disk_io(self, mock_disk_io_counters): + def test_system_disk_io_read(self, mock_disk_io_counters): DiskIO = namedtuple( "DiskIO", [ @@ -316,15 +323,13 @@ def test_system_disk_io(self, mock_disk_io_counters): } expected = [ - _SystemMetricsResult({"device": "sda", "direction": "read"}, 3), - _SystemMetricsResult({"device": "sda", "direction": "write"}, 4), - _SystemMetricsResult({"device": "sdb", "direction": "read"}, 11), - _SystemMetricsResult({"device": "sdb", "direction": "write"}, 12), + _SystemMetricsResult({"device": "sda"}, 3), + _SystemMetricsResult({"device": "sdb"}, 11), ] - self._test_metrics("system.disk.io", expected) + self._test_metrics("system.disk.io.read", expected) @mock.patch("psutil.disk_io_counters") - def test_system_disk_operations(self, mock_disk_io_counters): + def test_system_disk_io_write(self, mock_disk_io_counters): DiskIO = namedtuple( "DiskIO", [ @@ -362,15 +367,13 @@ def test_system_disk_operations(self, mock_disk_io_counters): } expected = [ - _SystemMetricsResult({"device": "sda", "direction": "read"}, 1), - _SystemMetricsResult({"device": "sda", "direction": "write"}, 2), - _SystemMetricsResult({"device": "sdb", "direction": "read"}, 9), - _SystemMetricsResult({"device": "sdb", "direction": "write"}, 10), + _SystemMetricsResult({"device": "sda"}, 4), + _SystemMetricsResult({"device": "sdb"}, 12), ] - self._test_metrics("system.disk.operations", expected) + self._test_metrics("system.disk.io.write", expected) @mock.patch("psutil.disk_io_counters") - def test_system_disk_time(self, mock_disk_io_counters): + def test_system_disk_operations_read(self, mock_disk_io_counters): DiskIO = namedtuple( "DiskIO", [ @@ -408,23 +411,145 @@ def test_system_disk_time(self, mock_disk_io_counters): } expected = [ - _SystemMetricsResult( - {"device": "sda", "direction": "read"}, 5 / 1000 + _SystemMetricsResult({"device": "sda"}, 1), + _SystemMetricsResult({"device": "sdb"}, 9), + ] + self._test_metrics("system.disk.operations.read", expected) + + @mock.patch("psutil.disk_io_counters") + def test_system_disk_operations_write(self, mock_disk_io_counters): + DiskIO = namedtuple( + "DiskIO", + [ + "read_count", + "write_count", + "read_bytes", + "write_bytes", + "read_time", + "write_time", + "read_merged_count", + "write_merged_count", + ], + ) + mock_disk_io_counters.return_value = { + "sda": DiskIO( + read_count=1, + write_count=2, + read_bytes=3, + write_bytes=4, + read_time=5, + write_time=6, + read_merged_count=7, + write_merged_count=8, ), - _SystemMetricsResult( - {"device": "sda", "direction": "write"}, 6 / 1000 + "sdb": DiskIO( + read_count=9, + write_count=10, + read_bytes=11, + write_bytes=12, + read_time=13, + write_time=14, + read_merged_count=15, + write_merged_count=16, ), - _SystemMetricsResult( - {"device": "sdb", "direction": "read"}, 13 / 1000 + } + + expected = [ + _SystemMetricsResult({"device": "sda",}, 2), + _SystemMetricsResult({"device": "sdb"}, 10), + ] + self._test_metrics("system.disk.operations.write", expected) + + @mock.patch("psutil.disk_io_counters") + def test_system_disk_operation_time_read(self, mock_disk_io_counters): + DiskIO = namedtuple( + "DiskIO", + [ + "read_count", + "write_count", + "read_bytes", + "write_bytes", + "read_time", + "write_time", + "read_merged_count", + "write_merged_count", + ], + ) + mock_disk_io_counters.return_value = { + "sda": DiskIO( + read_count=1, + write_count=2, + read_bytes=3, + write_bytes=4, + read_time=5, + write_time=6, + read_merged_count=7, + write_merged_count=8, ), - _SystemMetricsResult( - {"device": "sdb", "direction": "write"}, 14 / 1000 + "sdb": DiskIO( + read_count=9, + write_count=10, + read_bytes=11, + write_bytes=12, + read_time=13, + write_time=14, + read_merged_count=15, + write_merged_count=16, + ), + } + + expected = [ + _SystemMetricsResult({"device": "sda"}, 5 / 1000), + _SystemMetricsResult({"device": "sdb"}, 13 / 1000), + ] + self._test_metrics("system.disk.operation_time.read", expected) + + @mock.patch("psutil.disk_io_counters") + def test_system_disk_operation_time_write(self, mock_disk_io_counters): + DiskIO = namedtuple( + "DiskIO", + [ + "read_count", + "write_count", + "read_bytes", + "write_bytes", + "read_time", + "write_time", + "read_merged_count", + "write_merged_count", + ], + ) + mock_disk_io_counters.return_value = { + "sda": DiskIO( + read_count=1, + write_count=2, + read_bytes=3, + write_bytes=4, + read_time=5, + write_time=6, + read_merged_count=7, + write_merged_count=8, + ), + "sdb": DiskIO( + read_count=9, + write_count=10, + read_bytes=11, + write_bytes=12, + read_time=13, + write_time=14, + read_merged_count=15, + write_merged_count=16, ), + } + + expected = [ + _SystemMetricsResult({"device": "sda"}, 6 / 1000), + _SystemMetricsResult({"device": "sdb"}, 14 / 1000), ] - self._test_metrics("system.disk.time", expected) + self._test_metrics("system.disk.operation_time.write", expected) @mock.patch("psutil.net_io_counters") - def test_system_network_dropped_packets(self, mock_net_io_counters): + def test_system_network_dropped_transmit(self, mock_net_io_counters): NetIO = namedtuple( "NetIO", [ @@ -462,23 +587,13 @@ def test_system_network_dropped_packets(self, mock_net_io_counters): } expected = [ - _SystemMetricsResult( - {"device": "eth0", "direction": "receive"}, 1 - ), - _SystemMetricsResult( - {"device": "eth0", "direction": "transmit"}, 2 - ), - _SystemMetricsResult( - {"device": "eth1", "direction": "receive"}, 9 - ), - _SystemMetricsResult( - {"device": "eth1", "direction": "transmit"}, 10 - ), + _SystemMetricsResult({"device": "eth0"}, 2), + _SystemMetricsResult({"device": "eth1"}, 10), ] - self._test_metrics("system.network.dropped_packets", expected) + self._test_metrics("system.network.dropped.transmit", expected) @mock.patch("psutil.net_io_counters") - def test_system_network_packets(self, mock_net_io_counters): + def test_system_network_dropped_receive(self, mock_net_io_counters): NetIO = namedtuple( "NetIO", [ @@ -516,23 +631,13 @@ def test_system_network_packets(self, mock_net_io_counters): } expected = [ - _SystemMetricsResult( - {"device": "eth0", "direction": "receive"}, 4 - ), - _SystemMetricsResult( - {"device": "eth0", "direction": "transmit"}, 3 - ), - _SystemMetricsResult( - {"device": "eth1", "direction": "receive"}, 12 - ), - _SystemMetricsResult( - {"device": "eth1", "direction": "transmit"}, 11 - ), + _SystemMetricsResult({"device": "eth0"}, 1), + _SystemMetricsResult({"device": "eth1"}, 9), ] - self._test_metrics("system.network.packets", expected) + self._test_metrics("system.network.dropped.receive", expected) @mock.patch("psutil.net_io_counters") - def test_system_network_errors(self, mock_net_io_counters): + def test_system_network_packets_transmit(self, mock_net_io_counters): NetIO = namedtuple( "NetIO", [ @@ -570,23 +675,101 @@ def test_system_network_errors(self, mock_net_io_counters): } expected = [ - _SystemMetricsResult( - {"device": "eth0", "direction": "receive"}, 5 + _SystemMetricsResult({"device": "eth0"}, 3), + _SystemMetricsResult({"device": "eth1"}, 11), + ] + self._test_metrics("system.network.packets.transmit", expected) + + @mock.patch("psutil.net_io_counters") + def test_system_network_packets_receive(self, mock_net_io_counters): + NetIO = namedtuple( + "NetIO", + [ + "dropin", + "dropout", + "packets_sent", + "packets_recv", + "errin", + "errout", + "bytes_sent", + "bytes_recv", + ], + ) + mock_net_io_counters.return_value = { + "eth0": NetIO( + dropin=1, + dropout=2, + packets_sent=3, + packets_recv=4, + errin=5, + errout=6, + bytes_sent=7, + bytes_recv=8, ), - _SystemMetricsResult( - {"device": "eth0", "direction": "transmit"}, 6 + "eth1": NetIO( + dropin=9, + dropout=10, + packets_sent=11, + packets_recv=12, + errin=13, + errout=14, + bytes_sent=15, + bytes_recv=16, ), - _SystemMetricsResult( - {"device": "eth1", "direction": "receive"}, 13 + } + + expected = [ + _SystemMetricsResult({"device": "eth0"}, 4), + _SystemMetricsResult({"device": "eth1"}, 12), + ] + self._test_metrics("system.network.packets.receive", expected) + + @mock.patch("psutil.net_io_counters") + def test_system_network_errors_transmit(self, mock_net_io_counters): + NetIO = namedtuple( + "NetIO", + [ + "dropin", + "dropout", + "packets_sent", + "packets_recv", + "errin", + "errout", + "bytes_sent", + "bytes_recv", + ], + ) + mock_net_io_counters.return_value = { + "eth0": NetIO( + dropin=1, + dropout=2, + packets_sent=3, + packets_recv=4, + errin=5, + errout=6, + bytes_sent=7, + bytes_recv=8, ), - _SystemMetricsResult( - {"device": "eth1", "direction": "transmit"}, 14 + "eth1": NetIO( + dropin=9, + dropout=10, + packets_sent=11, + packets_recv=12, + errin=13, + errout=14, + bytes_sent=15, + bytes_recv=16, ), + } + + expected = [ + _SystemMetricsResult({"device": "eth0"}, 6), + _SystemMetricsResult({"device": "eth1"}, 14), ] - self._test_metrics("system.network.errors", expected) + self._test_metrics("system.network.errors.transmit", expected) @mock.patch("psutil.net_io_counters") - def test_system_network_io(self, mock_net_io_counters): + def test_system_network_errors_receive(self, mock_net_io_counters): NetIO = namedtuple( "NetIO", [ @@ -624,20 +807,98 @@ def test_system_network_io(self, mock_net_io_counters): } expected = [ - _SystemMetricsResult( - {"device": "eth0", "direction": "receive"}, 8 + _SystemMetricsResult({"device": "eth0"}, 5), + _SystemMetricsResult({"device": "eth1"}, 13), + ] + self._test_metrics("system.network.errors.receive", expected) + + @mock.patch("psutil.net_io_counters") + def test_system_network_io_transmit(self, mock_net_io_counters): + NetIO = namedtuple( + "NetIO", + [ + "dropin", + "dropout", + "packets_sent", + "packets_recv", + "errin", + "errout", + "bytes_sent", + "bytes_recv", + ], + ) + mock_net_io_counters.return_value = { + "eth0": NetIO( + dropin=1, + dropout=2, + packets_sent=3, + packets_recv=4, + errin=5, + errout=6, + bytes_sent=7, + bytes_recv=8, ), - _SystemMetricsResult( - {"device": "eth0", "direction": "transmit"}, 7 + "eth1": NetIO( + dropin=9, + dropout=10, + packets_sent=11, + packets_recv=12, + errin=13, + errout=14, + bytes_sent=15, + bytes_recv=16, ), - _SystemMetricsResult( - {"device": "eth1", "direction": "receive"}, 16 + } + + expected = [ + _SystemMetricsResult({"device": "eth0"}, 7), + _SystemMetricsResult({"device": "eth1"}, 15), + ] + self._test_metrics("system.network.io.transmit", expected) + + @mock.patch("psutil.net_io_counters") + def test_system_network_io_receive(self, mock_net_io_counters): + NetIO = namedtuple( + "NetIO", + [ + "dropin", + "dropout", + "packets_sent", + "packets_recv", + "errin", + "errout", + "bytes_sent", + "bytes_recv", + ], + ) + mock_net_io_counters.return_value = { + "eth0": NetIO( + dropin=1, + dropout=2, + packets_sent=3, + packets_recv=4, + errin=5, + errout=6, + bytes_sent=7, + bytes_recv=8, ), - _SystemMetricsResult( - {"device": "eth1", "direction": "transmit"}, 15 + "eth1": NetIO( + dropin=9, + dropout=10, + packets_sent=11, + packets_recv=12, + errin=13, + errout=14, + bytes_sent=15, + bytes_recv=16, ), + } + + expected = [ + _SystemMetricsResult({"device": "eth0"}, 8), + _SystemMetricsResult({"device": "eth1"}, 16), ] - self._test_metrics("system.network.io", expected) + self._test_metrics("system.network.io.receive", expected) @mock.patch("psutil.net_connections") def test_system_network_connections(self, mock_net_connections): From 41b8d38e14f8aaec3b48bf52b08a5fd71f571877 Mon Sep 17 00:00:00 2001 From: petertamuk Date: Tue, 9 Aug 2022 11:16:10 -0400 Subject: [PATCH 02/11] remove extra comment to resolve lint issue --- .../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 81cfae4d7a..fe6d29df00 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py @@ -455,7 +455,7 @@ def test_system_disk_operations_write(self, mock_disk_io_counters): } expected = [ - _SystemMetricsResult({"device": "sda",}, 2), + _SystemMetricsResult({"device": "sda"}, 2), _SystemMetricsResult({"device": "sdb"}, 10), ] self._test_metrics("system.disk.operations.write", expected) From 24d473fab65ba1b35547865e339a5fca1c95ded7 Mon Sep 17 00:00:00 2001 From: petertamuk Date: Tue, 9 Aug 2022 11:19:26 -0400 Subject: [PATCH 03/11] updates to change log to include changes / pr --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 57565626d4..73599d6533 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#1206](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1206)) - Add psycopg2 native tags to sqlcommenter ([#1203](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1203)) +- Deprecation of direction attribute for metrics. Addition of direction based metric names + ([#1214](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1214)) ### Added - `opentelemetry-instrumentation-redis` add support to instrument RedisCluster clients From 32ab3293ee5a22423f6142fd04887c7f9a335c09 Mon Sep 17 00:00:00 2001 From: petertamuk Date: Tue, 9 Aug 2022 12:45:27 -0400 Subject: [PATCH 04/11] resolution to remaining lintting issues --- .../opentelemetry/instrumentation/system_metrics/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 69daa9abc7..21be9b824d 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 @@ -560,7 +560,9 @@ def _get_system_disk_operation_time_write( """Observer callback for disk operation time write""" for device, counters in psutil.disk_io_counters(perdisk=True).items(): if hasattr(counters, "write_time"): - self._system_disk_operation_time_write_labels["device"] = device + self._system_disk_operation_time_write_labels[ + "device" + ] = device yield Observation( getattr(counters, "write_time") / 1000, self._system_disk_operation_time_write_labels.copy(), @@ -573,7 +575,6 @@ def _get_system_disk_merged( # FIXME The units in the spec is 1, it seems like it should be # operations or the value type should be Double - # FIXME Metric should be system.disk.merged for device, counters in psutil.disk_io_counters(perdisk=True).items(): From f3c9068befdd17334fed5d8f8866f3fdfcdbf3d1 Mon Sep 17 00:00:00 2001 From: petertamuk Date: Tue, 23 Aug 2022 12:34:18 -0400 Subject: [PATCH 05/11] deal with linting issues my disabling these 2 checks --- .../opentelemetry/instrumentation/system_metrics/__init__.py | 1 + .../tests/test_system_metrics.py | 2 +- 2 files changed, 2 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 21be9b824d..5173c7eecc 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 @@ -163,6 +163,7 @@ def __init__( def instrumentation_dependencies(self) -> Collection[str]: return _instruments + # pylint: disable=too-many-statements def _instrument(self, **kwargs): # pylint: disable=too-many-branches meter_provider = kwargs.get("meter_provider") 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 fe6d29df00..ad531a30d5 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py @@ -50,7 +50,7 @@ def __init__(self, attributes, value) -> None: self.attributes = attributes self.value = value - +# pylint: disable=too-many-public-methods class TestSystemMetrics(TestBase): def setUp(self): super().setUp() From 54a20b5c788e1d1ffe59e50453834e2445278b9b Mon Sep 17 00:00:00 2001 From: petertamuk Date: Thu, 25 Aug 2022 10:26:28 -0400 Subject: [PATCH 06/11] remove extra return --- .../tests/test_system_metrics.py | 1 - 1 file changed, 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 ad531a30d5..8e5c2571ea 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py @@ -44,7 +44,6 @@ def _mock_netconnection(): ), ] - class _SystemMetricsResult: def __init__(self, attributes, value) -> None: self.attributes = attributes From db6786bc665ddf7f7e0db9832a5b5d22107f269c Mon Sep 17 00:00:00 2001 From: petertamuk Date: Mon, 29 Aug 2022 21:43:22 -0400 Subject: [PATCH 07/11] linting --- .../tests/test_system_metrics.py | 2 ++ 1 file changed, 2 insertions(+) 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 8e5c2571ea..dd1ede0b01 100644 --- a/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py +++ b/instrumentation/opentelemetry-instrumentation-system-metrics/tests/test_system_metrics.py @@ -44,11 +44,13 @@ def _mock_netconnection(): ), ] + class _SystemMetricsResult: def __init__(self, attributes, value) -> None: self.attributes = attributes self.value = value + # pylint: disable=too-many-public-methods class TestSystemMetrics(TestBase): def setUp(self): From 65f5d4c607078acf8f84bbae5cd162c3c9fd78f0 Mon Sep 17 00:00:00 2001 From: petertamuk Date: Tue, 30 Aug 2022 16:49:05 -0400 Subject: [PATCH 08/11] Updates to nonempty descriptions based on spec --- .../system_metrics/__init__.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) 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 5173c7eecc..c3e280a808 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 @@ -276,7 +276,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.disk.operation_time.read", callbacks=[self._get_system_disk_operation_time_read], - description="System disk operation time read", + description="Sum of the time each operation took to complete", unit="seconds", ) @@ -284,7 +284,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.disk.operation_time.write", callbacks=[self._get_system_disk_operation_time_write], - description="System disk operation time write", + description="Sum of the time each operation took to complete", unit="seconds", ) @@ -314,7 +314,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.network.dropped.transmit", callbacks=[self._get_system_network_dropped_transmit], - description="System network dropped packets transmit", + description="Count of packets that are dropped or discarded on transmit even though there was no error", unit="packets", ) @@ -322,7 +322,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.network.dropped.receive", callbacks=[self._get_system_network_dropped_receive], - description="System network dropped packets receive", + description="Count of packets that are dropped or discarded on receive even though there was no error", unit="packets", ) @@ -330,7 +330,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.network.packets.transmit", callbacks=[self._get_system_network_packets_transmit], - description="System network packets transmit", + description="Count of packets transmitted", unit="packets", ) @@ -338,7 +338,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.network.packets.receive", callbacks=[self._get_system_network_packets_receive], - description="System network packets receive", + description="Count of packets received", unit="packets", ) @@ -346,7 +346,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.network.errors.transmit", callbacks=[self._get_system_network_errors_transmit], - description="System network errors transmit", + description="Count of network errors detected on transmit", unit="errors", ) @@ -354,7 +354,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.network.errors.receive", callbacks=[self._get_system_network_errors_receive], - description="System network errors receive", + description="Count of network errors detected on receive", unit="errors", ) @@ -362,7 +362,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.network.io.transmit", callbacks=[self._get_system_network_io_transmit], - description="System network io transmit", + description="Bytes sent", unit="bytes", ) @@ -370,7 +370,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.network.io.receive", callbacks=[self._get_system_network_io_receive], - description="System network io receive", + description="Bytes received", unit="bytes", ) From 98ee72745f8fbdc12202fbc682e412d810e9e602 Mon Sep 17 00:00:00 2001 From: petertamuk Date: Tue, 30 Aug 2022 16:50:45 -0400 Subject: [PATCH 09/11] removal of get_system_dick_merged as its not in use --- .../system_metrics/__init__.py | 19 ------------------- 1 file changed, 19 deletions(-) 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 c3e280a808..360bb7ea3b 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 @@ -569,25 +569,6 @@ def _get_system_disk_operation_time_write( self._system_disk_operation_time_write_labels.copy(), ) - def _get_system_disk_merged( - self, options: CallbackOptions - ) -> Iterable[Observation]: - """Observer callback for disk merged operations""" - - # FIXME The units in the spec is 1, it seems like it should be - # operations or the value type should be Double - # FIXME Metric should be system.disk.merged - - for device, counters in psutil.disk_io_counters(perdisk=True).items(): - for metric in self._config["system.disk.time"]: - if hasattr(counters, f"{metric}_merged_count"): - self._system_disk_merged_labels["device"] = device - self._system_disk_merged_labels["direction"] = metric - yield Observation( - getattr(counters, f"{metric}_merged_count"), - self._system_disk_merged_labels.copy(), - ) - def _get_system_network_dropped_transmit( self, options: CallbackOptions ) -> Iterable[Observation]: From eef3a4a866d85c6ffd582f047101d833a7d1e07c Mon Sep 17 00:00:00 2001 From: petertamuk Date: Tue, 30 Aug 2022 16:53:44 -0400 Subject: [PATCH 10/11] updated code example as well as docstring --- .../system_metrics/__init__.py | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) 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 360bb7ea3b..e492d12f77 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 @@ -25,16 +25,24 @@ "system.memory.utilization": ["used", "free", "cached"], "system.swap.usage": ["used", "free"], "system.swap.utilization": ["used", "free"], - "system.disk.io": ["read", "write"], - "system.disk.operations": ["read", "write"], - "system.disk.time": ["read", "write"], - "system.network.dropped.packets": ["transmit", "receive"], - "system.network.packets": ["transmit", "receive"], - "system.network.errors": ["transmit", "receive"], - "system.network.io": ["transmit", "receive"], + "system.disk.io.read": None, + "system.disk.io.write": None, + "system.disk.operations.read": None, + "system.disk.operations.write": None, + "system.disk.operation_time.read": None, + "system.disk.operation_time.write": None, + "system.network.dropped.transmit": None, + "system.network.dropped.receive": None, + "system.network.packets.transmit": None, + "system.network.packets.receive": None, + "system.network.errors.transmit": None, + "system.network.errors.receive": None, + "system.network.io.transmit": None, + "system.network.io.receive": None, "system.network.connections": ["family", "type"], "runtime.memory": ["rss", "vms"], "runtime.cpu.time": ["user", "system"], + "runtime.gc_count": None } Usage @@ -59,7 +67,8 @@ configuration = { "system.memory.usage": ["used", "free", "cached"], "system.cpu.time": ["idle", "user", "system", "irq"], - "system.network.io": ["transmit", "receive"], + "system.network.io.transmit": None, + "system.network.io.receive": None, "runtime.memory": ["rss", "vms"], "runtime.cpu.time": ["user", "system"], } From 71e96cbf7f15d1145fe6b9b2b44478b9b13b0a01 Mon Sep 17 00:00:00 2001 From: petertamuk Date: Tue, 30 Aug 2022 16:54:56 -0400 Subject: [PATCH 11/11] empty descriptions for 4 metrics to follow spec --- .../instrumentation/system_metrics/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 e492d12f77..d0cd10739c 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 @@ -253,7 +253,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.disk.io.read", callbacks=[self._get_system_disk_io_read], - description="System disk IO read", + description="", unit="bytes", ) @@ -261,7 +261,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.disk.io.write", callbacks=[self._get_system_disk_io_write], - description="System disk IO write", + description="", unit="bytes", ) @@ -269,7 +269,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.disk.operations.read", callbacks=[self._get_system_disk_operations_read], - description="System disk operations read", + description="", unit="operations", ) @@ -277,7 +277,7 @@ def _instrument(self, **kwargs): self._meter.create_observable_counter( name="system.disk.operations.write", callbacks=[self._get_system_disk_operations_write], - description="System disk operations write", + description="", unit="operations", )