From 99a028360eecf205eda6a2886210933b07bdfd6e Mon Sep 17 00:00:00 2001 From: Diego Hurtado Date: Tue, 14 Jun 2022 15:59:32 +0100 Subject: [PATCH] Check keys in config before creating instruments (#1129) * Check keys in config before creating instruments Fixes #1125 * Fix lint --- CHANGELOG.md | 2 + .../system_metrics/__init__.py | 258 ++++++++++-------- 2 files changed, 141 insertions(+), 119 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ea55c217b..c9c9b9e9c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased](https://github.com/open-telemetry/opentelemetry-python/compare/v1.12.0rc1-0.31b0...HEAD) ### Fixed +- Fix bug in system metrics by checking their configuration + ([#1129](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1129)) - Adding escape call to fix [auto-instrumentation not producing spans on Windows](https://github.com/open-telemetry/opentelemetry-python/issues/2703). ([#1100](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1100)) - `opentelemetry-instrumentation-grpc` narrow protobuf dependency to exclude protobuf >= 4 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 7ae82dc55d..a55b346d40 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 @@ -101,6 +101,7 @@ "system.network.connections": ["family", "type"], "runtime.memory": ["rss", "vms"], "runtime.cpu.time": ["user", "system"], + "runtime.gc_count": None, } @@ -149,6 +150,7 @@ def instrumentation_dependencies(self) -> Collection[str]: return _instruments def _instrument(self, **kwargs): + # pylint: disable=too-many-branches meter_provider = kwargs.get("meter_provider") self._meter = get_meter( __name__, @@ -156,47 +158,53 @@ def _instrument(self, **kwargs): meter_provider, ) - self._meter.create_observable_counter( - name="system.cpu.time", - callbacks=[self._get_system_cpu_time], - description="System CPU time", - unit="seconds", - ) + if "system.cpu.time" in self._config: + self._meter.create_observable_counter( + name="system.cpu.time", + callbacks=[self._get_system_cpu_time], + description="System CPU time", + unit="seconds", + ) - self._meter.create_observable_gauge( - name="system.cpu.utilization", - callbacks=[self._get_system_cpu_utilization], - description="System CPU utilization", - unit="1", - ) + if "system.cpu.utilization" in self._config: + self._meter.create_observable_gauge( + name="system.cpu.utilization", + callbacks=[self._get_system_cpu_utilization], + description="System CPU utilization", + unit="1", + ) - self._meter.create_observable_gauge( - name="system.memory.usage", - callbacks=[self._get_system_memory_usage], - description="System memory usage", - unit="bytes", - ) + if "system.memory.usage" in self._config: + self._meter.create_observable_gauge( + name="system.memory.usage", + callbacks=[self._get_system_memory_usage], + description="System memory usage", + unit="bytes", + ) - self._meter.create_observable_gauge( - name="system.memory.utilization", - callbacks=[self._get_system_memory_utilization], - description="System memory utilization", - unit="1", - ) + if "system.memory.utilization" in self._config: + self._meter.create_observable_gauge( + name="system.memory.utilization", + callbacks=[self._get_system_memory_utilization], + description="System memory utilization", + unit="1", + ) - self._meter.create_observable_gauge( - name="system.swap.usage", - callbacks=[self._get_system_swap_usage], - description="System swap usage", - unit="pages", - ) + if "system.swap.usage" in self._config: + self._meter.create_observable_gauge( + name="system.swap.usage", + callbacks=[self._get_system_swap_usage], + description="System swap usage", + unit="pages", + ) - self._meter.create_observable_gauge( - name="system.swap.utilization", - callbacks=[self._get_system_swap_utilization], - description="System swap utilization", - unit="1", - ) + if "system.swap.utilization" in self._config: + self._meter.create_observable_gauge( + name="system.swap.utilization", + callbacks=[self._get_system_swap_utilization], + description="System swap utilization", + unit="1", + ) # TODO Add _get_system_swap_page_faults @@ -217,26 +225,29 @@ def _instrument(self, **kwargs): # value_type=int, # ) - self._meter.create_observable_counter( - name="system.disk.io", - callbacks=[self._get_system_disk_io], - description="System disk IO", - unit="bytes", - ) + if "system.disk.io" in self._config: + self._meter.create_observable_counter( + name="system.disk.io", + callbacks=[self._get_system_disk_io], + description="System disk IO", + unit="bytes", + ) - self._meter.create_observable_counter( - name="system.disk.operations", - callbacks=[self._get_system_disk_operations], - description="System disk operations", - unit="operations", - ) + if "system.disk.operations" in self._config: + self._meter.create_observable_counter( + name="system.disk.operations", + callbacks=[self._get_system_disk_operations], + description="System disk operations", + unit="operations", + ) - self._meter.create_observable_counter( - name="system.disk.time", - callbacks=[self._get_system_disk_time], - description="System disk time", - unit="seconds", - ) + if "system.disk.time" in self._config: + self._meter.create_observable_counter( + name="system.disk.time", + callbacks=[self._get_system_disk_time], + description="System disk time", + unit="seconds", + ) # TODO Add _get_system_filesystem_usage @@ -260,61 +271,69 @@ def _instrument(self, **kwargs): # TODO Filesystem information can be obtained with os.statvfs in Unix-like # OSs, how to do the same in Windows? - self._meter.create_observable_counter( - name="system.network.dropped_packets", - callbacks=[self._get_system_network_dropped_packets], - description="System network dropped_packets", - unit="packets", - ) + if "system.network.dropped.packets" 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", + unit="packets", + ) - self._meter.create_observable_counter( - name="system.network.packets", - callbacks=[self._get_system_network_packets], - description="System network packets", - unit="packets", - ) + if "system.network.packets" in self._config: + self._meter.create_observable_counter( + name="system.network.packets", + callbacks=[self._get_system_network_packets], + description="System network packets", + unit="packets", + ) - self._meter.create_observable_counter( - name="system.network.errors", - callbacks=[self._get_system_network_errors], - description="System network errors", - unit="errors", - ) + if "system.network.errors" in self._config: + self._meter.create_observable_counter( + name="system.network.errors", + callbacks=[self._get_system_network_errors], + description="System network errors", + unit="errors", + ) - self._meter.create_observable_counter( - name="system.network.io", - callbacks=[self._get_system_network_io], - description="System network io", - unit="bytes", - ) + if "system.network.io" in self._config: + self._meter.create_observable_counter( + name="system.network.io", + callbacks=[self._get_system_network_io], + description="System network io", + unit="bytes", + ) - self._meter.create_observable_up_down_counter( - name="system.network.connections", - callbacks=[self._get_system_network_connections], - description="System network connections", - unit="connections", - ) + if "system.network.connections" in self._config: + self._meter.create_observable_up_down_counter( + name="system.network.connections", + callbacks=[self._get_system_network_connections], + description="System network connections", + unit="connections", + ) - self._meter.create_observable_counter( - name=f"runtime.{self._python_implementation}.memory", - callbacks=[self._get_runtime_memory], - description=f"Runtime {self._python_implementation} memory", - unit="bytes", - ) + if "runtime.memory" in self._config: + self._meter.create_observable_counter( + name=f"runtime.{self._python_implementation}.memory", + callbacks=[self._get_runtime_memory], + description=f"Runtime {self._python_implementation} memory", + unit="bytes", + ) - self._meter.create_observable_counter( - name=f"runtime.{self._python_implementation}.cpu_time", - callbacks=[self._get_runtime_cpu_time], - description=f"Runtime {self._python_implementation} CPU time", - unit="seconds", - ) + if "runtime.cpu.time" in self._config: + self._meter.create_observable_counter( + name=f"runtime.{self._python_implementation}.cpu_time", + callbacks=[self._get_runtime_cpu_time], + description=f"Runtime {self._python_implementation} CPU time", + unit="seconds", + ) - self._meter.create_observable_counter( - name=f"runtime.{self._python_implementation}.gc_count", - callbacks=[self._get_runtime_gc_count], - description=f"Runtime {self._python_implementation} GC count", - unit="bytes", - ) + if "runtime.gc_count" in self._config: + self._meter.create_observable_counter( + name=f"runtime.{self._python_implementation}.gc_count", + callbacks=[self._get_runtime_gc_count], + description=f"Runtime {self._python_implementation} GC count", + unit="bytes", + ) def _uninstrument(self, **__): pass @@ -329,7 +348,8 @@ def _get_system_cpu_time( self._system_cpu_time_labels["state"] = metric self._system_cpu_time_labels["cpu"] = cpu + 1 yield Observation( - getattr(times, metric), self._system_cpu_time_labels + getattr(times, metric), + self._system_cpu_time_labels.copy(), ) def _get_system_cpu_utilization( @@ -346,7 +366,7 @@ def _get_system_cpu_utilization( self._system_cpu_utilization_labels["cpu"] = cpu + 1 yield Observation( getattr(times_percent, metric) / 100, - self._system_cpu_utilization_labels, + self._system_cpu_utilization_labels.copy(), ) def _get_system_memory_usage( @@ -359,7 +379,7 @@ def _get_system_memory_usage( if hasattr(virtual_memory, metric): yield Observation( getattr(virtual_memory, metric), - self._system_memory_usage_labels, + self._system_memory_usage_labels.copy(), ) def _get_system_memory_utilization( @@ -373,7 +393,7 @@ def _get_system_memory_utilization( if hasattr(system_memory, metric): yield Observation( getattr(system_memory, metric) / system_memory.total, - self._system_memory_utilization_labels, + self._system_memory_utilization_labels.copy(), ) def _get_system_swap_usage( @@ -387,7 +407,7 @@ def _get_system_swap_usage( if hasattr(system_swap, metric): yield Observation( getattr(system_swap, metric), - self._system_swap_usage_labels, + self._system_swap_usage_labels.copy(), ) def _get_system_swap_utilization( @@ -401,7 +421,7 @@ def _get_system_swap_utilization( self._system_swap_utilization_labels["state"] = metric yield Observation( getattr(system_swap, metric) / system_swap.total, - self._system_swap_utilization_labels, + self._system_swap_utilization_labels.copy(), ) def _get_system_disk_io( @@ -415,7 +435,7 @@ def _get_system_disk_io( self._system_disk_io_labels["direction"] = metric yield Observation( getattr(counters, f"{metric}_bytes"), - self._system_disk_io_labels, + self._system_disk_io_labels.copy(), ) def _get_system_disk_operations( @@ -429,7 +449,7 @@ def _get_system_disk_operations( self._system_disk_operations_labels["direction"] = metric yield Observation( getattr(counters, f"{metric}_count"), - self._system_disk_operations_labels, + self._system_disk_operations_labels.copy(), ) def _get_system_disk_time( @@ -443,7 +463,7 @@ def _get_system_disk_time( self._system_disk_time_labels["direction"] = metric yield Observation( getattr(counters, f"{metric}_time") / 1000, - self._system_disk_time_labels, + self._system_disk_time_labels.copy(), ) def _get_system_disk_merged( @@ -461,7 +481,7 @@ def _get_system_disk_merged( self._system_disk_merged_labels["direction"] = metric yield Observation( getattr(counters, f"{metric}_merged_count"), - self._system_disk_merged_labels, + self._system_disk_merged_labels.copy(), ) def _get_system_network_dropped_packets( @@ -481,7 +501,7 @@ def _get_system_network_dropped_packets( ] = metric yield Observation( getattr(counters, f"drop{in_out}"), - self._system_network_dropped_packets_labels, + self._system_network_dropped_packets_labels.copy(), ) def _get_system_network_packets( @@ -497,7 +517,7 @@ def _get_system_network_packets( self._system_network_packets_labels["direction"] = metric yield Observation( getattr(counters, f"packets_{recv_sent}"), - self._system_network_packets_labels, + self._system_network_packets_labels.copy(), ) def _get_system_network_errors( @@ -512,7 +532,7 @@ def _get_system_network_errors( self._system_network_errors_labels["direction"] = metric yield Observation( getattr(counters, f"err{in_out}"), - self._system_network_errors_labels, + self._system_network_errors_labels.copy(), ) def _get_system_network_io( @@ -528,7 +548,7 @@ def _get_system_network_io( self._system_network_io_labels["direction"] = metric yield Observation( getattr(counters, f"bytes_{recv_sent}"), - self._system_network_io_labels, + self._system_network_io_labels.copy(), ) def _get_system_network_connections( @@ -581,7 +601,7 @@ def _get_runtime_memory( self._runtime_memory_labels["type"] = metric yield Observation( getattr(proc_memory, metric), - self._runtime_memory_labels, + self._runtime_memory_labels.copy(), ) def _get_runtime_cpu_time( @@ -594,7 +614,7 @@ def _get_runtime_cpu_time( self._runtime_cpu_time_labels["type"] = metric yield Observation( getattr(proc_cpu, metric), - self._runtime_cpu_time_labels, + self._runtime_cpu_time_labels.copy(), ) def _get_runtime_gc_count( @@ -603,4 +623,4 @@ def _get_runtime_gc_count( """Observer callback for garbage collection""" for index, count in enumerate(gc.get_count()): self._runtime_gc_count_labels["count"] = str(index) - yield Observation(count, self._runtime_gc_count_labels) + yield Observation(count, self._runtime_gc_count_labels.copy())