From cf03992b5a7bbed3563010e82b7386d687387a75 Mon Sep 17 00:00:00 2001 From: Zhihong Lin Date: Fri, 12 Jun 2026 18:53:57 +0000 Subject: [PATCH] feat(nvidia_smi): add schema v13 support Backports influxdata/telegraf#18690 to recognize the nvidia-smi v13 DTD schema (nvsmi_device_v13.dtd) emitted by newer NVIDIA drivers shipped on Amazon Linux 2023 GPU AMIs. Adds a schema_v13 parser/types package, wires case "v13" into the version dispatch, and moves the unknown-version fallback to schema_v13. Adds a v13 test fixture and gather test case. Fixes #2146 --- plugins/inputs/nvidia_smi/nvidia_smi.go | 5 +- plugins/inputs/nvidia_smi/nvidia_smi_test.go | 53 ++ .../inputs/nvidia_smi/schema_v13/parser.go | 157 ++++ plugins/inputs/nvidia_smi/schema_v13/types.go | 383 ++++++++ .../nvidia_smi/testdata/rtx-3080-v13.xml | 849 ++++++++++++++++++ 5 files changed, 1446 insertions(+), 1 deletion(-) create mode 100644 plugins/inputs/nvidia_smi/schema_v13/parser.go create mode 100644 plugins/inputs/nvidia_smi/schema_v13/types.go create mode 100644 plugins/inputs/nvidia_smi/testdata/rtx-3080-v13.xml diff --git a/plugins/inputs/nvidia_smi/nvidia_smi.go b/plugins/inputs/nvidia_smi/nvidia_smi.go index 876cfb2e52e..57f093aff0f 100644 --- a/plugins/inputs/nvidia_smi/nvidia_smi.go +++ b/plugins/inputs/nvidia_smi/nvidia_smi.go @@ -24,6 +24,7 @@ import ( "github.com/aws/amazon-cloudwatch-agent/internal" "github.com/aws/amazon-cloudwatch-agent/plugins/inputs/nvidia_smi/schema_v11" "github.com/aws/amazon-cloudwatch-agent/plugins/inputs/nvidia_smi/schema_v12" + "github.com/aws/amazon-cloudwatch-agent/plugins/inputs/nvidia_smi/schema_v13" ) //go:embed sample.conf @@ -123,6 +124,8 @@ func (smi *NvidiaSMI) parse(acc telegraf.Accumulator, data []byte) error { return schema_v11.Parse(acc, data) case "v12": return schema_v12.Parse(acc, data) + case "v13": + return schema_v13.Parse(acc, data) } smi.once.Do(func() { @@ -130,7 +133,7 @@ func (smi *NvidiaSMI) parse(acc telegraf.Accumulator, data []byte) error { Please report this as an issue to https://github.com/influxdata/telegraf together with a sample output of 'nvidia_smi -q -x'!`, schema) }) - return schema_v12.Parse(acc, data) + return schema_v13.Parse(acc, data) } func init() { diff --git a/plugins/inputs/nvidia_smi/nvidia_smi_test.go b/plugins/inputs/nvidia_smi/nvidia_smi_test.go index 804371ea4e8..0802ec91ebf 100644 --- a/plugins/inputs/nvidia_smi/nvidia_smi_test.go +++ b/plugins/inputs/nvidia_smi/nvidia_smi_test.go @@ -577,6 +577,59 @@ func TestGatherValidXML(t *testing.T) { time.Unix(1689872450, 0)), }, }, + { + name: "RTX 3080 schema v13", + filename: "rtx-3080-v13.xml", + expected: []telegraf.Metric{ + testutil.MustMetric( + "nvidia_smi", + map[string]string{ + "arch": "Ampere", + "compute_mode": "Default", + "index": "0", + "name": "NVIDIA GeForce RTX 3080", + "pstate": "P2", + "uuid": "GPU-19d6d965-2acc-f646-00f8-4c76979aabb4", + }, + map[string]interface{}{ + "clocks_current_graphics": 1950, + "clocks_current_memory": 9251, + "clocks_current_sm": 1950, + "clocks_current_video": 1710, + "cuda_version": "13.2", + "display_active": "Disabled", + "display_mode": "Requested", + "driver_version": "595.58.03", + "ecc_errors_channel_repair_pending": "No", + "ecc_errors_tpc_repair_pending": "No", + "encoder_stats_average_fps": 0, + "encoder_stats_average_latency": 0, + "encoder_stats_session_count": 0, + "fan_speed": 0, + "fbc_stats_average_fps": 0, + "fbc_stats_average_latency": 0, + "fbc_stats_session_count": 0, + "memory_free": 660, + "memory_reserved": 397, + "memory_total": 10240, + "memory_used": 9184, + "pcie_link_gen_current": 4, + "pcie_link_width_current": 16, + "power_draw": 142.33, + "power_limit": 320.0, + "serial": "REDACTED", + "temperature_gpu": 27, + "utilization_decoder": 0, + "utilization_encoder": 0, + "utilization_gpu": 65, + "utilization_jpeg": 0, + "utilization_memory": 9, + "utilization_ofa": 0, + "vbios_version": "94.02.71.40.72", + }, + time.Unix(1744280581, 0)), + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/plugins/inputs/nvidia_smi/schema_v13/parser.go b/plugins/inputs/nvidia_smi/schema_v13/parser.go new file mode 100644 index 00000000000..eb749357789 --- /dev/null +++ b/plugins/inputs/nvidia_smi/schema_v13/parser.go @@ -0,0 +1,157 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT + +package schema_v13 + +import ( + "encoding/xml" + "strconv" + "time" + + "github.com/influxdata/telegraf" + + "github.com/aws/amazon-cloudwatch-agent/plugins/inputs/nvidia_smi/common" +) + +// Parse parses the XML-encoded data from nvidia-smi and adds measurements. +func Parse(acc telegraf.Accumulator, buf []byte) error { + var s smi + if err := xml.Unmarshal(buf, &s); err != nil { + return err + } + + timestamp := time.Now() + if s.Timestamp != "" { + if t, err := time.ParseInLocation(time.ANSIC, s.Timestamp, time.Local); err == nil { + timestamp = t + } + } + + for i := range s.Gpu { + gpu := &s.Gpu[i] + + tags := map[string]string{ + "index": strconv.Itoa(i), + } + fields := map[string]interface{}{} + + common.SetTagIfUsed(tags, "pstate", gpu.PerformanceState) + common.SetTagIfUsed(tags, "name", gpu.ProductName) + common.SetTagIfUsed(tags, "arch", gpu.ProductArchitecture) + common.SetTagIfUsed(tags, "uuid", gpu.UUID) + common.SetTagIfUsed(tags, "compute_mode", gpu.ComputeMode) + + common.SetIfUsed("str", fields, "driver_version", s.DriverVersion) + common.SetIfUsed("str", fields, "cuda_version", s.CudaVersion) + common.SetIfUsed("str", fields, "serial", gpu.Serial) + common.SetIfUsed("str", fields, "vbios_version", gpu.VbiosVersion) + common.SetIfUsed("str", fields, "display_active", gpu.DisplayActive) + common.SetIfUsed("str", fields, "display_mode", gpu.DisplayMode) + common.SetIfUsed("str", fields, "current_ecc", gpu.EccMode.CurrentEcc) + common.SetIfUsed("int", fields, "fan_speed", gpu.FanSpeed) + common.SetIfUsed("int", fields, "memory_total", gpu.FbMemoryUsage.Total) + common.SetIfUsed("int", fields, "memory_used", gpu.FbMemoryUsage.Used) + common.SetIfUsed("int", fields, "memory_free", gpu.FbMemoryUsage.Free) + common.SetIfUsed("int", fields, "memory_reserved", gpu.FbMemoryUsage.Reserved) + // v13 adds detailed ECC error breakdowns (volatile/aggregate, SRAM source attribution) + // that are absent from the v12 schema. + common.SetIfUsed("int", fields, "ecc_errors_volatile_dram_correctable", gpu.EccErrors.Volatile.DramCorrectable) + common.SetIfUsed("int", fields, "ecc_errors_volatile_dram_uncorrectable", gpu.EccErrors.Volatile.DramUncorrectable) + common.SetIfUsed("int", fields, "ecc_errors_volatile_sram_correctable", gpu.EccErrors.Volatile.SramCorrectable) + common.SetIfUsed("int", fields, "ecc_errors_volatile_sram_uncorrectable", gpu.EccErrors.Volatile.SramUncorrectable) + common.SetIfUsed("int", fields, "ecc_errors_volatile_sram_uncorrectable_parity", gpu.EccErrors.Volatile.SramUncorrectableParity) + common.SetIfUsed("int", fields, "ecc_errors_volatile_sram_uncorrectable_secded", gpu.EccErrors.Volatile.SramUncorrectableSecded) + common.SetIfUsed("int", fields, "ecc_errors_aggregate_dram_correctable", gpu.EccErrors.Aggregate.DramCorrectable) + common.SetIfUsed("int", fields, "ecc_errors_aggregate_dram_uncorrectable", gpu.EccErrors.Aggregate.DramUncorrectable) + common.SetIfUsed("int", fields, "ecc_errors_aggregate_sram_correctable", gpu.EccErrors.Aggregate.SramCorrectable) + common.SetIfUsed("int", fields, "ecc_errors_aggregate_sram_uncorrectable", gpu.EccErrors.Aggregate.SramUncorrectable) + common.SetIfUsed("int", fields, "ecc_errors_aggregate_sram_uncorrectable_parity", gpu.EccErrors.Aggregate.SramUncorrectableParity) + common.SetIfUsed("int", fields, "ecc_errors_aggregate_sram_uncorrectable_secded", gpu.EccErrors.Aggregate.SramUncorrectableSecded) + common.SetIfUsed("str", fields, "ecc_errors_aggregate_sram_threshold_exceeded", gpu.EccErrors.Aggregate.SramThresholdExceeded) + common.SetIfUsed("int", fields, "ecc_errors_aggregate_sram_uncorrectable_l2", gpu.EccErrors.AggregateUncorrectableSramSources.SramL2) + common.SetIfUsed("int", fields, "ecc_errors_aggregate_sram_uncorrectable_microcontroller", + gpu.EccErrors.AggregateUncorrectableSramSources.SramMicrocontroller) + common.SetIfUsed("int", fields, "ecc_errors_aggregate_sram_uncorrectable_other", gpu.EccErrors.AggregateUncorrectableSramSources.SramOther) + common.SetIfUsed("int", fields, "ecc_errors_aggregate_sram_uncorrectable_pcie", gpu.EccErrors.AggregateUncorrectableSramSources.SramPcie) + common.SetIfUsed("int", fields, "ecc_errors_aggregate_sram_uncorrectable_sm", gpu.EccErrors.AggregateUncorrectableSramSources.SramSm) + common.SetIfUsed("str", fields, "ecc_errors_channel_repair_pending", gpu.EccErrors.ChannelRepairPending) + common.SetIfUsed("str", fields, "ecc_errors_tpc_repair_pending", gpu.EccErrors.TpcRepairPending) + common.SetIfUsed("str", fields, "ecc_errors_unrepairable_memory", gpu.EccErrors.UnrepairableMemory) + common.SetIfUsed("int", fields, "retired_pages_multiple_single_bit", gpu.RetiredPages.MultipleSingleBitRetirement.RetiredCount) + common.SetIfUsed("int", fields, "retired_pages_double_bit", gpu.RetiredPages.DoubleBitRetirement.RetiredCount) + common.SetIfUsed("str", fields, "retired_pages_blacklist", gpu.RetiredPages.PendingBlacklist) + common.SetIfUsed("str", fields, "retired_pages_pending", gpu.RetiredPages.PendingRetirement) + // v13 renames the remapped-row fields; reference the new struct field names directly. + common.SetIfUsed("int", fields, "remapped_rows_correctable", gpu.RemappedRows.RemappedRowCorr) + common.SetIfUsed("int", fields, "remapped_rows_uncorrectable", gpu.RemappedRows.RemappedRowUnc) + common.SetIfUsed("str", fields, "remapped_rows_pending", gpu.RemappedRows.RemappedRowPending) + common.SetIfUsed("str", fields, "remapped_rows_failure", gpu.RemappedRows.RemappedRowFailure) + common.SetIfUsed("int", fields, "temperature_gpu", gpu.Temperature.GpuTemp) + common.SetIfUsed("int", fields, "utilization_gpu", gpu.Utilization.GpuUtil) + common.SetIfUsed("int", fields, "utilization_memory", gpu.Utilization.MemoryUtil) + common.SetIfUsed("int", fields, "utilization_encoder", gpu.Utilization.EncoderUtil) + common.SetIfUsed("int", fields, "utilization_decoder", gpu.Utilization.DecoderUtil) + common.SetIfUsed("int", fields, "utilization_jpeg", gpu.Utilization.JpegUtil) + common.SetIfUsed("int", fields, "utilization_ofa", gpu.Utilization.OfaUtil) + common.SetIfUsed("int", fields, "pcie_link_gen_current", gpu.Pci.PciGpuLinkInfo.PcieGen.CurrentLinkGen) + common.SetIfUsed("int", fields, "pcie_link_width_current", gpu.Pci.PciGpuLinkInfo.LinkWidths.CurrentLinkWidth) + common.SetIfUsed("int", fields, "encoder_stats_session_count", gpu.EncoderStats.SessionCount) + common.SetIfUsed("int", fields, "encoder_stats_average_fps", gpu.EncoderStats.AverageFps) + common.SetIfUsed("int", fields, "encoder_stats_average_latency", gpu.EncoderStats.AverageLatency) + common.SetIfUsed("int", fields, "fbc_stats_session_count", gpu.FbcStats.SessionCount) + common.SetIfUsed("int", fields, "fbc_stats_average_fps", gpu.FbcStats.AverageFps) + common.SetIfUsed("int", fields, "fbc_stats_average_latency", gpu.FbcStats.AverageLatency) + common.SetIfUsed("int", fields, "clocks_current_graphics", gpu.Clocks.GraphicsClock) + common.SetIfUsed("int", fields, "clocks_current_sm", gpu.Clocks.SmClock) + common.SetIfUsed("int", fields, "clocks_current_memory", gpu.Clocks.MemClock) + common.SetIfUsed("int", fields, "clocks_current_video", gpu.Clocks.VideoClock) + common.SetIfUsed("float", fields, "power_draw", gpu.PowerReadings.PowerDraw) + common.SetIfUsed("float", fields, "power_draw", gpu.PowerReadings.InstantPowerDraw) + common.SetIfUsed("float", fields, "power_limit", gpu.PowerReadings.PowerLimit) + common.SetIfUsed("float", fields, "power_draw", gpu.GpuPowerReadings.PowerDraw) + common.SetIfUsed("float", fields, "power_draw", gpu.GpuPowerReadings.InstantPowerDraw) + common.SetIfUsed("float", fields, "power_limit", gpu.GpuPowerReadings.CurrentPowerLimit) + common.SetIfUsed("float", fields, "power_limit", gpu.GpuPowerReadings.PowerLimit) + common.SetIfUsed("float", fields, "module_power_draw", gpu.ModulePowerReadings.PowerDraw) + common.SetIfUsed("float", fields, "module_power_draw", gpu.ModulePowerReadings.InstantPowerDraw) + acc.AddFields("nvidia_smi", fields, tags, timestamp) + + for _, device := range gpu.MigDevices.MigDevice { + tags := map[string]string{} + common.SetTagIfUsed(tags, "index", device.Index) + common.SetTagIfUsed(tags, "gpu_index", device.GpuInstanceID) + common.SetTagIfUsed(tags, "compute_index", device.ComputeInstanceID) + common.SetTagIfUsed(tags, "pstate", gpu.PerformanceState) + common.SetTagIfUsed(tags, "name", gpu.ProductName) + common.SetTagIfUsed(tags, "arch", gpu.ProductArchitecture) + common.SetTagIfUsed(tags, "uuid", gpu.UUID) + common.SetTagIfUsed(tags, "compute_mode", gpu.ComputeMode) + + fields := map[string]interface{}{} + common.SetIfUsed("int", fields, "sram_uncorrectable", device.EccErrorCount.VolatileCount.SramUncorrectable) + common.SetIfUsed("int", fields, "memory_fb_total", device.FbMemoryUsage.Total) + common.SetIfUsed("int", fields, "memory_fb_reserved", device.FbMemoryUsage.Reserved) + common.SetIfUsed("int", fields, "memory_fb_used", device.FbMemoryUsage.Used) + common.SetIfUsed("int", fields, "memory_fb_free", device.FbMemoryUsage.Free) + common.SetIfUsed("int", fields, "memory_bar1_total", device.Bar1MemoryUsage.Total) + common.SetIfUsed("int", fields, "memory_bar1_used", device.Bar1MemoryUsage.Used) + common.SetIfUsed("int", fields, "memory_bar1_free", device.Bar1MemoryUsage.Free) + + acc.AddFields("nvidia_smi_mig", fields, tags, timestamp) + } + + for _, process := range gpu.Processes.ProcessInfo { + tags := make(map[string]string, 2) + common.SetTagIfUsed(tags, "name", process.ProcessName) + common.SetTagIfUsed(tags, "type", process.Type) + + fields := make(map[string]interface{}, 2) + common.SetIfUsed("int", fields, "pid", process.Pid) + common.SetIfUsed("int", fields, "used_memory", process.UsedMemory) + + acc.AddFields("nvidia_smi_process", fields, tags, timestamp) + } + } + + return nil +} diff --git a/plugins/inputs/nvidia_smi/schema_v13/types.go b/plugins/inputs/nvidia_smi/schema_v13/types.go new file mode 100644 index 00000000000..185b2c064d3 --- /dev/null +++ b/plugins/inputs/nvidia_smi/schema_v13/types.go @@ -0,0 +1,383 @@ +// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: MIT + +package schema_v13 + +// Generated by https://github.com/twpayne/go-xmlstruct with some type corrections. +type smi struct { + AttachedGpus string `xml:"attached_gpus"` + CudaVersion string `xml:"cuda_version"` + DriverVersion string `xml:"driver_version"` + Gpu []struct { + ID string `xml:"id,attr"` + AccountedProcesses struct{} `xml:"accounted_processes"` + AccountingMode string `xml:"accounting_mode"` + AccountingModeBufferSize string `xml:"accounting_mode_buffer_size"` + AddressingMode string `xml:"addressing_mode"` + ApplicationsClocks struct { + GraphicsClock string `xml:"graphics_clock"` + MemClock string `xml:"mem_clock"` + } `xml:"applications_clocks"` + Bar1MemoryUsage struct { + Free string `xml:"free"` + Total string `xml:"total"` + Used string `xml:"used"` + } `xml:"bar1_memory_usage"` + BoardID string `xml:"board_id"` + BoardPartNumber string `xml:"board_part_number"` + C2cMode string `xml:"c2c_mode"` + Capabilities struct { + Egm string `xml:"egm"` + } `xml:"capabilities"` + CcProtectedMemoryUsage struct { + Free string `xml:"free"` + Total string `xml:"total"` + Used string `xml:"used"` + } `xml:"cc_protected_memory_usage"` + ClockPolicy struct { + AutoBoost string `xml:"auto_boost"` + AutoBoostDefault string `xml:"auto_boost_default"` + } `xml:"clock_policy"` + Clocks struct { + GraphicsClock string `xml:"graphics_clock"` + MemClock string `xml:"mem_clock"` + SmClock string `xml:"sm_clock"` + VideoClock string `xml:"video_clock"` + } `xml:"clocks"` + ClocksEventReasons struct { + ClocksEventReasonApplicationsClocksSetting string `xml:"clocks_event_reason_applications_clocks_setting"` + ClocksEventReasonDisplayClocksSetting string `xml:"clocks_event_reason_display_clocks_setting"` + ClocksEventReasonGpuIdle string `xml:"clocks_event_reason_gpu_idle"` + ClocksEventReasonHwPowerBrakeSlowdown string `xml:"clocks_event_reason_hw_power_brake_slowdown"` + ClocksEventReasonHwSlowdown string `xml:"clocks_event_reason_hw_slowdown"` + ClocksEventReasonHwThermalSlowdown string `xml:"clocks_event_reason_hw_thermal_slowdown"` + ClocksEventReasonSwPowerCap string `xml:"clocks_event_reason_sw_power_cap"` + ClocksEventReasonSwThermalSlowdown string `xml:"clocks_event_reason_sw_thermal_slowdown"` + ClocksEventReasonSyncBoost string `xml:"clocks_event_reason_sync_boost"` + } `xml:"clocks_event_reasons"` + ClocksEventReasonsCounters struct { + ClocksEventReasonsCountersHwPowerBrake string `xml:"clocks_event_reasons_counters_hw_power_brake"` + ClocksEventReasonsCountersHwThermSlowdown string `xml:"clocks_event_reasons_counters_hw_therm_slowdown"` + ClocksEventReasonsCountersSwPowerCap string `xml:"clocks_event_reasons_counters_sw_power_cap"` + ClocksEventReasonsCountersSwThermSlowdown string `xml:"clocks_event_reasons_counters_sw_therm_slowdown"` + ClocksEventReasonsCountersSyncBoost string `xml:"clocks_event_reasons_counters_sync_boost"` + } `xml:"clocks_event_reasons_counters"` + ComputeMode string `xml:"compute_mode"` + DefaultApplicationsClocks struct { + GraphicsClock string `xml:"graphics_clock"` + MemClock string `xml:"mem_clock"` + } `xml:"default_applications_clocks"` + DeferredClocks struct { + MemClock string `xml:"mem_clock"` + } `xml:"deferred_clocks"` + DisplayActive string `xml:"display_active"` + DisplayAttached string `xml:"display_attached"` + DisplayMode string `xml:"display_mode"` + DramEncryptionMode struct { + CurrentDramEncryption string `xml:"current_dram_encryption"` + PendingDramEncryption string `xml:"pending_dram_encryption"` + } `xml:"dram_encryption_mode"` + DriverModel struct { + CurrentDm string `xml:"current_dm"` + PendingDm string `xml:"pending_dm"` + } `xml:"driver_model"` + EccErrors struct { + Aggregate struct { + DramCorrectable string `xml:"dram_correctable"` + DramUncorrectable string `xml:"dram_uncorrectable"` + SramCorrectable string `xml:"sram_correctable"` + SramThresholdExceeded string `xml:"sram_threshold_exceeded"` + SramUncorrectable string `xml:"sram_uncorrectable"` + SramUncorrectableParity string `xml:"sram_uncorrectable_parity"` + SramUncorrectableSecded string `xml:"sram_uncorrectable_secded"` + } `xml:"aggregate"` + AggregateUncorrectableSramSources struct { + SramL2 string `xml:"sram_l2"` + SramMicrocontroller string `xml:"sram_microcontroller"` + SramOther string `xml:"sram_other"` + SramPcie string `xml:"sram_pcie"` + SramSm string `xml:"sram_sm"` + } `xml:"aggregate_uncorrectable_sram_sources"` + ChannelRepairPending string `xml:"channel_repair_pending"` + TpcRepairPending string `xml:"tpc_repair_pending"` + UnrepairableMemory string `xml:"unrepairable_memory"` + Volatile struct { + DramCorrectable string `xml:"dram_correctable"` + DramUncorrectable string `xml:"dram_uncorrectable"` + SramCorrectable string `xml:"sram_correctable"` + SramUncorrectable string `xml:"sram_uncorrectable"` + SramUncorrectableParity string `xml:"sram_uncorrectable_parity"` + SramUncorrectableSecded string `xml:"sram_uncorrectable_secded"` + } `xml:"volatile"` + } `xml:"ecc_errors"` + EccMode struct { + CurrentEcc string `xml:"current_ecc"` + PendingEcc string `xml:"pending_ecc"` + } `xml:"ecc_mode"` + EdppMultiplier string `xml:"edpp_multiplier"` + EncoderStats struct { + AverageFps string `xml:"average_fps"` + AverageLatency string `xml:"average_latency"` + SessionCount string `xml:"session_count"` + } `xml:"encoder_stats"` + Fabric struct { + CliqueID string `xml:"cliqueId"` + ClusterUUID string `xml:"clusterUuid"` + Health struct { + AccessTimeoutRecovery string `xml:"access_timeout_recovery"` + Bandwidth string `xml:"bandwidth"` + IncorrectConfiguration string `xml:"incorrect_configuration"` + RouteRecoveryInProgress string `xml:"route_recovery_in_progress"` + RouteUnhealthy string `xml:"route_unhealthy"` + Summary string `xml:"summary"` + } `xml:"health"` + State string `xml:"state"` + Status string `xml:"status"` + } `xml:"fabric"` + FanSpeed string `xml:"fan_speed"` + FbMemoryUsage struct { + Free string `xml:"free"` + Reserved string `xml:"reserved"` + Total string `xml:"total"` + Used string `xml:"used"` + } `xml:"fb_memory_usage"` + FbcStats struct { + AverageFps string `xml:"average_fps"` + AverageLatency string `xml:"average_latency"` + SessionCount string `xml:"session_count"` + } `xml:"fbc_stats"` + GpuFruPartNumber string `xml:"gpu_fru_part_number"` + GpuMemoryPowerReadings struct { + AveragePowerDraw string `xml:"average_power_draw"` + InstantPowerDraw string `xml:"instant_power_draw"` + } `xml:"gpu_memory_power_readings"` + GpuModuleID string `xml:"gpu_module_id"` + GpuOperationMode struct { + CurrentGom string `xml:"current_gom"` + PendingGom string `xml:"pending_gom"` + } `xml:"gpu_operation_mode"` + GpuPartNumber string `xml:"gpu_part_number"` + GpuPowerReadings struct { + AveragePowerDraw string `xml:"average_power_draw"` + CurrentPowerLimit string `xml:"current_power_limit"` + DefaultPowerLimit string `xml:"default_power_limit"` + InstantPowerDraw string `xml:"instant_power_draw"` + MaxPowerLimit string `xml:"max_power_limit"` + MinPowerLimit string `xml:"min_power_limit"` + PowerDraw string `xml:"power_draw"` + PowerLimit string `xml:"power_limit"` + PowerState string `xml:"power_state"` + RequestedPowerLimit string `xml:"requested_power_limit"` + } `xml:"gpu_power_readings"` + GpuRecoveryAction string `xml:"gpu_recovery_action"` + GpuResetStatus struct { + DrainAndResetRecommended string `xml:"drain_and_reset_recommended"` + ResetRequired string `xml:"reset_required"` + } `xml:"gpu_reset_status"` + GpuVirtualizationMode struct { + HostVgpuMode string `xml:"host_vgpu_mode"` + VgpuHeterogeneousMode string `xml:"vgpu_heterogeneous_mode"` + VirtualizationMode string `xml:"virtualization_mode"` + } `xml:"gpu_virtualization_mode"` + GspFirmwareVersion string `xml:"gsp_firmware_version"` + Ibmnpu struct { + RelaxedOrderingMode string `xml:"relaxed_ordering_mode"` + } `xml:"ibmnpu"` + InforomBbxFlush struct { + LatestDuration string `xml:"latest_duration"` + LatestTimestamp string `xml:"latest_timestamp"` + } `xml:"inforom_bbx_flush"` + InforomVersion struct { + EccObject string `xml:"ecc_object"` + ImgVersion string `xml:"img_version"` + OemObject string `xml:"oem_object"` + PwrObject string `xml:"pwr_object"` + } `xml:"inforom_version"` + MaxClocks struct { + GraphicsClock string `xml:"graphics_clock"` + MemClock string `xml:"mem_clock"` + SmClock string `xml:"sm_clock"` + VideoClock string `xml:"video_clock"` + } `xml:"max_clocks"` + MaxCustomerBoostClocks struct { + GraphicsClock string `xml:"graphics_clock"` + } `xml:"max_customer_boost_clocks"` + MigDevices struct { + MigDevice []struct { + Index string `xml:"index"` + GpuInstanceID string `xml:"gpu_instance_id"` + ComputeInstanceID string `xml:"compute_instance_id"` + EccErrorCount struct { + Text string `xml:",chardata" json:"text"` + VolatileCount struct { + SramUncorrectable string `xml:"sram_uncorrectable"` + } `xml:"volatile_count" json:"volatile_count"` + } `xml:"ecc_error_count" json:"ecc_error_count"` + FbMemoryUsage struct { + Total string `xml:"total"` + Reserved string `xml:"reserved"` + Used string `xml:"used"` + Free string `xml:"free"` + } `xml:"fb_memory_usage" json:"fb_memory_usage"` + Bar1MemoryUsage struct { + Total string `xml:"total"` + Used string `xml:"used"` + Free string `xml:"free"` + } `xml:"bar1_memory_usage" json:"bar1_memory_usage"` + } `xml:"mig_device" json:"mig_device"` + } `xml:"mig_devices" json:"mig_devices"` + MigMode struct { + CurrentMig string `xml:"current_mig"` + PendingMig string `xml:"pending_mig"` + } `xml:"mig_mode"` + MinorNumber string `xml:"minor_number"` + ModulePowerReadings struct { + AveragePowerDraw string `xml:"average_power_draw"` + CurrentPowerLimit string `xml:"current_power_limit"` + DefaultPowerLimit string `xml:"default_power_limit"` + InstantPowerDraw string `xml:"instant_power_draw"` + MaxPowerLimit string `xml:"max_power_limit"` + MinPowerLimit string `xml:"min_power_limit"` + PowerDraw string `xml:"power_draw"` + PowerState string `xml:"power_state"` + RequestedPowerLimit string `xml:"requested_power_limit"` + } `xml:"module_power_readings"` + MultigpuBoard string `xml:"multigpu_board"` + Pci struct { + AtomicCapsInbound string `xml:"atomic_caps_inbound"` + AtomicCapsOutbound string `xml:"atomic_caps_outbound"` + PciBaseClass string `xml:"pci_base_class"` + PciBridgeChip struct { + BridgeChipFw string `xml:"bridge_chip_fw"` + BridgeChipType string `xml:"bridge_chip_type"` + } `xml:"pci_bridge_chip"` + PciBus string `xml:"pci_bus"` + PciBusID string `xml:"pci_bus_id"` + PciDevice string `xml:"pci_device"` + PciDeviceID string `xml:"pci_device_id"` + PciDomain string `xml:"pci_domain"` + PciGpuLinkInfo struct { + LinkWidths struct { + CurrentLinkWidth string `xml:"current_link_width"` + MaxLinkWidth string `xml:"max_link_width"` + } `xml:"link_widths"` + PcieGen struct { + CurrentLinkGen string `xml:"current_link_gen"` + DeviceCurrentLinkGen string `xml:"device_current_link_gen"` + MaxDeviceLinkGen string `xml:"max_device_link_gen"` + MaxHostLinkGen string `xml:"max_host_link_gen"` + MaxLinkGen string `xml:"max_link_gen"` + } `xml:"pcie_gen"` + } `xml:"pci_gpu_link_info"` + PciSubClass string `xml:"pci_sub_class"` + PciSubSystemID string `xml:"pci_sub_system_id"` + ReplayCounter string `xml:"replay_counter"` + ReplayRolloverCounter string `xml:"replay_rollover_counter"` + RxUtil string `xml:"rx_util"` + TxUtil string `xml:"tx_util"` + } `xml:"pci"` + Pdi string `xml:"pdi"` + PerformanceState string `xml:"performance_state"` + PersistenceMode string `xml:"persistence_mode"` + PlatformInfo struct { + ChassisSerialNumber string `xml:"chassis_serial_number"` + GpuFabricGUID string `xml:"gpu_fabric_guid"` + HostID string `xml:"host_id"` + ModuleID string `xml:"module_id"` + PeerType string `xml:"peer_type"` + SlotNumber string `xml:"slot_number"` + TrayIndex string `xml:"tray_index"` + } `xml:"platformInfo"` + PowerProfiles struct { + PowerProfileEnforcedProfiles string `xml:"power_profile_enforced_profiles"` + PowerProfileRequestedProfiles string `xml:"power_profile_requested_profiles"` + } `xml:"power_profiles"` + PowerReadings struct { + AveragePowerDraw string `xml:"average_power_draw"` + DefaultPowerLimit string `xml:"default_power_limit"` + EnforcedPowerLimit string `xml:"enforced_power_limit"` + InstantPowerDraw string `xml:"instant_power_draw"` + MaxPowerLimit string `xml:"max_power_limit"` + MinPowerLimit string `xml:"min_power_limit"` + PowerDraw string `xml:"power_draw"` + PowerLimit string `xml:"power_limit"` + PowerManagement string `xml:"power_management"` + PowerState string `xml:"power_state"` + } `xml:"power_readings"` + PowerSmoothing string `xml:"power_smoothing"` + Processes struct { + ProcessInfo []struct { + ComputeInstanceID string `xml:"compute_instance_id"` + GpuInstanceID string `xml:"gpu_instance_id"` + Pid string `xml:"pid"` + ProcessName string `xml:"process_name"` + Type string `xml:"type"` + UsedMemory string `xml:"used_memory"` + } `xml:"process_info"` + } `xml:"processes"` + ProductArchitecture string `xml:"product_architecture"` + ProductBrand string `xml:"product_brand"` + ProductName string `xml:"product_name"` + RemappedRows struct { + RemappedRowCorr string `xml:"remapped_row_corr"` + RemappedRowFailure string `xml:"remapped_row_failure"` + RemappedRowPending string `xml:"remapped_row_pending"` + RemappedRowUnc string `xml:"remapped_row_unc"` + RowRemapperHistogram struct { + RowRemapperHistogramHigh string `xml:"row_remapper_histogram_high"` + RowRemapperHistogramLow string `xml:"row_remapper_histogram_low"` + RowRemapperHistogramMax string `xml:"row_remapper_histogram_max"` + RowRemapperHistogramNone string `xml:"row_remapper_histogram_none"` + RowRemapperHistogramPartial string `xml:"row_remapper_histogram_partial"` + } `xml:"row_remapper_histogram"` + } `xml:"remapped_rows"` + RetiredPages struct { + DoubleBitRetirement struct { + RetiredCount string `xml:"retired_count"` + RetiredPagelist string `xml:"retired_pagelist"` + } `xml:"double_bit_retirement"` + MultipleSingleBitRetirement struct { + RetiredCount string `xml:"retired_count"` + RetiredPagelist string `xml:"retired_pagelist"` + } `xml:"multiple_single_bit_retirement"` + PendingBlacklist string `xml:"pending_blacklist"` + PendingRetirement string `xml:"pending_retirement"` + } `xml:"retired_pages"` + Serial string `xml:"serial"` + SparseOperationMode string `xml:"sparse_operation_mode"` + SupportedClocks struct { + SupportedMemClock []struct { + SupportedGraphicsClock []string `xml:"supported_graphics_clock"` + Value string `xml:"value"` + } `xml:"supported_mem_clock"` + } `xml:"supported_clocks"` + SupportedGpuTargetTemp struct { + GpuTargetTempMax string `xml:"gpu_target_temp_max"` + GpuTargetTempMin string `xml:"gpu_target_temp_min"` + } `xml:"supported_gpu_target_temp"` + Temperature struct { + GpuTargetTemperature string `xml:"gpu_target_temperature"` + GpuTemp string `xml:"gpu_temp"` + GpuTempMaxGpuTlimitThreshold string `xml:"gpu_temp_max_gpu_tlimit_threshold"` + GpuTempMaxMemTlimitThreshold string `xml:"gpu_temp_max_mem_tlimit_threshold"` + GpuTempMaxTlimitThreshold string `xml:"gpu_temp_max_tlimit_threshold"` + GpuTempSlowTlimitThreshold string `xml:"gpu_temp_slow_tlimit_threshold"` + GpuTempTlimit string `xml:"gpu_temp_tlimit"` + MemoryTemp string `xml:"memory_temp"` + } `xml:"temperature"` + Utilization struct { + DecoderUtil string `xml:"decoder_util"` + EncoderUtil string `xml:"encoder_util"` + GpuUtil string `xml:"gpu_util"` + JpegUtil string `xml:"jpeg_util"` + MemoryUtil string `xml:"memory_util"` + OfaUtil string `xml:"ofa_util"` + } `xml:"utilization"` + UUID string `xml:"uuid"` + VbiosVersion string `xml:"vbios_version"` + Voltage struct { + GraphicsVolt string `xml:"graphics_volt"` + } `xml:"voltage"` + } `xml:"gpu"` + Timestamp string `xml:"timestamp"` +} diff --git a/plugins/inputs/nvidia_smi/testdata/rtx-3080-v13.xml b/plugins/inputs/nvidia_smi/testdata/rtx-3080-v13.xml new file mode 100644 index 00000000000..8f088f09283 --- /dev/null +++ b/plugins/inputs/nvidia_smi/testdata/rtx-3080-v13.xml @@ -0,0 +1,849 @@ + + + + Fri Apr 10 10:23:01 2026 + 595.58.03 + 13.2 + 1 + + NVIDIA GeForce RTX 3080 + GeForce + Ampere + Requested functionality has been deprecated + Yes + Disabled + Disabled + HMM + + N/A + N/A + + + None + + Disabled + 4000 + + N/A + N/A + + REDACTED + GPU-19d6d965-2acc-f646-00f8-4c76979aabb4 + 0xb10cbc14dec8c521 + 0 + 94.02.71.40.72 + No + 0xc00 + N/A + 2216-202-A1 + N/A + + N/A + N/A + N/A + N/A + N/A + 1 + N/A + + + G001.0000.03.03 + 2.0 + N/A + N/A + + + N/A + N/A + + + N/A + N/A + + N/A + + None + N/A + N/A + + None + 595.58.03 + + N/A + + + 0C + 00 + 0000 + 3 + 0 + 221610DE + 00000000:0C:00.0 + 161219DA + + + 4 + 4 + 4 + 4 + 4 + + + 16x + 16x + + + + N/A + N/A + + 0 + 0 + 1066699 KB/s + 14742333 KB/s + N/A + N/A + + 0 % + P2 + + Not Active + Not Active + Not Active + Not Active + Not Active + Not Active + Not Active + Not Active + Not Active + + + 0 us + 0 us + 0 us + 0 us + 0 us + + N/A + + 10240 MiB + 397 MiB + 9184 MiB + 660 MiB + + + 16384 MiB + 9218 MiB + 7166 MiB + + + 0 MiB + 0 MiB + 0 MiB + + Default + + 65 % + 9 % + 0 % + 0 % + 0 % + 0 % + + + 0 + 0 + 0 + + + 0 + 0 + 0 + + + N/A + N/A + + + N/A + N/A + + + + N/A + N/A + N/A + N/A + N/A + + + N/A + N/A + N/A + N/A + N/A + N/A + + + N/A + N/A + N/A + N/A + N/A + + No + No + N/A + + + + N/A + N/A + + + N/A + N/A + + N/A + N/A + + N/A + + 27 C + N/A + 98 C + 95 C + 93 C + 83 C + N/A + N/A + + + 65 C + 91 C + + + Requested functionality has been deprecated + 139.62 W + 142.33 W + 320.00 W + 320.00 W + 320.00 W + 100.00 W + 336.00 W + + + N/A + N/A + + + Requested functionality has been deprecated + N/A + N/A + N/A + N/A + N/A + N/A + N/A + + N/A + + N/A + N/A + + N/A + + 1950 MHz + 1950 MHz + 9251 MHz + 1710 MHz + + + Requested functionality has been deprecated + Requested functionality has been deprecated + + + Requested functionality has been deprecated + Requested functionality has been deprecated + + + N/A + + + 2100 MHz + 2100 MHz + 9501 MHz + 1950 MHz + + + N/A + + + N/A + N/A + + + N/A + N/A + N/A + N/A + + N/A + N/A + N/A + N/A + N/A + N/A + N/A + + + + + 9501 MHz + 2100 MHz + 2085 MHz + 2070 MHz + 2055 MHz + 2040 MHz + 2025 MHz + 2010 MHz + 1995 MHz + 1980 MHz + 1965 MHz + 1950 MHz + 1935 MHz + 1920 MHz + 1905 MHz + 1890 MHz + 1875 MHz + 1860 MHz + 1845 MHz + 1830 MHz + 1815 MHz + 1800 MHz + 1785 MHz + 1770 MHz + 1755 MHz + 1740 MHz + 1725 MHz + 1710 MHz + 1695 MHz + 1680 MHz + 1665 MHz + 1650 MHz + 1635 MHz + 1620 MHz + 1605 MHz + 1590 MHz + 1575 MHz + 1560 MHz + 1545 MHz + 1530 MHz + 1515 MHz + 1500 MHz + 1485 MHz + 1470 MHz + 1455 MHz + 1440 MHz + 1425 MHz + 1410 MHz + 1395 MHz + 1380 MHz + 1365 MHz + 1350 MHz + 1335 MHz + 1320 MHz + 1305 MHz + 1290 MHz + 1275 MHz + 1260 MHz + 1245 MHz + 1230 MHz + 1215 MHz + 1200 MHz + 1185 MHz + 1170 MHz + 1155 MHz + 1140 MHz + 1125 MHz + 1110 MHz + 1095 MHz + 1080 MHz + 1065 MHz + 1050 MHz + 1035 MHz + 1020 MHz + 1005 MHz + 990 MHz + 975 MHz + 960 MHz + 945 MHz + 930 MHz + 915 MHz + 900 MHz + 885 MHz + 870 MHz + 855 MHz + 840 MHz + 825 MHz + 810 MHz + 795 MHz + 780 MHz + 765 MHz + 750 MHz + 735 MHz + 720 MHz + 705 MHz + 690 MHz + 675 MHz + 660 MHz + 645 MHz + 630 MHz + 615 MHz + 600 MHz + 585 MHz + 570 MHz + 555 MHz + 540 MHz + 525 MHz + 510 MHz + 495 MHz + 480 MHz + 465 MHz + 450 MHz + 435 MHz + 420 MHz + 405 MHz + 390 MHz + 375 MHz + 360 MHz + 345 MHz + 330 MHz + 315 MHz + 300 MHz + 285 MHz + 270 MHz + 255 MHz + 240 MHz + 225 MHz + 210 MHz + + + 9251 MHz + 2100 MHz + 2085 MHz + 2070 MHz + 2055 MHz + 2040 MHz + 2025 MHz + 2010 MHz + 1995 MHz + 1980 MHz + 1965 MHz + 1950 MHz + 1935 MHz + 1920 MHz + 1905 MHz + 1890 MHz + 1875 MHz + 1860 MHz + 1845 MHz + 1830 MHz + 1815 MHz + 1800 MHz + 1785 MHz + 1770 MHz + 1755 MHz + 1740 MHz + 1725 MHz + 1710 MHz + 1695 MHz + 1680 MHz + 1665 MHz + 1650 MHz + 1635 MHz + 1620 MHz + 1605 MHz + 1590 MHz + 1575 MHz + 1560 MHz + 1545 MHz + 1530 MHz + 1515 MHz + 1500 MHz + 1485 MHz + 1470 MHz + 1455 MHz + 1440 MHz + 1425 MHz + 1410 MHz + 1395 MHz + 1380 MHz + 1365 MHz + 1350 MHz + 1335 MHz + 1320 MHz + 1305 MHz + 1290 MHz + 1275 MHz + 1260 MHz + 1245 MHz + 1230 MHz + 1215 MHz + 1200 MHz + 1185 MHz + 1170 MHz + 1155 MHz + 1140 MHz + 1125 MHz + 1110 MHz + 1095 MHz + 1080 MHz + 1065 MHz + 1050 MHz + 1035 MHz + 1020 MHz + 1005 MHz + 990 MHz + 975 MHz + 960 MHz + 945 MHz + 930 MHz + 915 MHz + 900 MHz + 885 MHz + 870 MHz + 855 MHz + 840 MHz + 825 MHz + 810 MHz + 795 MHz + 780 MHz + 765 MHz + 750 MHz + 735 MHz + 720 MHz + 705 MHz + 690 MHz + 675 MHz + 660 MHz + 645 MHz + 630 MHz + 615 MHz + 600 MHz + 585 MHz + 570 MHz + 555 MHz + 540 MHz + 525 MHz + 510 MHz + 495 MHz + 480 MHz + 465 MHz + 450 MHz + 435 MHz + 420 MHz + 405 MHz + 390 MHz + 375 MHz + 360 MHz + 345 MHz + 330 MHz + 315 MHz + 300 MHz + 285 MHz + 270 MHz + 255 MHz + 240 MHz + 225 MHz + 210 MHz + + + 5001 MHz + 2100 MHz + 2085 MHz + 2070 MHz + 2055 MHz + 2040 MHz + 2025 MHz + 2010 MHz + 1995 MHz + 1980 MHz + 1965 MHz + 1950 MHz + 1935 MHz + 1920 MHz + 1905 MHz + 1890 MHz + 1875 MHz + 1860 MHz + 1845 MHz + 1830 MHz + 1815 MHz + 1800 MHz + 1785 MHz + 1770 MHz + 1755 MHz + 1740 MHz + 1725 MHz + 1710 MHz + 1695 MHz + 1680 MHz + 1665 MHz + 1650 MHz + 1635 MHz + 1620 MHz + 1605 MHz + 1590 MHz + 1575 MHz + 1560 MHz + 1545 MHz + 1530 MHz + 1515 MHz + 1500 MHz + 1485 MHz + 1470 MHz + 1455 MHz + 1440 MHz + 1425 MHz + 1410 MHz + 1395 MHz + 1380 MHz + 1365 MHz + 1350 MHz + 1335 MHz + 1320 MHz + 1305 MHz + 1290 MHz + 1275 MHz + 1260 MHz + 1245 MHz + 1230 MHz + 1215 MHz + 1200 MHz + 1185 MHz + 1170 MHz + 1155 MHz + 1140 MHz + 1125 MHz + 1110 MHz + 1095 MHz + 1080 MHz + 1065 MHz + 1050 MHz + 1035 MHz + 1020 MHz + 1005 MHz + 990 MHz + 975 MHz + 960 MHz + 945 MHz + 930 MHz + 915 MHz + 900 MHz + 885 MHz + 870 MHz + 855 MHz + 840 MHz + 825 MHz + 810 MHz + 795 MHz + 780 MHz + 765 MHz + 750 MHz + 735 MHz + 720 MHz + 705 MHz + 690 MHz + 675 MHz + 660 MHz + 645 MHz + 630 MHz + 615 MHz + 600 MHz + 585 MHz + 570 MHz + 555 MHz + 540 MHz + 525 MHz + 510 MHz + 495 MHz + 480 MHz + 465 MHz + 450 MHz + 435 MHz + 420 MHz + 405 MHz + 390 MHz + 375 MHz + 360 MHz + 345 MHz + 330 MHz + 315 MHz + 300 MHz + 285 MHz + 270 MHz + 255 MHz + 240 MHz + 225 MHz + 210 MHz + + + 810 MHz + 2100 MHz + 2085 MHz + 2070 MHz + 2055 MHz + 2040 MHz + 2025 MHz + 2010 MHz + 1995 MHz + 1980 MHz + 1965 MHz + 1950 MHz + 1935 MHz + 1920 MHz + 1905 MHz + 1890 MHz + 1875 MHz + 1860 MHz + 1845 MHz + 1830 MHz + 1815 MHz + 1800 MHz + 1785 MHz + 1770 MHz + 1755 MHz + 1740 MHz + 1725 MHz + 1710 MHz + 1695 MHz + 1680 MHz + 1665 MHz + 1650 MHz + 1635 MHz + 1620 MHz + 1605 MHz + 1590 MHz + 1575 MHz + 1560 MHz + 1545 MHz + 1530 MHz + 1515 MHz + 1500 MHz + 1485 MHz + 1470 MHz + 1455 MHz + 1440 MHz + 1425 MHz + 1410 MHz + 1395 MHz + 1380 MHz + 1365 MHz + 1350 MHz + 1335 MHz + 1320 MHz + 1305 MHz + 1290 MHz + 1275 MHz + 1260 MHz + 1245 MHz + 1230 MHz + 1215 MHz + 1200 MHz + 1185 MHz + 1170 MHz + 1155 MHz + 1140 MHz + 1125 MHz + 1110 MHz + 1095 MHz + 1080 MHz + 1065 MHz + 1050 MHz + 1035 MHz + 1020 MHz + 1005 MHz + 990 MHz + 975 MHz + 960 MHz + 945 MHz + 930 MHz + 915 MHz + 900 MHz + 885 MHz + 870 MHz + 855 MHz + 840 MHz + 825 MHz + 810 MHz + 795 MHz + 780 MHz + 765 MHz + 750 MHz + 735 MHz + 720 MHz + 705 MHz + 690 MHz + 675 MHz + 660 MHz + 645 MHz + 630 MHz + 615 MHz + 600 MHz + 585 MHz + 570 MHz + 555 MHz + 540 MHz + 525 MHz + 510 MHz + 495 MHz + 480 MHz + 465 MHz + 450 MHz + 435 MHz + 420 MHz + 405 MHz + 390 MHz + 375 MHz + 360 MHz + 345 MHz + 330 MHz + 315 MHz + 300 MHz + 285 MHz + 270 MHz + 255 MHz + 240 MHz + 225 MHz + 210 MHz + + + 405 MHz + 420 MHz + 405 MHz + 390 MHz + 375 MHz + 360 MHz + 345 MHz + 330 MHz + 315 MHz + 300 MHz + 285 MHz + 270 MHz + 255 MHz + 240 MHz + 225 MHz + 210 MHz + + + + + + + + disabled + + + +