code: def probe(self) -> dict:
      asset_info = {
          "cpu_count": psutil.cpu_count(logical=False),
          "cpu_count_logical": psutil.cpu_count(logical=True),
      }
      try:
          asset_info["cpu_freq"] = {
              "current": psutil.cpu_freq().current,
              "min": psutil.cpu_freq().min,
              "max": psutil.cpu_freq().max,
          }
          asset_info["cpu_freq_per_core"] = [
              {
                  "current": freq.current,
                  "min": freq.min,
                  "max": freq.max,
              }
              for freq in psutil.cpu_freq(percpu=True)
          ]
      except Exception:
          pass
      return asset_info
  
imports: import threading
  from collections import deque
  from typing import TYPE_CHECKING, List, Optional
  from .aggregators import aggregate_last, aggregate_mean
  from .asset_registry import asset_registry
  from .interfaces import Interface, Metric, MetricsMonitor
label_desc: Use image node_id 3 for calling the CPU obj's underlying member method code with example usage: obj.probe() and returns: asset_info