mirror of https://github.com/nicolargo/glances.git
Merge branch 'develop' of https://github.com/nicolargo/glances into develop
This commit is contained in:
commit
862ac41b58
|
|
@ -11,10 +11,7 @@ repos:
|
||||||
- id: ruff-check
|
- id: ruff-check
|
||||||
name: "🐍 python · Linter with Ruff"
|
name: "🐍 python · Linter with Ruff"
|
||||||
types_or: [ python, pyi ]
|
types_or: [ python, pyi ]
|
||||||
args: [ --fix, --exit-non-zero-on-fix ]
|
args: [ --fix, --exit-non-zero-on-fix, --config, './pyproject.toml' ]
|
||||||
- id: ruff-format
|
|
||||||
name: "🐍 python · Format with Ruff"
|
|
||||||
types_or: [ python, pyi ]
|
|
||||||
|
|
||||||
# - repo: https://github.com/RobertCraigie/pyright-python
|
# - repo: https://github.com/RobertCraigie/pyright-python
|
||||||
# rev: v1.1.391
|
# rev: v1.1.391
|
||||||
|
|
@ -48,11 +45,11 @@ repos:
|
||||||
name: "🐚 shell · Check shell script code style"
|
name: "🐚 shell · Check shell script code style"
|
||||||
entry: bashate --error . --ignore=E006
|
entry: bashate --error . --ignore=E006
|
||||||
|
|
||||||
- repo: https://github.com/mrtazz/checkmake.git
|
# - repo: https://github.com/mrtazz/checkmake.git
|
||||||
rev: 0.2.2
|
# rev: 0.2.2
|
||||||
hooks:
|
# hooks:
|
||||||
- id: checkmake
|
# - id: checkmake
|
||||||
name: "🐮 Makefile · Lint Makefile"
|
# name: "🐮 Makefile · Lint Makefile"
|
||||||
|
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v6.0.0
|
rev: v6.0.0
|
||||||
|
|
|
||||||
7
Makefile
7
Makefile
|
|
@ -20,7 +20,7 @@ UV_RUN := .venv-uv/bin/uv
|
||||||
# if the command is only `make`, the default tasks will be the printing of the help.
|
# if the command is only `make`, the default tasks will be the printing of the help.
|
||||||
.DEFAULT_GOAL := help
|
.DEFAULT_GOAL := help
|
||||||
|
|
||||||
.PHONY: help test docs docs-server venv requirements profiling docker all clean
|
.PHONY: help test docs docs-server venv requirements profiling docker all clean all test
|
||||||
|
|
||||||
help: ## List all make commands available
|
help: ## List all make commands available
|
||||||
@grep -E '^[\.a-zA-Z_%-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
|
@grep -E '^[\.a-zA-Z_%-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
|
||||||
|
|
@ -134,7 +134,10 @@ test-export-influxdb-v3: ## Run interface tests with InfluxDB version 3 (Core)
|
||||||
test-export-timescaledb: ## Run interface tests with TimescaleDB
|
test-export-timescaledb: ## Run interface tests with TimescaleDB
|
||||||
/bin/bash ./tests/test_export_timescaledb.sh
|
/bin/bash ./tests/test_export_timescaledb.sh
|
||||||
|
|
||||||
test-exports: test-export-csv test-export-json test-export-influxdb-v1 test-export-influxdb-v3 test-export-timescaledb ## Tests all exports
|
test-export-nats: ## Run interface tests with NATS
|
||||||
|
/bin/bash ./tests/test_export_nats.sh
|
||||||
|
|
||||||
|
test-exports: test-export-csv test-export-json test-export-influxdb-v1 test-export-influxdb-v3 test-export-timescaledb test-export-nats ## Tests all exports
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Linters, profilers and cyber security
|
# Linters, profilers and cyber security
|
||||||
|
|
|
||||||
80
README.rst
80
README.rst
|
|
@ -242,7 +242,7 @@ Glances can export stats to:
|
||||||
|
|
||||||
- files: ``CSV`` and ``JSON``
|
- files: ``CSV`` and ``JSON``
|
||||||
- databases: ``InfluxDB``, ``ElasticSearch``, ``PostgreSQL/TimeScale``, ``Cassandra``, ``CouchDB``, ``OpenTSDB``, ``Prometheus``, ``StatsD``, ``Riemann`` and ``Graphite``
|
- databases: ``InfluxDB``, ``ElasticSearch``, ``PostgreSQL/TimeScale``, ``Cassandra``, ``CouchDB``, ``OpenTSDB``, ``Prometheus``, ``StatsD``, ``Riemann`` and ``Graphite``
|
||||||
- brokers: ``RabbitMQ/ActiveMQ``, ``ZeroMQ`` and ``Kafka``
|
- brokers: ``RabbitMQ/ActiveMQ``, ``NATS``, ``ZeroMQ`` and ``Kafka``
|
||||||
- others: ``RESTful`` endpoint
|
- others: ``RESTful`` endpoint
|
||||||
|
|
||||||
Installation 🚀
|
Installation 🚀
|
||||||
|
|
@ -255,14 +255,14 @@ PyPI: Pip, the standard way
|
||||||
|
|
||||||
Glances is on ``PyPI``. By using PyPI, you will be using the latest stable version.
|
Glances is on ``PyPI``. By using PyPI, you will be using the latest stable version.
|
||||||
|
|
||||||
To install Glances, simply use the ``pip`` command line.
|
To install Glances, simply use the ``pip`` command line in an virtual environment.
|
||||||
|
|
||||||
Warning: on modern Linux operating systems, you may have an externally-managed-environment
|
|
||||||
error message when you try to use ``pip``. In this case, go to the the PipX section below.
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
pip install --user glances
|
cd ~
|
||||||
|
python3 -m venv ~/.venv
|
||||||
|
source ~/.venv/bin/activate
|
||||||
|
pip install glances
|
||||||
|
|
||||||
*Note*: Python headers are required to install `psutil`_, a Glances
|
*Note*: Python headers are required to install `psutil`_, a Glances
|
||||||
dependency. For example, on Debian/Ubuntu **the simplest** is
|
dependency. For example, on Debian/Ubuntu **the simplest** is
|
||||||
|
|
@ -271,17 +271,18 @@ the *python-dev* package and gcc (*python-devel* on Fedora/CentOS/RHEL).
|
||||||
For Windows, just install psutil from the binary installation file.
|
For Windows, just install psutil from the binary installation file.
|
||||||
|
|
||||||
By default, Glances is installed **without** the Web interface dependencies.
|
By default, Glances is installed **without** the Web interface dependencies.
|
||||||
|
|
||||||
To install it, use the following command:
|
To install it, use the following command:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
pip install --user 'glances[web]'
|
pip install 'glances[web]'
|
||||||
|
|
||||||
For a full installation (with all features, see features list bellow):
|
For a full installation (with all features, see features list bellow):
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
pip install --user 'glances[all]'
|
pip install 'glances[all]'
|
||||||
|
|
||||||
Features list:
|
Features list:
|
||||||
|
|
||||||
|
|
@ -306,21 +307,18 @@ To upgrade Glances to the latest version:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
pip install --user --upgrade glances
|
pip install --upgrade glances
|
||||||
|
|
||||||
The current develop branch is published to the test.pypi.org package index.
|
|
||||||
If you want to test the develop version (could be instable), enter:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
pip install --user -i https://test.pypi.org/simple/ Glances
|
|
||||||
|
|
||||||
PyPI: PipX, the alternative way
|
PyPI: PipX, the alternative way
|
||||||
-------------------------------
|
-------------------------------
|
||||||
|
|
||||||
Install PipX on your system (apt install pipx on Ubuntu).
|
Install PipX on your system. For example on Ubuntu/Debian:
|
||||||
|
|
||||||
Install Glances (with all features):
|
.. code-block:: console
|
||||||
|
|
||||||
|
sudo apt install pipx
|
||||||
|
|
||||||
|
Then install Glances (with all features):
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
|
|
@ -328,14 +326,11 @@ Install Glances (with all features):
|
||||||
|
|
||||||
The glances script will be installed in the ~/.local/bin folder.
|
The glances script will be installed in the ~/.local/bin folder.
|
||||||
|
|
||||||
Brew: The missing package manager
|
To upgrade Glances to the latest version:
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
For Linux and Mac OS, it is also possible to install Glances with `Brew`_:
|
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
||||||
brew install glances
|
pipx upgrade glances
|
||||||
|
|
||||||
Docker: the cloudy way
|
Docker: the cloudy way
|
||||||
----------------------
|
----------------------
|
||||||
|
|
@ -343,12 +338,6 @@ Docker: the cloudy way
|
||||||
Glances Docker images are available. You can use it to monitor your
|
Glances Docker images are available. You can use it to monitor your
|
||||||
server and all your containers !
|
server and all your containers !
|
||||||
|
|
||||||
Get the Glances container:
|
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
docker pull nicolargo/glances:latest-full
|
|
||||||
|
|
||||||
The following tags are available:
|
The following tags are available:
|
||||||
|
|
||||||
- *latest-full* for a full Alpine Glances image (latest release) with all dependencies
|
- *latest-full* for a full Alpine Glances image (latest release) with all dependencies
|
||||||
|
|
@ -393,13 +382,32 @@ Run the container in *Web server mode*:
|
||||||
|
|
||||||
For a full list of options, see the Glances `Docker`_ documentation page.
|
For a full list of options, see the Glances `Docker`_ documentation page.
|
||||||
|
|
||||||
|
It is also possible to use a simple Docker compose file (see in ./docker-compose/docker-compose.yml):
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
cd ./docker-compose
|
||||||
|
docker-compose up
|
||||||
|
|
||||||
|
It will start a Glances server with WebUI.
|
||||||
|
|
||||||
|
Brew: The missing package manager
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
For Linux and Mac OS, it is also possible to install Glances with `Brew`_:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
brew install glances
|
||||||
|
|
||||||
GNU/Linux package
|
GNU/Linux package
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
`Glances` is available on many Linux distributions, so you should be
|
`Glances` is available on many Linux distributions, so you should be
|
||||||
able to install it using your favorite package manager. Be aware that
|
able to install it using your favorite package manager. Nevetheless,
|
||||||
when you use this method the operating system `package`_ for `Glances`
|
i do not recommend it. Be aware that when you use this method the operating
|
||||||
may not be the latest version and only basics plugins are enabled.
|
system `package`_ for `Glances`may not be the latest version and only basics
|
||||||
|
plugins are enabled.
|
||||||
|
|
||||||
Note: The Debian package (and all other Debian-based distributions) do
|
Note: The Debian package (and all other Debian-based distributions) do
|
||||||
not include anymore the JS statics files used by the Web interface
|
not include anymore the JS statics files used by the Web interface
|
||||||
|
|
@ -418,7 +426,6 @@ Check for Python version:
|
||||||
|
|
||||||
# python --version
|
# python --version
|
||||||
|
|
||||||
|
|
||||||
Install the Glances package:
|
Install the Glances package:
|
||||||
|
|
||||||
.. code-block:: console
|
.. code-block:: console
|
||||||
|
|
@ -464,11 +471,7 @@ Windows
|
||||||
-------
|
-------
|
||||||
|
|
||||||
Install `Python`_ for Windows (Python 3.4+ ship with pip) and
|
Install `Python`_ for Windows (Python 3.4+ ship with pip) and
|
||||||
then run the following command:
|
follow the Glances Pip install procedure.
|
||||||
|
|
||||||
.. code-block:: console
|
|
||||||
|
|
||||||
$ pip install glances
|
|
||||||
|
|
||||||
Android
|
Android
|
||||||
-------
|
-------
|
||||||
|
|
@ -571,6 +574,7 @@ Extra dependencies:
|
||||||
- ``influxdb`` (for the InfluxDB version 1 export module)
|
- ``influxdb`` (for the InfluxDB version 1 export module)
|
||||||
- ``influxdb-client`` (for the InfluxDB version 2 export module)
|
- ``influxdb-client`` (for the InfluxDB version 2 export module)
|
||||||
- ``kafka-python`` (for the Kafka export module)
|
- ``kafka-python`` (for the Kafka export module)
|
||||||
|
- ``nats-py`` (for the NATS export module)
|
||||||
- ``netifaces2`` (for the IP plugin)
|
- ``netifaces2`` (for the IP plugin)
|
||||||
- ``nvidia-ml-py`` (for the GPU plugin)
|
- ``nvidia-ml-py`` (for the GPU plugin)
|
||||||
- ``pycouchdb`` (for the CouchDB export module)
|
- ``pycouchdb`` (for the CouchDB export module)
|
||||||
|
|
|
||||||
|
|
@ -40,23 +40,17 @@ cryptography==46.0.3
|
||||||
# via pysnmpcrypto
|
# via pysnmpcrypto
|
||||||
defusedxml==0.7.1
|
defusedxml==0.7.1
|
||||||
# via glances
|
# via glances
|
||||||
dnspython==2.7.0 ; python_full_version < '3.10'
|
dnspython==2.8.0
|
||||||
# via pymongo
|
|
||||||
dnspython==2.8.0 ; python_full_version >= '3.10'
|
|
||||||
# via pymongo
|
# via pymongo
|
||||||
docker==7.1.0
|
docker==7.1.0
|
||||||
# via glances
|
# via glances
|
||||||
elastic-transport==9.1.0 ; python_full_version < '3.10'
|
elastic-transport==9.2.1
|
||||||
# via elasticsearch
|
# via elasticsearch
|
||||||
elastic-transport==9.2.0 ; python_full_version >= '3.10'
|
elasticsearch==9.2.1
|
||||||
# via elasticsearch
|
|
||||||
elasticsearch==9.1.2 ; python_full_version < '3.10'
|
|
||||||
# via glances
|
|
||||||
elasticsearch==9.2.0 ; python_full_version >= '3.10'
|
|
||||||
# via glances
|
# via glances
|
||||||
exceptiongroup==1.2.2 ; python_full_version < '3.11'
|
exceptiongroup==1.2.2 ; python_full_version < '3.11'
|
||||||
# via anyio
|
# via anyio
|
||||||
fastapi==0.125.0
|
fastapi==0.128.0
|
||||||
# via glances
|
# via glances
|
||||||
geomet==1.1.0
|
geomet==1.1.0
|
||||||
# via cassandra-driver
|
# via cassandra-driver
|
||||||
|
|
@ -68,9 +62,7 @@ humanfriendly==10.0
|
||||||
# via pysmart
|
# via pysmart
|
||||||
ibm-cloud-sdk-core==3.24.2
|
ibm-cloud-sdk-core==3.24.2
|
||||||
# via ibmcloudant
|
# via ibmcloudant
|
||||||
ibmcloudant==0.11.0 ; python_full_version < '3.10'
|
ibmcloudant==0.11.2
|
||||||
# via glances
|
|
||||||
ibmcloudant==0.11.2 ; python_full_version >= '3.10'
|
|
||||||
# via glances
|
# via glances
|
||||||
idna==3.11
|
idna==3.11
|
||||||
# via
|
# via
|
||||||
|
|
@ -78,9 +70,7 @@ idna==3.11
|
||||||
# requests
|
# requests
|
||||||
ifaddr==0.2.0
|
ifaddr==0.2.0
|
||||||
# via zeroconf
|
# via zeroconf
|
||||||
importlib-metadata==7.1.0 ; python_full_version < '3.10'
|
importlib-metadata==8.7.1
|
||||||
# via pygal
|
|
||||||
importlib-metadata==8.7.0 ; python_full_version >= '3.10'
|
|
||||||
# via pygal
|
# via pygal
|
||||||
influxdb==5.3.2
|
influxdb==5.3.2
|
||||||
# via glances
|
# via glances
|
||||||
|
|
@ -98,6 +88,8 @@ markupsafe==3.0.3
|
||||||
# via jinja2
|
# via jinja2
|
||||||
msgpack==1.1.2
|
msgpack==1.1.2
|
||||||
# via influxdb
|
# via influxdb
|
||||||
|
nats-py==2.12.0
|
||||||
|
# via glances
|
||||||
netifaces2==0.0.22
|
netifaces2==0.0.22
|
||||||
# via glances
|
# via glances
|
||||||
nvidia-ml-py==13.590.44
|
nvidia-ml-py==13.590.44
|
||||||
|
|
@ -118,23 +110,15 @@ potsdb==1.0.3
|
||||||
# via glances
|
# via glances
|
||||||
prometheus-client==0.23.1
|
prometheus-client==0.23.1
|
||||||
# via glances
|
# via glances
|
||||||
protobuf==4.25.8 ; python_full_version < '3.10'
|
protobuf==6.33.2
|
||||||
# via bernhard
|
# via bernhard
|
||||||
protobuf==6.33.2 ; python_full_version >= '3.10'
|
psutil==7.2.1
|
||||||
# via bernhard
|
|
||||||
psutil==7.1.3
|
|
||||||
# via glances
|
# via glances
|
||||||
psycopg==3.2.13 ; python_full_version < '3.10'
|
psycopg==3.3.2
|
||||||
# via glances
|
# via glances
|
||||||
psycopg==3.3.2 ; python_full_version >= '3.10'
|
psycopg-binary==3.3.2 ; implementation_name != 'pypy'
|
||||||
# via glances
|
|
||||||
psycopg-binary==3.2.13 ; python_full_version < '3.10' and implementation_name != 'pypy'
|
|
||||||
# via psycopg
|
# via psycopg
|
||||||
psycopg-binary==3.3.2 ; python_full_version >= '3.10' and implementation_name != 'pypy'
|
pyarrow==22.0.0
|
||||||
# via psycopg
|
|
||||||
pyarrow==21.0.0 ; python_full_version < '3.10'
|
|
||||||
# via influxdb3-python
|
|
||||||
pyarrow==22.0.0 ; python_full_version >= '3.10'
|
|
||||||
# via influxdb3-python
|
# via influxdb3-python
|
||||||
pyasn1==0.6.1
|
pyasn1==0.6.1
|
||||||
# via pysnmp-lextudio
|
# via pysnmp-lextudio
|
||||||
|
|
@ -203,21 +187,17 @@ six==1.17.0
|
||||||
# glances
|
# glances
|
||||||
# influxdb
|
# influxdb
|
||||||
# python-dateutil
|
# python-dateutil
|
||||||
sniffio==1.3.1 ; python_full_version >= '3.10'
|
sniffio==1.3.1
|
||||||
# via
|
# via
|
||||||
# elastic-transport
|
# elastic-transport
|
||||||
# elasticsearch
|
# elasticsearch
|
||||||
sparklines==0.7.0
|
sparklines==0.7.0
|
||||||
# via glances
|
# via glances
|
||||||
starlette==0.49.3 ; python_full_version < '3.10'
|
starlette==0.50.0
|
||||||
# via fastapi
|
|
||||||
starlette==0.50.0 ; python_full_version >= '3.10'
|
|
||||||
# via fastapi
|
# via fastapi
|
||||||
statsd==4.0.1
|
statsd==4.0.1
|
||||||
# via glances
|
# via glances
|
||||||
termcolor==3.1.0 ; python_full_version < '3.10'
|
termcolor==3.3.0
|
||||||
# via sparklines
|
|
||||||
termcolor==3.2.0 ; python_full_version >= '3.10'
|
|
||||||
# via sparklines
|
# via sparklines
|
||||||
tomli==2.0.2 ; python_full_version < '3.11'
|
tomli==2.0.2 ; python_full_version < '3.11'
|
||||||
# via podman
|
# via podman
|
||||||
|
|
@ -247,7 +227,7 @@ urllib3==2.6.2
|
||||||
# influxdb3-python
|
# influxdb3-python
|
||||||
# podman
|
# podman
|
||||||
# requests
|
# requests
|
||||||
uvicorn==0.38.0
|
uvicorn==0.40.0
|
||||||
# via glances
|
# via glances
|
||||||
wifi==0.3.8
|
wifi==0.3.8
|
||||||
# via glances
|
# via glances
|
||||||
|
|
|
||||||
|
|
@ -892,6 +892,14 @@ password=password
|
||||||
# Most of the time, you should not overwrite this value
|
# Most of the time, you should not overwrite this value
|
||||||
#hostname=mycomputer
|
#hostname=mycomputer
|
||||||
|
|
||||||
|
[nats]
|
||||||
|
# Configuration for the --export nats option
|
||||||
|
# https://nats.io/
|
||||||
|
# Host is a separated list of NATS nodes
|
||||||
|
host=nats://localhost:4222
|
||||||
|
# Prefix for the subjects (default is 'glances')
|
||||||
|
prefix=glances
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# AMPS
|
# AMPS
|
||||||
# * enable: Enable (true) or disable (false) the AMP
|
# * enable: Enable (true) or disable (false) the AMP
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,10 @@
|
||||||
# This file was autogenerated by uv via the following command:
|
# This file was autogenerated by uv via the following command:
|
||||||
# uv export --no-hashes --only-dev --output-file dev-requirements.txt
|
# uv export --no-hashes --only-dev --output-file dev-requirements.txt
|
||||||
alabaster==0.7.16 ; python_full_version < '3.10'
|
alabaster==1.0.0
|
||||||
# via sphinx
|
|
||||||
alabaster==1.0.0 ; python_full_version >= '3.10'
|
|
||||||
# via sphinx
|
# via sphinx
|
||||||
annotated-types==0.7.0
|
annotated-types==0.7.0
|
||||||
# via pydantic
|
# via pydantic
|
||||||
anyio==4.12.0 ; python_full_version >= '3.10'
|
anyio==4.12.0
|
||||||
# via
|
# via
|
||||||
# httpx
|
# httpx
|
||||||
# mcp
|
# mcp
|
||||||
|
|
@ -23,17 +21,13 @@ attrs==25.4.0
|
||||||
# trio
|
# trio
|
||||||
babel==2.17.0
|
babel==2.17.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
binaryornot==0.4.4 ; python_full_version < '3.10'
|
|
||||||
# via reuse
|
|
||||||
boltons==21.0.0
|
boltons==21.0.0
|
||||||
# via
|
# via
|
||||||
# face
|
# face
|
||||||
# glom
|
# glom
|
||||||
# semgrep
|
# semgrep
|
||||||
boolean-py==5.0
|
boolean-py==5.0
|
||||||
# via
|
# via license-expression
|
||||||
# license-expression
|
|
||||||
# reuse
|
|
||||||
bracex==2.6
|
bracex==2.6
|
||||||
# via wcmatch
|
# via wcmatch
|
||||||
certifi==2025.11.12
|
certifi==2025.11.12
|
||||||
|
|
@ -42,16 +36,12 @@ certifi==2025.11.12
|
||||||
# httpx
|
# httpx
|
||||||
# requests
|
# requests
|
||||||
# selenium
|
# selenium
|
||||||
cffi==2.0.0 ; (python_full_version >= '3.10' and implementation_name == 'pypy' and platform_python_implementation != 'PyPy') or (python_full_version >= '3.10' and os_name != 'nt' and platform_python_implementation != 'PyPy') or (implementation_name != 'pypy' and os_name == 'nt')
|
cffi==2.0.0 ; (implementation_name != 'pypy' and os_name == 'nt') or platform_python_implementation != 'PyPy'
|
||||||
# via
|
# via
|
||||||
# cryptography
|
# cryptography
|
||||||
# trio
|
# trio
|
||||||
cfgv==3.4.0 ; python_full_version < '3.10'
|
cfgv==3.5.0
|
||||||
# via pre-commit
|
# via pre-commit
|
||||||
cfgv==3.5.0 ; python_full_version >= '3.10'
|
|
||||||
# via pre-commit
|
|
||||||
chardet==5.2.0 ; python_full_version < '3.10'
|
|
||||||
# via binaryornot
|
|
||||||
charset-normalizer==3.4.4
|
charset-normalizer==3.4.4
|
||||||
# via
|
# via
|
||||||
# python-debian
|
# python-debian
|
||||||
|
|
@ -72,22 +62,14 @@ colorama==0.4.6
|
||||||
# pytest
|
# pytest
|
||||||
# semgrep
|
# semgrep
|
||||||
# sphinx
|
# sphinx
|
||||||
contourpy==1.3.0 ; python_full_version < '3.10'
|
contourpy==1.3.2 ; python_full_version < '3.11'
|
||||||
# via matplotlib
|
|
||||||
contourpy==1.3.2 ; python_full_version == '3.10.*'
|
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
contourpy==1.3.3 ; python_full_version >= '3.11'
|
contourpy==1.3.3 ; python_full_version >= '3.11'
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
cryptography==46.0.3 ; python_full_version >= '3.10'
|
cryptography==46.0.3
|
||||||
# via pyjwt
|
# via pyjwt
|
||||||
cycler==0.12.1
|
cycler==0.12.1
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
defusedxml==0.7.1 ; python_full_version < '3.10'
|
|
||||||
# via semgrep
|
|
||||||
deprecated==1.3.1 ; python_full_version < '3.10'
|
|
||||||
# via
|
|
||||||
# opentelemetry-api
|
|
||||||
# opentelemetry-exporter-otlp-proto-http
|
|
||||||
distlib==0.4.0
|
distlib==0.4.0
|
||||||
# via virtualenv
|
# via virtualenv
|
||||||
docutils==0.21.2
|
docutils==0.21.2
|
||||||
|
|
@ -104,13 +86,9 @@ exceptiongroup==1.2.2
|
||||||
# trio-websocket
|
# trio-websocket
|
||||||
face==24.0.0
|
face==24.0.0
|
||||||
# via glom
|
# via glom
|
||||||
filelock==3.19.1 ; python_full_version < '3.10'
|
filelock==3.20.2
|
||||||
# via virtualenv
|
# via virtualenv
|
||||||
filelock==3.20.1 ; python_full_version >= '3.10'
|
fonttools==4.61.1
|
||||||
# via virtualenv
|
|
||||||
fonttools==4.60.2 ; python_full_version < '3.10'
|
|
||||||
# via matplotlib
|
|
||||||
fonttools==4.61.1 ; python_full_version >= '3.10'
|
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
glom==22.1.0
|
glom==22.1.0
|
||||||
# via semgrep
|
# via semgrep
|
||||||
|
|
@ -122,11 +100,11 @@ h11==0.16.0
|
||||||
# httpcore
|
# httpcore
|
||||||
# uvicorn
|
# uvicorn
|
||||||
# wsproto
|
# wsproto
|
||||||
httpcore==1.0.9 ; python_full_version >= '3.10'
|
httpcore==1.0.9
|
||||||
# via httpx
|
# via httpx
|
||||||
httpx==0.28.1 ; python_full_version >= '3.10'
|
httpx==0.28.1
|
||||||
# via mcp
|
# via mcp
|
||||||
httpx-sse==0.4.3 ; python_full_version >= '3.10'
|
httpx-sse==0.4.3
|
||||||
# via mcp
|
# via mcp
|
||||||
identify==2.6.15
|
identify==2.6.15
|
||||||
# via pre-commit
|
# via pre-commit
|
||||||
|
|
@ -138,17 +116,9 @@ idna==3.11
|
||||||
# trio
|
# trio
|
||||||
imagesize==1.4.1
|
imagesize==1.4.1
|
||||||
# via sphinx
|
# via sphinx
|
||||||
importlib-metadata==7.1.0 ; python_full_version < '3.10'
|
importlib-metadata==8.7.1
|
||||||
# via
|
|
||||||
# opentelemetry-api
|
|
||||||
# sphinx
|
|
||||||
importlib-metadata==8.7.0 ; python_full_version >= '3.10'
|
|
||||||
# via opentelemetry-api
|
# via opentelemetry-api
|
||||||
importlib-resources==6.5.2 ; python_full_version < '3.10'
|
iniconfig==2.3.0
|
||||||
# via matplotlib
|
|
||||||
iniconfig==2.1.0 ; python_full_version < '3.10'
|
|
||||||
# via pytest
|
|
||||||
iniconfig==2.3.0 ; python_full_version >= '3.10'
|
|
||||||
# via pytest
|
# via pytest
|
||||||
jinja2==3.1.6
|
jinja2==3.1.6
|
||||||
# via
|
# via
|
||||||
|
|
@ -160,42 +130,33 @@ jsonschema==4.25.1
|
||||||
# semgrep
|
# semgrep
|
||||||
jsonschema-specifications==2025.9.1
|
jsonschema-specifications==2025.9.1
|
||||||
# via jsonschema
|
# via jsonschema
|
||||||
kiwisolver==1.4.7 ; python_full_version < '3.10'
|
kiwisolver==1.4.9
|
||||||
# via matplotlib
|
|
||||||
kiwisolver==1.4.9 ; python_full_version >= '3.10'
|
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
license-expression==30.4.4
|
license-expression==30.4.4
|
||||||
# via reuse
|
# via reuse
|
||||||
markdown-it-py==3.0.0 ; python_full_version < '3.10'
|
markdown-it-py==4.0.0
|
||||||
# via rich
|
|
||||||
markdown-it-py==4.0.0 ; python_full_version >= '3.10'
|
|
||||||
# via rich
|
# via rich
|
||||||
markupsafe==3.0.3
|
markupsafe==3.0.3
|
||||||
# via jinja2
|
# via jinja2
|
||||||
matplotlib==3.9.4 ; python_full_version < '3.10'
|
matplotlib==3.10.8
|
||||||
matplotlib==3.10.8 ; python_full_version >= '3.10'
|
mcp==1.23.3
|
||||||
mcp==1.23.3 ; python_full_version >= '3.10'
|
|
||||||
# via semgrep
|
# via semgrep
|
||||||
mdurl==0.1.2
|
mdurl==0.1.2
|
||||||
# via markdown-it-py
|
# via markdown-it-py
|
||||||
memory-profiler==0.61.0
|
memory-profiler==0.61.0
|
||||||
nodeenv==1.9.1
|
nodeenv==1.10.0
|
||||||
# via
|
# via
|
||||||
# pre-commit
|
# pre-commit
|
||||||
# pyright
|
# pyright
|
||||||
numpy==2.0.2 ; python_full_version < '3.10'
|
numpy==2.2.6 ; python_full_version < '3.11'
|
||||||
# via
|
# via
|
||||||
# contourpy
|
# contourpy
|
||||||
# matplotlib
|
# matplotlib
|
||||||
numpy==2.2.6 ; python_full_version == '3.10.*'
|
numpy==2.4.0 ; python_full_version >= '3.11'
|
||||||
# via
|
# via
|
||||||
# contourpy
|
# contourpy
|
||||||
# matplotlib
|
# matplotlib
|
||||||
numpy==2.3.5 ; python_full_version >= '3.11'
|
opentelemetry-api==1.37.0
|
||||||
# via
|
|
||||||
# contourpy
|
|
||||||
# matplotlib
|
|
||||||
opentelemetry-api==1.25.0 ; python_full_version < '3.10'
|
|
||||||
# via
|
# via
|
||||||
# opentelemetry-exporter-otlp-proto-http
|
# opentelemetry-exporter-otlp-proto-http
|
||||||
# opentelemetry-instrumentation
|
# opentelemetry-instrumentation
|
||||||
|
|
@ -203,58 +164,28 @@ opentelemetry-api==1.25.0 ; python_full_version < '3.10'
|
||||||
# opentelemetry-sdk
|
# opentelemetry-sdk
|
||||||
# opentelemetry-semantic-conventions
|
# opentelemetry-semantic-conventions
|
||||||
# semgrep
|
# semgrep
|
||||||
opentelemetry-api==1.37.0 ; python_full_version >= '3.10'
|
opentelemetry-exporter-otlp-proto-common==1.37.0
|
||||||
# via
|
|
||||||
# opentelemetry-exporter-otlp-proto-http
|
|
||||||
# opentelemetry-instrumentation
|
|
||||||
# opentelemetry-instrumentation-requests
|
|
||||||
# opentelemetry-sdk
|
|
||||||
# opentelemetry-semantic-conventions
|
|
||||||
# semgrep
|
|
||||||
opentelemetry-exporter-otlp-proto-common==1.25.0 ; python_full_version < '3.10'
|
|
||||||
# via opentelemetry-exporter-otlp-proto-http
|
# via opentelemetry-exporter-otlp-proto-http
|
||||||
opentelemetry-exporter-otlp-proto-common==1.37.0 ; python_full_version >= '3.10'
|
opentelemetry-exporter-otlp-proto-http==1.37.0
|
||||||
# via opentelemetry-exporter-otlp-proto-http
|
|
||||||
opentelemetry-exporter-otlp-proto-http==1.25.0 ; python_full_version < '3.10'
|
|
||||||
# via semgrep
|
# via semgrep
|
||||||
opentelemetry-exporter-otlp-proto-http==1.37.0 ; python_full_version >= '3.10'
|
opentelemetry-instrumentation==0.58b0
|
||||||
# via semgrep
|
|
||||||
opentelemetry-instrumentation==0.46b0 ; python_full_version < '3.10'
|
|
||||||
# via opentelemetry-instrumentation-requests
|
# via opentelemetry-instrumentation-requests
|
||||||
opentelemetry-instrumentation==0.58b0 ; python_full_version >= '3.10'
|
opentelemetry-instrumentation-requests==0.58b0
|
||||||
# via opentelemetry-instrumentation-requests
|
|
||||||
opentelemetry-instrumentation-requests==0.46b0 ; python_full_version < '3.10'
|
|
||||||
# via semgrep
|
# via semgrep
|
||||||
opentelemetry-instrumentation-requests==0.58b0 ; python_full_version >= '3.10'
|
opentelemetry-proto==1.37.0
|
||||||
# via semgrep
|
|
||||||
opentelemetry-proto==1.25.0 ; python_full_version < '3.10'
|
|
||||||
# via
|
# via
|
||||||
# opentelemetry-exporter-otlp-proto-common
|
# opentelemetry-exporter-otlp-proto-common
|
||||||
# opentelemetry-exporter-otlp-proto-http
|
# opentelemetry-exporter-otlp-proto-http
|
||||||
opentelemetry-proto==1.37.0 ; python_full_version >= '3.10'
|
opentelemetry-sdk==1.37.0
|
||||||
# via
|
|
||||||
# opentelemetry-exporter-otlp-proto-common
|
|
||||||
# opentelemetry-exporter-otlp-proto-http
|
|
||||||
opentelemetry-sdk==1.25.0 ; python_full_version < '3.10'
|
|
||||||
# via
|
# via
|
||||||
# opentelemetry-exporter-otlp-proto-http
|
# opentelemetry-exporter-otlp-proto-http
|
||||||
# semgrep
|
# semgrep
|
||||||
opentelemetry-sdk==1.37.0 ; python_full_version >= '3.10'
|
opentelemetry-semantic-conventions==0.58b0
|
||||||
# via
|
|
||||||
# opentelemetry-exporter-otlp-proto-http
|
|
||||||
# semgrep
|
|
||||||
opentelemetry-semantic-conventions==0.46b0 ; python_full_version < '3.10'
|
|
||||||
# via
|
|
||||||
# opentelemetry-instrumentation-requests
|
|
||||||
# opentelemetry-sdk
|
|
||||||
opentelemetry-semantic-conventions==0.58b0 ; python_full_version >= '3.10'
|
|
||||||
# via
|
# via
|
||||||
# opentelemetry-instrumentation
|
# opentelemetry-instrumentation
|
||||||
# opentelemetry-instrumentation-requests
|
# opentelemetry-instrumentation-requests
|
||||||
# opentelemetry-sdk
|
# opentelemetry-sdk
|
||||||
opentelemetry-util-http==0.46b0 ; python_full_version < '3.10'
|
opentelemetry-util-http==0.58b0
|
||||||
# via opentelemetry-instrumentation-requests
|
|
||||||
opentelemetry-util-http==0.58b0 ; python_full_version >= '3.10'
|
|
||||||
# via opentelemetry-instrumentation-requests
|
# via opentelemetry-instrumentation-requests
|
||||||
outcome==1.3.0.post0
|
outcome==1.3.0.post0
|
||||||
# via
|
# via
|
||||||
|
|
@ -271,30 +202,21 @@ packaging==25.0
|
||||||
# webdriver-manager
|
# webdriver-manager
|
||||||
peewee==3.18.3
|
peewee==3.18.3
|
||||||
# via semgrep
|
# via semgrep
|
||||||
pillow==11.3.0 ; python_full_version < '3.10'
|
pillow==12.1.0
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
pillow==12.0.0 ; python_full_version >= '3.10'
|
platformdirs==4.5.1
|
||||||
# via matplotlib
|
|
||||||
platformdirs==4.4.0 ; python_full_version < '3.10'
|
|
||||||
# via virtualenv
|
|
||||||
platformdirs==4.5.1 ; python_full_version >= '3.10'
|
|
||||||
# via virtualenv
|
# via virtualenv
|
||||||
pluggy==1.6.0
|
pluggy==1.6.0
|
||||||
# via pytest
|
# via pytest
|
||||||
pre-commit==4.3.0 ; python_full_version < '3.10'
|
pre-commit==4.5.1
|
||||||
pre-commit==4.5.1 ; python_full_version >= '3.10'
|
protobuf==6.33.2
|
||||||
# via
|
# via
|
||||||
# googleapis-common-protos
|
# googleapis-common-protos
|
||||||
# opentelemetry-proto
|
# opentelemetry-proto
|
||||||
protobuf==6.33.2 ; python_full_version >= '3.10'
|
psutil==7.2.1
|
||||||
protobuf==4.25.8 ; python_full_version < '3.10'
|
|
||||||
# via
|
|
||||||
# googleapis-common-protos
|
|
||||||
# opentelemetry-proto
|
|
||||||
psutil==7.1.3
|
|
||||||
# via memory-profiler
|
# via memory-profiler
|
||||||
py-spy==0.4.1
|
py-spy==0.4.1
|
||||||
pycparser==2.23 ; (python_full_version >= '3.10' and implementation_name != 'PyPy' and os_name != 'nt' and platform_python_implementation != 'PyPy') or (python_full_version >= '3.10' and implementation_name == 'pypy' and os_name == 'nt' and platform_python_implementation != 'PyPy') or (implementation_name != 'PyPy' and implementation_name != 'pypy' and os_name == 'nt')
|
pycparser==2.23 ; (implementation_name != 'PyPy' and implementation_name != 'pypy' and os_name == 'nt') or (implementation_name != 'PyPy' and platform_python_implementation != 'PyPy')
|
||||||
# via cffi
|
# via cffi
|
||||||
pydantic==2.12.5
|
pydantic==2.12.5
|
||||||
# via
|
# via
|
||||||
|
|
@ -303,7 +225,7 @@ pydantic==2.12.5
|
||||||
# rstcheck-core
|
# rstcheck-core
|
||||||
pydantic-core==2.41.5
|
pydantic-core==2.41.5
|
||||||
# via pydantic
|
# via pydantic
|
||||||
pydantic-settings==2.12.0 ; python_full_version >= '3.10'
|
pydantic-settings==2.12.0
|
||||||
# via mcp
|
# via mcp
|
||||||
pygments==2.19.2
|
pygments==2.19.2
|
||||||
# via
|
# via
|
||||||
|
|
@ -311,15 +233,14 @@ pygments==2.19.2
|
||||||
# rich
|
# rich
|
||||||
# sphinx
|
# sphinx
|
||||||
pyinstrument==5.1.1
|
pyinstrument==5.1.1
|
||||||
pyjwt==2.10.1 ; python_full_version >= '3.10'
|
pyjwt==2.10.1
|
||||||
# via mcp
|
# via mcp
|
||||||
pyparsing==3.2.5
|
pyparsing==3.3.1
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
pyright==1.1.407
|
pyright==1.1.407
|
||||||
pysocks==1.7.1
|
pysocks==1.7.1
|
||||||
# via urllib3
|
# via urllib3
|
||||||
pytest==8.4.2 ; python_full_version < '3.10'
|
pytest==9.0.2
|
||||||
pytest==9.0.2 ; python_full_version >= '3.10'
|
|
||||||
python-dateutil==2.9.0.post0
|
python-dateutil==2.9.0.post0
|
||||||
# via matplotlib
|
# via matplotlib
|
||||||
python-debian==1.0.1
|
python-debian==1.0.1
|
||||||
|
|
@ -328,21 +249,17 @@ python-dotenv==1.2.1
|
||||||
# via
|
# via
|
||||||
# pydantic-settings
|
# pydantic-settings
|
||||||
# webdriver-manager
|
# webdriver-manager
|
||||||
python-magic==0.4.27 ; python_full_version >= '3.10'
|
python-magic==0.4.27
|
||||||
# via reuse
|
# via reuse
|
||||||
python-multipart==0.0.21 ; python_full_version >= '3.10'
|
python-multipart==0.0.21
|
||||||
# via mcp
|
# via mcp
|
||||||
pywin32==311 ; python_full_version >= '3.10' and sys_platform == 'win32'
|
pywin32==311 ; sys_platform == 'win32'
|
||||||
# via
|
# via
|
||||||
# mcp
|
# mcp
|
||||||
# semgrep
|
# semgrep
|
||||||
pyyaml==6.0.3
|
pyyaml==6.0.3
|
||||||
# via pre-commit
|
# via pre-commit
|
||||||
referencing==0.36.2 ; python_full_version < '3.10'
|
referencing==0.37.0
|
||||||
# via
|
|
||||||
# jsonschema
|
|
||||||
# jsonschema-specifications
|
|
||||||
referencing==0.37.0 ; python_full_version >= '3.10'
|
|
||||||
# via
|
# via
|
||||||
# jsonschema
|
# jsonschema
|
||||||
# jsonschema-specifications
|
# jsonschema-specifications
|
||||||
|
|
@ -353,8 +270,7 @@ requests==2.32.5
|
||||||
# sphinx
|
# sphinx
|
||||||
# webdriver-manager
|
# webdriver-manager
|
||||||
requirements-parser==0.13.0
|
requirements-parser==0.13.0
|
||||||
reuse==5.1.1 ; python_full_version < '3.10'
|
reuse==6.2.0
|
||||||
reuse==6.2.0 ; python_full_version >= '3.10'
|
|
||||||
rich==13.5.3
|
rich==13.5.3
|
||||||
# via
|
# via
|
||||||
# semgrep
|
# semgrep
|
||||||
|
|
@ -363,30 +279,21 @@ roman-numerals==4.1.0 ; python_full_version >= '3.11'
|
||||||
# via roman-numerals-py
|
# via roman-numerals-py
|
||||||
roman-numerals-py==4.1.0 ; python_full_version >= '3.11'
|
roman-numerals-py==4.1.0 ; python_full_version >= '3.11'
|
||||||
# via sphinx
|
# via sphinx
|
||||||
rpds-py==0.27.1 ; python_full_version < '3.10'
|
rpds-py==0.30.0
|
||||||
# via
|
|
||||||
# jsonschema
|
|
||||||
# referencing
|
|
||||||
rpds-py==0.30.0 ; python_full_version >= '3.10'
|
|
||||||
# via
|
# via
|
||||||
# jsonschema
|
# jsonschema
|
||||||
# referencing
|
# referencing
|
||||||
rstcheck==6.2.5
|
rstcheck==6.2.5
|
||||||
rstcheck-core==1.2.2
|
rstcheck-core==1.2.2
|
||||||
# via rstcheck
|
# via rstcheck
|
||||||
ruamel-yaml==0.18.16
|
ruamel-yaml==0.19.1
|
||||||
|
# via semgrep
|
||||||
|
ruamel-yaml-clib==0.2.14
|
||||||
# via semgrep
|
# via semgrep
|
||||||
ruamel-yaml-clib==0.2.14 ; python_full_version >= '3.10' or platform_python_implementation == 'CPython'
|
|
||||||
# via
|
|
||||||
# ruamel-yaml
|
|
||||||
# semgrep
|
|
||||||
ruff==0.14.10
|
ruff==0.14.10
|
||||||
selenium==4.36.0 ; python_full_version < '3.10'
|
selenium==4.39.0
|
||||||
selenium==4.39.0 ; python_full_version >= '3.10'
|
semgrep==1.146.0
|
||||||
semgrep==1.136.0 ; python_full_version < '3.10'
|
|
||||||
semgrep==1.146.0 ; python_full_version >= '3.10'
|
|
||||||
setuptools==80.9.0
|
setuptools==80.9.0
|
||||||
# via opentelemetry-instrumentation
|
|
||||||
shellingham==1.5.4
|
shellingham==1.5.4
|
||||||
# via typer
|
# via typer
|
||||||
six==1.17.0
|
six==1.17.0
|
||||||
|
|
@ -397,11 +304,7 @@ snowballstemmer==3.0.1
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sortedcontainers==2.4.0
|
sortedcontainers==2.4.0
|
||||||
# via trio
|
# via trio
|
||||||
sphinx==7.4.7 ; python_full_version < '3.10'
|
sphinx==8.1.3 ; python_full_version < '3.11'
|
||||||
# via
|
|
||||||
# sphinx-rtd-theme
|
|
||||||
# sphinxcontrib-jquery
|
|
||||||
sphinx==8.1.3 ; python_full_version == '3.10.*'
|
|
||||||
# via
|
# via
|
||||||
# sphinx-rtd-theme
|
# sphinx-rtd-theme
|
||||||
# sphinxcontrib-jquery
|
# sphinxcontrib-jquery
|
||||||
|
|
@ -424,9 +327,9 @@ sphinxcontrib-qthelp==2.0.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sphinxcontrib-serializinghtml==2.0.0
|
sphinxcontrib-serializinghtml==2.0.0
|
||||||
# via sphinx
|
# via sphinx
|
||||||
sse-starlette==3.0.4 ; python_full_version >= '3.10'
|
sse-starlette==3.1.2
|
||||||
# via mcp
|
# via mcp
|
||||||
starlette==0.50.0 ; python_full_version >= '3.10'
|
starlette==0.50.0
|
||||||
# via
|
# via
|
||||||
# mcp
|
# mcp
|
||||||
# sse-starlette
|
# sse-starlette
|
||||||
|
|
@ -437,17 +340,13 @@ tomli==2.0.2
|
||||||
# sphinx
|
# sphinx
|
||||||
tomlkit==0.13.3
|
tomlkit==0.13.3
|
||||||
# via reuse
|
# via reuse
|
||||||
trio==0.31.0 ; python_full_version < '3.10'
|
trio==0.32.0
|
||||||
# via
|
|
||||||
# selenium
|
|
||||||
# trio-websocket
|
|
||||||
trio==0.32.0 ; python_full_version >= '3.10'
|
|
||||||
# via
|
# via
|
||||||
# selenium
|
# selenium
|
||||||
# trio-websocket
|
# trio-websocket
|
||||||
trio-websocket==0.12.2
|
trio-websocket==0.12.2
|
||||||
# via selenium
|
# via selenium
|
||||||
typer==0.20.1
|
typer==0.21.0
|
||||||
# via rstcheck
|
# via rstcheck
|
||||||
typing-extensions==4.15.0
|
typing-extensions==4.15.0
|
||||||
# via
|
# via
|
||||||
|
|
@ -479,7 +378,7 @@ urllib3==2.6.2
|
||||||
# requests
|
# requests
|
||||||
# selenium
|
# selenium
|
||||||
# semgrep
|
# semgrep
|
||||||
uvicorn==0.38.0 ; python_full_version >= '3.10' and sys_platform != 'emscripten'
|
uvicorn==0.40.0 ; sys_platform != 'emscripten'
|
||||||
# via mcp
|
# via mcp
|
||||||
virtualenv==20.35.4
|
virtualenv==20.35.4
|
||||||
# via pre-commit
|
# via pre-commit
|
||||||
|
|
@ -489,14 +388,8 @@ webdriver-manager==4.0.2
|
||||||
websocket-client==1.9.0
|
websocket-client==1.9.0
|
||||||
# via selenium
|
# via selenium
|
||||||
wrapt==1.17.3
|
wrapt==1.17.3
|
||||||
# via
|
# via opentelemetry-instrumentation
|
||||||
# deprecated
|
wsproto==1.3.2
|
||||||
# opentelemetry-instrumentation
|
|
||||||
wsproto==1.2.0 ; python_full_version < '3.10'
|
|
||||||
# via trio-websocket
|
|
||||||
wsproto==1.3.2 ; python_full_version >= '3.10'
|
|
||||||
# via trio-websocket
|
# via trio-websocket
|
||||||
zipp==3.23.0
|
zipp==3.23.0
|
||||||
# via
|
# via importlib-metadata
|
||||||
# importlib-metadata
|
|
||||||
# importlib-resources
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
FROM glances:local-alpine-minimal as glancesminimal
|
|
||||||
COPY glances.conf /glances/conf/glances.conf
|
|
||||||
CMD python -m glances -C /glances/conf/glances.conf $GLANCES_OPT
|
|
||||||
|
|
@ -1,40 +0,0 @@
|
||||||
version: "3.9"
|
|
||||||
services:
|
|
||||||
reverse-proxy:
|
|
||||||
image: traefik
|
|
||||||
command: --api --docker
|
|
||||||
ports:
|
|
||||||
- "80:80"
|
|
||||||
- "8080:8080"
|
|
||||||
volumes:
|
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
|
||||||
|
|
||||||
whoami:
|
|
||||||
image: emilevauge/whoami
|
|
||||||
labels:
|
|
||||||
- "traefik.frontend.rule=Host:whoami.docker.localhost"
|
|
||||||
|
|
||||||
monitoring:
|
|
||||||
image: nicolargo/glances:dev
|
|
||||||
restart: unless-stopped
|
|
||||||
pid: host
|
|
||||||
privileged: true
|
|
||||||
network_mode: "host"
|
|
||||||
volumes:
|
|
||||||
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
|
||||||
- "/run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:ro"
|
|
||||||
- "./glances.conf:/glances/conf/glances.conf"
|
|
||||||
environment:
|
|
||||||
- TZ=${TZ}
|
|
||||||
- "GLANCES_OPT=-C /glances/conf/glances.conf -w"
|
|
||||||
# Uncomment for GPU compatibility (Nvidia) inside the container
|
|
||||||
# deploy:
|
|
||||||
# resources:
|
|
||||||
# reservations:
|
|
||||||
# devices:
|
|
||||||
# - driver: nvidia
|
|
||||||
# count: 1
|
|
||||||
# capabilities: [gpu]
|
|
||||||
labels:
|
|
||||||
- "traefik.port=61208"
|
|
||||||
- "traefik.frontend.rule=Host:glances.docker.localhost"
|
|
||||||
|
|
@ -1,23 +1,41 @@
|
||||||
version: '3.9'
|
|
||||||
services:
|
services:
|
||||||
glances:
|
glances:
|
||||||
build:
|
# See all images tags here: https://hub.docker.com/r/nicolargo/glances/tags
|
||||||
context: ./
|
image: nicolargo/glances:latest-full
|
||||||
dockerfile: Dockerfile
|
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
pid: "host"
|
pid: "host"
|
||||||
privileged: true
|
|
||||||
network_mode: "host"
|
network_mode: "host"
|
||||||
|
|
||||||
|
read_only: true
|
||||||
|
privileged: false
|
||||||
|
# Uncomment next line for SATA or NVME smartctl monitoring
|
||||||
|
# cap_add:
|
||||||
|
# Uncomment next line for SATA smartctl monitoring
|
||||||
|
# - SYS_RAWIO
|
||||||
|
# Uncomment next line for NVME smartctl monitoring
|
||||||
|
# - SYS_ADMIN
|
||||||
|
# devices:
|
||||||
|
# - "/dev/nvme0"
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
|
- "/:/rootfs:ro"
|
||||||
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
||||||
- "/run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:ro"
|
- "/run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:ro"
|
||||||
- "./glances.conf:/glances/conf/glances.conf"
|
- "./glances.conf:/glances/conf/glances.conf"
|
||||||
# # Uncomment for proper distro information in upper panel.
|
# Uncomment for proper distro information in upper panel.
|
||||||
# # Works only for distros that do have this file (most of distros do).
|
# # Works only for distros that do have this file (most of distros do).
|
||||||
# - "/etc/os-release:/etc/os-release:ro"
|
# - "/etc/os-release:/etc/os-release:ro"
|
||||||
|
|
||||||
|
tmpfs:
|
||||||
|
- /tmp
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
- TZ=${TZ}
|
# Please set to your local timezone (or use local ${TZ} environment variable if set on your host)
|
||||||
- GLANCES_OPT=-C /glances/conf/glances.conf -w
|
- TZ=Europe/Paris
|
||||||
|
- GLANCES_OPT=-C /glances/conf/glances.conf -w --enable-plugin smart
|
||||||
|
- PYTHONPYCACHEPREFIX=/tmp/py_caches
|
||||||
|
|
||||||
# # Uncomment for GPU compatibility (Nvidia) inside the container
|
# # Uncomment for GPU compatibility (Nvidia) inside the container
|
||||||
# deploy:
|
# deploy:
|
||||||
# resources:
|
# resources:
|
||||||
|
|
@ -26,10 +44,11 @@ services:
|
||||||
# - driver: nvidia
|
# - driver: nvidia
|
||||||
# count: 1
|
# count: 1
|
||||||
# capabilities: [gpu]
|
# capabilities: [gpu]
|
||||||
# # Uncomment to protect Glances WebUI by a login/password (add --password to GLANCES_OPT)
|
|
||||||
# secrets:
|
# Uncomment to protect Glances WebUI by a login/password (add --password to GLANCES_OPT)
|
||||||
# - source: glances_password
|
# secrets:
|
||||||
# target: /root/.config/glances/<login>.pwd
|
# - source: glances_password
|
||||||
|
# target: /root/.config/glances/<login>.pwd
|
||||||
|
|
||||||
# secrets:
|
# secrets:
|
||||||
# glances_password:
|
# glances_password:
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
# WARNING: the Alpine image version and Python version should be set.
|
# WARNING: the Alpine image version and Python version should be set.
|
||||||
# Alpine 3.18 tag is a link to the latest 3.18.x version.
|
# Alpine 3.18 tag is a link to the latest 3.18.x version.
|
||||||
# Be aware that if you change the Alpine version, you may have to change the Python version.
|
# Be aware that if you change the Alpine version, you may have to change the Python version.
|
||||||
ARG IMAGE_VERSION=3.22
|
ARG IMAGE_VERSION=3.23
|
||||||
ARG PYTHON_VERSION=3.12
|
ARG PYTHON_VERSION=3.12
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
@ -61,9 +61,6 @@ RUN apk add --no-cache \
|
||||||
RUN python${PYTHON_VERSION} -m venv venv-build
|
RUN python${PYTHON_VERSION} -m venv venv-build
|
||||||
RUN /venv-build/bin/python${PYTHON_VERSION} -m pip install --upgrade pip
|
RUN /venv-build/bin/python${PYTHON_VERSION} -m pip install --upgrade pip
|
||||||
|
|
||||||
RUN python${PYTHON_VERSION} -m venv venv-build
|
|
||||||
RUN /venv-build/bin/python${PYTHON_VERSION} -m pip install --upgrade pip
|
|
||||||
|
|
||||||
RUN python${PYTHON_VERSION} -m venv --without-pip venv
|
RUN python${PYTHON_VERSION} -m venv --without-pip venv
|
||||||
|
|
||||||
COPY pyproject.toml docker-requirements.txt all-requirements.txt ./
|
COPY pyproject.toml docker-requirements.txt all-requirements.txt ./
|
||||||
|
|
@ -105,17 +102,18 @@ COPY docker-bin.sh /usr/local/bin/glances
|
||||||
RUN chmod a+x /usr/local/bin/glances
|
RUN chmod a+x /usr/local/bin/glances
|
||||||
ENV PATH="/venv/bin:$PATH"
|
ENV PATH="/venv/bin:$PATH"
|
||||||
|
|
||||||
# Copy binary and update PATH
|
|
||||||
COPY docker-bin.sh /usr/local/bin/glances
|
|
||||||
RUN chmod a+x /usr/local/bin/glances
|
|
||||||
ENV PATH="/venv/bin:$PATH"
|
|
||||||
|
|
||||||
# EXPOSE PORT (XMLRPC / WebUI)
|
# EXPOSE PORT (XMLRPC / WebUI)
|
||||||
EXPOSE 61209 61208
|
EXPOSE 61209 61208
|
||||||
|
|
||||||
|
# Add glances user
|
||||||
|
# RUN addgroup -g 1000 glances && \
|
||||||
|
# adduser -D -u 1000 -G glances glances && \
|
||||||
|
# chown -R glances:glances /app
|
||||||
|
|
||||||
# Define default command.
|
# Define default command.
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
CMD ["/bin/sh", "-c", "/venv/bin/python3 -m glances ${GLANCES_OPT}"]
|
ENV PYTHON_VERSION=${PYTHON_VERSION}
|
||||||
|
CMD ["/bin/sh", "-c", "/venv/bin/python${PYTHON_VERSION} -m glances ${GLANCES_OPT}"]
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# RELEASE: minimal
|
# RELEASE: minimal
|
||||||
|
|
@ -123,6 +121,8 @@ FROM release AS minimal
|
||||||
|
|
||||||
COPY --from=buildminimal /venv /venv
|
COPY --from=buildminimal /venv /venv
|
||||||
|
|
||||||
|
# USER glances
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# RELEASE: full
|
# RELEASE: full
|
||||||
FROM release AS full
|
FROM release AS full
|
||||||
|
|
@ -131,6 +131,8 @@ RUN apk add --no-cache libzmq
|
||||||
|
|
||||||
COPY --from=buildfull /venv /venv
|
COPY --from=buildfull /venv /venv
|
||||||
|
|
||||||
|
# USER glances
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# RELEASE: dev - to be compatible with CI
|
# RELEASE: dev - to be compatible with CI
|
||||||
FROM full AS dev
|
FROM full AS dev
|
||||||
|
|
@ -140,5 +142,8 @@ FROM full AS dev
|
||||||
COPY ./docker-files/docker-logger.json /app
|
COPY ./docker-files/docker-logger.json /app
|
||||||
ENV LOG_CFG=/app/docker-logger.json
|
ENV LOG_CFG=/app/docker-logger.json
|
||||||
|
|
||||||
|
# USER glances
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
CMD ["/bin/sh", "-c", "/venv/bin/python3 -m glances ${GLANCES_OPT}"]
|
ENV PYTHON_VERSION=${PYTHON_VERSION}
|
||||||
|
CMD ["/bin/sh", "-c", "/venv/bin/python${PYTHON_VERSION} -m glances ${GLANCES_OPT}"]
|
||||||
|
|
|
||||||
|
|
@ -89,17 +89,21 @@ COPY docker-bin.sh /usr/local/bin/glances
|
||||||
RUN chmod a+x /usr/local/bin/glances
|
RUN chmod a+x /usr/local/bin/glances
|
||||||
ENV PATH="/venv/bin:$PATH"
|
ENV PATH="/venv/bin:$PATH"
|
||||||
|
|
||||||
# Copy binary and update PATH
|
|
||||||
COPY docker-bin.sh /usr/local/bin/glances
|
|
||||||
RUN chmod a+x /usr/local/bin/glances
|
|
||||||
ENV PATH="/venv/bin:$PATH"
|
|
||||||
|
|
||||||
# EXPOSE PORT (XMLRPC / WebUI)
|
# EXPOSE PORT (XMLRPC / WebUI)
|
||||||
EXPOSE 61209 61208
|
EXPOSE 61209 61208
|
||||||
|
|
||||||
|
# Add glances user
|
||||||
|
# NOTE: If used, the Glances Docker plugin do not work...
|
||||||
|
# UID and GUID 1000 are already configured for the ubuntu user
|
||||||
|
# Create anew one with UID and GUID 1001
|
||||||
|
# RUN groupadd -g 1001 glances && \
|
||||||
|
# useradd -u 1001 -g glances glances && \
|
||||||
|
# chown -R glances:glances /app
|
||||||
|
|
||||||
# Define default command.
|
# Define default command.
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
CMD ["/bin/sh", "-c", "/venv/bin/python3 -m glances ${GLANCES_OPT}"]
|
ENV PYTHON_VERSION=${PYTHON_VERSION}
|
||||||
|
CMD ["/bin/sh", "-c", "/venv/bin/python${PYTHON_VERSION} -m glances ${GLANCES_OPT}"]
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# RELEASE: minimal
|
# RELEASE: minimal
|
||||||
|
|
@ -108,6 +112,8 @@ ARG PYTHON_VERSION
|
||||||
|
|
||||||
COPY --from=buildMinimal /venv /venv
|
COPY --from=buildMinimal /venv /venv
|
||||||
|
|
||||||
|
# USER glances
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# RELEASE: full
|
# RELEASE: full
|
||||||
FROM release AS full
|
FROM release AS full
|
||||||
|
|
@ -120,6 +126,8 @@ RUN apt-get update \
|
||||||
|
|
||||||
COPY --from=buildfull /venv /venv
|
COPY --from=buildfull /venv /venv
|
||||||
|
|
||||||
|
# USER glances
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# RELEASE: dev - to be compatible with CI
|
# RELEASE: dev - to be compatible with CI
|
||||||
FROM full AS dev
|
FROM full AS dev
|
||||||
|
|
@ -130,5 +138,8 @@ ARG PYTHON_VERSION
|
||||||
COPY ./docker-files/docker-logger.json /app
|
COPY ./docker-files/docker-logger.json /app
|
||||||
ENV LOG_CFG=/app/docker-logger.json
|
ENV LOG_CFG=/app/docker-logger.json
|
||||||
|
|
||||||
|
# USER glances
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
CMD ["/bin/sh", "-c", "/venv/bin/python3 -m glances ${GLANCES_OPT}"]
|
ENV PYTHON_VERSION=${PYTHON_VERSION}
|
||||||
|
CMD ["/bin/sh", "-c", "/venv/bin/python${PYTHON_VERSION} -m glances ${GLANCES_OPT}"]
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ docker==7.1.0
|
||||||
# via glances
|
# via glances
|
||||||
exceptiongroup==1.2.2 ; python_full_version < '3.11'
|
exceptiongroup==1.2.2 ; python_full_version < '3.11'
|
||||||
# via anyio
|
# via anyio
|
||||||
fastapi==0.125.0
|
fastapi==0.128.0
|
||||||
# via glances
|
# via glances
|
||||||
h11==0.16.0
|
h11==0.16.0
|
||||||
# via uvicorn
|
# via uvicorn
|
||||||
|
|
@ -36,7 +36,7 @@ packaging==25.0
|
||||||
# via glances
|
# via glances
|
||||||
podman==5.6.0
|
podman==5.6.0
|
||||||
# via glances
|
# via glances
|
||||||
psutil==7.1.3
|
psutil==7.2.1
|
||||||
# via glances
|
# via glances
|
||||||
pydantic==2.12.5
|
pydantic==2.12.5
|
||||||
# via fastapi
|
# via fastapi
|
||||||
|
|
@ -57,9 +57,7 @@ six==1.17.0
|
||||||
# via
|
# via
|
||||||
# glances
|
# glances
|
||||||
# python-dateutil
|
# python-dateutil
|
||||||
starlette==0.49.3 ; python_full_version < '3.10'
|
starlette==0.50.0
|
||||||
# via fastapi
|
|
||||||
starlette==0.50.0 ; python_full_version >= '3.10'
|
|
||||||
# via fastapi
|
# via fastapi
|
||||||
tomli==2.0.2 ; python_full_version < '3.11'
|
tomli==2.0.2 ; python_full_version < '3.11'
|
||||||
# via podman
|
# via podman
|
||||||
|
|
@ -79,7 +77,7 @@ urllib3==2.6.2
|
||||||
# docker
|
# docker
|
||||||
# podman
|
# podman
|
||||||
# requests
|
# requests
|
||||||
uvicorn==0.38.0
|
uvicorn==0.40.0
|
||||||
# via glances
|
# via glances
|
||||||
windows-curses==2.4.1 ; sys_platform == 'win32'
|
windows-curses==2.4.1 ; sys_platform == 'win32'
|
||||||
# via glances
|
# via glances
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -22,25 +22,25 @@ use the following code:
|
||||||
>>> gl = api.GlancesAPI()
|
>>> gl = api.GlancesAPI()
|
||||||
>>> gl.cpu
|
>>> gl.cpu
|
||||||
{'cpucore': 16,
|
{'cpucore': 16,
|
||||||
'ctx_switches': 9270037,
|
'ctx_switches': 392968698,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
'idle': 92.9,
|
'idle': 93.4,
|
||||||
'interrupts': 6399251,
|
'interrupts': 347279201,
|
||||||
'iowait': 0.2,
|
'iowait': 0.5,
|
||||||
'irq': 0.0,
|
'irq': 0.0,
|
||||||
'nice': 0.0,
|
'nice': 0.0,
|
||||||
'soft_interrupts': 2465459,
|
'soft_interrupts': 146726416,
|
||||||
'steal': 0.0,
|
'steal': 0.0,
|
||||||
'syscalls': 0,
|
'syscalls': 0,
|
||||||
'system': 4.5,
|
'system': 4.4,
|
||||||
'total': 6.6,
|
'total': 5.9,
|
||||||
'user': 2.3}
|
'user': 1.7}
|
||||||
>>> gl.cpu.get("total")
|
>>> gl.cpu.get("total")
|
||||||
6.6
|
5.9
|
||||||
>>> gl.mem.get("used")
|
>>> gl.mem.get("used")
|
||||||
9278827984
|
12044965912
|
||||||
>>> gl.auto_unit(gl.mem.get("used"))
|
>>> gl.auto_unit(gl.mem.get("used"))
|
||||||
8.64G
|
11.2G
|
||||||
|
|
||||||
If the stats return a list of items (like network interfaces or processes), you can
|
If the stats return a list of items (like network interfaces or processes), you can
|
||||||
access them by their name:
|
access them by their name:
|
||||||
|
|
@ -51,19 +51,19 @@ access them by their name:
|
||||||
['wlp0s20f3']
|
['wlp0s20f3']
|
||||||
>>> gl.network["wlp0s20f3"]
|
>>> gl.network["wlp0s20f3"]
|
||||||
{'alias': None,
|
{'alias': None,
|
||||||
'bytes_all': 2046,
|
'bytes_all': 1149,
|
||||||
'bytes_all_gauge': 1072158728,
|
'bytes_all_gauge': 14756012143,
|
||||||
'bytes_all_rate_per_sec': 11750.0,
|
'bytes_all_rate_per_sec': 7603.0,
|
||||||
'bytes_recv': 1424,
|
'bytes_recv': 608,
|
||||||
'bytes_recv_gauge': 1055691424,
|
'bytes_recv_gauge': 13741392863,
|
||||||
'bytes_recv_rate_per_sec': 8178.0,
|
'bytes_recv_rate_per_sec': 4023.0,
|
||||||
'bytes_sent': 622,
|
'bytes_sent': 541,
|
||||||
'bytes_sent_gauge': 16467304,
|
'bytes_sent_gauge': 1014619280,
|
||||||
'bytes_sent_rate_per_sec': 3572.0,
|
'bytes_sent_rate_per_sec': 3580.0,
|
||||||
'interface_name': 'wlp0s20f3',
|
'interface_name': 'wlp0s20f3',
|
||||||
'key': 'interface_name',
|
'key': 'interface_name',
|
||||||
'speed': 0,
|
'speed': 0,
|
||||||
'time_since_update': 0.1741182804107666}
|
'time_since_update': 0.15111541748046875}
|
||||||
|
|
||||||
Init Glances Python API
|
Init Glances Python API
|
||||||
-----------------------
|
-----------------------
|
||||||
|
|
@ -95,7 +95,32 @@ Alert stats:
|
||||||
>>> type(gl.alert)
|
>>> type(gl.alert)
|
||||||
<class 'glances.plugins.alert.AlertPlugin'>
|
<class 'glances.plugins.alert.AlertPlugin'>
|
||||||
>>> gl.alert
|
>>> gl.alert
|
||||||
[]
|
[{'avg': 96.85105977159478,
|
||||||
|
'begin': 1767373692,
|
||||||
|
'count': 2,
|
||||||
|
'desc': '',
|
||||||
|
'end': -1,
|
||||||
|
'global_msg': 'High swap (paging) usage',
|
||||||
|
'max': 96.85105977159478,
|
||||||
|
'min': 96.85105977159478,
|
||||||
|
'sort': 'memory_percent',
|
||||||
|
'state': 'CRITICAL',
|
||||||
|
'sum': 193.70211954318955,
|
||||||
|
'top': ['code', 'firefox', 'code'],
|
||||||
|
'type': 'MEMSWAP'},
|
||||||
|
{'avg': 73.31673281888682,
|
||||||
|
'begin': 1767373692,
|
||||||
|
'count': 2,
|
||||||
|
'desc': '',
|
||||||
|
'end': -1,
|
||||||
|
'global_msg': 'High swap (paging) usage',
|
||||||
|
'max': 73.34283346687624,
|
||||||
|
'min': 73.2906321708974,
|
||||||
|
'sort': 'memory_percent',
|
||||||
|
'state': 'WARNING',
|
||||||
|
'sum': 146.63346563777364,
|
||||||
|
'top': [],
|
||||||
|
'type': 'MEM'}]
|
||||||
|
|
||||||
Alert fields description:
|
Alert fields description:
|
||||||
|
|
||||||
|
|
@ -131,12 +156,12 @@ Ports stats:
|
||||||
<class 'glances.plugins.ports.PortsPlugin'>
|
<class 'glances.plugins.ports.PortsPlugin'>
|
||||||
>>> gl.ports
|
>>> gl.ports
|
||||||
[{'description': 'DefaultGateway',
|
[{'description': 'DefaultGateway',
|
||||||
'host': '192.168.1.1',
|
'host': '192.168.0.254',
|
||||||
'indice': 'port_0',
|
'indice': 'port_0',
|
||||||
'port': 0,
|
'port': 0,
|
||||||
'refresh': 30,
|
'refresh': 30,
|
||||||
'rtt_warning': None,
|
'rtt_warning': None,
|
||||||
'status': 0.005353,
|
'status': 0.002841,
|
||||||
'timeout': 3}]
|
'timeout': 3}]
|
||||||
|
|
||||||
Ports fields description:
|
Ports fields description:
|
||||||
|
|
@ -177,14 +202,14 @@ Diskio stats:
|
||||||
>>> gl.diskio.get("nvme0n1")
|
>>> gl.diskio.get("nvme0n1")
|
||||||
{'disk_name': 'nvme0n1',
|
{'disk_name': 'nvme0n1',
|
||||||
'key': 'disk_name',
|
'key': 'disk_name',
|
||||||
'read_bytes': 6307091968,
|
'read_bytes': 26400656896,
|
||||||
'read_count': 212136,
|
'read_count': 995162,
|
||||||
'read_latency': 0,
|
'read_latency': 0,
|
||||||
'read_time': 25497,
|
'read_time': 249396,
|
||||||
'write_bytes': 5472228352,
|
'write_bytes': 39424275456,
|
||||||
'write_count': 237246,
|
'write_count': 2633670,
|
||||||
'write_latency': 0,
|
'write_latency': 0,
|
||||||
'write_time': 197091}
|
'write_time': 2045785}
|
||||||
|
|
||||||
Diskio fields description:
|
Diskio fields description:
|
||||||
|
|
||||||
|
|
@ -269,11 +294,11 @@ Processcount stats:
|
||||||
>>> type(gl.processcount)
|
>>> type(gl.processcount)
|
||||||
<class 'glances.plugins.processcount.ProcesscountPlugin'>
|
<class 'glances.plugins.processcount.ProcesscountPlugin'>
|
||||||
>>> gl.processcount
|
>>> gl.processcount
|
||||||
{'pid_max': 0, 'running': 1, 'sleeping': 406, 'thread': 1964, 'total': 559}
|
{'pid_max': 0, 'running': 1, 'sleeping': 444, 'thread': 2451, 'total': 593}
|
||||||
>>> gl.processcount.keys()
|
>>> gl.processcount.keys()
|
||||||
['total', 'running', 'sleeping', 'thread', 'pid_max']
|
['total', 'running', 'sleeping', 'thread', 'pid_max']
|
||||||
>>> gl.processcount.get("total")
|
>>> gl.processcount.get("total")
|
||||||
559
|
593
|
||||||
|
|
||||||
Processcount fields description:
|
Processcount fields description:
|
||||||
|
|
||||||
|
|
@ -346,7 +371,7 @@ Percpu stats:
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
'guest_nice': 0.0,
|
'guest_nice': 0.0,
|
||||||
'idle': 28.0,
|
'idle': 27.0,
|
||||||
'interrupt': None,
|
'interrupt': None,
|
||||||
'iowait': 0.0,
|
'iowait': 0.0,
|
||||||
'irq': 0.0,
|
'irq': 0.0,
|
||||||
|
|
@ -354,8 +379,8 @@ Percpu stats:
|
||||||
'nice': 0.0,
|
'nice': 0.0,
|
||||||
'softirq': 0.0,
|
'softirq': 0.0,
|
||||||
'steal': 0.0,
|
'steal': 0.0,
|
||||||
'system': 4.0,
|
'system': 8.0,
|
||||||
'total': 72.0,
|
'total': 73.0,
|
||||||
'user': 0.0}
|
'user': 0.0}
|
||||||
|
|
||||||
Percpu fields description:
|
Percpu fields description:
|
||||||
|
|
@ -404,10 +429,10 @@ System stats:
|
||||||
<class 'glances.plugins.system.SystemPlugin'>
|
<class 'glances.plugins.system.SystemPlugin'>
|
||||||
>>> gl.system
|
>>> gl.system
|
||||||
{'hostname': 'nicolargo-xps15',
|
{'hostname': 'nicolargo-xps15',
|
||||||
'hr_name': 'Ubuntu 24.04 64bit / Linux 6.14.0-35-generic',
|
'hr_name': 'Ubuntu 24.04 64bit / Linux 6.14.0-37-generic',
|
||||||
'linux_distro': 'Ubuntu 24.04',
|
'linux_distro': 'Ubuntu 24.04',
|
||||||
'os_name': 'Linux',
|
'os_name': 'Linux',
|
||||||
'os_version': '6.14.0-35-generic',
|
'os_version': '6.14.0-37-generic',
|
||||||
'platform': '64bit'}
|
'platform': '64bit'}
|
||||||
>>> gl.system.keys()
|
>>> gl.system.keys()
|
||||||
['os_name', 'hostname', 'platform', 'os_version', 'linux_distro', 'hr_name']
|
['os_name', 'hostname', 'platform', 'os_version', 'linux_distro', 'hr_name']
|
||||||
|
|
@ -446,18 +471,18 @@ Network stats:
|
||||||
>>> gl.network.get("wlp0s20f3")
|
>>> gl.network.get("wlp0s20f3")
|
||||||
{'alias': None,
|
{'alias': None,
|
||||||
'bytes_all': 0,
|
'bytes_all': 0,
|
||||||
'bytes_all_gauge': 1072158728,
|
'bytes_all_gauge': 14756012143,
|
||||||
'bytes_all_rate_per_sec': 0.0,
|
'bytes_all_rate_per_sec': 0.0,
|
||||||
'bytes_recv': 0,
|
'bytes_recv': 0,
|
||||||
'bytes_recv_gauge': 1055691424,
|
'bytes_recv_gauge': 13741392863,
|
||||||
'bytes_recv_rate_per_sec': 0.0,
|
'bytes_recv_rate_per_sec': 0.0,
|
||||||
'bytes_sent': 0,
|
'bytes_sent': 0,
|
||||||
'bytes_sent_gauge': 16467304,
|
'bytes_sent_gauge': 1014619280,
|
||||||
'bytes_sent_rate_per_sec': 0.0,
|
'bytes_sent_rate_per_sec': 0.0,
|
||||||
'interface_name': 'wlp0s20f3',
|
'interface_name': 'wlp0s20f3',
|
||||||
'key': 'interface_name',
|
'key': 'interface_name',
|
||||||
'speed': 0,
|
'speed': 0,
|
||||||
'time_since_update': 0.0031774044036865234}
|
'time_since_update': 0.0019180774688720703}
|
||||||
|
|
||||||
Network fields description:
|
Network fields description:
|
||||||
|
|
||||||
|
|
@ -498,23 +523,23 @@ Cpu stats:
|
||||||
<class 'glances.plugins.cpu.CpuPlugin'>
|
<class 'glances.plugins.cpu.CpuPlugin'>
|
||||||
>>> gl.cpu
|
>>> gl.cpu
|
||||||
{'cpucore': 16,
|
{'cpucore': 16,
|
||||||
'ctx_switches': 9270037,
|
'ctx_switches': 392968698,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
'idle': 92.9,
|
'idle': 93.4,
|
||||||
'interrupts': 6399251,
|
'interrupts': 347279201,
|
||||||
'iowait': 0.2,
|
'iowait': 0.5,
|
||||||
'irq': 0.0,
|
'irq': 0.0,
|
||||||
'nice': 0.0,
|
'nice': 0.0,
|
||||||
'soft_interrupts': 2465459,
|
'soft_interrupts': 146726416,
|
||||||
'steal': 0.0,
|
'steal': 0.0,
|
||||||
'syscalls': 0,
|
'syscalls': 0,
|
||||||
'system': 4.5,
|
'system': 4.4,
|
||||||
'total': 6.6,
|
'total': 5.9,
|
||||||
'user': 2.3}
|
'user': 1.7}
|
||||||
>>> gl.cpu.keys()
|
>>> gl.cpu.keys()
|
||||||
['total', 'user', 'nice', 'system', 'idle', 'iowait', 'irq', 'steal', 'guest', 'ctx_switches', 'interrupts', 'soft_interrupts', 'syscalls', 'cpucore']
|
['total', 'user', 'nice', 'system', 'idle', 'iowait', 'irq', 'steal', 'guest', 'ctx_switches', 'interrupts', 'soft_interrupts', 'syscalls', 'cpucore']
|
||||||
>>> gl.cpu.get("total")
|
>>> gl.cpu.get("total")
|
||||||
6.6
|
5.9
|
||||||
|
|
||||||
Cpu fields description:
|
Cpu fields description:
|
||||||
|
|
||||||
|
|
@ -586,7 +611,7 @@ Amps stats:
|
||||||
'refresh': 3.0,
|
'refresh': 3.0,
|
||||||
'regex': True,
|
'regex': True,
|
||||||
'result': None,
|
'result': None,
|
||||||
'timer': 0.1661975383758545}
|
'timer': 0.18659353256225586}
|
||||||
|
|
||||||
Amps fields description:
|
Amps fields description:
|
||||||
|
|
||||||
|
|
@ -617,38 +642,33 @@ Processlist stats:
|
||||||
>>> gl.processlist
|
>>> gl.processlist
|
||||||
Return a dict of dict with key=<pid>
|
Return a dict of dict with key=<pid>
|
||||||
>>> gl.processlist.keys()
|
>>> gl.processlist.keys()
|
||||||
[30532, 129, 7722, 6446, 8756, 8852, 6423, 8840, 9543, 7548, 10383, 5247, 10239, 6971, 7838, 7562, 7550, 10672, 7715, 8639, 6711, 10143, 29150, 8081, 8853, 9153, 8794, 3018, 6207, 9171, 9629, 3613, 9374, 8333, 6244, 6219, 8711, 30172, 28756, 29409, 5453, 29262, 5991, 5363, 9409, 9408, 7371, 9406, 9407, 9402, 5677, 8641, 8642, 3031, 2669, 29063, 5812, 6722, 5815, 30529, 6689, 5605, 6684, 8156, 6124, 5724, 5575, 5375, 5826, 5878, 6763, 3025, 6242, 5409, 5412, 5355, 4271, 3609, 5386, 5437, 2776, 5394, 5189, 749, 4946, 2700, 5087, 2641, 1, 2704, 2703, 5627, 5803, 3087, 4924, 4943, 4948, 3495, 2509, 2649, 5388, 5381, 3621, 5429, 3004, 5418, 2858, 5479, 6050, 3596, 2797, 4904, 4950, 5435, 2974, 3685, 5634, 3496, 5783, 2688, 5432, 5462, 808, 5389, 5678, 2684, 2510, 2864, 2690, 2645, 5175, 2508, 5009, 5661, 5574, 5738, 5336, 5230, 2636, 5653, 5584, 5643, 5186, 5383, 5157, 8342, 2685, 4961, 5427, 5690, 2655, 5013, 5073, 2635, 5428, 5367, 8469, 4944, 2746, 9198, 9154, 5161, 2710, 5243, 2634, 2507, 4931, 2640, 3778, 6250, 8656, 6540, 30525, 2979, 2981, 3626, 3634, 3234, 3650, 5020, 3633, 3629, 3501, 30528, 2980, 2769, 3016, 3017, 3235, 3500, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 157, 164, 165, 166, 168, 169, 171, 176, 186, 188, 203, 212, 216, 218, 264, 270, 271, 272, 273, 274, 275, 276, 277, 278, 352, 355, 357, 358, 359, 360, 361, 362, 363, 364, 367, 369, 370, 447, 448, 450, 611, 616, 617, 618, 624, 651, 652, 653, 654, 657, 658, 659, 660, 661, 662, 683, 684, 738, 780, 781, 817, 1000, 1001, 1013, 1014, 1015, 1016, 1017, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1255, 1303, 1366, 1369, 1370, 1371, 1387, 1388, 1389, 1390, 1439, 1440, 1443, 1444, 1525, 1529, 1896, 1897, 1898, 1899, 1900, 1901, 1902, 1903, 1904, 1905, 1906, 1907, 1908, 1909, 1938, 1939, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2044, 2045, 2050, 2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2061, 2063, 2064, 2066, 2068, 2071, 2072, 2075, 2322, 2323, 2326, 3558, 3559, 3560, 3561, 3562, 3660, 3706, 3707, 3708, 3709, 3710, 3711, 3712, 3713, 3949, 3956, 4080, 4725, 4859, 4877, 7686, 13970, 14398, 14514, 15908, 16227, 16410, 16721, 28674, 28676, 28726, 29096, 30133]
|
[1, 2, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 59, 60, 61, 62, 63, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 109, 110, 111, 113, 114, 115, 116, 117, 118, 121, 122, 123, 124, 125, 126, 127, 128, 133, 135, 136, 137, 138, 139, 140, 142, 143, 144, 145, 146, 147, 148, 150, 154, 156, 157, 158, 166, 179, 188, 189, 218, 219, 239, 240, 258, 267, 268, 269, 270, 271, 273, 279, 280, 364, 367, 369, 370, 371, 372, 373, 450, 452, 613, 618, 619, 620, 627, 659, 660, 726, 757, 758, 787, 795, 970, 971, 986, 1037, 1040, 1042, 1043, 1045, 1046, 1047, 1048, 1049, 1050, 1051, 1052, 1056, 1058, 1059, 1064, 1065, 1218, 1219, 1223, 1275, 1277, 1278, 1279, 1320, 1327, 1534, 1537, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 2007, 2008, 2009, 2010, 2011, 2013, 2014, 2016, 2017, 2018, 2019, 2020, 2021, 2023, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074, 2075, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086, 2087, 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 2098, 2099, 2100, 2101, 2102, 2103, 2104, 2105, 2117, 2122, 2123, 2124, 2125, 2126, 2127, 2128, 2129, 2130, 2133, 2134, 2135, 2136, 2137, 2138, 2139, 2140, 2141, 2142, 2143, 2144, 2145, 2149, 2603, 2604, 2605, 2606, 2613, 2615, 2744, 2745, 2746, 2750, 2751, 2755, 2762, 2774, 2781, 2788, 2791, 2796, 2799, 2802, 2813, 2820, 2823, 2887, 2904, 2905, 2916, 3031, 3038, 3081, 3181, 3182, 3186, 3191, 3192, 3240, 3382, 3383, 3670, 3671, 3695, 3698, 3807, 3817, 3818, 3822, 3827, 3828, 3846, 3853, 3874, 3901, 3902, 3903, 3904, 3905, 3906, 3907, 3908, 3982, 4194, 4596, 5146, 5166, 5172, 5179, 5189, 5190, 5193, 5195, 5197, 5207, 5263, 5267, 5274, 5318, 5333, 5421, 5425, 5441, 5453, 5457, 5492, 5505, 5509, 5593, 5612, 5620, 5621, 5634, 5657, 5658, 5661, 5664, 5665, 5667, 5669, 5672, 5675, 5678, 5680, 5685, 5687, 5693, 5695, 5700, 5708, 5726, 5734, 5829, 5832, 5833, 5844, 5861, 5871, 5914, 5921, 5931, 5941, 5954, 5957, 6017, 6063, 6087, 6093, 6094, 6123, 6154, 6206, 6244, 6475, 6505, 6552, 6559, 6562, 7227, 8412, 8526, 9631, 9649, 9661, 9731, 9734, 11010, 12121, 12123, 12124, 12138, 12192, 12239, 12278, 12321, 12335, 12336, 12417, 12686, 12726, 12735, 12929, 12931, 12932, 12933, 12934, 13048, 13115, 13536, 13665, 36430, 40117, 53755, 53764, 62488, 62637, 72064, 72065, 72120, 72139, 102070, 340569, 358046, 388396, 413445, 444052, 444061, 471623, 471714, 471892, 471899, 471919, 471929, 471954, 472557, 472566, 472570, 472785, 472854, 472861, 473314, 481055, 498113, 513901, 514243, 514681, 515455, 518033, 520070, 524431, 524432, 524447, 524457, 524551, 530020, 531982, 531983, 532003, 532019, 532126, 532187, 532625, 542169, 542928, 545701, 546233, 546254, 547205, 547220, 547714, 547732, 548091, 548102, 548622, 550414, 555282, 557645, 557646, 557648, 561234, 564559, 567573, 572276, 572387, 572901, 574078, 581119, 581221, 581222, 582989, 583097, 583966, 585509, 585867, 586640, 586660, 586676, 586686, 588116, 588144, 588161, 588690, 589569, 589794, 591548, 591550, 591551, 591712, 591853, 592272, 593020, 593126, 594465, 595041, 595152, 596658, 596663, 596890, 597033, 598027, 598303, 598538, 598539, 598540, 598541, 598598, 598756, 599183, 599214, 599225, 600160, 600310, 601882, 601885, 601886, 601889]
|
||||||
>>> gl.processlist.get("30532")
|
>>> gl.processlist.get("1")
|
||||||
{'cmdline': ['/home/nicolargo/dev/glances/.venv/bin/python3',
|
{'cmdline': ['/sbin/init', 'splash'],
|
||||||
'-m',
|
'cpu_percent': 0.0,
|
||||||
'glances',
|
'cpu_times': {'children_system': 287.89,
|
||||||
'-C',
|
'children_user': 5146.36,
|
||||||
'conf/glances.conf',
|
|
||||||
'--api-doc'],
|
|
||||||
'cpu_percent': 75.1,
|
|
||||||
'cpu_times': {'children_system': 0.03,
|
|
||||||
'children_user': 0.01,
|
|
||||||
'iowait': 0.0,
|
'iowait': 0.0,
|
||||||
'system': 0.4,
|
'system': 7.96,
|
||||||
'user': 0.4},
|
'user': 11.06},
|
||||||
'gids': {'effective': 1000, 'real': 1000, 'saved': 1000},
|
'gids': {'effective': 0, 'real': 0, 'saved': 0},
|
||||||
'io_counters': [20688896, 86016, 8990720, 86016, 1],
|
'io_counters': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
'key': 'pid',
|
'key': 'pid',
|
||||||
'memory_info': {'data': 100184064,
|
'memory_info': {'data': 7282688,
|
||||||
'dirty': 0,
|
'dirty': 0,
|
||||||
'lib': 0,
|
'lib': 0,
|
||||||
'rss': 81117184,
|
'rss': 14622720,
|
||||||
'shared': 18477056,
|
'shared': 8175616,
|
||||||
'text': 31211520,
|
'text': 45056,
|
||||||
'vms': 415424512},
|
'vms': 26632192},
|
||||||
'memory_percent': 0.49392852502078194,
|
'memory_percent': 0.0890389998301525,
|
||||||
'name': 'python3',
|
'name': 'systemd',
|
||||||
'nice': 0,
|
'nice': 0,
|
||||||
'num_threads': 3,
|
'num_threads': 1,
|
||||||
'pid': 30532,
|
'pid': 1,
|
||||||
'status': 'R',
|
'status': 'S',
|
||||||
'time_since_update': 0.45221495628356934,
|
'time_since_update': 0.39455604553222656,
|
||||||
'username': 'nicolargo'}
|
'username': 'root'}
|
||||||
|
|
||||||
Processlist fields description:
|
Processlist fields description:
|
||||||
|
|
||||||
|
|
@ -732,13 +752,13 @@ Load stats:
|
||||||
<class 'glances.plugins.load.LoadPlugin'>
|
<class 'glances.plugins.load.LoadPlugin'>
|
||||||
>>> gl.load
|
>>> gl.load
|
||||||
{'cpucore': 16,
|
{'cpucore': 16,
|
||||||
'min1': 1.77197265625,
|
'min1': 0.52685546875,
|
||||||
'min15': 0.69287109375,
|
'min15': 0.517578125,
|
||||||
'min5': 1.29052734375}
|
'min5': 0.5439453125}
|
||||||
>>> gl.load.keys()
|
>>> gl.load.keys()
|
||||||
['min1', 'min5', 'min15', 'cpucore']
|
['min1', 'min5', 'min15', 'cpucore']
|
||||||
>>> gl.load.get("min1")
|
>>> gl.load.get("min1")
|
||||||
1.77197265625
|
0.52685546875
|
||||||
|
|
||||||
Load fields description:
|
Load fields description:
|
||||||
|
|
||||||
|
|
@ -770,14 +790,14 @@ Sensors stats:
|
||||||
>>> gl.sensors
|
>>> gl.sensors
|
||||||
Return a dict of dict with key=<label>
|
Return a dict of dict with key=<label>
|
||||||
>>> gl.sensors.keys()
|
>>> gl.sensors.keys()
|
||||||
['Ambient', 'Ambient 3', 'Ambient 5', 'Ambient 6', 'CPU', 'Composite', 'Core 0', 'Core 4', 'Core 8', 'Core 12', 'Core 16', 'Core 20', 'Core 28', 'Core 29', 'Core 30', 'Core 31', 'HDD', 'Package id 0', 'SODIMM', 'Sensor 1', 'Sensor 2', 'dell_smm 0', 'dell_smm 1', 'dell_smm 2', 'dell_smm 3', 'dell_smm 4', 'dell_smm 5', 'dell_smm 6', 'dell_smm 7', 'dell_smm 8', 'dell_smm 9', 'i915 0', 'iwlwifi_1 0', 'spd5118 0', 'CPU Fan', 'Video Fan', 'BAT BAT0']
|
['Ambient', 'Ambient 3', 'Ambient 5', 'Ambient 6', 'CPU', 'Composite', 'Core 0', 'Core 4', 'Core 8', 'Core 12', 'Core 16', 'Core 20', 'Core 28', 'Core 29', 'Core 30', 'Core 31', 'HDD', 'Package id 0', 'SODIMM', 'Sensor 1', 'Sensor 2', 'dell_smm 0', 'dell_smm 1', 'dell_smm 2', 'dell_smm 3', 'dell_smm 4', 'dell_smm 5', 'dell_smm 6', 'dell_smm 7', 'dell_smm 8', 'dell_smm 9', 'i915 0', 'iwlwifi_1 0', 'CPU Fan', 'Video Fan', 'BAT BAT0']
|
||||||
>>> gl.sensors.get("Ambient")
|
>>> gl.sensors.get("Ambient")
|
||||||
{'critical': None,
|
{'critical': None,
|
||||||
'key': 'label',
|
'key': 'label',
|
||||||
'label': 'Ambient',
|
'label': 'Ambient',
|
||||||
'type': 'temperature_core',
|
'type': 'temperature_core',
|
||||||
'unit': 'C',
|
'unit': 'C',
|
||||||
'value': 33,
|
'value': 39,
|
||||||
'warning': 0}
|
'warning': 0}
|
||||||
|
|
||||||
Sensors fields description:
|
Sensors fields description:
|
||||||
|
|
@ -815,7 +835,7 @@ Uptime stats:
|
||||||
>>> type(gl.uptime)
|
>>> type(gl.uptime)
|
||||||
<class 'glances.plugins.uptime.UptimePlugin'>
|
<class 'glances.plugins.uptime.UptimePlugin'>
|
||||||
>>> gl.uptime
|
>>> gl.uptime
|
||||||
'0:09:45'
|
'6 days, 1:42:29'
|
||||||
|
|
||||||
Uptime limits:
|
Uptime limits:
|
||||||
|
|
||||||
|
|
@ -834,11 +854,11 @@ Now stats:
|
||||||
>>> type(gl.now)
|
>>> type(gl.now)
|
||||||
<class 'glances.plugins.now.NowPlugin'>
|
<class 'glances.plugins.now.NowPlugin'>
|
||||||
>>> gl.now
|
>>> gl.now
|
||||||
{'custom': '2025-11-21 18:02:29 CET', 'iso': '2025-11-21T18:02:29+01:00'}
|
{'custom': '2026-01-02 18:08:13 CET', 'iso': '2026-01-02T18:08:13+01:00'}
|
||||||
>>> gl.now.keys()
|
>>> gl.now.keys()
|
||||||
['iso', 'custom']
|
['iso', 'custom']
|
||||||
>>> gl.now.get("iso")
|
>>> gl.now.get("iso")
|
||||||
'2025-11-21T18:02:29+01:00'
|
'2026-01-02T18:08:13+01:00'
|
||||||
|
|
||||||
Now fields description:
|
Now fields description:
|
||||||
|
|
||||||
|
|
@ -868,14 +888,14 @@ Fs stats:
|
||||||
>>> gl.fs.get("/")
|
>>> gl.fs.get("/")
|
||||||
{'alias': 'Root',
|
{'alias': 'Root',
|
||||||
'device_name': '/dev/mapper/ubuntu--vg-ubuntu--lv',
|
'device_name': '/dev/mapper/ubuntu--vg-ubuntu--lv',
|
||||||
'free': 705957326848,
|
'free': 582637228032,
|
||||||
'fs_type': 'ext4',
|
'fs_type': 'ext4',
|
||||||
'key': 'mnt_point',
|
'key': 'mnt_point',
|
||||||
'mnt_point': '/',
|
'mnt_point': '/',
|
||||||
'options': 'rw,relatime',
|
'options': 'rw,relatime',
|
||||||
'percent': 25.9,
|
'percent': 38.8,
|
||||||
'size': 1003736440832,
|
'size': 1003736440832,
|
||||||
'used': 246716608512}
|
'used': 370036707328}
|
||||||
|
|
||||||
Fs fields description:
|
Fs fields description:
|
||||||
|
|
||||||
|
|
@ -916,8 +936,8 @@ Wifi stats:
|
||||||
['wlp0s20f3']
|
['wlp0s20f3']
|
||||||
>>> gl.wifi.get("wlp0s20f3")
|
>>> gl.wifi.get("wlp0s20f3")
|
||||||
{'key': 'ssid',
|
{'key': 'ssid',
|
||||||
'quality_level': -61.0,
|
'quality_level': -63.0,
|
||||||
'quality_link': 49.0,
|
'quality_link': 47.0,
|
||||||
'ssid': 'wlp0s20f3'}
|
'ssid': 'wlp0s20f3'}
|
||||||
|
|
||||||
Wifi limits:
|
Wifi limits:
|
||||||
|
|
@ -941,7 +961,7 @@ Ip stats:
|
||||||
>>> type(gl.ip)
|
>>> type(gl.ip)
|
||||||
<class 'glances.plugins.ip.IpPlugin'>
|
<class 'glances.plugins.ip.IpPlugin'>
|
||||||
>>> gl.ip
|
>>> gl.ip
|
||||||
{'address': '192.168.1.26',
|
{'address': '192.168.0.26',
|
||||||
'mask': '255.255.255.0',
|
'mask': '255.255.255.0',
|
||||||
'mask_cidr': 24,
|
'mask_cidr': 24,
|
||||||
'public_address': '',
|
'public_address': '',
|
||||||
|
|
@ -949,7 +969,7 @@ Ip stats:
|
||||||
>>> gl.ip.keys()
|
>>> gl.ip.keys()
|
||||||
['address', 'mask', 'mask_cidr', 'public_address', 'public_info_human']
|
['address', 'mask', 'mask_cidr', 'public_address', 'public_info_human']
|
||||||
>>> gl.ip.get("address")
|
>>> gl.ip.get("address")
|
||||||
'192.168.1.26'
|
'192.168.0.26'
|
||||||
|
|
||||||
Ip fields description:
|
Ip fields description:
|
||||||
|
|
||||||
|
|
@ -1002,7 +1022,7 @@ Psutilversion stats:
|
||||||
>>> type(gl.psutilversion)
|
>>> type(gl.psutilversion)
|
||||||
<class 'glances.plugins.psutilversion.PsutilversionPlugin'>
|
<class 'glances.plugins.psutilversion.PsutilversionPlugin'>
|
||||||
>>> gl.psutilversion
|
>>> gl.psutilversion
|
||||||
'7.1.3'
|
'7.2.1'
|
||||||
|
|
||||||
Psutilversion limits:
|
Psutilversion limits:
|
||||||
|
|
||||||
|
|
@ -1049,20 +1069,20 @@ Mem stats:
|
||||||
>>> type(gl.mem)
|
>>> type(gl.mem)
|
||||||
<class 'glances.plugins.mem.MemPlugin'>
|
<class 'glances.plugins.mem.MemPlugin'>
|
||||||
>>> gl.mem
|
>>> gl.mem
|
||||||
{'active': 8012464128,
|
{'active': 5357809664,
|
||||||
'available': 7144030768,
|
'available': 4377860072,
|
||||||
'buffers': 324308992,
|
'buffers': 106696704,
|
||||||
'cached': 6972434864,
|
'cached': 4016909160,
|
||||||
'free': 806096896,
|
'free': 846315520,
|
||||||
'inactive': 5787877376,
|
'inactive': 7907250176,
|
||||||
'percent': 56.5,
|
'percent': 73.3,
|
||||||
'shared': 803672064,
|
'shared': 812941312,
|
||||||
'total': 16422858752,
|
'total': 16422825984,
|
||||||
'used': 9278827984}
|
'used': 12044965912}
|
||||||
>>> gl.mem.keys()
|
>>> gl.mem.keys()
|
||||||
['total', 'available', 'percent', 'used', 'free', 'active', 'inactive', 'buffers', 'cached', 'shared']
|
['total', 'available', 'percent', 'used', 'free', 'active', 'inactive', 'buffers', 'cached', 'shared']
|
||||||
>>> gl.mem.get("total")
|
>>> gl.mem.get("total")
|
||||||
16422858752
|
16422825984
|
||||||
|
|
||||||
Mem fields description:
|
Mem fields description:
|
||||||
|
|
||||||
|
|
@ -1128,19 +1148,19 @@ Quicklook stats:
|
||||||
>>> type(gl.quicklook)
|
>>> type(gl.quicklook)
|
||||||
<class 'glances.plugins.quicklook.QuicklookPlugin'>
|
<class 'glances.plugins.quicklook.QuicklookPlugin'>
|
||||||
>>> gl.quicklook
|
>>> gl.quicklook
|
||||||
{'cpu': 6.6,
|
{'cpu': 5.9,
|
||||||
'cpu_hz': 4475000000.0,
|
'cpu_hz': 4475000000.0,
|
||||||
'cpu_hz_current': 785612625.0000001,
|
'cpu_hz_current': 736325000.0000001,
|
||||||
'cpu_log_core': 16,
|
'cpu_log_core': 16,
|
||||||
'cpu_name': '13th Gen Intel(R) Core(TM) i7-13620H',
|
'cpu_name': '13th Gen Intel(R) Core(TM) i7-13620H',
|
||||||
'cpu_phys_core': 10,
|
'cpu_phys_core': 10,
|
||||||
'load': 4.3,
|
'load': 3.2,
|
||||||
'mem': 56.5,
|
'mem': 73.3,
|
||||||
'percpu': [{'cpu_number': 0,
|
'percpu': [{'cpu_number': 0,
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
'guest_nice': 0.0,
|
'guest_nice': 0.0,
|
||||||
'idle': 28.0,
|
'idle': 27.0,
|
||||||
'interrupt': None,
|
'interrupt': None,
|
||||||
'iowait': 0.0,
|
'iowait': 0.0,
|
||||||
'irq': 0.0,
|
'irq': 0.0,
|
||||||
|
|
@ -1148,8 +1168,8 @@ Quicklook stats:
|
||||||
'nice': 0.0,
|
'nice': 0.0,
|
||||||
'softirq': 0.0,
|
'softirq': 0.0,
|
||||||
'steal': 0.0,
|
'steal': 0.0,
|
||||||
'system': 4.0,
|
'system': 8.0,
|
||||||
'total': 72.0,
|
'total': 73.0,
|
||||||
'user': 0.0},
|
'user': 0.0},
|
||||||
{'cpu_number': 1,
|
{'cpu_number': 1,
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
|
|
@ -1165,7 +1185,7 @@ Quicklook stats:
|
||||||
'steal': 0.0,
|
'steal': 0.0,
|
||||||
'system': 0.0,
|
'system': 0.0,
|
||||||
'total': 66.0,
|
'total': 66.0,
|
||||||
'user': 0.0},
|
'user': 1.0},
|
||||||
{'cpu_number': 2,
|
{'cpu_number': 2,
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
|
|
@ -1180,7 +1200,7 @@ Quicklook stats:
|
||||||
'steal': 0.0,
|
'steal': 0.0,
|
||||||
'system': 0.0,
|
'system': 0.0,
|
||||||
'total': 66.0,
|
'total': 66.0,
|
||||||
'user': 0.0},
|
'user': 1.0},
|
||||||
{'cpu_number': 3,
|
{'cpu_number': 3,
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
|
|
@ -1200,7 +1220,22 @@ Quicklook stats:
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
'guest_nice': 0.0,
|
'guest_nice': 0.0,
|
||||||
'idle': 26.0,
|
'idle': 20.0,
|
||||||
|
'interrupt': None,
|
||||||
|
'iowait': 1.0,
|
||||||
|
'irq': 0.0,
|
||||||
|
'key': 'cpu_number',
|
||||||
|
'nice': 0.0,
|
||||||
|
'softirq': 0.0,
|
||||||
|
'steal': 0.0,
|
||||||
|
'system': 6.0,
|
||||||
|
'total': 80.0,
|
||||||
|
'user': 7.0},
|
||||||
|
{'cpu_number': 5,
|
||||||
|
'dpc': None,
|
||||||
|
'guest': 0.0,
|
||||||
|
'guest_nice': 0.0,
|
||||||
|
'idle': 25.0,
|
||||||
'interrupt': None,
|
'interrupt': None,
|
||||||
'iowait': 0.0,
|
'iowait': 0.0,
|
||||||
'irq': 0.0,
|
'irq': 0.0,
|
||||||
|
|
@ -1208,10 +1243,25 @@ Quicklook stats:
|
||||||
'nice': 0.0,
|
'nice': 0.0,
|
||||||
'softirq': 0.0,
|
'softirq': 0.0,
|
||||||
'steal': 0.0,
|
'steal': 0.0,
|
||||||
'system': 3.0,
|
'system': 7.0,
|
||||||
'total': 74.0,
|
'total': 75.0,
|
||||||
'user': 7.0},
|
'user': 1.0},
|
||||||
{'cpu_number': 5,
|
{'cpu_number': 6,
|
||||||
|
'dpc': None,
|
||||||
|
'guest': 0.0,
|
||||||
|
'guest_nice': 0.0,
|
||||||
|
'idle': 34.0,
|
||||||
|
'interrupt': None,
|
||||||
|
'iowait': 0.0,
|
||||||
|
'irq': 0.0,
|
||||||
|
'key': 'cpu_number',
|
||||||
|
'nice': 0.0,
|
||||||
|
'softirq': 0.0,
|
||||||
|
'steal': 0.0,
|
||||||
|
'system': 0.0,
|
||||||
|
'total': 66.0,
|
||||||
|
'user': 1.0},
|
||||||
|
{'cpu_number': 7,
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
'guest_nice': 0.0,
|
'guest_nice': 0.0,
|
||||||
|
|
@ -1226,41 +1276,11 @@ Quicklook stats:
|
||||||
'system': 0.0,
|
'system': 0.0,
|
||||||
'total': 65.0,
|
'total': 65.0,
|
||||||
'user': 0.0},
|
'user': 0.0},
|
||||||
{'cpu_number': 6,
|
|
||||||
'dpc': None,
|
|
||||||
'guest': 0.0,
|
|
||||||
'guest_nice': 0.0,
|
|
||||||
'idle': 26.0,
|
|
||||||
'interrupt': None,
|
|
||||||
'iowait': 1.0,
|
|
||||||
'irq': 0.0,
|
|
||||||
'key': 'cpu_number',
|
|
||||||
'nice': 0.0,
|
|
||||||
'softirq': 0.0,
|
|
||||||
'steal': 0.0,
|
|
||||||
'system': 8.0,
|
|
||||||
'total': 74.0,
|
|
||||||
'user': 2.0},
|
|
||||||
{'cpu_number': 7,
|
|
||||||
'dpc': None,
|
|
||||||
'guest': 0.0,
|
|
||||||
'guest_nice': 0.0,
|
|
||||||
'idle': 28.0,
|
|
||||||
'interrupt': None,
|
|
||||||
'iowait': 1.0,
|
|
||||||
'irq': 0.0,
|
|
||||||
'key': 'cpu_number',
|
|
||||||
'nice': 0.0,
|
|
||||||
'softirq': 0.0,
|
|
||||||
'steal': 0.0,
|
|
||||||
'system': 6.0,
|
|
||||||
'total': 72.0,
|
|
||||||
'user': 0.0},
|
|
||||||
{'cpu_number': 8,
|
{'cpu_number': 8,
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
'guest_nice': 0.0,
|
'guest_nice': 0.0,
|
||||||
'idle': 31.0,
|
'idle': 35.0,
|
||||||
'interrupt': None,
|
'interrupt': None,
|
||||||
'iowait': 0.0,
|
'iowait': 0.0,
|
||||||
'irq': 0.0,
|
'irq': 0.0,
|
||||||
|
|
@ -1268,9 +1288,9 @@ Quicklook stats:
|
||||||
'nice': 0.0,
|
'nice': 0.0,
|
||||||
'softirq': 0.0,
|
'softirq': 0.0,
|
||||||
'steal': 0.0,
|
'steal': 0.0,
|
||||||
'system': 1.0,
|
'system': 0.0,
|
||||||
'total': 69.0,
|
'total': 65.0,
|
||||||
'user': 3.0},
|
'user': 0.0},
|
||||||
{'cpu_number': 9,
|
{'cpu_number': 9,
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
|
|
@ -1290,7 +1310,7 @@ Quicklook stats:
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
'guest_nice': 0.0,
|
'guest_nice': 0.0,
|
||||||
'idle': 34.0,
|
'idle': 35.0,
|
||||||
'interrupt': None,
|
'interrupt': None,
|
||||||
'iowait': 0.0,
|
'iowait': 0.0,
|
||||||
'irq': 0.0,
|
'irq': 0.0,
|
||||||
|
|
@ -1299,8 +1319,8 @@ Quicklook stats:
|
||||||
'softirq': 0.0,
|
'softirq': 0.0,
|
||||||
'steal': 0.0,
|
'steal': 0.0,
|
||||||
'system': 0.0,
|
'system': 0.0,
|
||||||
'total': 66.0,
|
'total': 65.0,
|
||||||
'user': 1.0},
|
'user': 0.0},
|
||||||
{'cpu_number': 11,
|
{'cpu_number': 11,
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
|
|
@ -1317,21 +1337,6 @@ Quicklook stats:
|
||||||
'total': 65.0,
|
'total': 65.0,
|
||||||
'user': 0.0},
|
'user': 0.0},
|
||||||
{'cpu_number': 12,
|
{'cpu_number': 12,
|
||||||
'dpc': None,
|
|
||||||
'guest': 0.0,
|
|
||||||
'guest_nice': 0.0,
|
|
||||||
'idle': 35.0,
|
|
||||||
'interrupt': None,
|
|
||||||
'iowait': 0.0,
|
|
||||||
'irq': 0.0,
|
|
||||||
'key': 'cpu_number',
|
|
||||||
'nice': 0.0,
|
|
||||||
'softirq': 0.0,
|
|
||||||
'steal': 0.0,
|
|
||||||
'system': 0.0,
|
|
||||||
'total': 65.0,
|
|
||||||
'user': 0.0},
|
|
||||||
{'cpu_number': 13,
|
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
'guest_nice': 0.0,
|
'guest_nice': 0.0,
|
||||||
|
|
@ -1345,8 +1350,8 @@ Quicklook stats:
|
||||||
'steal': 0.0,
|
'steal': 0.0,
|
||||||
'system': 0.0,
|
'system': 0.0,
|
||||||
'total': 66.0,
|
'total': 66.0,
|
||||||
'user': 0.0},
|
'user': 1.0},
|
||||||
{'cpu_number': 14,
|
{'cpu_number': 13,
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
'guest_nice': 0.0,
|
'guest_nice': 0.0,
|
||||||
|
|
@ -1361,6 +1366,21 @@ Quicklook stats:
|
||||||
'system': 0.0,
|
'system': 0.0,
|
||||||
'total': 65.0,
|
'total': 65.0,
|
||||||
'user': 1.0},
|
'user': 1.0},
|
||||||
|
{'cpu_number': 14,
|
||||||
|
'dpc': None,
|
||||||
|
'guest': 0.0,
|
||||||
|
'guest_nice': 0.0,
|
||||||
|
'idle': 34.0,
|
||||||
|
'interrupt': None,
|
||||||
|
'iowait': 0.0,
|
||||||
|
'irq': 0.0,
|
||||||
|
'key': 'cpu_number',
|
||||||
|
'nice': 0.0,
|
||||||
|
'softirq': 0.0,
|
||||||
|
'steal': 0.0,
|
||||||
|
'system': 0.0,
|
||||||
|
'total': 66.0,
|
||||||
|
'user': 1.0},
|
||||||
{'cpu_number': 15,
|
{'cpu_number': 15,
|
||||||
'dpc': None,
|
'dpc': None,
|
||||||
'guest': 0.0,
|
'guest': 0.0,
|
||||||
|
|
@ -1373,10 +1393,10 @@ Quicklook stats:
|
||||||
'nice': 0.0,
|
'nice': 0.0,
|
||||||
'softirq': 0.0,
|
'softirq': 0.0,
|
||||||
'steal': 0.0,
|
'steal': 0.0,
|
||||||
'system': 1.0,
|
'system': 0.0,
|
||||||
'total': 66.0,
|
'total': 66.0,
|
||||||
'user': 1.0}],
|
'user': 0.0}],
|
||||||
'swap': 0.0}
|
'swap': 96.9}
|
||||||
>>> gl.quicklook.keys()
|
>>> gl.quicklook.keys()
|
||||||
['cpu_name', 'cpu_hz_current', 'cpu_hz', 'cpu', 'percpu', 'mem', 'swap', 'cpu_log_core', 'cpu_phys_core', 'load']
|
['cpu_name', 'cpu_hz_current', 'cpu_hz', 'cpu', 'percpu', 'mem', 'swap', 'cpu_log_core', 'cpu_phys_core', 'load']
|
||||||
>>> gl.quicklook.get("cpu_name")
|
>>> gl.quicklook.get("cpu_name")
|
||||||
|
|
@ -1426,13 +1446,13 @@ Memswap stats:
|
||||||
>>> type(gl.memswap)
|
>>> type(gl.memswap)
|
||||||
<class 'glances.plugins.memswap.MemswapPlugin'>
|
<class 'glances.plugins.memswap.MemswapPlugin'>
|
||||||
>>> gl.memswap
|
>>> gl.memswap
|
||||||
{'free': 4293918720,
|
{'free': 135245824,
|
||||||
'percent': 0.0,
|
'percent': 96.9,
|
||||||
'sin': 0,
|
'sin': 1637122048,
|
||||||
'sout': 155648,
|
'sout': 6747344896,
|
||||||
'time_since_update': 0.3645017147064209,
|
'time_since_update': 0.3689241409301758,
|
||||||
'total': 4294963200,
|
'total': 4294963200,
|
||||||
'used': 1044480}
|
'used': 4159717376}
|
||||||
>>> gl.memswap.keys()
|
>>> gl.memswap.keys()
|
||||||
['total', 'used', 'free', 'percent', 'sin', 'sout', 'time_since_update']
|
['total', 'used', 'free', 'percent', 'sin', 'sout', 'time_since_update']
|
||||||
>>> gl.memswap.get("total")
|
>>> gl.memswap.get("total")
|
||||||
|
|
@ -1467,10 +1487,10 @@ Use auto_unit() function to generate a human-readable string with the unit:
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
>>> gl.mem.get("used")
|
>>> gl.mem.get("used")
|
||||||
9278827984
|
12044965912
|
||||||
|
|
||||||
>>> gl.auto_unit(gl.mem.get("used"))
|
>>> gl.auto_unit(gl.mem.get("used"))
|
||||||
8.64G
|
11.2G
|
||||||
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
|
@ -1496,7 +1516,7 @@ Use bar() function to generate a bar:
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
>>> gl.bar(gl.mem["percent"])
|
>>> gl.bar(gl.mem["percent"])
|
||||||
■■■■■■■■■■□□□□□□□□
|
■■■■■■■■■■■■■□□□□□
|
||||||
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
|
@ -1526,7 +1546,7 @@ Use top_process() function to generate a list of top processes sorted by CPU or
|
||||||
.. code-block:: python
|
.. code-block:: python
|
||||||
|
|
||||||
>>> gl.top_process()
|
>>> gl.top_process()
|
||||||
[{'nice': 0, 'cpu_percent': 7.0, 'memory_percent': 3.672140600530691, 'pid': 7722, 'gids': {'real': 1000, 'effective': 1000, 'saved': 1000}, 'name': 'Isolated Web Co', 'cpu_times': {'user': 38.35, 'system': 2.43, 'children_user': 0.0, 'children_system': 0.0, 'iowait': 0.0}, 'num_threads': 30, 'status': 'S', 'io_counters': [205824, 0, 205824, 0, 1, 3581952, 0, 3581952, 0, 1, 5797888, 0, 5797888, 0, 1, 530432, 0, 530432, 0, 1, 2024448, 0, 2024448, 0, 1, 709632, 32768, 709632, 32768, 1, 11264, 0, 11264, 0, 1], 'memory_info': {'rss': 603070464, 'vms': 3160858624, 'shared': 111169536, 'text': 610304, 'lib': 0, 'data': 573337600, 'dirty': 0}, 'key': 'pid', 'time_since_update': 0.45221495628356934, 'cmdline': ['/snap/firefox/7177/usr/lib/firefox/firefox', '-contentproc', '-isForBrowser', '-prefsHandle', '0:46665', '-prefMapHandle', '1:278392', '-jsInitHandle', '2:224660', '-parentBuildID', '20251028100515', '-sandboxReporter', '3', '-chrootClient', '4', '-ipcHandle', '5', '-initialChannelId', '{63519720-ce7d-4af7-98af-78404f81d457}', '-parentPid', '6446', '-crashReporter', '6', '-crashHelper', '7', '-greomni', '/snap/firefox/7177/usr/lib/firefox/omni.ja', '-appomni', '/snap/firefox/7177/usr/lib/firefox/browser/omni.ja', '-appDir', '/snap/firefox/7177/usr/lib/firefox/browser', '11', 'tab'], 'username': 'nicolargo'}, {'nice': 0, 'cpu_percent': 4.7, 'memory_percent': 4.352427130952164, 'pid': 6446, 'gids': {'real': 1000, 'effective': 1000, 'saved': 1000}, 'name': 'firefox', 'cpu_times': {'user': 48.21, 'system': 12.77, 'children_user': 0.09, 'children_system': 0.28, 'iowait': 0.0}, 'num_threads': 148, 'status': 'S', 'io_counters': [499519488, 568045568, 499519488, 568045568, 1], 'memory_info': {'rss': 714792960, 'vms': 4454141952, 'shared': 265625600, 'text': 610304, 'lib': 0, 'data': 1026625536, 'dirty': 0}, 'key': 'pid', 'time_since_update': 0.45221495628356934, 'cmdline': ['/snap/firefox/7177/usr/lib/firefox/firefox'], 'username': 'nicolargo'}, {'nice': 0, 'cpu_percent': 2.3, 'memory_percent': 2.7413232665425777, 'pid': 8756, 'gids': {'real': 1000, 'effective': 1000, 'saved': 1000}, 'name': 'code', 'cpu_times': {'user': 90.96, 'system': 7.52, 'children_user': 0.0, 'children_system': 0.0, 'iowait': 0.0}, 'num_threads': 25, 'status': 'S', 'io_counters': [22750208, 126976, 22750208, 126976, 1, 28655616, 957018112, 28655616, 957018112, 1, 769914880, 121479168, 769914880, 121479168, 1, 50319360, 225280, 50319360, 225280, 1, 75313152, 0, 75313152, 0, 1, 68087808, 10162176, 68087808, 10162176, 1, 17530880, 4096, 17530880, 4096, 1, 35771392, 0, 35771392, 0, 1, 9899008, 0, 9899008, 0, 1, 2501632, 0, 2501632, 0, 1, 629760, 0, 629760, 0, 1, 4743168, 0, 4743168, 0, 1, 110592, 0, 110592, 0, 1, 3406848, 1003520, 3406848, 1003520, 1, 1456128, 0, 1456128, 0, 1, 1014784, 0, 1014784, 0, 1], 'memory_info': {'rss': 450203648, 'vms': 1517464080384, 'shared': 142995456, 'text': 148733952, 'lib': 0, 'data': 1207480320, 'dirty': 0}, 'key': 'pid', 'time_since_update': 0.45221495628356934, 'cmdline': ['/snap/code/211/usr/share/code/code', '--type=zygote', '--no-sandbox'], 'username': 'nicolargo'}]
|
[{'name': 'Isolated Web Co', 'io_counters': [7396352, 0, 7396352, 0, 1], 'pid': 472861, 'num_threads': 34, 'cpu_times': {'user': 618.31, 'system': 60.68, 'children_user': 0.0, 'children_system': 0.0, 'iowait': 0.0}, 'nice': 0, 'memory_percent': 3.11668922570738, 'status': 'S', 'memory_info': {'rss': 511848448, 'vms': 4369629184, 'shared': 74829824, 'text': 708608, 'lib': 0, 'data': 702328832, 'dirty': 0}, 'gids': {'real': 1000, 'effective': 1000, 'saved': 1000}, 'cpu_percent': 2.6, 'key': 'pid', 'time_since_update': 0.39455604553222656, 'cmdline': ['/snap/firefox/7559/usr/lib/firefox/firefox', '-contentproc', '-isForBrowser', '-prefsHandle', '0:45904', '-prefMapHandle', '1:280269', '-jsInitHandle', '2:223356', '-parentBuildID', '20251217233610', '-sandboxReporter', '3', '-chrootClient', '4', '-ipcHandle', '5', '-initialChannelId', '{b750b1b5-b51f-4cbd-8493-9c918fb23a11}', '-parentPid', '471623', '-crashReporter', '6', '-crashHelper', '7', '-greomni', '/snap/firefox/7559/usr/lib/firefox/omni.ja', '-appomni', '/snap/firefox/7559/usr/lib/firefox/browser/omni.ja', '-appDir', '/snap/firefox/7559/usr/lib/firefox/browser', '11', 'tab'], 'username': 'nicolargo'}, {'name': 'dockerd', 'io_counters': [0, 0, 0, 0, 0], 'pid': 3807, 'num_threads': 80, 'cpu_times': {'user': 103.99, 'system': 47.08, 'children_user': 3.67, 'children_system': 5.75, 'iowait': 0.0}, 'nice': 0, 'memory_percent': 0.335679523449306, 'status': 'S', 'memory_info': {'rss': 55128064, 'vms': 7906430976, 'shared': 23244800, 'text': 32280576, 'lib': 0, 'data': 795447296, 'dirty': 0}, 'gids': {'real': 0, 'effective': 0, 'saved': 0}, 'cpu_percent': 2.6, 'key': 'pid', 'time_since_update': 0.39455604553222656, 'cmdline': ['/usr/bin/dockerd', '-H', 'fd://', '--containerd=/run/containerd/containerd.sock'], 'username': 'root'}, {'name': 'iio-sensor-proxy', 'io_counters': [0, 0, 0, 0, 0], 'pid': 2755, 'num_threads': 4, 'cpu_times': {'user': 4.86, 'system': 7.32, 'children_user': 0.0, 'children_system': 0.0, 'iowait': 0.0}, 'nice': 0, 'memory_percent': 0.04753734836870327, 'status': 'S', 'memory_info': {'rss': 7806976, 'vms': 321671168, 'shared': 7127040, 'text': 36864, 'lib': 0, 'data': 35307520, 'dirty': 0}, 'gids': {'real': 0, 'effective': 0, 'saved': 0}, 'cpu_percent': 2.6, 'key': 'pid', 'time_since_update': 0.39455604553222656, 'cmdline': ['/usr/libexec/iio-sensor-proxy'], 'username': 'root'}]
|
||||||
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -36,6 +36,7 @@ This section describes the available exporters and how to configure them:
|
||||||
kafka
|
kafka
|
||||||
mqtt
|
mqtt
|
||||||
mongodb
|
mongodb
|
||||||
|
nats
|
||||||
opentsdb
|
opentsdb
|
||||||
prometheus
|
prometheus
|
||||||
rabbitmq
|
rabbitmq
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
.. _nats:
|
||||||
|
|
||||||
|
NATS
|
||||||
|
====
|
||||||
|
|
||||||
|
NATS is a message broker.
|
||||||
|
|
||||||
|
You can export statistics to a ``NATS`` server.
|
||||||
|
|
||||||
|
The connection should be defined in the Glances configuration file as
|
||||||
|
following:
|
||||||
|
|
||||||
|
.. code-block:: ini
|
||||||
|
|
||||||
|
[nats]
|
||||||
|
host=nats://localhost:4222
|
||||||
|
prefix=glances
|
||||||
|
|
||||||
|
and run Glances with:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ glances --export nats
|
||||||
|
|
||||||
|
Data model
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Glances stats are published as JSON messagesto the following subjects:
|
||||||
|
|
||||||
|
<prefix>.<plugin>
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
CPU stats are published to glances.cpu
|
||||||
|
|
||||||
|
So a simple Python client will subscribe to this subject with:
|
||||||
|
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
import nats
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
nc = nats.NATS()
|
||||||
|
|
||||||
|
await nc.connect(servers=["nats://localhost:4222"])
|
||||||
|
|
||||||
|
future = asyncio.Future()
|
||||||
|
|
||||||
|
async def cb(msg):
|
||||||
|
nonlocal future
|
||||||
|
future.set_result(msg)
|
||||||
|
|
||||||
|
await nc.subscribe("glances.cpu", cb=cb)
|
||||||
|
|
||||||
|
# Wait for message to come in
|
||||||
|
print("Waiting (max 30 seconds) for a message on 'glances' subject...")
|
||||||
|
msg = await asyncio.wait_for(future, 30)
|
||||||
|
print(msg.subject, msg.data)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
asyncio.run(main())
|
||||||
|
|
||||||
|
To subscribe to all Glannces stats use wildcard:
|
||||||
|
|
||||||
|
await nc.subscribe("glances.*", cb=cb)
|
||||||
|
|
||||||
|
|
@ -28,7 +28,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||||
..
|
..
|
||||||
.TH "GLANCES" "1" "Nov 21, 2025" "4.4.2_dev1" "Glances"
|
.TH "GLANCES" "1" "Jan 02, 2026" "4.4.2_dev1" "Glances"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
glances \- An eye on your system
|
glances \- An eye on your system
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
|
@ -963,6 +963,6 @@ If you do not want to see the local Glances Web Server in the browser list pleas
|
||||||
.sp
|
.sp
|
||||||
Nicolas Hennion aka Nicolargo <\X'tty: link mailto:contact@nicolargo.com'\fI\%contact@nicolargo.com\fP\X'tty: link'>
|
Nicolas Hennion aka Nicolargo <\X'tty: link mailto:contact@nicolargo.com'\fI\%contact@nicolargo.com\fP\X'tty: link'>
|
||||||
.SH COPYRIGHT
|
.SH COPYRIGHT
|
||||||
2025, Nicolas Hennion
|
2026, Nicolas Hennion
|
||||||
.\" Generated by docutils manpage writer.
|
.\" Generated by docutils manpage writer.
|
||||||
.
|
.
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# This file is part of Glances.
|
# This file is part of Glances.
|
||||||
#
|
#
|
||||||
# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
|
# SPDX-FileCopyrightText: 2026 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: LGPL-3.0-only
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
#
|
#
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,165 @@
|
||||||
|
#
|
||||||
|
# This file is part of Glances.
|
||||||
|
#
|
||||||
|
# SPDX-FileCopyrightText: 2026 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
|
#
|
||||||
|
|
||||||
|
"""
|
||||||
|
I am your son...
|
||||||
|
...abstract class for AsyncIO-based Glances exports.
|
||||||
|
"""
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
from abc import abstractmethod
|
||||||
|
|
||||||
|
from glances.exports.export import GlancesExport
|
||||||
|
from glances.logger import logger
|
||||||
|
|
||||||
|
|
||||||
|
class GlancesExportAsyncio(GlancesExport):
|
||||||
|
"""Abstract class for AsyncIO-based export modules.
|
||||||
|
|
||||||
|
This class manages a persistent event loop in a background thread,
|
||||||
|
allowing child classes to use AsyncIO operations for exporting data.
|
||||||
|
|
||||||
|
Child classes must implement:
|
||||||
|
- async _async_init(): AsyncIO initialization (e.g., connection setup)
|
||||||
|
- async _async_exit(): AsyncIO cleanup (e.g., disconnection)
|
||||||
|
- async _async_export(name, columns, points): AsyncIO export operation
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, config=None, args=None):
|
||||||
|
"""Init the AsyncIO export interface."""
|
||||||
|
super().__init__(config=config, args=args)
|
||||||
|
|
||||||
|
# AsyncIO event loop management
|
||||||
|
self.loop = None
|
||||||
|
self._loop_ready = threading.Event()
|
||||||
|
self._loop_exception = None
|
||||||
|
self._shutdown = False
|
||||||
|
|
||||||
|
# Start the background event loop thread
|
||||||
|
self._loop_thread = threading.Thread(target=self._run_event_loop, daemon=True)
|
||||||
|
self._loop_thread.start()
|
||||||
|
|
||||||
|
# Wait for the loop to be ready
|
||||||
|
if not self._loop_ready.wait(timeout=10):
|
||||||
|
raise RuntimeError("AsyncIO event loop failed to start within timeout")
|
||||||
|
|
||||||
|
if self._loop_exception:
|
||||||
|
raise RuntimeError(f"AsyncIO event loop creation failed: {self._loop_exception}")
|
||||||
|
|
||||||
|
if self.loop is None:
|
||||||
|
raise RuntimeError("AsyncIO event loop is None after initialization")
|
||||||
|
|
||||||
|
# Call child class AsyncIO initialization
|
||||||
|
future = asyncio.run_coroutine_threadsafe(self._async_init(), self.loop)
|
||||||
|
try:
|
||||||
|
future.result(timeout=10)
|
||||||
|
logger.debug(f"{self.export_name} AsyncIO export initialized successfully")
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"{self.export_name} AsyncIO initialization failed: {e}. Will retry in background.")
|
||||||
|
|
||||||
|
def _run_event_loop(self):
|
||||||
|
"""Run event loop in background thread."""
|
||||||
|
try:
|
||||||
|
self.loop = asyncio.new_event_loop()
|
||||||
|
asyncio.set_event_loop(self.loop)
|
||||||
|
self._loop_ready.set()
|
||||||
|
self.loop.run_forever()
|
||||||
|
except Exception as e:
|
||||||
|
self._loop_exception = e
|
||||||
|
self._loop_ready.set()
|
||||||
|
logger.error(f"{self.export_name} AsyncIO event loop thread error: {e}")
|
||||||
|
finally:
|
||||||
|
# Clean up pending tasks
|
||||||
|
pending = asyncio.all_tasks(self.loop)
|
||||||
|
for task in pending:
|
||||||
|
task.cancel()
|
||||||
|
if pending:
|
||||||
|
self.loop.run_until_complete(asyncio.gather(*pending, return_exceptions=True))
|
||||||
|
self.loop.close()
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
async def _async_init(self):
|
||||||
|
"""AsyncIO initialization method.
|
||||||
|
|
||||||
|
Child classes should implement this method to perform AsyncIO-based
|
||||||
|
initialization such as connecting to servers, setting up clients, etc.
|
||||||
|
|
||||||
|
This method is called once during __init__ after the event loop is ready.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
async def _async_exit(self):
|
||||||
|
"""AsyncIO cleanup method.
|
||||||
|
|
||||||
|
Child classes should implement this method to perform AsyncIO-based
|
||||||
|
cleanup such as disconnecting from servers, closing clients, etc.
|
||||||
|
|
||||||
|
This method is called during exit() before stopping the event loop.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
async def _async_export(self, name, columns, points):
|
||||||
|
"""AsyncIO export method.
|
||||||
|
|
||||||
|
Child classes must implement this method to perform the actual
|
||||||
|
export operation using AsyncIO.
|
||||||
|
|
||||||
|
:param name: plugin name
|
||||||
|
:param columns: list of column names
|
||||||
|
:param points: list of values corresponding to columns
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def exit(self):
|
||||||
|
"""Close the AsyncIO export module."""
|
||||||
|
super().exit()
|
||||||
|
self._shutdown = True
|
||||||
|
logger.info(f"{self.export_name} AsyncIO export shutting down")
|
||||||
|
|
||||||
|
# Call child class cleanup
|
||||||
|
if self.loop:
|
||||||
|
future = asyncio.run_coroutine_threadsafe(self._async_exit(), self.loop)
|
||||||
|
try:
|
||||||
|
future.result(timeout=5)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"{self.export_name} Error in AsyncIO cleanup: {e}")
|
||||||
|
|
||||||
|
# Stop the event loop
|
||||||
|
if self.loop:
|
||||||
|
self.loop.call_soon_threadsafe(self.loop.stop)
|
||||||
|
time.sleep(0.5)
|
||||||
|
|
||||||
|
logger.debug(f"{self.export_name} AsyncIO export shutdown complete")
|
||||||
|
|
||||||
|
def export(self, name, columns, points):
|
||||||
|
"""Export data using AsyncIO.
|
||||||
|
|
||||||
|
This method bridges the synchronous export() interface with
|
||||||
|
the AsyncIO _async_export() implementation.
|
||||||
|
"""
|
||||||
|
if self._shutdown:
|
||||||
|
logger.debug(f"{self.export_name} Export called during shutdown, skipping")
|
||||||
|
return
|
||||||
|
|
||||||
|
if not self.loop or not self.loop.is_running():
|
||||||
|
logger.error(f"{self.export_name} AsyncIO event loop is not running")
|
||||||
|
return
|
||||||
|
|
||||||
|
# Submit the export operation to the background event loop
|
||||||
|
try:
|
||||||
|
future = asyncio.run_coroutine_threadsafe(self._async_export(name, columns, points), self.loop)
|
||||||
|
# Don't block forever - use a short timeout
|
||||||
|
future.result(timeout=1)
|
||||||
|
except asyncio.TimeoutError:
|
||||||
|
logger.warning(f"{self.export_name} AsyncIO export timeout for {name}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"{self.export_name} AsyncIO export error for {name}: {e}", exc_info=True)
|
||||||
|
|
@ -0,0 +1,134 @@
|
||||||
|
#
|
||||||
|
# This file is part of Glances.
|
||||||
|
#
|
||||||
|
# SPDX-FileCopyrightText: 2026 Nicolas Hennion <nicolas@nicolargo.com>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: LGPL-3.0-only
|
||||||
|
#
|
||||||
|
|
||||||
|
"""NATS interface class."""
|
||||||
|
|
||||||
|
from nats.aio.client import Client as NATS
|
||||||
|
from nats.errors import ConnectionClosedError
|
||||||
|
from nats.errors import TimeoutError as NatsTimeoutError
|
||||||
|
|
||||||
|
from glances.exports.export_asyncio import GlancesExportAsyncio
|
||||||
|
from glances.globals import json_dumps
|
||||||
|
from glances.logger import logger
|
||||||
|
|
||||||
|
|
||||||
|
class Export(GlancesExportAsyncio):
|
||||||
|
"""This class manages the NATS export module."""
|
||||||
|
|
||||||
|
def __init__(self, config=None, args=None):
|
||||||
|
"""Init the NATS export IF."""
|
||||||
|
# Load the NATS configuration file before calling super().__init__
|
||||||
|
# because super().__init__ will call _async_init() which needs config
|
||||||
|
self.config = config
|
||||||
|
self.args = args
|
||||||
|
self.export_name = self.__class__.__module__
|
||||||
|
|
||||||
|
export_enable = self.load_conf(
|
||||||
|
'nats',
|
||||||
|
mandatories=['host'],
|
||||||
|
options=['prefix'],
|
||||||
|
)
|
||||||
|
if not export_enable:
|
||||||
|
exit('Missing NATS config')
|
||||||
|
|
||||||
|
self.prefix = self.prefix or 'glances'
|
||||||
|
# Host is a comma-separated list of NATS servers
|
||||||
|
self.hosts = self.host
|
||||||
|
|
||||||
|
# NATS-specific attributes
|
||||||
|
self.client = None
|
||||||
|
self._connected = False
|
||||||
|
self._publish_count = 0
|
||||||
|
|
||||||
|
# Call parent __init__ which will start event loop and call _async_init()
|
||||||
|
super().__init__(config=config, args=args)
|
||||||
|
|
||||||
|
# Restore export_enable after super().__init__() resets it to False
|
||||||
|
self.export_enable = export_enable
|
||||||
|
|
||||||
|
async def _async_init(self):
|
||||||
|
"""Connect to NATS with error handling."""
|
||||||
|
try:
|
||||||
|
if self.client:
|
||||||
|
try:
|
||||||
|
await self.client.close()
|
||||||
|
except Exception as e:
|
||||||
|
logger.debug(f"NATS Error closing existing client: {e}")
|
||||||
|
|
||||||
|
self.client = NATS()
|
||||||
|
|
||||||
|
logger.debug(f"NATS Connecting to servers: {self.hosts}")
|
||||||
|
|
||||||
|
# Configure with reconnection callbacks
|
||||||
|
await self.client.connect(
|
||||||
|
servers=[s.strip() for s in self.hosts.split(',')],
|
||||||
|
reconnect_time_wait=2,
|
||||||
|
max_reconnect_attempts=60,
|
||||||
|
error_cb=self._error_callback,
|
||||||
|
disconnected_cb=self._disconnected_callback,
|
||||||
|
reconnected_cb=self._reconnected_callback,
|
||||||
|
)
|
||||||
|
|
||||||
|
self._connected = True
|
||||||
|
logger.info(f"NATS Successfully connected to servers: {self.hosts}")
|
||||||
|
except Exception as e:
|
||||||
|
self._connected = False
|
||||||
|
logger.error(f"NATS connection error: {e}")
|
||||||
|
raise
|
||||||
|
|
||||||
|
async def _error_callback(self, e):
|
||||||
|
"""Called when NATS client encounters an error."""
|
||||||
|
logger.error(f"NATS error callback: {e}")
|
||||||
|
|
||||||
|
async def _disconnected_callback(self):
|
||||||
|
"""Called when disconnected from NATS."""
|
||||||
|
self._connected = False
|
||||||
|
logger.debug("NATS disconnected callback")
|
||||||
|
|
||||||
|
async def _reconnected_callback(self):
|
||||||
|
"""Called when reconnected to NATS."""
|
||||||
|
self._connected = True
|
||||||
|
logger.debug("NATS reconnected callback")
|
||||||
|
|
||||||
|
async def _async_exit(self):
|
||||||
|
"""Disconnect from NATS."""
|
||||||
|
try:
|
||||||
|
if self.client and self._connected:
|
||||||
|
await self.client.drain()
|
||||||
|
await self.client.close()
|
||||||
|
self._connected = False
|
||||||
|
logger.debug(f"NATS disconnected cleanly. Total messages published: {self._publish_count}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"NATS Error in disconnect: {e}")
|
||||||
|
|
||||||
|
async def _async_export(self, name, columns, points):
|
||||||
|
"""Write the points to NATS using AsyncIO."""
|
||||||
|
if not self._connected:
|
||||||
|
logger.warning("NATS not connected, skipping export")
|
||||||
|
return
|
||||||
|
|
||||||
|
subject_name = f"{self.prefix}.{name}"
|
||||||
|
subject_data = dict(zip(columns, points))
|
||||||
|
|
||||||
|
# Publish data to NATS
|
||||||
|
try:
|
||||||
|
if not self._connected:
|
||||||
|
raise ConnectionClosedError("NATS Not connected to server")
|
||||||
|
await self.client.publish(subject_name, json_dumps(subject_data))
|
||||||
|
await self.client.flush(timeout=2.0)
|
||||||
|
self._publish_count += 1
|
||||||
|
except (ConnectionClosedError, NatsTimeoutError) as e:
|
||||||
|
self._connected = False
|
||||||
|
logger.error(f"NATS publish failed for {subject_name}: {e}")
|
||||||
|
raise
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"NATS Unexpected error publishing {subject_name}: {e}", exc_info=True)
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
# End of glances/exports/glances_nats/__init__.py
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
|
"name": "static",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bootstrap": "^5.3.8",
|
"bootstrap": "^5.3.8",
|
||||||
"favico.js": "^0.3.10",
|
"favico.js": "^0.3.10",
|
||||||
|
|
@ -5423,9 +5424,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/qs": {
|
"node_modules/qs": {
|
||||||
"version": "6.14.0",
|
"version": "6.14.1",
|
||||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
|
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
|
||||||
"integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
|
"integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "BSD-3-Clause",
|
"license": "BSD-3-Clause",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|
|
||||||
|
|
@ -966,3 +966,6 @@ class ProcesslistPlugin(GlancesPluginModel):
|
||||||
|
|
||||||
# By default return 5 (corresponding to 99999 PID number)
|
# By default return 5 (corresponding to 99999 PID number)
|
||||||
return 5
|
return 5
|
||||||
|
|
||||||
|
|
||||||
|
# End of file
|
||||||
|
|
|
||||||
|
|
@ -478,10 +478,7 @@ class GlancesProcesses:
|
||||||
# Only get the info key
|
# Only get the info key
|
||||||
# PsUtil 6+ no longer check PID reused #2755 so use is_running in the loop
|
# PsUtil 6+ no longer check PID reused #2755 so use is_running in the loop
|
||||||
# Note: not sure it is realy needed but CPU consumption look the same with or without it
|
# Note: not sure it is realy needed but CPU consumption look the same with or without it
|
||||||
processlist = [p.info for p in processlist if p.is_running()]
|
return [p.info for p in processlist if p.is_running()]
|
||||||
|
|
||||||
# Sort the processes list by the current sort_key
|
|
||||||
return sort_stats(processlist, sorted_by=self.sort_key, reverse=True)
|
|
||||||
|
|
||||||
def get_sorted_attrs(self):
|
def get_sorted_attrs(self):
|
||||||
defaults = ['cpu_percent', 'cpu_times', 'memory_percent', 'name', 'status', 'num_threads']
|
defaults = ['cpu_percent', 'cpu_times', 'memory_percent', 'name', 'status', 'num_threads']
|
||||||
|
|
@ -599,6 +596,8 @@ class GlancesProcesses:
|
||||||
|
|
||||||
# Remove attributes set by the user in the config file (see #1524)
|
# Remove attributes set by the user in the config file (see #1524)
|
||||||
sorted_attrs = [i for i in sorted_attrs if i not in self.disable_stats]
|
sorted_attrs = [i for i in sorted_attrs if i not in self.disable_stats]
|
||||||
|
|
||||||
|
# Buid and sort the process list
|
||||||
processlist = self.build_process_list(sorted_attrs)
|
processlist = self.build_process_list(sorted_attrs)
|
||||||
|
|
||||||
# Update the processcount
|
# Update the processcount
|
||||||
|
|
@ -757,6 +756,7 @@ def _sort_io_counters(process, sorted_by='io_counters', sorted_by_secondary='mem
|
||||||
|
|
||||||
:return: Sum of io_r + io_w
|
:return: Sum of io_r + io_w
|
||||||
"""
|
"""
|
||||||
|
logger.info(f'*** Sort by cpu_times called {type(process[sorted_by])} {process[sorted_by]}')
|
||||||
return process[sorted_by][0] - process[sorted_by][2] + process[sorted_by][1] - process[sorted_by][3]
|
return process[sorted_by][0] - process[sorted_by][2] + process[sorted_by][1] - process[sorted_by][3]
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -768,7 +768,7 @@ def _sort_cpu_times(process, sorted_by='cpu_times', sorted_by_secondary='memory_
|
||||||
see (https://github.com/giampaolo/psutil/issues/1339)
|
see (https://github.com/giampaolo/psutil/issues/1339)
|
||||||
The following implementation takes user and system time into account
|
The following implementation takes user and system time into account
|
||||||
"""
|
"""
|
||||||
return process[sorted_by][0] + process[sorted_by][1]
|
return process[sorted_by]['user'] + process[sorted_by]['system']
|
||||||
|
|
||||||
|
|
||||||
def _sort_lambda(sorted_by='cpu_percent', sorted_by_secondary='memory_percent'):
|
def _sort_lambda(sorted_by='cpu_percent', sorted_by_secondary='memory_percent'):
|
||||||
|
|
@ -793,18 +793,22 @@ def sort_stats(stats, sorted_by='cpu_percent', sorted_by_secondary='memory_perce
|
||||||
# Specific sort
|
# Specific sort
|
||||||
try:
|
try:
|
||||||
stats = sorted(stats, key=sort_lambda, reverse=reverse)
|
stats = sorted(stats, key=sort_lambda, reverse=reverse)
|
||||||
except Exception:
|
except Exception as e:
|
||||||
# If an error is detected, fallback to cpu_percent
|
# If an error is detected, fallback to cpu_percent
|
||||||
|
logger.debug(f'Error while sorting by {sorted_by}, fallback to cpu_percent ({e})')
|
||||||
stats = sorted(stats, key=sort_by_these_keys('cpu_percent', sorted_by_secondary), reverse=reverse)
|
stats = sorted(stats, key=sort_by_these_keys('cpu_percent', sorted_by_secondary), reverse=reverse)
|
||||||
else:
|
else:
|
||||||
# Standard sort
|
# Standard sort
|
||||||
try:
|
try:
|
||||||
stats = sorted(stats, key=sort_by_these_keys(sorted_by, sorted_by_secondary), reverse=reverse)
|
stats = sorted(stats, key=sort_by_these_keys(sorted_by, sorted_by_secondary), reverse=reverse)
|
||||||
except (KeyError, TypeError):
|
except (KeyError, TypeError) as e:
|
||||||
# Fallback to name
|
# Fallback to name
|
||||||
|
logger.debug(f'Error while sorting by {sorted_by}, fallback to name ({e})')
|
||||||
stats.sort(key=lambda process: process['name'] if process['name'] is not None else '~', reverse=False)
|
stats.sort(key=lambda process: process['name'] if process['name'] is not None else '~', reverse=False)
|
||||||
|
|
||||||
return stats
|
return stats
|
||||||
|
|
||||||
|
|
||||||
glances_processes = GlancesProcesses()
|
glances_processes = GlancesProcesses()
|
||||||
|
|
||||||
|
# End of file processes.py
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,7 @@ export = [
|
||||||
"influxdb>=1.0.0",
|
"influxdb>=1.0.0",
|
||||||
"influxdb3-python",
|
"influxdb3-python",
|
||||||
"kafka-python",
|
"kafka-python",
|
||||||
|
"nats-py",
|
||||||
"paho-mqtt",
|
"paho-mqtt",
|
||||||
"pika",
|
"pika",
|
||||||
"potsdb",
|
"potsdb",
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ markupsafe==3.0.3
|
||||||
# via jinja2
|
# via jinja2
|
||||||
packaging==25.0
|
packaging==25.0
|
||||||
# via glances
|
# via glances
|
||||||
psutil==7.1.3
|
psutil==7.2.1
|
||||||
# via glances
|
# via glances
|
||||||
shtab==1.8.0 ; sys_platform != 'win32'
|
shtab==1.8.0 ; sys_platform != 'win32'
|
||||||
# via glances
|
# via glances
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
import nats
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
nc = nats.NATS()
|
||||||
|
|
||||||
|
await nc.connect(servers=["nats://localhost:4222"])
|
||||||
|
|
||||||
|
await nc.publish("glances.test", b'A test')
|
||||||
|
await nc.flush()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
asyncio.run(main())
|
||||||
|
|
||||||
|
# To run this test script, make sure you have a NATS server running locally.
|
||||||
|
|
@ -0,0 +1,32 @@
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
import nats
|
||||||
|
|
||||||
|
|
||||||
|
async def main():
|
||||||
|
duration = 30
|
||||||
|
subject = "glances.*"
|
||||||
|
|
||||||
|
nc = nats.NATS()
|
||||||
|
|
||||||
|
await nc.connect(servers=["nats://localhost:4222"])
|
||||||
|
|
||||||
|
future = asyncio.Future()
|
||||||
|
|
||||||
|
async def cb(msg):
|
||||||
|
subject = msg.subject
|
||||||
|
reply = msg.reply
|
||||||
|
data = msg.data.decode()
|
||||||
|
print(f"Received a message on '{subject} {reply}': {data}")
|
||||||
|
|
||||||
|
print(f"Receiving message from {subject} during {duration} seconds...")
|
||||||
|
await nc.subscribe(subject, cb=cb)
|
||||||
|
await asyncio.wait_for(future, duration)
|
||||||
|
|
||||||
|
await nc.close()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
asyncio.run(main())
|
||||||
|
|
||||||
|
# To run this test script, make sure you have a NATS server running locally.
|
||||||
|
|
@ -72,4 +72,4 @@ docker rm influxdb-v3-for-glances
|
||||||
# Remove the temporary configuration file
|
# Remove the temporary configuration file
|
||||||
rm -f /tmp/glances.conf
|
rm -f /tmp/glances.conf
|
||||||
|
|
||||||
echo "Script completed successfully!"
|
echo "Script completed successfully!"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Pre-requisites:
|
||||||
|
# - docker
|
||||||
|
# - jq
|
||||||
|
|
||||||
|
# Exit on error
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "Stop previous nats container..."
|
||||||
|
docker stop nats-for-glances || true
|
||||||
|
docker rm nats-for-glances || true
|
||||||
|
|
||||||
|
echo "Starting nats container..."
|
||||||
|
docker run -d \
|
||||||
|
--name nats-for-glances \
|
||||||
|
-p 4222:4222 \
|
||||||
|
-p 8222:8222 \
|
||||||
|
-p 6222:6222 \
|
||||||
|
nats:latest
|
||||||
|
|
||||||
|
# Wait for InfluxDB to be ready (5 seconds)
|
||||||
|
echo "Waiting for nats to start (~ 5 seconds)..."
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
# Run glances with export to nats, stopping after 10 writes
|
||||||
|
# This will run synchronously now since we're using --stop-after
|
||||||
|
echo "Glances to export system stats to nats (duration: ~ 20 seconds)"
|
||||||
|
.venv/bin/python -m glances --config ./conf/glances.conf --export nats --stop-after 10 --quiet
|
||||||
|
|
||||||
|
# Stop and remove the nats container
|
||||||
|
echo "Stopping and removing nats container..."
|
||||||
|
docker stop nats-for-glances && docker rm nats-for-glances
|
||||||
|
|
||||||
|
echo "Script completed successfully!"
|
||||||
|
|
@ -20,7 +20,7 @@ curl http://localhost:9091/metrics
|
||||||
|
|
||||||
# Kill the glances process if it's still running
|
# Kill the glances process if it's still running
|
||||||
if ps -p $GLANCES_PID > /dev/null; then
|
if ps -p $GLANCES_PID > /dev/null; then
|
||||||
kill $GLANCES_PID
|
kill $GLANCES_PID
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Script completed successfully!"
|
echo "Script completed successfully!"
|
||||||
|
|
@ -38,6 +38,6 @@ docker exec timescaledb-for-glances psql -d "postgres://postgres:password@localh
|
||||||
|
|
||||||
# Stop and remove the TimescaleDB container
|
# Stop and remove the TimescaleDB container
|
||||||
echo "Stopping and removing TimescaleDB container..."
|
echo "Stopping and removing TimescaleDB container..."
|
||||||
# docker stop timescaledb-for-glances && docker rm timescaledb-for-glances
|
docker stop timescaledb-for-glances && docker rm timescaledb-for-glances
|
||||||
|
|
||||||
echo "Script completed successfully!"
|
echo "Script completed successfully!"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue