Skip to content

Commit f9218ca

Browse files
author
alrex
authored
Fix issue when metrics are not available (#1207)
Not all configured metrics are available on all operating systems, added a hasattr call before calling the observer.
1 parent b565d6b commit f9218ca

File tree

2 files changed

+107
-85
lines changed
  • instrumentation/opentelemetry-instrumentation-system-metrics

2 files changed

+107
-85
lines changed

instrumentation/opentelemetry-instrumentation-system-metrics/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## Unreleased
44

5+
- Fix issue when specific metrics are not available in certain OS
6+
([#1207](https://github.com/open-telemetry/opentelemetry-python/pull/1207))
7+
58
## Version 0.13b0
69

710
Released 2020-09-17

instrumentation/opentelemetry-instrumentation-system-metrics/src/opentelemetry/instrumentation/system_metrics/__init__.py

Lines changed: 104 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -372,11 +372,12 @@ def _get_system_cpu_time(self, observer: metrics.ValueObserver) -> None:
372372
"""
373373
for cpu, times in enumerate(psutil.cpu_times(percpu=True)):
374374
for metric in self._config["system.cpu.time"]:
375-
self._system_cpu_time_labels["state"] = metric
376-
self._system_cpu_time_labels["cpu"] = cpu + 1
377-
observer.observe(
378-
getattr(times, metric), self._system_cpu_time_labels
379-
)
375+
if hasattr(times, metric):
376+
self._system_cpu_time_labels["state"] = metric
377+
self._system_cpu_time_labels["cpu"] = cpu + 1
378+
observer.observe(
379+
getattr(times, metric), self._system_cpu_time_labels
380+
)
380381

381382
def _get_system_cpu_utilization(
382383
self, observer: metrics.ValueObserver
@@ -391,12 +392,13 @@ def _get_system_cpu_utilization(
391392
psutil.cpu_times_percent(percpu=True)
392393
):
393394
for metric in self._config["system.cpu.utilization"]:
394-
self._system_cpu_utilization_labels["state"] = metric
395-
self._system_cpu_utilization_labels["cpu"] = cpu + 1
396-
observer.observe(
397-
getattr(times_percent, metric) / 100,
398-
self._system_cpu_utilization_labels,
399-
)
395+
if hasattr(times_percent, metric):
396+
self._system_cpu_utilization_labels["state"] = metric
397+
self._system_cpu_utilization_labels["cpu"] = cpu + 1
398+
observer.observe(
399+
getattr(times_percent, metric) / 100,
400+
self._system_cpu_utilization_labels,
401+
)
400402

401403
def _get_system_memory_usage(
402404
self, observer: metrics.ValueObserver
@@ -409,10 +411,11 @@ def _get_system_memory_usage(
409411
virtual_memory = psutil.virtual_memory()
410412
for metric in self._config["system.memory.usage"]:
411413
self._system_memory_usage_labels["state"] = metric
412-
observer.observe(
413-
getattr(virtual_memory, metric),
414-
self._system_memory_usage_labels,
415-
)
414+
if hasattr(virtual_memory, metric):
415+
observer.observe(
416+
getattr(virtual_memory, metric),
417+
self._system_memory_usage_labels,
418+
)
416419

417420
def _get_system_memory_utilization(
418421
self, observer: metrics.ValueObserver
@@ -426,10 +429,11 @@ def _get_system_memory_utilization(
426429

427430
for metric in self._config["system.memory.utilization"]:
428431
self._system_memory_utilization_labels["state"] = metric
429-
observer.observe(
430-
getattr(system_memory, metric) / system_memory.total,
431-
self._system_memory_utilization_labels,
432-
)
432+
if hasattr(system_memory, metric):
433+
observer.observe(
434+
getattr(system_memory, metric) / system_memory.total,
435+
self._system_memory_utilization_labels,
436+
)
433437

434438
def _get_system_swap_usage(self, observer: metrics.ValueObserver) -> None:
435439
"""Observer callback for swap usage
@@ -441,9 +445,11 @@ def _get_system_swap_usage(self, observer: metrics.ValueObserver) -> None:
441445

442446
for metric in self._config["system.swap.usage"]:
443447
self._system_swap_usage_labels["state"] = metric
444-
observer.observe(
445-
getattr(system_swap, metric), self._system_swap_usage_labels
446-
)
448+
if hasattr(system_swap, metric):
449+
observer.observe(
450+
getattr(system_swap, metric),
451+
self._system_swap_usage_labels,
452+
)
447453

448454
def _get_system_swap_utilization(
449455
self, observer: metrics.ValueObserver
@@ -456,11 +462,12 @@ def _get_system_swap_utilization(
456462
system_swap = psutil.swap_memory()
457463

458464
for metric in self._config["system.swap.utilization"]:
459-
self._system_swap_utilization_labels["state"] = metric
460-
observer.observe(
461-
getattr(system_swap, metric) / system_swap.total,
462-
self._system_swap_utilization_labels,
463-
)
465+
if hasattr(system_swap, metric):
466+
self._system_swap_utilization_labels["state"] = metric
467+
observer.observe(
468+
getattr(system_swap, metric) / system_swap.total,
469+
self._system_swap_utilization_labels,
470+
)
464471

465472
# TODO Add _get_system_swap_page_faults
466473
# TODO Add _get_system_swap_page_operations
@@ -473,12 +480,13 @@ def _get_system_disk_io(self, observer: metrics.SumObserver) -> None:
473480
"""
474481
for device, counters in psutil.disk_io_counters(perdisk=True).items():
475482
for metric in self._config["system.disk.io"]:
476-
self._system_disk_io_labels["device"] = device
477-
self._system_disk_io_labels["direction"] = metric
478-
observer.observe(
479-
getattr(counters, "{}_bytes".format(metric)),
480-
self._system_disk_io_labels,
481-
)
483+
if hasattr(counters, "{}_bytes".format(metric)):
484+
self._system_disk_io_labels["device"] = device
485+
self._system_disk_io_labels["direction"] = metric
486+
observer.observe(
487+
getattr(counters, "{}_bytes".format(metric)),
488+
self._system_disk_io_labels,
489+
)
482490

483491
def _get_system_disk_operations(
484492
self, observer: metrics.SumObserver
@@ -490,12 +498,13 @@ def _get_system_disk_operations(
490498
"""
491499
for device, counters in psutil.disk_io_counters(perdisk=True).items():
492500
for metric in self._config["system.disk.operations"]:
493-
self._system_disk_operations_labels["device"] = device
494-
self._system_disk_operations_labels["direction"] = metric
495-
observer.observe(
496-
getattr(counters, "{}_count".format(metric)),
497-
self._system_disk_operations_labels,
498-
)
501+
if hasattr(counters, "{}_count".format(metric)):
502+
self._system_disk_operations_labels["device"] = device
503+
self._system_disk_operations_labels["direction"] = metric
504+
observer.observe(
505+
getattr(counters, "{}_count".format(metric)),
506+
self._system_disk_operations_labels,
507+
)
499508

500509
def _get_system_disk_time(self, observer: metrics.SumObserver) -> None:
501510
"""Observer callback for disk time
@@ -505,12 +514,13 @@ def _get_system_disk_time(self, observer: metrics.SumObserver) -> None:
505514
"""
506515
for device, counters in psutil.disk_io_counters(perdisk=True).items():
507516
for metric in self._config["system.disk.time"]:
508-
self._system_disk_time_labels["device"] = device
509-
self._system_disk_time_labels["direction"] = metric
510-
observer.observe(
511-
getattr(counters, "{}_time".format(metric)) / 1000,
512-
self._system_disk_time_labels,
513-
)
517+
if hasattr(counters, "{}_time".format(metric)):
518+
self._system_disk_time_labels["device"] = device
519+
self._system_disk_time_labels["direction"] = metric
520+
observer.observe(
521+
getattr(counters, "{}_time".format(metric)) / 1000,
522+
self._system_disk_time_labels,
523+
)
514524

515525
def _get_system_disk_merged(self, observer: metrics.SumObserver) -> None:
516526
"""Observer callback for disk merged operations
@@ -524,12 +534,13 @@ def _get_system_disk_merged(self, observer: metrics.SumObserver) -> None:
524534

525535
for device, counters in psutil.disk_io_counters(perdisk=True).items():
526536
for metric in self._config["system.disk.time"]:
527-
self._system_disk_merged_labels["device"] = device
528-
self._system_disk_merged_labels["direction"] = metric
529-
observer.observe(
530-
getattr(counters, "{}_merged_count".format(metric)),
531-
self._system_disk_merged_labels,
532-
)
537+
if hasattr(counters, "{}_merged_count".format(metric)):
538+
self._system_disk_merged_labels["device"] = device
539+
self._system_disk_merged_labels["direction"] = metric
540+
observer.observe(
541+
getattr(counters, "{}_merged_count".format(metric)),
542+
self._system_disk_merged_labels,
543+
)
533544

534545
# TODO Add _get_system_filesystem_usage
535546
# TODO Add _get_system_filesystem_utilization
@@ -548,14 +559,17 @@ def _get_system_network_dropped_packets(
548559
for device, counters in psutil.net_io_counters(pernic=True).items():
549560
for metric in self._config["system.network.dropped.packets"]:
550561
in_out = {"receive": "in", "transmit": "out"}[metric]
551-
self._system_network_dropped_packets_labels["device"] = device
552-
self._system_network_dropped_packets_labels[
553-
"direction"
554-
] = metric
555-
observer.observe(
556-
getattr(counters, "drop{}".format(in_out)),
557-
self._system_network_dropped_packets_labels,
558-
)
562+
if hasattr(counters, "drop{}".format(in_out)):
563+
self._system_network_dropped_packets_labels[
564+
"device"
565+
] = device
566+
self._system_network_dropped_packets_labels[
567+
"direction"
568+
] = metric
569+
observer.observe(
570+
getattr(counters, "drop{}".format(in_out)),
571+
self._system_network_dropped_packets_labels,
572+
)
559573

560574
def _get_system_network_packets(
561575
self, observer: metrics.SumObserver
@@ -569,12 +583,13 @@ def _get_system_network_packets(
569583
for device, counters in psutil.net_io_counters(pernic=True).items():
570584
for metric in self._config["system.network.dropped.packets"]:
571585
recv_sent = {"receive": "recv", "transmit": "sent"}[metric]
572-
self._system_network_packets_labels["device"] = device
573-
self._system_network_packets_labels["direction"] = metric
574-
observer.observe(
575-
getattr(counters, "packets_{}".format(recv_sent)),
576-
self._system_network_packets_labels,
577-
)
586+
if hasattr(counters, "packets_{}".format(recv_sent)):
587+
self._system_network_packets_labels["device"] = device
588+
self._system_network_packets_labels["direction"] = metric
589+
observer.observe(
590+
getattr(counters, "packets_{}".format(recv_sent)),
591+
self._system_network_packets_labels,
592+
)
578593

579594
def _get_system_network_errors(
580595
self, observer: metrics.SumObserver
@@ -587,12 +602,13 @@ def _get_system_network_errors(
587602
for device, counters in psutil.net_io_counters(pernic=True).items():
588603
for metric in self._config["system.network.errors"]:
589604
in_out = {"receive": "in", "transmit": "out"}[metric]
590-
self._system_network_errors_labels["device"] = device
591-
self._system_network_errors_labels["direction"] = metric
592-
observer.observe(
593-
getattr(counters, "err{}".format(in_out)),
594-
self._system_network_errors_labels,
595-
)
605+
if hasattr(counters, "err{}".format(in_out)):
606+
self._system_network_errors_labels["device"] = device
607+
self._system_network_errors_labels["direction"] = metric
608+
observer.observe(
609+
getattr(counters, "err{}".format(in_out)),
610+
self._system_network_errors_labels,
611+
)
596612

597613
def _get_system_network_io(self, observer: metrics.SumObserver) -> None:
598614
"""Observer callback for network IO
@@ -604,12 +620,13 @@ def _get_system_network_io(self, observer: metrics.SumObserver) -> None:
604620
for device, counters in psutil.net_io_counters(pernic=True).items():
605621
for metric in self._config["system.network.dropped.packets"]:
606622
recv_sent = {"receive": "recv", "transmit": "sent"}[metric]
607-
self._system_network_io_labels["device"] = device
608-
self._system_network_io_labels["direction"] = metric
609-
observer.observe(
610-
getattr(counters, "bytes_{}".format(recv_sent)),
611-
self._system_network_io_labels,
612-
)
623+
if hasattr(counters, "bytes_{}".format(recv_sent)):
624+
self._system_network_io_labels["device"] = device
625+
self._system_network_io_labels["direction"] = metric
626+
observer.observe(
627+
getattr(counters, "bytes_{}".format(recv_sent)),
628+
self._system_network_io_labels,
629+
)
613630

614631
def _get_system_network_connections(
615632
self, observer: metrics.UpDownSumObserver
@@ -662,10 +679,11 @@ def _get_runtime_memory(self, observer: metrics.SumObserver) -> None:
662679
"""
663680
proc_memory = self._proc.memory_info()
664681
for metric in self._config["runtime.memory"]:
665-
self._runtime_memory_labels["type"] = metric
666-
observer.observe(
667-
getattr(proc_memory, metric), self._runtime_memory_labels,
668-
)
682+
if hasattr(proc_memory, metric):
683+
self._runtime_memory_labels["type"] = metric
684+
observer.observe(
685+
getattr(proc_memory, metric), self._runtime_memory_labels,
686+
)
669687

670688
def _get_runtime_cpu_time(self, observer: metrics.SumObserver) -> None:
671689
"""Observer callback for runtime CPU time
@@ -675,10 +693,11 @@ def _get_runtime_cpu_time(self, observer: metrics.SumObserver) -> None:
675693
"""
676694
proc_cpu = self._proc.cpu_times()
677695
for metric in self._config["runtime.cpu.time"]:
678-
self._runtime_cpu_time_labels["type"] = metric
679-
observer.observe(
680-
getattr(proc_cpu, metric), self._runtime_cpu_time_labels,
681-
)
696+
if hasattr(proc_cpu, metric):
697+
self._runtime_cpu_time_labels["type"] = metric
698+
observer.observe(
699+
getattr(proc_cpu, metric), self._runtime_cpu_time_labels,
700+
)
682701

683702
def _get_runtime_gc_count(self, observer: metrics.SumObserver) -> None:
684703
"""Observer callback for garbage collection

0 commit comments

Comments
 (0)