diff --git a/docs/PLUGIN_DOC.md b/docs/PLUGIN_DOC.md
index 63002024..18c7bde4 100644
--- a/docs/PLUGIN_DOC.md
+++ b/docs/PLUGIN_DOC.md
@@ -5,11 +5,11 @@
| Plugin | Collection | Analyzer Args | Collection Args | DataModel | Collector | Analyzer |
| --- | --- | --- | --- | --- | --- | --- |
| GenericCollectionPlugin | Runs each command from collection_args.commands on the target (in-band host or BMC over OOB SSH).
Commands are user-configured; there are no fixed CMD_\* class fields. | **Analyzer Args:**
- `checks`: list[nodescraper.plugins.generic_collection.analyzer_args.CommandCheck] — Per-command validation rules keyed by collected command name. | **Collection Args:**
- `html_view`: bool — When true, include logged command artifacts in command_artifacts.html using human-readable output.
- `commands`: list[nodescraper.plugins.generic_collection.collector_args.CommandSpec] — Named commands to run. Each entry must include 'name' and 'command'. Prefer small textual stdout; see class docstring...
- `sudo`: bool — Default sudo setting for commands that do not specify sudo.
- `timeout`: int — Default per-command timeout in seconds.
- `include_stdout`: bool — Default: include each command's stdout in collected results for analysis. When false, stdout is omitted from stored r... | [GenericCollectionDataModel](#GenericCollectionDataModel-Model) | [GenericCollectionCollector](#Collector-Class-GenericCollectionCollector) | [GenericAnalyzer](#Data-Analyzer-Class-GenericAnalyzer) |
-| AmdSmiFlavorPlugin | bad-pages
metric --cpu-dimm-pow-consumption {dimm_addr}
metric --cpu-dimm-temp-range-rate {dimm_addr}
metric --cpu-dimm-thermal-sensor {dimm_addr}
metric --cpu-io-bandwidth {bw} {link_id}
metric --cpu-lclk-dpm-level {nbio_id}
metric --cpu-svi3-vr-controller-temp 0
metric --cpu-svi3-vr-controller-temp 1 {rail_index}
metric --cpu-xgmi-bandwidth {bw} {link_id}
fabric
firmware
list
metric -g all
metric --core all
metric --cpu all
node
partition
process
ras --cper --folder={folder}
ras --afid --cper-file {cper_file}
static -g all
static -g {gpu_id}
topology
version
xgmi -l
xgmi -m | **Analyzer Args:**
- `check_static_data`: bool — If True, run static data checks (e.g. driver version, partition mode).
- `expected_gpu_processes`: Optional[int] — Expected number of GPU processes.
- `expected_max_power`: Optional[int] — Expected maximum power value (e.g. watts).
- `power`: Optional[nodescraper.plugins.inband.amdsmi.analyzer_args.PowerConfig] — GPU power-cap consistency policy.
- `expected_power_management`: Optional[str] — Expected amd-smi metric power_management value per GPU (e.g. DISABLED for active/full power, ENABLED for power-manage...
- `expected_driver_version`: Optional[str] — Expected AMD driver version string.
- `expected_memory_partition_mode`: Optional[str] — Expected memory partition mode (e.g. sp3, dp).
- `expected_compute_partition_mode`: Optional[str] — Expected compute partition mode.
- `expected_firmware_versions`: Optional[dict[str, str]] — Expected firmware versions keyed by amd-smi fw_id (e.g. PLDM_BUNDLE).
- `gpu_memory`: Optional[nodescraper.plugins.inband.amdsmi.analyzer_args.GpuMemoryConfig] — Minimum free VRAM threshold to validate for each GPU.
- `check_xgmi_or_peer_links_status`: bool — Check XGMI or peer-link status for each GPU.
- `l0_to_recovery_count_error_threshold`: Optional[int] — L0-to-recovery count above which an error is raised.
- `l0_to_recovery_count_warning_threshold`: Optional[int] — L0-to-recovery count above which a warning is raised.
- `vendorid_ep`: Optional[str] — Expected endpoint vendor ID (e.g. for PCIe).
- `vendorid_ep_vf`: Optional[str] — Expected endpoint VF vendor ID.
- `devid_ep`: Optional[str] — Expected endpoint device ID.
- `devid_ep_vf`: Optional[str] — Expected endpoint VF device ID.
- `sku_name`: Optional[str] — Expected SKU name string for GPU.
- `expected_xgmi_speed`: Optional[list[float]] — Expected xGMI speed value(s) (e.g. link rate).
- `expected_accel_state`: str — Expected amd-smi fabric accel_state value.
- `expected_fabric_type`: str — Expected amd-smi fabric fabric_type value.
- `analysis_range_start`: Optional[datetime.datetime] — Start of time range for time-windowed analysis.
- `analysis_range_end`: Optional[datetime.datetime] — End of time range for time-windowed analysis. | **Collection Args:**
- `html_view`: bool — When true, include logged command artifacts in command_artifacts.html using human-readable output.
- `analysis_firmware_ids`: Optional[list[str]] — amd-smi fw_id values to record in analysis_ref.firmware_versions
- `cper_file_path`: Optional[str] — Path to CPER folder or file for RAS AFID collection (ras --afid --cper-file). | [AmdSmiFlavorDataModel](#AmdSmiFlavorDataModel-Model) | [AmdSmiFlavorCollector](#Collector-Class-AmdSmiFlavorCollector) | [AmdSmiAnalyzer](#Data-Analyzer-Class-AmdSmiAnalyzer) |
-| AmdSmiPlugin | bad-pages
metric --cpu-dimm-pow-consumption {dimm_addr}
metric --cpu-dimm-temp-range-rate {dimm_addr}
metric --cpu-dimm-thermal-sensor {dimm_addr}
metric --cpu-io-bandwidth {bw} {link_id}
metric --cpu-lclk-dpm-level {nbio_id}
metric --cpu-svi3-vr-controller-temp 0
metric --cpu-svi3-vr-controller-temp 1 {rail_index}
metric --cpu-xgmi-bandwidth {bw} {link_id}
fabric
firmware
list
metric -g all
metric --core all
metric --cpu all
node
partition
process
ras --cper --folder={folder}
ras --afid --cper-file {cper_file}
static -g all
static -g {gpu_id}
topology
version
xgmi -l
xgmi -m | **Analyzer Args:**
- `check_static_data`: bool — If True, run static data checks (e.g. driver version, partition mode).
- `expected_gpu_processes`: Optional[int] — Expected number of GPU processes.
- `expected_max_power`: Optional[int] — Expected maximum power value (e.g. watts).
- `power`: Optional[nodescraper.plugins.inband.amdsmi.analyzer_args.PowerConfig] — GPU power-cap consistency policy.
- `expected_power_management`: Optional[str] — Expected amd-smi metric power_management value per GPU (e.g. DISABLED for active/full power, ENABLED for power-manage...
- `expected_driver_version`: Optional[str] — Expected AMD driver version string.
- `expected_memory_partition_mode`: Optional[str] — Expected memory partition mode (e.g. sp3, dp).
- `expected_compute_partition_mode`: Optional[str] — Expected compute partition mode.
- `expected_firmware_versions`: Optional[dict[str, str]] — Expected firmware versions keyed by amd-smi fw_id (e.g. PLDM_BUNDLE).
- `gpu_memory`: Optional[nodescraper.plugins.inband.amdsmi.analyzer_args.GpuMemoryConfig] — Minimum free VRAM threshold to validate for each GPU.
- `check_xgmi_or_peer_links_status`: bool — Check XGMI or peer-link status for each GPU.
- `l0_to_recovery_count_error_threshold`: Optional[int] — L0-to-recovery count above which an error is raised.
- `l0_to_recovery_count_warning_threshold`: Optional[int] — L0-to-recovery count above which a warning is raised.
- `vendorid_ep`: Optional[str] — Expected endpoint vendor ID (e.g. for PCIe).
- `vendorid_ep_vf`: Optional[str] — Expected endpoint VF vendor ID.
- `devid_ep`: Optional[str] — Expected endpoint device ID.
- `devid_ep_vf`: Optional[str] — Expected endpoint VF device ID.
- `sku_name`: Optional[str] — Expected SKU name string for GPU.
- `expected_xgmi_speed`: Optional[list[float]] — Expected xGMI speed value(s) (e.g. link rate).
- `expected_accel_state`: str — Expected amd-smi fabric accel_state value.
- `expected_fabric_type`: str — Expected amd-smi fabric fabric_type value.
- `analysis_range_start`: Optional[datetime.datetime] — Start of time range for time-windowed analysis.
- `analysis_range_end`: Optional[datetime.datetime] — End of time range for time-windowed analysis. | **Collection Args:**
- `html_view`: bool — When true, include logged command artifacts in command_artifacts.html using human-readable output.
- `analysis_firmware_ids`: Optional[list[str]] — amd-smi fw_id values to record in analysis_ref.firmware_versions
- `cper_file_path`: Optional[str] — Path to CPER folder or file for RAS AFID collection (ras --afid --cper-file). | [AmdSmiDataModel](#AmdSmiDataModel-Model) | [AmdSmiCollector](#Collector-Class-AmdSmiCollector) | [AmdSmiAnalyzer](#Data-Analyzer-Class-AmdSmiAnalyzer) |
-| BiosPlugin | sh -c 'cat /sys/devices/virtual/dmi/id/bios_version'
smbiosDump | grep -A5 'BIOS Info (Type 0)' | grep 'Version:' | head -1
wmic bios get SMBIOSBIOSVersion /Value | **Analyzer Args:**
- `exp_bios_version`: list[str] — Expected BIOS version(s) to match against collected value (str or list).
- `regex_match`: bool — If True, match exp_bios_version as regex; otherwise exact match. | - | [BiosDataModel](#BiosDataModel-Model) | [BiosCollector](#Collector-Class-BiosCollector) | [BiosAnalyzer](#Data-Analyzer-Class-BiosAnalyzer) |
+| AmdSmiFlavorPlugin | bad-pages
metric --cpu-dimm-pow-consumption {dimm_addr}
metric --cpu-dimm-temp-range-rate {dimm_addr}
metric --cpu-dimm-thermal-sensor {dimm_addr}
metric --cpu-io-bandwidth {bw} {link_id}
metric --cpu-lclk-dpm-level {nbio_id}
metric --cpu-svi3-vr-controller-temp 0
metric --cpu-svi3-vr-controller-temp 1 {rail_index}
metric --cpu-xgmi-bandwidth {bw} {link_id}
fabric
firmware
list
metric -g all
metric --core all
metric --cpu all
node
partition
process
ras --cper --folder={folder}
ras --afid --cper-file {cper_file}
static -g all
static -g {gpu_id}
topology
version
xgmi -l
xgmi -m | **Analyzer Args:**
- `check_static_data`: bool — If True, run static data checks (e.g. driver version, partition mode).
- `expected_gpu_processes`: Optional[int] — Expected number of GPU processes.
- `expected_max_power`: Optional[int] — Expected maximum power value (e.g. watts).
- `power`: Optional[nodescraper.plugins.inband.amdsmi.analyzer_args.PowerConfig] — GPU power-cap consistency policy.
- `expected_power_management`: Optional[str] — Expected amd-smi metric power_management value per GPU (e.g. DISABLED for active/full power, ENABLED for power-manage...
- `expected_driver_version`: Optional[str] — Expected AMD driver version string.
- `expected_memory_partition_mode`: Optional[str] — Expected memory partition mode (e.g. sp3, dp).
- `expected_compute_partition_mode`: Optional[str] — Expected compute partition mode.
- `expected_firmware_versions`: Optional[dict[str, str]] — Expected firmware versions keyed by amd-smi fw_id (e.g. PLDM_BUNDLE).
- `gpu_memory`: Optional[nodescraper.plugins.inband.amdsmi.analyzer_args.GpuMemoryConfig] — Minimum free VRAM threshold to validate for each GPU.
- `min_hbm_gib_per_gpu`: Optional[float] — Minimum HBM capacity in GiB required on each GPU. Compared to amd-smi static vram size.
- `ecc_required`: bool — When true, require UMC RAS ENABLED on each GPU. That block state is the in-band proxy for HBM ECC being on.
- `check_xgmi_or_peer_links_status`: bool — Check XGMI or peer-link status for each GPU.
- `l0_to_recovery_count_error_threshold`: Optional[int] — L0-to-recovery count above which an error is raised.
- `l0_to_recovery_count_warning_threshold`: Optional[int] — L0-to-recovery count above which a warning is raised.
- `vendorid_ep`: Optional[str] — Expected endpoint vendor ID (e.g. for PCIe).
- `vendorid_ep_vf`: Optional[str] — Expected endpoint VF vendor ID.
- `devid_ep`: Optional[str] — Expected endpoint device ID.
- `devid_ep_vf`: Optional[str] — Expected endpoint VF device ID.
- `sku_name`: Optional[str] — Expected SKU name string for GPU.
- `expected_xgmi_speed`: Optional[list[float]] — Expected xGMI speed value(s) (e.g. link rate).
- `expected_accel_state`: str — Expected amd-smi fabric accel_state value.
- `expected_fabric_type`: str — Expected amd-smi fabric fabric_type value.
- `analysis_range_start`: Optional[datetime.datetime] — Start of time range for time-windowed analysis.
- `analysis_range_end`: Optional[datetime.datetime] — End of time range for time-windowed analysis. | **Collection Args:**
- `html_view`: bool — When true, include logged command artifacts in command_artifacts.html using human-readable output.
- `analysis_firmware_ids`: Optional[list[str]] — amd-smi fw_id values to record in analysis_ref.firmware_versions
- `cper_file_path`: Optional[str] — Path to CPER folder or file for RAS AFID collection (ras --afid --cper-file). | [AmdSmiFlavorDataModel](#AmdSmiFlavorDataModel-Model) | [AmdSmiFlavorCollector](#Collector-Class-AmdSmiFlavorCollector) | [AmdSmiAnalyzer](#Data-Analyzer-Class-AmdSmiAnalyzer) |
+| AmdSmiPlugin | bad-pages
metric --cpu-dimm-pow-consumption {dimm_addr}
metric --cpu-dimm-temp-range-rate {dimm_addr}
metric --cpu-dimm-thermal-sensor {dimm_addr}
metric --cpu-io-bandwidth {bw} {link_id}
metric --cpu-lclk-dpm-level {nbio_id}
metric --cpu-svi3-vr-controller-temp 0
metric --cpu-svi3-vr-controller-temp 1 {rail_index}
metric --cpu-xgmi-bandwidth {bw} {link_id}
fabric
firmware
list
metric -g all
metric --core all
metric --cpu all
node
partition
process
ras --cper --folder={folder}
ras --afid --cper-file {cper_file}
static -g all
static -g {gpu_id}
topology
version
xgmi -l
xgmi -m | **Analyzer Args:**
- `check_static_data`: bool — If True, run static data checks (e.g. driver version, partition mode).
- `expected_gpu_processes`: Optional[int] — Expected number of GPU processes.
- `expected_max_power`: Optional[int] — Expected maximum power value (e.g. watts).
- `power`: Optional[nodescraper.plugins.inband.amdsmi.analyzer_args.PowerConfig] — GPU power-cap consistency policy.
- `expected_power_management`: Optional[str] — Expected amd-smi metric power_management value per GPU (e.g. DISABLED for active/full power, ENABLED for power-manage...
- `expected_driver_version`: Optional[str] — Expected AMD driver version string.
- `expected_memory_partition_mode`: Optional[str] — Expected memory partition mode (e.g. sp3, dp).
- `expected_compute_partition_mode`: Optional[str] — Expected compute partition mode.
- `expected_firmware_versions`: Optional[dict[str, str]] — Expected firmware versions keyed by amd-smi fw_id (e.g. PLDM_BUNDLE).
- `gpu_memory`: Optional[nodescraper.plugins.inband.amdsmi.analyzer_args.GpuMemoryConfig] — Minimum free VRAM threshold to validate for each GPU.
- `min_hbm_gib_per_gpu`: Optional[float] — Minimum HBM capacity in GiB required on each GPU. Compared to amd-smi static vram size.
- `ecc_required`: bool — When true, require UMC RAS ENABLED on each GPU. That block state is the in-band proxy for HBM ECC being on.
- `check_xgmi_or_peer_links_status`: bool — Check XGMI or peer-link status for each GPU.
- `l0_to_recovery_count_error_threshold`: Optional[int] — L0-to-recovery count above which an error is raised.
- `l0_to_recovery_count_warning_threshold`: Optional[int] — L0-to-recovery count above which a warning is raised.
- `vendorid_ep`: Optional[str] — Expected endpoint vendor ID (e.g. for PCIe).
- `vendorid_ep_vf`: Optional[str] — Expected endpoint VF vendor ID.
- `devid_ep`: Optional[str] — Expected endpoint device ID.
- `devid_ep_vf`: Optional[str] — Expected endpoint VF device ID.
- `sku_name`: Optional[str] — Expected SKU name string for GPU.
- `expected_xgmi_speed`: Optional[list[float]] — Expected xGMI speed value(s) (e.g. link rate).
- `expected_accel_state`: str — Expected amd-smi fabric accel_state value.
- `expected_fabric_type`: str — Expected amd-smi fabric fabric_type value.
- `analysis_range_start`: Optional[datetime.datetime] — Start of time range for time-windowed analysis.
- `analysis_range_end`: Optional[datetime.datetime] — End of time range for time-windowed analysis. | **Collection Args:**
- `html_view`: bool — When true, include logged command artifacts in command_artifacts.html using human-readable output.
- `analysis_firmware_ids`: Optional[list[str]] — amd-smi fw_id values to record in analysis_ref.firmware_versions
- `cper_file_path`: Optional[str] — Path to CPER folder or file for RAS AFID collection (ras --afid --cper-file). | [AmdSmiDataModel](#AmdSmiDataModel-Model) | [AmdSmiCollector](#Collector-Class-AmdSmiCollector) | [AmdSmiAnalyzer](#Data-Analyzer-Class-AmdSmiAnalyzer) |
+| BiosPlugin | sh -c 'cat /sys/devices/virtual/dmi/id/bios_version'
smbiosDump | grep -A5 'BIOS Info (Type 0)' | grep 'Version:' | head -1
smbiosDump | grep -A20 'System Info (Type 1)'
sh -c 'cat /sys/devices/virtual/dmi/id/product_name'
wmic computersystem get Manufacturer,Model /Value
sh -c 'cat /sys/devices/virtual/dmi/id/sys_vendor'
wmic bios get SMBIOSBIOSVersion /Value | **Analyzer Args:**
- `exp_bios_version`: list[str] — Expected BIOS version(s) to match against collected value (str or list).
- `exp_server_vendor`: list[str] — Expected server vendor(s) from DMI system manufacturer (str or list).
- `exp_server_model`: list[str] — Expected server model(s) from DMI system product name (str or list).
- `regex_match`: bool — If True, match expected BIOS, vendor, and model values as regex; otherwise exact match. | - | [BiosDataModel](#BiosDataModel-Model) | [BiosCollector](#Collector-Class-BiosCollector) | [BiosAnalyzer](#Data-Analyzer-Class-BiosAnalyzer) |
| CmdlinePlugin | cat /proc/cmdline | **Analyzer Args:**
- `required_cmdline`: Union[str, List] — Command-line parameters that must be present (e.g. 'pci=bfsort').
- `banned_cmdline`: Union[str, List] — Command-line parameters that must not be present.
- `os_overrides`: Dict[str, nodescraper.plugins.inband.cmdline.cmdlineconfig.OverrideConfig] — Per-OS overrides for required_cmdline and banned_cmdline (keyed by OS identifier).
- `platform_overrides`: Dict[str, nodescraper.plugins.inband.cmdline.cmdlineconfig.OverrideConfig] — Per-platform overrides for required_cmdline and banned_cmdline (keyed by platform). | - | [CmdlineDataModel](#CmdlineDataModel-Model) | [CmdlineCollector](#Collector-Class-CmdlineCollector) | [CmdlineAnalyzer](#Data-Analyzer-Class-CmdlineAnalyzer) |
-| DeviceEnumerationPlugin | esxcli hardware cpu global get | awk '/CPU Packages:/ {print $NF}'
powershell -Command "(Get-WmiObject -Class Win32_Processor | Measure-Object).Count"
lspci -d {vendorid_ep}: | grep -iE 'VGA|Display|3D|Processing accelerators|Co-processor|Accelerator' | grep -vi 'Virtual Function' | wc -l
powershell -Command "(wmic path win32_VideoController get name | findstr AMD | Measure-Object).Count"
lscpu
lshw
esxcli hardware pci list | grep -iE '^ \*Device ID: 0x0\*{device_id}([^0-9a-f]|$)' | wc -l
lspci -d {vendorid_ep}: | grep -i 'Virtual Function' | wc -l
powershell -Command "(Get-VMHostPartitionableGpu | Measure-Object).Count" | **Analyzer Args:**
- `cpu_count`: Optional[list[int]] — Expected CPU count(s); pass as int or list of ints. Analysis passes if actual is in list.
- `gpu_count`: Optional[list[int]] — Expected GPU count(s); pass as int or list of ints. Analysis passes if actual is in list.
- `vf_count`: Optional[list[int]] — Expected virtual function count(s); pass as int or list of ints. Analysis passes if actual is in list. | **Collection Args:**
- `html_view`: bool — When true, include logged command artifacts in command_artifacts.html using human-readable output.
- `devid_ep`: Optional[int] — Expected GPU PF PCI device ID (int, e.g. 0x75a3) for ESXi device counting.
- `devid_ep_vf`: Optional[int] — Expected GPU VF PCI device ID (int) for ESXi VF counting. | [DeviceEnumerationDataModel](#DeviceEnumerationDataModel-Model) | [DeviceEnumerationCollector](#Collector-Class-DeviceEnumerationCollector) | [DeviceEnumerationAnalyzer](#Data-Analyzer-Class-DeviceEnumerationAnalyzer) |
+| DeviceEnumerationPlugin | esxcli hardware cpu global get | awk '/CPU Packages:/ {print $NF}'
powershell -Command "(Get-WmiObject -Class Win32_Processor | Measure-Object).Count"
powershell -NoProfile -Command "`$p = @(Get-CimInstance -ClassName Win32_Processor); `$cores = (`$p | Measure-Object -Property NumberOfCores -Sum).Sum; `$map = @{0='i686'; 5='arm'; 6='ia64'; 9='x86_64'; 12='aarch64'}; `$arch = `$map[[int]`$p[0].Architecture]; Write-Output ('Architecture=' + `$arch); Write-Output ('Cores=' + `$cores)"
lspci -d {vendorid_ep}: | grep -iE 'VGA|Display|3D|Processing accelerators|Co-processor|Accelerator' | grep -vi 'Virtual Function' | wc -l
powershell -Command "(wmic path win32_VideoController get name | findstr AMD | Measure-Object).Count"
lscpu
lshw
esxcli hardware pci list | grep -iE '^ \*Device ID: 0x0\*{device_id}([^0-9a-f]|$)' | wc -l
lspci -d {vendorid_ep}: | grep -i 'Virtual Function' | wc -l
powershell -Command "(Get-VMHostPartitionableGpu | Measure-Object).Count" | **Analyzer Args:**
- `cpu_count`: Optional[list[int]] — Expected CPU socket count(s) from lscpu Socket(s); pass as int or list of ints.
- `cpu_architecture`: Optional[list[str]] — Expected CPU architecture(s) from lscpu Architecture (e.g. x86_64).
- `min_cpu_cores`: Optional[int] — Minimum physical CPU cores, Core(s) per socket times Socket(s). This is not the logical CPU count from nproc.
- `gpu_count`: Optional[list[int]] — Expected GPU count(s); pass as int or list of ints. Analysis passes if actual is in list.
- `vf_count`: Optional[list[int]] — Expected virtual function count(s); pass as int or list of ints. Analysis passes if actual is in list. | **Collection Args:**
- `html_view`: bool — When true, include logged command artifacts in command_artifacts.html using human-readable output.
- `devid_ep`: Optional[int] — Expected GPU PF PCI device ID (int, e.g. 0x75a3) for ESXi device counting.
- `devid_ep_vf`: Optional[int] — Expected GPU VF PCI device ID (int) for ESXi VF counting. | [DeviceEnumerationDataModel](#DeviceEnumerationDataModel-Model) | [DeviceEnumerationCollector](#Collector-Class-DeviceEnumerationCollector) | [DeviceEnumerationAnalyzer](#Data-Analyzer-Class-DeviceEnumerationAnalyzer) |
| DimmPlugin | dmidecode -q --type 17
dmidecode
wmic memorychip get /format:csv | - | **Collection Args:**
- `html_view`: bool — When true, include logged command artifacts in command_artifacts.html using human-readable output.
- `skip_sudo`: bool — If True, do not use sudo when running dmidecode or wmic for memory info. | [DimmDataModel](#DimmDataModel-Model) | [DimmCollector](#Collector-Class-DimmCollector) | - |
| DkmsPlugin | dkms status
dkms --version | **Analyzer Args:**
- `dkms_status`: Union[str, list] — Expected dkms status string(s) to match (e.g. 'amd/1.0.0'). At least one of dkms_status or dkms_version required.
- `dkms_version`: Union[str, list] — Expected dkms version string(s) to match. At least one of dkms_status or dkms_version required.
- `regex_match`: bool — If True, match dkms_status and dkms_version as regex; otherwise exact match. | - | [DkmsDataModel](#DkmsDataModel-Model) | [DkmsCollector](#Collector-Class-DkmsCollector) | [DkmsAnalyzer](#Data-Analyzer-Class-DkmsAnalyzer) |
| DmesgPlugin | dmesg --time-format iso -x
cat /var/log/vmkernel.log
ls -1 /var/log/dmesg\* 2>/dev/null | grep -E '^/var/log/dmesg(\.[0-9]+(\.gz)?)?$' || true
ls -1 /var/log/vmkernel.\* 2>/dev/null | grep -E '^/var/log/vmkernel\.[0-9]+(\.gz)?$' || true | **Built-in Regexes:**
- Out of memory error: `(?:oom_kill_process.*)|(?:Out of memory.*)`
- I/O Page Fault: `IO_PAGE_FAULT`
- Kernel Panic: `\bkernel panic\b.*`
- SQ Interrupt: `sq_intr`
- SRAM ECC: `sram_ecc.*`
- Failed to load driver. IP hardware init error.: `\[amdgpu\]\] \*ERROR\* hw_init of IP block.*`
- Failed to load driver. IP software init error.: `\[amdgpu\]\] \*ERROR\* sw_init of IP block.*`
- Real Time throttling activated: `sched: RT throttling activated.*`
- RCU preempt detected stalls: `rcu_preempt detected stalls.*`
- RCU preempt self-detected stall: `rcu_preempt self-detected stall.*`
- QCM fence timeout: `qcm fence wait loop timeout.*`
- General protection fault: `(?:[\w-]+(?:\[[0-9.]+\])?\s+)?general protectio...`
- Segmentation fault: `(?:segfault.*in .*\[)|(?:[Ss]egmentation [Ff]au...`
- Failed to disallow cf state: `amdgpu: Failed to disallow cf state.*`
- Failed to terminate tmr: `\*ERROR\* Failed to terminate tmr.*`
- Suspend of IP block failed: `\*ERROR\* suspend of IP block <\w+> failed.*`
- amdgpu Page Fault: `(amdgpu \w{4}:\w{2}:\w{2}\.\w:\s+amdgpu:\s+\[\S...`
- Page Fault: `page fault for address.*`
- Fatal error during GPU init: `(?:amdgpu)(.*Fatal error during GPU init)|(Fata...`
- PCIe AER Error Status: `(pcieport [\w:.]+: AER: aer_status:[^\n]*(?:\n[...`
- PCIe AER Correctable Error Status: `(.*aer_cor_status: 0x[0-9a-fA-F]+, aer_cor_mask...`
- PCIe AER Uncorrectable Error Status: `(.*aer_uncor_status: 0x[0-9a-fA-F]+, aer_uncor_...`
- PCIe AER Uncorrectable Error Severity with TLP Header: `(.*aer_uncor_severity: 0x[0-9a-fA-F]+.*)(\n.*TL...`
- Failed to read journal file: `Failed to read journal file.*`
- Journal file corrupted or uncleanly shut down: `journal corrupted or uncleanly shut down.*`
- ACPI BIOS Error: `ACPI BIOS Error`
- ACPI Error: `ACPI Error`
- Filesystem corrupted!: `EXT4-fs error \(device .*\):`
- Error in buffered IO, check filesystem integrity: `(Buffer I\/O error on dev)(?:ice)? (\w+)`
- PCIe card no longer present: `pcieport (\w+:\w+:\w+\.\w+):\s+(\w+):\s+(Slot\(...`
- PCIe Link Down: `pcieport (\w+:\w+:\w+\.\w+):\s+(\w+):\s+(Slot\(...`
- Mismatched clock configuration between PCIe device and host: `pcieport (\w+:\w+:\w+\.\w+):\s+(\w+):\s+(curren...`
- RAS Correctable Error: `(?:\d{4}-\d+-\d+T\d+:\d+:\d+,\d+[+-]\d+:\d+)?(....`
- RAS Uncorrectable Error: `(?:\d{4}-\d+-\d+T\d+:\d+:\d+,\d+[+-]\d+:\d+)?(....`
- RAS Deferred Error: `(?:\d{4}-\d+-\d+T\d+:\d+:\d+,\d+[+-]\d+:\d+)?(....`
- RAS Uncorrectable Error: `(\d+ new uncorrectable hardware errors detected...`
- RAS Correctable Error: `(\d+ new correctable hardware errors detected i...`
- RAS ECC Fatal Error: `(GPU detected ECC Fatal Error\.)`
- GPU Reset: `(Issuing Whole GPU reset\.)`
- RAS Corrected PCIe Error: `((?:\[Hardware Error\]:\s+)?event severity: cor...`
- GPU Reset: `(?:\d{4}-\d+-\d+T\d+:\d+:\d+,\d+[+-]\d+:\d+)?(....`
- GPU reset failed: `(?:\d{4}-\d+-\d+T\d+:\d+:\d+,\d+[+-]\d+:\d+)?(....`
- ACA Error: `(Accelerator Check Architecture[^\n]*)(?:\n[^\n...`
- ACA Error: `(Accelerator Check Architecture[^\n]*)(?:\n[^\n...`
- MCE Corrected Error: `\[Hardware Error\]:[^\n]*MC\d+_STATUS\[[^\]]*\|...`
- MCE Uncorrected Error: `\[Hardware Error\]:[^\n]*MC\d+_STATUS\[[^\]]*\|...`
- Mode 2 Reset Failed: `(?:\d{4}-\d+-\d+T\d+:\d+:\d+,\d+[+-]\d+:\d+)? (...`
- RAS Corrected Error: `(?:\d{4}-\d+-\d+T\d+:\d+:\d+,\d+[+-]\d+:\d+)?(....`
- SGX Error: `x86/cpu: SGX disabled by BIOS`
- MMP Error: `Failed to load MMP firmware qat_4xxx_mmp.bin`
- GPU Throttled: `amdgpu \w{4}:\w{2}:\w{2}.\w: amdgpu: WARN: GPU ...`
- RAS Poison Consumed: `amdgpu[ 0-9a-fA-F:.]+:(?:\s*amdgpu:)?\s+(?:{\d+...`
- RAS Poison created: `amdgpu[ 0-9a-fA-F:.]+:(?:\s*amdgpu:)?\s+(?:{\d+...`
- Bad page threshold exceeded: `(amdgpu: Saved bad pages (\d+) reaches threshol...`
- RAS Hardware Error: `Hardware error from APEI Generic Hardware Error...`
- Error Address: `Error Address.*(?:\s.*)`
- RAS EDR Event: `EDR: EDR event received`
- DPC Event: `DPC: .*`
- LNet: ko2iblnd has no matching interfaces: `(?:\[[^\]]+\]\s*)?LNetError:.*ko2iblnd:\s*No ma...`
- LNet: Error starting up LNI: `(?:\[[^\]]+\]\s*)?LNetError:\s*.*Error\s*-?\d+\...`
- Lustre: network initialisation failed: `LustreError:.*ptlrpc_init_portals\(\).*network ...`
**Analyzer Args:**
- `analysis_range_start`: Optional[datetime.datetime] — Start of time range for analysis (ISO format). Only events on or after this time are analyzed.
- `analysis_range_end`: Optional[datetime.datetime] — End of time range for analysis (ISO format). Only events before this time are analyzed.
- `check_unknown_dmesg_errors`: Optional[bool] — If True, treat unknown/unmatched dmesg error lines as failures.
- `exclude_category`: Optional[set[str]] — Set of error categories to exclude from analysis.
- `interval_to_collapse_event`: int — Seconds within which repeated events are collapsed into one (for rate limiting).
- `num_timestamps`: int — Number of timestamps to include per event in output.
- `error_regex`: Union[list[nodescraper.base.regexanalyzer.ErrorRegex], list[dict], NoneType] — Custom error regex patterns; each item can be ErrorRegex or dict with category/pattern.
- `priority_override_rules`: Optional[list[dict]] — Rules to override the priority of matched ErrorRegex objects. Each rule is a dict where all keys except 'new_priority...
- `mce_threshold`: Optional[int] — When set, raise ERROR if correctable MCE/RAS error count for any component (CPU, GPU BDF/block, etc.) reaches or exce...
- `ignore_match_rules`: Optional[list[dict[str, object]]] — Rules that skip regex matches during analysis. Each rule may use line_regex, match_regex, message, and/or mce_banks.... | **Collection Args:**
- `html_view`: bool — When true, include logged command artifacts in command_artifacts.html using human-readable output.
- `collect_rotated_logs`: bool — If True, also collect rotated dmesg log files from /var/log/dmesg\*.
- `skip_sudo`: bool — If True, do not use sudo when running dmesg or listing log files.
- `log_dmesg_data`: bool — If True, log the collected dmesg output in artifacts. | [DmesgData](#DmesgData-Model) | [DmesgCollector](#Collector-Class-DmesgCollector) | [DmesgAnalyzer](#Data-Analyzer-Class-DmesgAnalyzer) |
@@ -17,7 +17,7 @@
| JournalPlugin | journalctl --no-pager --system --output=short-iso
journalctl --no-pager --system --output=json | **Analyzer Args:**
- `analysis_range_start`: Optional[datetime.datetime] — Start of time range for analysis (ISO format). Only events on or after this time are analyzed.
- `analysis_range_end`: Optional[datetime.datetime] — End of time range for analysis (ISO format). Only events before this time are analyzed.
- `check_priority`: Optional[int] — Check against journal log priority (0=emergency..7=debug). If an entry has priority <= check_priority, an ERROR event...
- `group`: bool — If True, group entries that have the same priority and message. | **Collection Args:**
- `html_view`: bool — When true, include logged command artifacts in command_artifacts.html using human-readable output.
- `boot`: Optional[int] — Optional boot ID to limit journal collection to a specific boot. | [JournalData](#JournalData-Model) | [JournalCollector](#Collector-Class-JournalCollector) | [JournalAnalyzer](#Data-Analyzer-Class-JournalAnalyzer) |
| KernelPlugin | sh -c 'uname -a'
sh -c 'cat /proc/sys/kernel/numa_balancing'
wmic os get Version /Value | **Analyzer Args:**
- `exp_kernel`: Union[str, list] — Expected kernel version string(s) to match (e.g. from uname -a).
- `exp_numa`: Optional[int] — Expected value for kernel.numa_balancing (e.g. 0 or 1).
- `regex_match`: bool — If True, match exp_kernel as regex; otherwise exact match. | - | [KernelDataModel](#KernelDataModel-Model) | [KernelCollector](#Collector-Class-KernelCollector) | [KernelAnalyzer](#Data-Analyzer-Class-KernelAnalyzer) |
| KernelModulePlugin | cat /proc/modules
modinfo amdgpu
wmic os get Version /Value | **Analyzer Args:**
- `kernel_modules`: dict[str, dict] — Expected kernel module name -> {version, etc.}. Analyzer checks collected modules match.
- `regex_filter`: list[str] — List of regex patterns to filter which collected modules are checked (default: amd). | - | [KernelModuleDataModel](#KernelModuleDataModel-Model) | [KernelModuleCollector](#Collector-Class-KernelModuleCollector) | [KernelModuleAnalyzer](#Data-Analyzer-Class-KernelModuleAnalyzer) |
-| MemoryPlugin | free -b
lsmem
numactl -H
wmic OS get FreePhysicalMemory /Value; wmic ComputerSystem get TotalPhysicalMemory /Value | **Analyzer Args:**
- `minimum_free_memory_percent`: Optional[float] — Minimum available system memory percentage required.
- `ratio`: float — Required free-memory ratio (0-1). Analysis fails if free/total < ratio.
- `memory_threshold`: str — Minimum free memory required (e.g. '30Gi', '1T'). Used when ratio is not sufficient. | - | [MemoryDataModel](#MemoryDataModel-Model) | [MemoryCollector](#Collector-Class-MemoryCollector) | [MemoryAnalyzer](#Data-Analyzer-Class-MemoryAnalyzer) |
+| MemoryPlugin | free -b
lsmem
numactl -H
wmic OS get FreePhysicalMemory /Value; wmic ComputerSystem get TotalPhysicalMemory /Value | **Analyzer Args:**
- `minimum_system_memory_gib`: Optional[float] — Minimum installed system memory in GiB. Compared to MemTotal. Passes when reported memory is at least 98 percent of t...
- `minimum_free_memory_percent`: Optional[float] — Minimum available system memory percentage required.
- `ratio`: float — Required free-memory ratio (0-1). Analysis fails if free/total < ratio.
- `memory_threshold`: str — Minimum free memory required (e.g. '30Gi', '1T'). Used when ratio is not sufficient. | - | [MemoryDataModel](#MemoryDataModel-Model) | [MemoryCollector](#Collector-Class-MemoryCollector) | [MemoryAnalyzer](#Data-Analyzer-Class-MemoryAnalyzer) |
| NetworkPlugin | ip addr show
curl
ethtool -i {interface}
ethtool -S {interface}
ethtool {interface}
lldpcli show neighbor
lldpctl
ip neighbor show
ping
ip route show
ip rule show
wget | **Analyzer Args:**
- `expected_nic_firmware`: Optional[str] — Exact firmware version expected from each collected NIC. | **Collection Args:**
- `html_view`: bool — When true, include logged command artifacts in command_artifacts.html using human-readable output.
- `url`: Optional[str] — Optional URL to probe for network connectivity (used with netprobe).
- `netprobe`: Optional[Literal['ping', 'wget', 'curl']] — Tool to use for network connectivity probe: ping, wget, or curl.
- `exclusion_regex`: Optional[list[str]] — Regex patterns matched (search) against netdev/interface names; any match is skipped (ethtool not run against it). | [NetworkDataModel](#NetworkDataModel-Model) | [NetworkCollector](#Collector-Class-NetworkCollector) | [NetworkAnalyzer](#Data-Analyzer-Class-NetworkAnalyzer) |
| NicPlugin | bcmcli_config query AN_PROTOCOL -d {device_id}
bcmcli_debug dscdump --lane 0 -d {device_id}
bcmcli_fwmanager show certificate -d {device_id}
bcmcli_fwmanager show fwpackage -d {device_id}
bcmcli_show version
bcmcli_show device_list
bcmcli_show health -d {device_id}
bcmcli_link show -d {device_id}
bcmcli_livepatch show -d {device_id}
bcmcli_debug loopback -d {device_id}
bcmcli_config msixmv query --pf all -d {device_id}
bcmcli_config show_confs -d {device_id}
bcmcli_nvm show -d {device_id}
bcmcli_debug pcie counters -d {device_id}
bcmcli_config query pcie_relaxed_ordering -d {device_id}
bcmcli_show pci -d {device_id}
bcmcli_config query performance_profile -d {device_id}
bcmcli_qos show qos -d {device_id}
bcmcli_qos show hw-maps -d {device_id}
bcmcli_qos show rx-port-ratelimit -d {device_id}
bcmcli_qos show tx-ep-ratelimit --port 0 -d {device_id}
bcmcli_qos show ingress --cosq -d {device_id}
bcmcli_qos show egress --cosq -d {device_id}
bcmcli_show status -d {device_id}
bcmcli_show temperature -d {device_id}
bcmcli_show phy -d {device_id}
bcmcli_show resource_counts -d {device_id}
bcmcli_hwdbg dump_tx_counters -d {device_id}
bcmcli_hwdbg dump_rx_counters -d {device_id}
bcmcli_debug verify -d {device_id}
bcmcli_debug serdes_tx --get --modtype NRZ --lane 0 -d {device_id}
bcmcli_tunnel show rss -d {device_id}
bcmcli_tunnel show vxlan --type ipv4 -d {device_id}
bcmcli_tunnel show vxlan --type ipv6 -d {device_id}
bcmcli_timesync show dll -d {device_id}
bcmcli_timesync show duty-cycle -d {device_id}
bcmcli_timesync show ts-pin -d {device_id}
bcmcli_dump snap_dump -d {device_id}
bcmcli_config query support_rdma -d {device_id}
bcmcli_timesync show ptp -d {device_id}
bcmcli_timesync show synce -d {device_id}
bcmcli_timesync show tsio -d {device_id}
niccli --dev {device_num} cable --module_info --show
niccli --dev {device_num} counters --pcie
niccli devid
niccli --listdev
niccli --list
niccli --list_devices
niccli --dev {device_num} fw --livepatch --show
niccli --dev {device_num} linkdiag --dscdump --lane 0
niccli --dev {device_num} linkdiag --loopback --show
niccli --dev {device_num} linkdiag --txfir --show --modulation_type NRZ --lane 0
niccli --dev {device_num} link --counters --show
niccli --dev {device_num} link --status
niccli --dev {device_num} msix --max_vectors --show --pf 0
niccli --dev {device_num} nvm --listoptions
niccli --dev {device_num} nvm --list
niccli --dev {device_num} nvm --verify
niccli --dev {device_num} nvm --view
niccli -dev {device_num} nvm -getoption pcie_relaxed_ordering
niccli --dev {device_num} nvm --getoption pcie_relaxed_ordering
niccli -dev {device_num} nvm -getoption performance_profile
niccli --dev {device_num} nvm --getoption performance_profile
niccli -dev {device_num} nvm -getoption support_rdma -scope 0
niccli -dev {device_num} getqos
niccli --dev {device_num} nvm --getoption support_rdma --scope 0
niccli --dev {device_num} qos --ets --show
niccli --dev {device_num} show --all
niccli --dev {device_num} show --health
niccli --dev {device_num} show --certificate
niccli --dev {device_num} show --pkg_ver
niccli --dev {device_num} qos --egress --cosq --show
niccli --dev {device_num} qos --ingress --cosq --show
niccli --dev {device_num} qos --rx_rate_limit --show
niccli --dev {device_num} qos --listmap --pri2cos
niccli --dev {device_num} timesync --ptp --show
niccli --dev {device_num} timesync --tsio --show
niccli --dev {device_num} tunnel --cfg --rss --show
niccli --dev {device_num} tunnel --cfg --vxlan --type ipv4 --show
niccli --dev {device_num} resmgmt --all --profile --show
niccli --dev {device_num} qos --dscp2prio
niccli --dev {device_num} qos --tx_ep_rate_limit --port 0 --show
niccli --dev {device_num} show --device_info
niccli --dev {device_num} show --device_pci_ids
niccli --dev {device_num} show
niccli --dev {device_num} timesync --synce --show
niccli verify
niccli --version
nicctl show card
nicctl --version
nicctl show card flash partition --json
nicctl show card interrupts --json
nicctl show card logs --non-persistent
nicctl show card logs --boot-fault
nicctl show card logs --persistent
nicctl show card profile --json
nicctl show card time --json
nicctl show card statistics packet-buffer summary --json
nicctl show lif statistics --json
nicctl show lif internal queue-to-ud-pinning
nicctl show pipeline internal anomalies
nicctl show pipeline internal rsq-ring
nicctl show pipeline internal statistics memory
nicctl show port fsm
nicctl show port transceiver --json
nicctl show port statistics --json
nicctl show port internal mac
nicctl show qos headroom --json
nicctl show rdma queue --json
nicctl show rdma queue-pair --detail --json
nicctl show version firmware
nicctl show dcqcn
nicctl show environment
nicctl show lif
nicctl show pcie ats
nicctl show port
nicctl show qos
nicctl show rdma statistics
nicctl show version host-software
nicctl show dcqcn --card {card_id} --json
nicctl show card hardware-config --card {card_id} | **Analyzer Args:**
- `expected_nic_firmware`: Optional[str] — Exact firmware version expected from each collected NIC.
- `expected_values`: Optional[Dict[str, Dict[str, Any]]] — Per-command expected checks keyed by canonical key (see command_to_canonical_key).
- `performance_profile_expected`: str — Expected Broadcom performance_profile value (case-insensitive). Default RoCE.
- `support_rdma_disabled_values`: List[str] — Values that indicate RDMA is not supported (case-insensitive).
- `pcie_relaxed_ordering_expected`: str — Expected Broadcom pcie_relaxed_ordering value (e.g. 'Relaxed ordering = enabled'); checked case-insensitively. Defaul...
- `expected_qos_prio_map`: Optional[Dict[Any, Any]] — Expected priority-to-TC map (e.g. {0: 0, 1: 1}; keys may be int or str in config). Checked per device when set.
- `expected_qos_pfc_enabled`: Optional[int] — Expected PFC enabled value (0/1 or bitmask). Checked per device when set.
- `expected_qos_tsa_map`: Optional[Dict[Any, Any]] — Expected TSA map for ETS (e.g. {0: 'ets', 1: 'strict'}; keys may be int or str in config). Checked per device when set.
- `expected_qos_tc_bandwidth`: Optional[List[int]] — Expected TC bandwidth percentages. Checked per device when set.
- `require_qos_consistent_across_adapters`: bool — When True and no expected_qos_\* are set, require all adapters to have the same prio_map, pfc_enabled, and tsa_map.
- `nicctl_log_error_regex`: Optional[List[Dict[str, Any]]] — Optional list of error patterns for nicctl show card logs. | **Collection Args:**
- `html_view`: bool — When true, include logged command artifacts in command_artifacts.html using human-readable output.
- `commands`: Optional[List[str]] — Optional list of niccli/nicctl/bcmcli commands to run. When None, default command set is used.
- `use_sudo_niccli`: bool — If True, run niccli commands with sudo when required.
- `use_sudo_nicctl`: bool — If True, run nicctl commands with sudo when required.
- `use_sudo_bcmcli`: bool — If True, run bcmcli commands with sudo when required.
- `broadcom_cli_override`: Optional[str] — Force 'niccli' or 'bcmcli' instead of auto-detecting which Broadcom CLI is present. | [NicDataModel](#NicDataModel-Model) | [NicCollector](#Collector-Class-NicCollector) | [NicAnalyzer](#Data-Analyzer-Class-NicAnalyzer) |
| NvmePlugin | nvme smart-log {dev}
nvme error-log {dev} --log-entries=256
nvme id-ctrl {dev}
nvme id-ns {dev}{ns}
nvme fw-log {dev}
nvme self-test-log {dev}
nvme get-log {dev} --log-id=6 --log-len=512
nvme telemetry-log {dev} --output-file={dev}_{f_name}
nvme list -o json | **Analyzer Args:**
- `maximum_smart_error_count`: Optional[int] — Maximum allowed NVMe SMART media error count per device. | - | [NvmeDataModel](#NvmeDataModel-Model) | [NvmeCollector](#Collector-Class-NvmeCollector) | [NvmeAnalyzer](#Data-Analyzer-Class-NvmeAnalyzer) |
@@ -224,8 +224,12 @@ Collect BIOS details
- **SUPPORTED_OS_FAMILY**: `{, , }`
- **CMD_WINDOWS**: `wmic bios get SMBIOSBIOSVersion /Value`
+- **CMD_SYSTEM_WINDOWS**: `wmic computersystem get Manufacturer,Model /Value`
- **CMD**: `sh -c 'cat /sys/devices/virtual/dmi/id/bios_version'`
+- **CMD_SYS_VENDOR**: `sh -c 'cat /sys/devices/virtual/dmi/id/sys_vendor'`
+- **CMD_PRODUCT_NAME**: `sh -c 'cat /sys/devices/virtual/dmi/id/product_name'`
- **CMD_ESXI**: `smbiosDump | grep -A5 'BIOS Info (Type 0)' | grep 'Version:' | head -1`
+- **CMD_ESXI_SYSTEM**: `smbiosDump | grep -A20 'System Info (Type 1)'`
### Provides Data
@@ -235,6 +239,10 @@ BiosDataModel
- sh -c 'cat /sys/devices/virtual/dmi/id/bios_version'
- smbiosDump | grep -A5 'BIOS Info (Type 0)' | grep 'Version:' | head -1
+- smbiosDump | grep -A20 'System Info (Type 1)'
+- sh -c 'cat /sys/devices/virtual/dmi/id/product_name'
+- wmic computersystem get Manufacturer,Model /Value
+- sh -c 'cat /sys/devices/virtual/dmi/id/sys_vendor'
- wmic bios get SMBIOSBIOSVersion /Value
## Collector Class CmdlineCollector
@@ -278,6 +286,7 @@ Collect CPU and GPU count
- **CMD_LSCPU_LINUX**: `lscpu`
- **CMD_LSHW_LINUX**: `lshw`
- **CMD_CPU_COUNT_WINDOWS**: `powershell -Command "(Get-WmiObject -Class Win32_Processor | Measure-Object).Count"`
+- **CMD_CPU_INFO_WINDOWS**: `powershell -NoProfile -Command "`$p = @(Get-CimInstance -ClassName Win32_Processor); `$cores = (`$p | Measure-Object -Property NumberOfCores -Sum).Sum; `$map = @{0='i686'; 5='arm'; 6='ia64'; 9='x86_64'; 12='aarch64'}; `$arch = `$map[[int]`$p[0].Architecture]; Write-Output ('Architecture=' + `$arch); Write-Output ('Cores=' + `$cores)"`
- **CMD_GPU_COUNT_WINDOWS**: `powershell -Command "(wmic path win32_VideoController get name | findstr AMD | Measure-Object).Count"`
- **CMD_VF_COUNT_WINDOWS**: `powershell -Command "(Get-VMHostPartitionableGpu | Measure-Object).Count"`
- **CMD_CPU_COUNT_ESXI**: `esxcli hardware cpu global get | awk '/CPU Packages:/ {print $NF}'`
@@ -291,6 +300,7 @@ DeviceEnumerationDataModel
- esxcli hardware cpu global get | awk '/CPU Packages:/ {print $NF}'
- powershell -Command "(Get-WmiObject -Class Win32_Processor | Measure-Object).Count"
+- powershell -NoProfile -Command "`$p = @(Get-CimInstance -ClassName Win32_Processor); `$cores = (`$p | Measure-Object -Property NumberOfCores -Sum).Sum; `$map = @{0='i686'; 5='arm'; 6='ia64'; 9='x86_64'; 12='aarch64'}; `$arch = `$map[[int]`$p[0].Architecture]; Write-Output ('Architecture=' + `$arch); Write-Output ('Cores=' + `$cores)"
- lspci -d {vendorid_ep}: | grep -iE 'VGA|Display|3D|Processing accelerators|Co-processor|Accelerator' | grep -vi 'Virtual Function' | wc -l
- powershell -Command "(wmic path win32_VideoController get name | findstr AMD | Measure-Object).Count"
- lscpu
@@ -1874,6 +1884,8 @@ Data model for amd-smi data.
### Model annotations and fields
- **bios_version**: `str`
+- **server_vendor**: `Optional[str]`
+- **server_model**: `Optional[str]`
## CmdlineDataModel Model
@@ -1894,6 +1906,8 @@ Data model for amd-smi data.
### Model annotations and fields
- **cpu_count**: `Optional[int]`
+- **cpu_architecture**: `Optional[str]`
+- **cpu_cores**: `Optional[int]`
- **gpu_count**: `Optional[int]`
- **vf_count**: `Optional[int]`
- **lscpu_output**: `Optional[str]`
@@ -2684,6 +2698,10 @@ Check memory usage is within the maximum allowed used memory
**Link to code**: [memory_analyzer.py](https://github.com/amd/node-scraper/blob/HEAD/nodescraper/plugins/inband/memory/memory_analyzer.py)
+### Class Variables
+
+- **_INSTALLED_MEMORY_TOLERANCE**: `0.98`
+
## Data Analyzer Class NetworkAnalyzer
### Description
@@ -3039,6 +3057,8 @@ Build AFID events from collected data and run the configured entry-point hub.
- **expected_compute_partition_mode**: `Optional[str]` — Expected compute partition mode.
- **expected_firmware_versions**: `Optional[dict[str, str]]` — Expected firmware versions keyed by amd-smi fw_id (e.g. PLDM_BUNDLE).
- **gpu_memory**: `Optional[nodescraper.plugins.inband.amdsmi.analyzer_args.GpuMemoryConfig]` — Minimum free VRAM threshold to validate for each GPU.
+- **min_hbm_gib_per_gpu**: `Optional[float]` — Minimum HBM capacity in GiB required on each GPU. Compared to amd-smi static vram size.
+- **ecc_required**: `bool` — When true, require UMC RAS ENABLED on each GPU. That block state is the in-band proxy for HBM ECC being on.
- **check_xgmi_or_peer_links_status**: `bool` — Check XGMI or peer-link status for each GPU.
- **l0_to_recovery_count_error_threshold**: `Optional[int]` — L0-to-recovery count above which an error is raised.
- **l0_to_recovery_count_warning_threshold**: `Optional[int]` — L0-to-recovery count above which a warning is raised.
@@ -3062,7 +3082,9 @@ Build AFID events from collected data and run the configured entry-point hub.
### Annotations / fields
- **exp_bios_version**: `list[str]` — Expected BIOS version(s) to match against collected value (str or list).
-- **regex_match**: `bool` — If True, match exp_bios_version as regex; otherwise exact match.
+- **exp_server_vendor**: `list[str]` — Expected server vendor(s) from DMI system manufacturer (str or list).
+- **exp_server_model**: `list[str]` — Expected server model(s) from DMI system product name (str or list).
+- **regex_match**: `bool` — If True, match expected BIOS, vendor, and model values as regex; otherwise exact match.
## Analyzer Args Class CmdlineAnalyzerArgs
@@ -3085,7 +3107,9 @@ Build AFID events from collected data and run the configured entry-point hub.
### Annotations / fields
-- **cpu_count**: `Optional[list[int]]` — Expected CPU count(s); pass as int or list of ints. Analysis passes if actual is in list.
+- **cpu_count**: `Optional[list[int]]` — Expected CPU socket count(s) from lscpu Socket(s); pass as int or list of ints.
+- **cpu_architecture**: `Optional[list[str]]` — Expected CPU architecture(s) from lscpu Architecture (e.g. x86_64).
+- **min_cpu_cores**: `Optional[int]` — Minimum physical CPU cores, Core(s) per socket times Socket(s). This is not the logical CPU count from nproc.
- **gpu_count**: `Optional[list[int]]` — Expected GPU count(s); pass as int or list of ints. Analysis passes if actual is in list.
- **vf_count**: `Optional[list[int]]` — Expected virtual function count(s); pass as int or list of ints. Analysis passes if actual is in list.
@@ -3168,6 +3192,7 @@ Arguments for journal analyzer
### Annotations / fields
+- **minimum_system_memory_gib**: `Optional[float]` — Minimum installed system memory in GiB. Compared to MemTotal. Passes when reported memory is at least 98 percent of this value, because the OS reports slightly less than nominal DIMM capacity.
- **minimum_free_memory_percent**: `Optional[float]` — Minimum available system memory percentage required.
- **ratio**: `float` — Required free-memory ratio (0-1). Analysis fails if free/total < ratio.
- **memory_threshold**: `str` — Minimum free memory required (e.g. '30Gi', '1T'). Used when ratio is not sufficient.