nicolargo / glances

Glances an Eye on your system. A top/htop alternative for GNU/Linux, BSD, Mac OS and Windows operating systems.
http://nicolargo.github.io/glances/
Other
26.81k stars 1.53k forks source link

SMART is not displayed on a web page but available in a container through smartctl #2916

Open v-bulynkin opened 3 months ago

v-bulynkin commented 3 months ago

Hello dear sir,

I'm trying to display the SMART information from Docker container. What I've done:

  1. Enabled SMART plugin by disable=False in glances.conf.
  2. Added the following options to the Glances service in docker-compose.yml:
    privileged: true
    devices:
      - /dev/nvme0n1:/dev/nvme0n1

    After that:

  3. "SMART disks" on a web page is empty
  4. docker exec glances glances --stdout smart is empty too:
    2024-08-11 10:06:13,778 -- INFO -- Start Glances 4.2.0_beta04
    2024-08-11 10:06:13,778 -- INFO -- CPython 3.12.3 (/venv/bin/python3) and psutil 6.0.0 detected
    2024-08-11 10:06:13,783 -- INFO -- Read configuration file '/etc/glances/glances.conf'
    2024-08-11 10:06:13,908 -- INFO -- Start GlancesStandalone mode
    2024-08-11 10:06:14,080 -- INFO -- Export process filter is set to: .*
    2024-08-11 10:06:14,531 -- INFO -- Stdout mode is ON, following stats will be displayed: smart
    smart: []
    smart: []
  5. docker exec glances smartctl -a /dev/nvme0n1 works well:
    
    smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.8.0-39-generic] (local build)
    Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION === Model Number: Samsung SSD 980 PRO 1TB Serial Number: XXXXXXXXXXXXXXX Firmware Version: 5B2QGXA7 PCI Vendor/Subsystem ID: 0x144d IEEE OUI Identifier: 0x002538 Total NVM Capacity: 1,000,204,886,016 [1.00 TB] Unallocated NVM Capacity: 0 Controller ID: 6 NVMe Version: 1.3 Number of Namespaces: 1 Namespace 1 Size/Capacity: 1,000,204,886,016 [1.00 TB] Namespace 1 Utilization: 115,592,560,640 [115 GB] Namespace 1 Formatted LBA Size: 512 Namespace 1 IEEE EUI-64: 002538 b531a5b590 Local Time is: Sun Aug 11 09:58:14 2024 UTC Firmware Updates (0x16): 3 Slots, no Reset required Optional Admin Commands (0x0017): Security Format Frmw_DL Self_Test Optional NVM Commands (0x0057): Comp Wr_Unc DS_Mngmt Sav/Sel_Feat Timestmp Log Page Attributes (0x0f): S/H_per_NS Cmd_Eff_Lg Ext_Get_Lg Telmtry_Lg Maximum Data Transfer Size: 128 Pages Warning Comp. Temp. Threshold: 82 Celsius Critical Comp. Temp. Threshold: 85 Celsius

Supported Power States St Op Max Active Idle RL RT WL WT Ent_Lat Ex_Lat 0 + 8.49W - - 0 0 0 0 0 0 1 + 4.48W - - 1 1 1 1 0 200 2 + 3.18W - - 2 2 2 2 0 1000 3 - 0.0400W - - 3 3 3 3 2000 1200 4 - 0.0050W - - 4 4 4 4 500 9500

Supported LBA Sizes (NSID 0x1) Id Fmt Data Metadt Rel_Perf 0 + 512 0 0

=== START OF SMART DATA SECTION === SMART overall-health self-assessment test result: PASSED

SMART/Health Information (NVMe Log 0x02) Critical Warning: 0x00 Temperature: 56 Celsius Available Spare: 100% Available Spare Threshold: 10% Percentage Used: 0% Data Units Read: 140,764 [72.0 GB] Data Units Written: 516,631 [264 GB] Host Read Commands: 1,953,083 Host Write Commands: 5,805,489 Controller Busy Time: 82 Power Cycles: 32 Power On Hours: 15 Unsafe Shutdowns: 11 Media and Data Integrity Errors: 0 Error Information Log Entries: 0 Warning Comp. Temperature Time: 0 Critical Comp. Temperature Time: 0 Temperature Sensor 1: 56 Celsius Temperature Sensor 2: 61 Celsius

Error Information (NVMe Log 0x01, 16 of 64 entries) No Errors Logged

Read Self-test Log failed: Invalid Field in Command (0x002)



Why the SMART plugin can't show the information? Does it support NVMe drives?
nicolargo commented 3 months ago

Hi @v-bulynkin

the Smart plugin is disable by default in the Glances configuration file.

You can enable by editing your glances.conf file (/etc/glances/glances.conf inside the container):

[smart]
# Documentation: https://glances.readthedocs.io/en/latest/aoa/smart.html
# This plugin is disabled by default
disable=True

or via the command line:

docker exec glances glances --enable-plugin smart

Keep us inform.

v-bulynkin commented 3 months ago

I wrote that I enabled it in the first message:

  1. Enabled SMART plugin by disable=False in glances.conf.

I mount the glances.conf file in docker-compose.yml the following way:

    volumes:
      - ./glances/glances.conf:/etc/glances/glances.conf

Is it not enough?

RazCrimson commented 3 months ago

@v-bulynkin That should be enough, but glances looks for paths in multiple locations. So if possible, could you just give the command line variant a try, so that atleast it works when enabled explicitly?

docker exec glances glances --enable-plugin smart

If that works, then could you just try running glances in debug mode (-d flag) and check the start of the logs?

Should be present at ~/.local/share/glances/glances.log inside the container

v-bulynkin commented 2 months ago

I have this configuration now in docker-compose.yml:

  glances:
    image: nicolargo/glances:dev
    container_name: glances
    hostname: example.com
    restart: unless-stopped
    pid: host
    privileged: true
    devices:
      - "/dev/nvme0"
    environment:
      GLANCES_OPT: "-w -d --enable-plugin smart"
    volumes:
      - ./glances/glances.conf:/etc/glances/glances.conf
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /etc/os-release:/etc/os-release:ro
    labels:
      - "traefik.enable=true"
      - "traefik.http.services.glances.loadbalancer.server.port=61208"
      - "traefik.http.routers.glances.rule=Host(`example.com`) && (PathPrefix(`/mon/`) || Path(`/mon`))"
      - "traefik.http.routers.glances.tls.certresolver=le"
      - "traefik.http.routers.glances.entrypoints=websecure"

In logs: docker logs glances >& glances.log cat glances.log |grep smart

2024-08-12 14:18:26,406 -- DEBUG -- Init smart plugin
2024-08-12 14:18:26,406 -- DEBUG -- Load section smart in Glances configuration file
2024-08-12 14:18:26,406 -- DEBUG -- Load limit: smart_disable = ['False']
2024-08-12 14:18:26,406 -- DEBUG -- Plugin smart started in 0.006852 seconds
2024-08-12 14:18:26,499 -- DEBUG -- Active plugins list: ['containers', 'uptime', 'help', 'ports', 'now', 'network', 'amps', 'percpu', 'quicklook', 'smart', 'wifi', 'load', 'processcount', 'alert', 'fs', 'core', 'cpu', 'psutilversion', 'mem', 'diskio', 'memswap', 'sensors', 'version', 'folders', 'gpu', 'processlist', 'system']
2024-08-12 14:18:26,823 -- DEBUG -- PluginModel glances.plugins.smart update return [] in 0.216957 seconds
2024-08-12 14:18:41,452 -- DEBUG -- PluginModel glances.plugins.smart update return [] in 0.235986 seconds
2024-08-12 14:18:53,826 -- DEBUG -- PluginModel glances.plugins.smart update return [] in 0.217937 seconds
2024-08-12 14:19:04,340 -- DEBUG -- PluginModel glances.plugins.smart update return [] in 0.210826 seconds
2024-08-12 14:19:15,909 -- DEBUG -- PluginModel glances.plugins.smart update return [] in 0.22168 seconds
2024-08-12 14:19:26,381 -- DEBUG -- PluginModel glances.plugins.smart update return [] in 0.226953 seconds
2024-08-12 14:19:36,934 -- DEBUG -- PluginModel glances.plugins.smart update return [] in 0.220929 seconds
nicolargo commented 2 months ago

It's perhaps an issue concerning the read rights on the /dev/nvme0n1 file. Inside your container, glances user should be allowed to read this file.

I have the same issue on my laptop (running Glances not from a container):

1) glances

No smart info displayed

2) sudo glances

image

nicolargo commented 2 months ago

Note for Glances developer.

A mode exist to run PySmart in sudo:

>>> from pySMART import DeviceList
>>> from pySMART import Device
>>> sda = Device('/dev/sda')
>>> sda
<UNKNOWN INTERFACE device on /dev/sda mod:None sn:None>
>>> devlist = DeviceList()
>>> devlist
<DeviceList contents:
>
>>> from pySMART import SMARTCTL
>>> SMARTCTL.sudo = True
>>> sda = Device('/dev/sda')
>>> sda
[sudo] password for user:
<SAT device on /dev/sda mod:ST10000DM0004-1ZC101 sn:ZA20VNPT>
>>> devlist = DeviceList()
>>> devlist
<DeviceList contents:
<NVME device on /dev/nvme0 mod:Sabrent Rocket 4.0 1TB sn:03850709185D88300410>
<NVME device on /dev/nvme1 mod:Samsung SSD 970 EVO Plus 2TB sn:S59CNM0RB05028D>
<NVME device on /dev/nvme2 mod:Samsung SSD 970 EVO Plus 2TB sn:S59CNM0RB05113H>
<SAT device on /dev/sda mod:ST10000DM0004-1ZC101 sn:ZA20VNPT>
<SAT device on /dev/sdb mod:ST10000DM0004-1ZC101 sn:ZA22W366>
<SAT device on /dev/sdc mod:ST10000DM0004-1ZC101 sn:ZA22SPLG>
<SAT device on /dev/sdd mod:ST10000DM0004-1ZC101 sn:ZA2215HL>

But password should be enter...

...
[sudo] password for user:
...

or sudoers file configure correctly...

zatricky commented 2 months ago

I'm running glances (not the current version) on a Fedora server as root and seeing similar output - just formatted slightly differently. I'll try testing a newer version:

root@host1:~# glances --version
Glances version:    4.0.5
Glances API version:    4
PsUtil version:     5.9.8
Log file:       /root/.local/share/glances/glances.log
root@host1:~# glances --enable-plugin smart -d --stdout smart
smart: {}
smart: {}
^Croot@host1:~# 
root@host1:~# grep smart ~/.local/share/glances/glances.log
2024-08-20 10:41:28,273 -- DEBUG -- Init smart plugin
2024-08-20 10:41:28,273 -- DEBUG -- Load section smart in ['/root/.config/glances/glances.conf', '/etc/glances/glances.conf', '/usr/share/doc/glances/glances.conf']
2024-08-20 10:41:28,273 -- DEBUG -- Load limit: smart_disable = ['False']
2024-08-20 10:41:28,273 -- DEBUG -- Plugin smart started in 0.001074 seconds
2024-08-20 10:41:28,277 -- DEBUG -- Active plugins list: ['alert', 'amps', 'containers', 'core', 'cpu', 'diskio', 'folders', 'fs', 'gpu', 'help', 'ip', 'load', 'mem', 'memswap', 'network', 'now', 'percpu', 'ports', 'processcount', 'processlist', 'psutilversion', 'quicklook', 'sensors', 'smart', 'system', 'uptime', 'version']
2024-08-20 10:41:28,297 -- DEBUG -- PluginModel glances.plugins.smart update return {} in 5e-06 seconds
2024-08-20 10:41:28,479 -- INFO -- Stdout mode is ON, following stats will be displayed: smart
2024-08-20 10:41:48,568 -- DEBUG -- PluginModel glances.plugins.smart update return {} in 2.4e-05 seconds
2024-08-20 10:41:49,779 -- DEBUG -- Stop the smart plugin

Testing pySMART directly:

root@host1:~# python3
Python 3.12.4 (main, Jun  7 2024, 00:00:00) [GCC 14.1.1 20240607 (Red Hat 14.1.1-5)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from pySMART import DeviceList
>>> from pySMART import Device
>>> sda = Device('/dev/sda')
>>> sda
<SAT device on /dev/sda mod:Samsung SSD 870 EVO 1TB sn:<serial>>
>>> devlist = DeviceList()
>>> devlist
<DeviceList contents:
<SAT device on /dev/sda mod:Samsung SSD 870 EVO 1TB sn:<serial>>
<SAT device on /dev/sdb mod:WDC WD140EFGX-68B0GN0 sn:<serial>>
<SAT device on /dev/sdc mod:WDC WD140EFGX-68B0GN0 sn:<serial>>
<SAT device on /dev/sdd mod:WDC WD140EFGX-68B0GN0 sn:<serial>>
<SAT device on /dev/sde mod:WDC WD140EFGX-68B0GN0 sn:<serial>>
<SAT device on /dev/sdf mod:WDC WD140EFGX-68B0GN0 sn:<serial>>
... long list of devices
>
>>>

I figured there might be some SELinux interference but there are no log entries from setroubleshootd corresponding with the time this is being tested. Also of course, executing pySMART directly does seem to work.

zatricky commented 2 months ago

Running the current version I get good output:

root@host1:~# ~/.local/bin/glances --version
Glances version:    4.1.2
Glances API version:    4
PsUtil version:     5.9.8
Log file:       /root/.local/share/glances/glances.log