Compare commits
1101 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
17266144c8 | |
|
|
7da3111b76 | |
|
|
131d0aec8d | |
|
|
3f060c684b | |
|
|
37d2fe13d0 | |
|
|
0d8352c9c7 | |
|
|
ad9d52b5b0 | |
|
|
22f7be01cb | |
|
|
326c2fef51 | |
|
|
a3195463a0 | |
|
|
84324615c5 | |
|
|
fa9bb2cdab | |
|
|
d97c5cd5b9 | |
|
|
420305a24a | |
|
|
603f1ee8a4 | |
|
|
62e0b784bd | |
|
|
1e25b4b130 | |
|
|
8b76cd458e | |
|
|
5cbbe91e1f | |
|
|
862ac41b58 | |
|
|
c8b2a90f3b | |
|
|
6e844f3c8b | |
|
|
91279b9144 | |
|
|
7160cd8ae4 | |
|
|
4bd36a34a1 | |
|
|
6cedd16753 | |
|
|
12083f33fc | |
|
|
b7c6cce373 | |
|
|
ba932e72bd | |
|
|
5d9593b393 | |
|
|
5886321156 | |
|
|
f72b3e226e | |
|
|
b9a89006a2 | |
|
|
1353b22445 | |
|
|
f058360b52 | |
|
|
f3b3b42e29 | |
|
|
be199ef044 | |
|
|
15d252a40b | |
|
|
0b141ff92d | |
|
|
60f304c313 | |
|
|
29d7a15dab | |
|
|
f837614a69 | |
|
|
3247b0dc33 | |
|
|
507079491a | |
|
|
d5ce8a7461 | |
|
|
f587b281c0 | |
|
|
e74dcc0060 | |
|
|
59d54b8e2b | |
|
|
184e490660 | |
|
|
cd1f9348c2 | |
|
|
68b5215e94 | |
|
|
928e577d8c | |
|
|
1b6d63fd2f | |
|
|
fafdef615d | |
|
|
8ab188bc04 | |
|
|
cd9360f637 | |
|
|
be5a92c7e6 | |
|
|
9907e7242f | |
|
|
9b5cc01b06 | |
|
|
89753198b3 | |
|
|
8408a35100 | |
|
|
bd246fe966 | |
|
|
7b22761c75 | |
|
|
9d4bc76304 | |
|
|
74771d0949 | |
|
|
2a508d7641 | |
|
|
41db9c86f9 | |
|
|
eb21408b72 | |
|
|
4f48d33709 | |
|
|
2800e81cb0 | |
|
|
bc629d12b2 | |
|
|
ec11dff2cd | |
|
|
71b0d4b606 | |
|
|
d009335ba0 | |
|
|
f84baaa8df | |
|
|
bbb733d6cb | |
|
|
73f45dd9a8 | |
|
|
394f94fb27 | |
|
|
2146673841 | |
|
|
fcc5061d8c | |
|
|
f2641c80e2 | |
|
|
b9c451ce7a | |
|
|
ca2d729211 | |
|
|
50818213b1 | |
|
|
868aa0f4b1 | |
|
|
f7ab7efdd4 | |
|
|
9797fc795e | |
|
|
fc2e2c71af | |
|
|
45bdcc92c7 | |
|
|
1cf7683c1d | |
|
|
1b3ee3e035 | |
|
|
3de1a25305 | |
|
|
1567c2db49 | |
|
|
1171d0b4d3 | |
|
|
df684c64c2 | |
|
|
c70321c3fb | |
|
|
93120b9779 | |
|
|
89c8fc125c | |
|
|
11aac6ca4d | |
|
|
e7bd8d4768 | |
|
|
e660520eb2 | |
|
|
0ae24bade0 | |
|
|
728b36a8c9 | |
|
|
e2a1606479 | |
|
|
8c9822ed26 | |
|
|
c4f6c04eb4 | |
|
|
7c13d53cb8 | |
|
|
ccb00ec252 | |
|
|
ab3b386e10 | |
|
|
5cbd9e030a | |
|
|
c89effd602 | |
|
|
ab68fcbe28 | |
|
|
df4b312bec | |
|
|
25da171479 | |
|
|
34c3c11725 | |
|
|
de0b1ef2da | |
|
|
c0dad78189 | |
|
|
d9abfca7fb | |
|
|
cb377055f2 | |
|
|
b2e3ea283d | |
|
|
a74b1867d7 | |
|
|
afff3e2ba6 | |
|
|
fb17066692 | |
|
|
e5e476d255 | |
|
|
ea10748e07 | |
|
|
7c19d01c21 | |
|
|
8bb2a8a91b | |
|
|
b75d1f24c3 | |
|
|
5efa3a01a3 | |
|
|
e11cb80492 | |
|
|
e2d37ee482 | |
|
|
930745b5f3 | |
|
|
ba1b898a3e | |
|
|
9de127cce9 | |
|
|
55ff04437f | |
|
|
ba6be768d0 | |
|
|
4e669d0bc7 | |
|
|
3e7a49eb3b | |
|
|
f1bd18a3a5 | |
|
|
ef5ef9eb8a | |
|
|
89a10d9633 | |
|
|
6692e00a0e | |
|
|
a1edfc735a | |
|
|
5101512320 | |
|
|
244f13634f | |
|
|
7e3116a4e1 | |
|
|
579049cec5 | |
|
|
3646e011cf | |
|
|
ff5e33d856 | |
|
|
de6fae584e | |
|
|
1c6a9e1412 | |
|
|
a7ba827cc5 | |
|
|
c523d20648 | |
|
|
ef36eb9ab6 | |
|
|
f38ff27faa | |
|
|
f87783689b | |
|
|
28098f1555 | |
|
|
0cec111764 | |
|
|
54068209b3 | |
|
|
bdd66c56d3 | |
|
|
10111cc7f6 | |
|
|
02752f90ea | |
|
|
d9d4507bd4 | |
|
|
133f97efd8 | |
|
|
c9fc7d4bb4 | |
|
|
7f34578cea | |
|
|
7b827954e0 | |
|
|
3a3ae4eddb | |
|
|
aef78c3a10 | |
|
|
db13c8380b | |
|
|
7f2f69985c | |
|
|
6361217258 | |
|
|
7edbab35d8 | |
|
|
067eb918ad | |
|
|
c8ed977c9d | |
|
|
1ac760c55b | |
|
|
c2e038d244 | |
|
|
02fe3aa12e | |
|
|
f3a76caa64 | |
|
|
729532713f | |
|
|
2b1d6f4309 | |
|
|
6dd33e3317 | |
|
|
1114a9ab87 | |
|
|
4361df8f84 | |
|
|
1bc8df0a13 | |
|
|
1b93758b65 | |
|
|
8fa0677538 | |
|
|
074a01efc2 | |
|
|
227dedb41b | |
|
|
bcd48844b5 | |
|
|
f01008f430 | |
|
|
a41a67edf7 | |
|
|
6fc887839e | |
|
|
8c70a55488 | |
|
|
8a748d15e3 | |
|
|
bcfb3675a6 | |
|
|
e3b016e6f3 | |
|
|
a64474f43f | |
|
|
c2b59d0a74 | |
|
|
d6a820d2bb | |
|
|
ee50f4e8e2 | |
|
|
eead34b0d0 | |
|
|
29e3947577 | |
|
|
bb0116a198 | |
|
|
349c33fd27 | |
|
|
52c5042e37 | |
|
|
853b71998c | |
|
|
03d4d6cf65 | |
|
|
d02aed76a6 | |
|
|
97ec09dfc3 | |
|
|
0c2b9e5e8e | |
|
|
0134487f5e | |
|
|
f1328a84e9 | |
|
|
547d98599a | |
|
|
031d5d6485 | |
|
|
62c6c9df4e | |
|
|
6302389073 | |
|
|
83d5886a35 | |
|
|
350ed125d3 | |
|
|
7382089129 | |
|
|
2254f899b6 | |
|
|
d03295a977 | |
|
|
9f1eb9496a | |
|
|
d28f3056a7 | |
|
|
e2c65c6687 | |
|
|
e721b66488 | |
|
|
26a0c3ef87 | |
|
|
0bf79775b6 | |
|
|
c970932e96 | |
|
|
38c7bfccba | |
|
|
48674ee71f | |
|
|
6539979498 | |
|
|
3652dc339f | |
|
|
da700c8cfc | |
|
|
420cf2bdde | |
|
|
ce27d795db | |
|
|
f53dbe748e | |
|
|
3931457495 | |
|
|
d0137830c2 | |
|
|
48296a5de9 | |
|
|
6339393271 | |
|
|
2b59ad71fe | |
|
|
ff6dcd5cb0 | |
|
|
b26dac4dd5 | |
|
|
b6db99cbb8 | |
|
|
86e198310d | |
|
|
55c3b9c0ab | |
|
|
9eaef1da36 | |
|
|
de9d46297c | |
|
|
36c9658912 | |
|
|
afdd09d648 | |
|
|
c8e67d07c1 | |
|
|
63f0aacb7c | |
|
|
2c1abd666e | |
|
|
9834e204c4 | |
|
|
39c1b9e13c | |
|
|
6631b37d67 | |
|
|
95620bf584 | |
|
|
fcdd792722 | |
|
|
3de48a4f56 | |
|
|
17eca1f6e6 | |
|
|
3db5f13d8c | |
|
|
11bab0fb5e | |
|
|
ef45c6def2 | |
|
|
32e17004b6 | |
|
|
be29f069d6 | |
|
|
d5d38af356 | |
|
|
0abc39f7df | |
|
|
8f240afec1 | |
|
|
8c8120fb90 | |
|
|
54216c6580 | |
|
|
605f3a9da3 | |
|
|
3ad154b4f8 | |
|
|
af082ee2e0 | |
|
|
ba68e3d8f4 | |
|
|
48641b5d1a | |
|
|
fa82d8ed1c | |
|
|
81a16075bd | |
|
|
05080765cc | |
|
|
580af978f4 | |
|
|
d99d3684c4 | |
|
|
26a41d0c21 | |
|
|
435b250a84 | |
|
|
a31b60b1ab | |
|
|
cb8003c1df | |
|
|
973dd8978e | |
|
|
06c6f8408e | |
|
|
948bc90b58 | |
|
|
a7683caa71 | |
|
|
3f5c1f478a | |
|
|
f65ae16ea2 | |
|
|
e88f33ca05 | |
|
|
2a3046796b | |
|
|
89e9ad1284 | |
|
|
dbba6e0673 | |
|
|
1daac0e6d0 | |
|
|
f173c8d6b4 | |
|
|
5f3e1de01e | |
|
|
9a58715a2f | |
|
|
afaab7190b | |
|
|
c63f2404aa | |
|
|
ae31d29c75 | |
|
|
04fee963cc | |
|
|
f1ae3bb535 | |
|
|
f5ec34cdf9 | |
|
|
11890f31b1 | |
|
|
c1c0d4038f | |
|
|
2cf92f93a9 | |
|
|
89118e53de | |
|
|
1e8ea943ba | |
|
|
6ffcaf4a94 | |
|
|
cba28407cb | |
|
|
463d0af666 | |
|
|
3eb09d7fc5 | |
|
|
202289599d | |
|
|
3a1e188d58 | |
|
|
3d263bc7d4 | |
|
|
365a670c12 | |
|
|
660b94e99d | |
|
|
65393b0771 | |
|
|
45c3c489a0 | |
|
|
73a01d4c52 | |
|
|
218831ecb9 | |
|
|
e3bbd0dc2a | |
|
|
b340b5fc30 | |
|
|
fca11995cb | |
|
|
76b070f3de | |
|
|
5b2b7325fc | |
|
|
94ae566eb7 | |
|
|
a9c3770851 | |
|
|
4c31611f2f | |
|
|
e46a38f141 | |
|
|
c6a48bf424 | |
|
|
bf2c6d1bda | |
|
|
455888e0fa | |
|
|
0db81b71c6 | |
|
|
c1d67556c7 | |
|
|
e46eb765ff | |
|
|
82a829d0c4 | |
|
|
155452e223 | |
|
|
15a94f04da | |
|
|
813785ff82 | |
|
|
28e82eb237 | |
|
|
1268b58bbc | |
|
|
1434d3ad5c | |
|
|
28ae053e4b | |
|
|
cd71b45089 | |
|
|
1365d600a3 | |
|
|
7c13ae17fa | |
|
|
b888dc55e8 | |
|
|
ed2e1cdefb | |
|
|
505a90f8da | |
|
|
cac2e0b884 | |
|
|
df93b5bf4c | |
|
|
e277908118 | |
|
|
ea12008e10 | |
|
|
bcf3d42097 | |
|
|
0ffb08dd2a | |
|
|
75b7998185 | |
|
|
f45900b450 | |
|
|
96660cae16 | |
|
|
83a5847ff1 | |
|
|
51166fe1df | |
|
|
1375573a46 | |
|
|
239d5f7db6 | |
|
|
81150246e5 | |
|
|
39ac435218 | |
|
|
016799cbfa | |
|
|
719094edf7 | |
|
|
c343351072 | |
|
|
d79c74df25 | |
|
|
3488760ae5 | |
|
|
7c0dee3a63 | |
|
|
a5b2a97e6c | |
|
|
b57b26e1b5 | |
|
|
31834a366f | |
|
|
aea1b67862 | |
|
|
e28bf6496f | |
|
|
a78e778b36 | |
|
|
91902f0ffa | |
|
|
f747bdfa73 | |
|
|
e4cdc14cd0 | |
|
|
dc165930b4 | |
|
|
03f23a582d | |
|
|
1e92365c5e | |
|
|
a3e55145b8 | |
|
|
72a1466e9f | |
|
|
c612899612 | |
|
|
b86b201e6a | |
|
|
c59931cb80 | |
|
|
bfda524b4e | |
|
|
0bbb20a127 | |
|
|
54e57317be | |
|
|
c473060740 | |
|
|
4e8b1f5508 | |
|
|
82e59dbfda | |
|
|
fb81a2a5f7 | |
|
|
50c440f739 | |
|
|
9db02dc7ec | |
|
|
ae5eb61307 | |
|
|
080be4d845 | |
|
|
c738f482e9 | |
|
|
a550afbd25 | |
|
|
941baba5b4 | |
|
|
91c132fe08 | |
|
|
009212a04d | |
|
|
43626d9d69 | |
|
|
ec8365817f | |
|
|
bdef92da4f | |
|
|
16dee18c52 | |
|
|
d2de1424fb | |
|
|
daf6964f14 | |
|
|
cfc34e7cd4 | |
|
|
0d2f5e4ba3 | |
|
|
7de582fdb0 | |
|
|
1378eb80ba | |
|
|
fe59850c28 | |
|
|
558ebbaec7 | |
|
|
9e2504b056 | |
|
|
b4d5de96fc | |
|
|
0e181d9059 | |
|
|
25b550834a | |
|
|
b30a29897e | |
|
|
451b1a2294 | |
|
|
b23a4f6a3d | |
|
|
415abe2284 | |
|
|
7f5f2fd2b1 | |
|
|
49aa4e21ab | |
|
|
11a1aa6250 | |
|
|
a1eb6cbacf | |
|
|
343c933e15 | |
|
|
e8b6fd7641 | |
|
|
5d4596ed41 | |
|
|
0d542550a4 | |
|
|
ba67e55a0f | |
|
|
4cf6cf8ac2 | |
|
|
3eb67a32bb | |
|
|
fe48f7df94 | |
|
|
ca65324976 | |
|
|
d563c68b4c | |
|
|
d978d545ed | |
|
|
4f743287b6 | |
|
|
12eecf47f6 | |
|
|
7b8724244a | |
|
|
fcbad49771 | |
|
|
4b15e6693c | |
|
|
6db3672c50 | |
|
|
b56b231ad8 | |
|
|
eec89ccd90 | |
|
|
95ff4506d1 | |
|
|
4e5eff834a | |
|
|
4f03be737b | |
|
|
f799911058 | |
|
|
0dbd4c58d4 | |
|
|
ecb3e6e0ea | |
|
|
4ef03ddac2 | |
|
|
ed400246fd | |
|
|
efa636b7a7 | |
|
|
a3556a4004 | |
|
|
4dd312229f | |
|
|
36e0b46903 | |
|
|
b31aa7234e | |
|
|
f854ea31d8 | |
|
|
1f8e63ec3d | |
|
|
0e288cdc97 | |
|
|
6ed7bee526 | |
|
|
5a661a295c | |
|
|
9e29d8aa45 | |
|
|
a6de55bfca | |
|
|
fe5edd6e60 | |
|
|
71c1c34ddd | |
|
|
eff75ebeed | |
|
|
07daacd35f | |
|
|
7440f6df9b | |
|
|
d6802b77d7 | |
|
|
3462a48081 | |
|
|
c5acae327b | |
|
|
73663ef5c7 | |
|
|
003ba392c0 | |
|
|
b28d793d72 | |
|
|
1c6485fda6 | |
|
|
649562ca37 | |
|
|
17e43c1271 | |
|
|
c1a772d7f1 | |
|
|
72e1511dc4 | |
|
|
3278027281 | |
|
|
ad5e7f8479 | |
|
|
3f124d3596 | |
|
|
24eb6cf21a | |
|
|
52bd26f03e | |
|
|
75afbe16c9 | |
|
|
6af2aa092b | |
|
|
95d38a1392 | |
|
|
dde335696a | |
|
|
ef83c404ff | |
|
|
445d20dcad | |
|
|
e732ba37be | |
|
|
e118d7d171 | |
|
|
b414bafc94 | |
|
|
8e23bd661f | |
|
|
c8d70fb343 | |
|
|
21f0fd0eb4 | |
|
|
5f31106ac1 | |
|
|
6e466c7d14 | |
|
|
1be8d528ed | |
|
|
1e7e0c056b | |
|
|
ebd8f766b0 | |
|
|
270ff52363 | |
|
|
f933d9f1ef | |
|
|
c69a5a9307 | |
|
|
b747c87796 | |
|
|
f77e039f21 | |
|
|
1901fcad05 | |
|
|
2ef24c7b2d | |
|
|
1c93368561 | |
|
|
55258748ff | |
|
|
133b97bcaf | |
|
|
840670ea77 | |
|
|
5e1a08af79 | |
|
|
4531aac37f | |
|
|
829ae981b5 | |
|
|
8d1039d4ac | |
|
|
2cbf7a7fba | |
|
|
0f10ffc245 | |
|
|
f9250c9985 | |
|
|
bdccb0b196 | |
|
|
7218a22002 | |
|
|
1feb1ec6f8 | |
|
|
4b21d0a18f | |
|
|
bead0ae13d | |
|
|
1c7a824821 | |
|
|
48543cab8f | |
|
|
01b4ca1cf5 | |
|
|
de90b4fd54 | |
|
|
a91b187069 | |
|
|
eeb7db8e82 | |
|
|
d22f3e16fe | |
|
|
7cc4e86639 | |
|
|
3cdededa78 | |
|
|
3016717208 | |
|
|
9fd1efce21 | |
|
|
4db6aaeb3d | |
|
|
d4202339d9 | |
|
|
551ec80be6 | |
|
|
4c9685f0bf | |
|
|
90ebe27f7e | |
|
|
0907700843 | |
|
|
ca2b7a9907 | |
|
|
c1beee40a2 | |
|
|
acf54a508e | |
|
|
50aa49a497 | |
|
|
17553fac8f | |
|
|
060457c2ae | |
|
|
bf54140b87 | |
|
|
18d6beebe1 | |
|
|
bc1211a672 | |
|
|
9cd51fc060 | |
|
|
041a9852a9 | |
|
|
aa8f3abab3 | |
|
|
96aa6987ab | |
|
|
f29af964ef | |
|
|
aee1ea6acd | |
|
|
6f93c1bad9 | |
|
|
20d08c0cb6 | |
|
|
4d7300ab96 | |
|
|
0b62a9f785 | |
|
|
cb22a0c56a | |
|
|
fcbcbbfb4d | |
|
|
c5954c9d99 | |
|
|
ad0be97653 | |
|
|
6ccd4430e9 | |
|
|
b06b0d5c7c | |
|
|
3a96cfd0cc | |
|
|
584fbba311 | |
|
|
fc4dc38028 | |
|
|
aa428b51c9 | |
|
|
3ba5946974 | |
|
|
b7cdf66eb0 | |
|
|
7cfc0c7aa6 | |
|
|
91fa4bf200 | |
|
|
a6b14d75bb | |
|
|
ec0baca9f7 | |
|
|
e7c2c219c5 | |
|
|
84c54a7b9a | |
|
|
f2c7e4724a | |
|
|
91a052d11a | |
|
|
002954e58a | |
|
|
df3d96bd33 | |
|
|
079f926eb1 | |
|
|
c70eb857ba | |
|
|
979d040f7b | |
|
|
8e8773d1c2 | |
|
|
b206938f95 | |
|
|
1aa8d221f1 | |
|
|
e14e49a2fd | |
|
|
f9bbcea9e1 | |
|
|
c32d363897 | |
|
|
6a265be9d5 | |
|
|
c00383f0b0 | |
|
|
bafe0e2438 | |
|
|
7e28116252 | |
|
|
e1dcfc38c5 | |
|
|
1345bc24d5 | |
|
|
0c6c488627 | |
|
|
4a4cb135da | |
|
|
233a47e971 | |
|
|
c93df694d9 | |
|
|
c536fcde77 | |
|
|
7eb488ba77 | |
|
|
d2e2b8fb17 | |
|
|
296b2ece60 | |
|
|
e4bc144f31 | |
|
|
3ad94bc095 | |
|
|
d5f8418387 | |
|
|
5090cd4493 | |
|
|
e907519c4a | |
|
|
d264155fc2 | |
|
|
728f86fa5e | |
|
|
2c9beccea5 | |
|
|
0b818e99fa | |
|
|
372380bdb9 | |
|
|
c711a63322 | |
|
|
bfdc27dc2c | |
|
|
7e3948b72e | |
|
|
7a2ee52362 | |
|
|
f1054c5eea | |
|
|
1588375624 | |
|
|
c0270056b7 | |
|
|
dd93371dc4 | |
|
|
5274339774 | |
|
|
4c3e8f9448 | |
|
|
825b9879c8 | |
|
|
3b67eb1c79 | |
|
|
c372d35f2c | |
|
|
acb206ef78 | |
|
|
bd35c77437 | |
|
|
b77d1b36b3 | |
|
|
797b0d06b1 | |
|
|
6124da2e59 | |
|
|
f730bf3aa2 | |
|
|
b33cd3fd2b | |
|
|
8fb49d99b1 | |
|
|
1624e66f48 | |
|
|
b4402bfc53 | |
|
|
ef602ac59e | |
|
|
c8a592b5b7 | |
|
|
ae31259709 | |
|
|
d457fad293 | |
|
|
790bd5bfad | |
|
|
233f5a68df | |
|
|
3ec94d32f0 | |
|
|
bce9fe3621 | |
|
|
d92c18784e | |
|
|
754898854f | |
|
|
c8cb4d05b3 | |
|
|
7e1b7e34db | |
|
|
df5ecca044 | |
|
|
287df49af2 | |
|
|
18e386a5dd | |
|
|
bc201df05b | |
|
|
ec0d5695a9 | |
|
|
4bb39232fe | |
|
|
5faad4b13c | |
|
|
80f330d866 | |
|
|
ebf5431592 | |
|
|
85b786c832 | |
|
|
86082963b3 | |
|
|
236d2f80e3 | |
|
|
9da81638b9 | |
|
|
dbb791fa58 | |
|
|
7439ec1625 | |
|
|
e09530693f | |
|
|
1a4eeaee01 | |
|
|
e14934a197 | |
|
|
8276ddd184 | |
|
|
c828f21753 | |
|
|
61edf4daf5 | |
|
|
b491cbe42b | |
|
|
b6865d8cff | |
|
|
0ed44f2c13 | |
|
|
f3d9e3feee | |
|
|
499e46cf44 | |
|
|
695559c72a | |
|
|
01e007deaa | |
|
|
b6fc1596a9 | |
|
|
1980569c90 | |
|
|
96ed18e503 | |
|
|
de8341b5b5 | |
|
|
c6e7281e1b | |
|
|
077d5fee5b | |
|
|
0e9e74fa8c | |
|
|
cf56203c09 | |
|
|
a20362d68e | |
|
|
faf4d3cbf6 | |
|
|
183772cf3e | |
|
|
890b5d5dd2 | |
|
|
d9725d623f | |
|
|
53d5a0f1a6 | |
|
|
d0b9ea69b6 | |
|
|
577605f772 | |
|
|
2134174758 | |
|
|
8258101d35 | |
|
|
af808c48e8 | |
|
|
cb53393f83 | |
|
|
4345e9877b | |
|
|
ce0e3c7945 | |
|
|
2061d1b42c | |
|
|
55d42d358d | |
|
|
9e945f1bb7 | |
|
|
21d17c2d44 | |
|
|
fb25a6f4f4 | |
|
|
16c5c71cdc | |
|
|
86c07a3fb4 | |
|
|
3fdc5402be | |
|
|
40299a633e | |
|
|
feefcd417d | |
|
|
e1e4e8bda9 | |
|
|
734632faa2 | |
|
|
8d1a5ca189 | |
|
|
a7d5b1e869 | |
|
|
fa57d5a5ab | |
|
|
2ec5c8d251 | |
|
|
a36c2bf87a | |
|
|
ddd7e5ebe4 | |
|
|
494b0a01c5 | |
|
|
c36ad5d4ff | |
|
|
7ef4b6642b | |
|
|
77e3c4968d | |
|
|
57868c70f5 | |
|
|
8cf98e59e6 | |
|
|
c5fc63b53a | |
|
|
3f26fb85f6 | |
|
|
07656fd7ff | |
|
|
9fe0c812a0 | |
|
|
318a61da6c | |
|
|
1910004d21 | |
|
|
0c635af10d | |
|
|
b59f9a3957 | |
|
|
279a27f60f | |
|
|
0370c91567 | |
|
|
da54624d5a | |
|
|
28fb7bff62 | |
|
|
10543581ed | |
|
|
172dda97de | |
|
|
82c2ade01f | |
|
|
1fda541350 | |
|
|
34520ca45b | |
|
|
e1cd3ded23 | |
|
|
ff9339b74f | |
|
|
7a57263b81 | |
|
|
42b87acb55 | |
|
|
f980608724 | |
|
|
a3341b196e | |
|
|
5791a19017 | |
|
|
ffb2af1b66 | |
|
|
170dda4eac | |
|
|
aaf660c1c1 | |
|
|
e763c9b4f1 | |
|
|
4ad93e629d | |
|
|
776a2356b2 | |
|
|
0e83631b97 | |
|
|
7d1b9a3bf3 | |
|
|
6ea8244906 | |
|
|
f92150a4f6 | |
|
|
037c0d2cf9 | |
|
|
530f4e37b0 | |
|
|
c60b4bf2eb | |
|
|
76d8cbe251 | |
|
|
af156665a4 | |
|
|
773ebd9920 | |
|
|
64e8cf4221 | |
|
|
cd70a8091f | |
|
|
15d993a2cc | |
|
|
efd79b0bd8 | |
|
|
a9e3820947 | |
|
|
27116443b7 | |
|
|
b537f454c1 | |
|
|
114435e033 | |
|
|
eebab00720 | |
|
|
e2b53594ec | |
|
|
0eaa3727a1 | |
|
|
0f641cb9eb | |
|
|
2495677d7b | |
|
|
dc5c182ee8 | |
|
|
7ac7171a3f | |
|
|
d0629ea128 | |
|
|
6bfccdf87f | |
|
|
08c31b810f | |
|
|
ce3f740a2f | |
|
|
e6e6b16aad | |
|
|
0d908034ab | |
|
|
bcd7b3d9c6 | |
|
|
30a31eda81 | |
|
|
e1dd979b86 | |
|
|
799dcab034 | |
|
|
3352f095b6 | |
|
|
cd5877daf0 | |
|
|
d538b2dd13 | |
|
|
f12de6619b | |
|
|
ce0fc37952 | |
|
|
1f5deb3f83 | |
|
|
ac8cd748f3 | |
|
|
ccf837eb9f | |
|
|
23f4c55147 | |
|
|
6095eadd30 | |
|
|
5a3ce6e8aa | |
|
|
72f142d2ac | |
|
|
1f505dda60 | |
|
|
a3b8ca83d4 | |
|
|
63c7cfcfe8 | |
|
|
6ee3683172 | |
|
|
8767de51f2 | |
|
|
ac7ab9ea84 | |
|
|
49d15b20da | |
|
|
a6956bf7ee | |
|
|
a2c609ca6f | |
|
|
ffba4ca6f4 | |
|
|
5b091f413b | |
|
|
34da61647b | |
|
|
ff1cde4ffb | |
|
|
0e40ec657e | |
|
|
47da2a6967 | |
|
|
6479a6c38d | |
|
|
604d805828 | |
|
|
68104b7d0f | |
|
|
2d0dcb18e1 | |
|
|
b2b6879dd5 | |
|
|
039dd00c96 | |
|
|
4f692fa185 | |
|
|
5732a52fbc | |
|
|
88a804b57b | |
|
|
d343131487 | |
|
|
0bbbd8fce2 | |
|
|
9e1d977a26 | |
|
|
9ad511ad05 | |
|
|
31abc57c2a | |
|
|
04a1770ebd | |
|
|
44ae3e5f0b | |
|
|
73fd34e588 | |
|
|
e02d95083b | |
|
|
a8608f17d6 | |
|
|
7d44a2f554 | |
|
|
d67d4e3d0e | |
|
|
e1f7ec252f | |
|
|
c2cb7cc788 | |
|
|
ddb7cfabc7 | |
|
|
ea11ee9243 | |
|
|
9cf60be628 | |
|
|
5f3350e62f | |
|
|
315678b5bd | |
|
|
d39d7c7dfa | |
|
|
cac964df3c | |
|
|
06ab6144b4 | |
|
|
a1c0be479f | |
|
|
dc8707ad33 | |
|
|
eed2ec954a | |
|
|
4afe46a2cb | |
|
|
119add783e | |
|
|
13606da667 | |
|
|
db9785e37f | |
|
|
7f2454154f | |
|
|
8b8c61cc7c | |
|
|
25b87a08ae | |
|
|
0cdf2d62e7 | |
|
|
252f593bcc | |
|
|
4eb5f540c1 | |
|
|
77e9eb3306 | |
|
|
a1b07690e4 | |
|
|
e57eeb8089 | |
|
|
f6279baacd | |
|
|
adfb642539 | |
|
|
702b747d9d | |
|
|
b2a2a96292 | |
|
|
65abadfe00 | |
|
|
2af34b3069 | |
|
|
f8fe7e2d64 | |
|
|
10cc1dbe82 | |
|
|
56d7801afb | |
|
|
6e485a2bad | |
|
|
f27c39c74a | |
|
|
612615bc79 | |
|
|
3a860dd4c2 | |
|
|
e2d3179c43 | |
|
|
cbd166bf0b | |
|
|
3ede32a359 | |
|
|
7ab8a39846 | |
|
|
3f97874c63 | |
|
|
2e1abd3986 | |
|
|
dec419f443 | |
|
|
24c8725359 | |
|
|
42af55b317 | |
|
|
7fee42f940 | |
|
|
4bcbc12cea | |
|
|
400013bb4a | |
|
|
61480109d6 | |
|
|
ccda282bbf | |
|
|
fa7fc5bdcd | |
|
|
75fdc8f46e | |
|
|
10c98f6fda | |
|
|
7d3904e89f | |
|
|
a1cb3630b8 | |
|
|
01823df917 | |
|
|
b9843a1d8c | |
|
|
36755ba4be | |
|
|
a3895e49b6 | |
|
|
e9ae9ff61b | |
|
|
1fa173edbc | |
|
|
6dc16e92ea | |
|
|
2a5251ca2d | |
|
|
538013d192 | |
|
|
46054afd22 | |
|
|
adfa85e8ab | |
|
|
7598fbed54 | |
|
|
1e278fa2cb | |
|
|
92de3be0a1 | |
|
|
9432d9361e | |
|
|
76478959cc | |
|
|
37457ed892 | |
|
|
2493a1929f | |
|
|
16d56109c8 | |
|
|
962ea850ed | |
|
|
74a8b0bf34 | |
|
|
73ff388400 | |
|
|
d9fc2ca231 | |
|
|
504cf0613f | |
|
|
fa6d46c0c1 | |
|
|
c9525b8a5a | |
|
|
8e4b9d9215 | |
|
|
6fa969adf4 | |
|
|
fbca700562 | |
|
|
c0aa754ebc | |
|
|
fcbee3518c | |
|
|
13079a606b | |
|
|
feac10a84d | |
|
|
916aabcfd9 | |
|
|
9c09d6b4a4 | |
|
|
7f049669fb | |
|
|
0003768bb8 | |
|
|
a37010929d | |
|
|
ddfcf46dee | |
|
|
69290ee405 | |
|
|
e40aa05e8a | |
|
|
f5c2d8ce36 | |
|
|
516c99e496 | |
|
|
1fef2594d2 | |
|
|
c5f06b3847 | |
|
|
16e5bb2023 | |
|
|
69f4a5fe24 | |
|
|
0804d06c0b | |
|
|
b03ea17a5f | |
|
|
6910e61bde | |
|
|
a6fdc098b9 | |
|
|
313612333c | |
|
|
cad29145f1 | |
|
|
4dba2f13ad | |
|
|
c171d7604e | |
|
|
658e318fd7 | |
|
|
76cd7e63e2 | |
|
|
020fe7a0b2 | |
|
|
c96c778883 | |
|
|
4dd732b4d1 | |
|
|
a7402b1e94 | |
|
|
7c45563991 | |
|
|
99ba0d0a84 | |
|
|
5ef7238298 | |
|
|
1b199ada75 | |
|
|
e03632459b | |
|
|
98e8e32457 | |
|
|
81a529dbad | |
|
|
52a129a3e8 | |
|
|
aacc12df45 | |
|
|
2b30c9986f | |
|
|
fbd0eee5c4 | |
|
|
6059b9ab42 | |
|
|
e38e2ce831 | |
|
|
d10b4bdc71 | |
|
|
80d07615f4 | |
|
|
81f6ec03b4 | |
|
|
1153d18a37 | |
|
|
0950e407a7 | |
|
|
5ed876423f | |
|
|
9d76bfeb3e | |
|
|
881017e63b | |
|
|
6b036ec0ac | |
|
|
e086625f1a | |
|
|
bfdf899615 | |
|
|
e1e3ca9c8a | |
|
|
413df02728 | |
|
|
be83a0f735 | |
|
|
166e6df373 | |
|
|
c86f01b7a1 | |
|
|
363a66c263 | |
|
|
f603e8412c | |
|
|
6f7a09686c | |
|
|
18bade9edf | |
|
|
cc9054d082 | |
|
|
ca41d09845 | |
|
|
f8aa98bac7 | |
|
|
90f4934c62 | |
|
|
fd99c8008d | |
|
|
6af2340c5c | |
|
|
46abd4b4c9 | |
|
|
2801add7e2 | |
|
|
9b853d857b | |
|
|
99e65079a0 | |
|
|
0e1d462c69 | |
|
|
f4c7ca01fe | |
|
|
60591630df | |
|
|
48103f167e | |
|
|
154ae8e610 | |
|
|
1826f07fb3 | |
|
|
86c2cd1d4a | |
|
|
452fd6497e | |
|
|
ccfd8f0aa9 | |
|
|
d91bfa2f8b | |
|
|
afa1da59d1 | |
|
|
582ca07716 | |
|
|
036eb976e9 | |
|
|
2c5a1150bd | |
|
|
f6066e5d46 | |
|
|
cff2e9fc4a | |
|
|
e5d5351d31 | |
|
|
be89ee0025 | |
|
|
f4cd350221 | |
|
|
3928007169 | |
|
|
eebd769c46 | |
|
|
2ee3c86e2b | |
|
|
f5ecbf7a1f | |
|
|
267e7e2ff0 | |
|
|
1e2e36af23 | |
|
|
c153e71aa3 | |
|
|
f9915d93e8 | |
|
|
69c3a948ba | |
|
|
8c520e1d94 | |
|
|
1edaed52de | |
|
|
752bd40a04 | |
|
|
fce3aac34e | |
|
|
9c482196f3 | |
|
|
3beb08b66e | |
|
|
0874e13f1d | |
|
|
8b4ef8c235 | |
|
|
993ef0107a | |
|
|
0bdda36143 | |
|
|
7cffdcbff7 | |
|
|
986c865718 | |
|
|
0227d221da | |
|
|
3f39522487 | |
|
|
78b4518547 | |
|
|
ea4ce83d83 | |
|
|
051006e12f | |
|
|
4862264a2a | |
|
|
0791c7e9da | |
|
|
12dafcf856 | |
|
|
4b071403da | |
|
|
a6b7de8a4b | |
|
|
e371c8f39d | |
|
|
810b0ec488 | |
|
|
f224cab225 | |
|
|
9b0d0a7ff0 | |
|
|
1832655793 | |
|
|
af06652fa1 | |
|
|
bf3bb6a7e8 | |
|
|
8d3b3691e5 | |
|
|
13e2f73738 | |
|
|
6077bb4a55 | |
|
|
5ad9e89658 | |
|
|
65f84fd1e9 | |
|
|
b2e5cb58c4 | |
|
|
4a60e826b5 | |
|
|
d0de547e41 | |
|
|
d00be34255 | |
|
|
6410ccab9b | |
|
|
350318fb6e | |
|
|
5a78e72419 | |
|
|
2379ec6b55 | |
|
|
a55970af83 | |
|
|
273a405a10 | |
|
|
c187c14b5f | |
|
|
b1b8ea6966 | |
|
|
ad604c1dc5 | |
|
|
a06737c177 | |
|
|
a129c1b337 | |
|
|
e5e5cf4c01 | |
|
|
092ecf5cf8 | |
|
|
4b48304324 | |
|
|
79d9aa742b | |
|
|
8d6fabc510 | |
|
|
23cd99d11e | |
|
|
6d2ecf5cf0 | |
|
|
c61d10bec7 | |
|
|
60d6be1718 | |
|
|
9ab3199e13 | |
|
|
f6ddc5cf49 | |
|
|
c5ea3d292c | |
|
|
e07bacf9a3 | |
|
|
6743eea32d | |
|
|
53621f413b | |
|
|
f0fc27f952 | |
|
|
ba88263b85 | |
|
|
d2f1fa10d5 | |
|
|
15b0a9bbab |
|
|
@ -4,7 +4,6 @@ include =
|
|||
*glances*
|
||||
|
||||
omit =
|
||||
setup.py
|
||||
glances/outputs/*
|
||||
glances/exports/*
|
||||
glances/compat.py
|
||||
|
|
|
|||
|
|
@ -8,13 +8,15 @@
|
|||
!/glances/outputs/static
|
||||
|
||||
# Include Requirements files
|
||||
!/requirements.txt
|
||||
!/all-requirements.txt
|
||||
!/docker-requirements.txt
|
||||
!/webui-requirements.txt
|
||||
!/optional-requirements.txt
|
||||
|
||||
# Include Config file
|
||||
!/docker-compose/glances.conf
|
||||
!/docker-files/docker-logger.json
|
||||
|
||||
# Include Binary file
|
||||
!/docker-bin.sh
|
||||
|
||||
# Include TOML file
|
||||
!/pyproject.toml
|
||||
|
|
|
|||
|
|
@ -6,6 +6,9 @@ labels: ''
|
|||
assignees: ''
|
||||
|
||||
---
|
||||
**Check the bug**
|
||||
Before filling this bug report, please search if a similar issue already exists.
|
||||
In this case, just add a comment on this existing issue.
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
|
@ -26,11 +29,7 @@ If applicable, add screenshots to help explain your problem.
|
|||
- Operating System (lsb_release -a or OS name/version): `To be completed with result of: lsb_release -a`
|
||||
- Glances & psutil versions: `To be completed with result of: glances -V`
|
||||
- How do you install Glances (Pypi package, script, package manager, source): `To be completed`
|
||||
- Glances test (only available with Glances 3.1.7 or higher):
|
||||
|
||||
```
|
||||
To be completed with result of: glances --issue
|
||||
```
|
||||
- Glances test: ` To be completed with result of: glances --issue`
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
||||
|
|
|
|||
|
|
@ -1,170 +1,82 @@
|
|||
# This pipeline aims at building Glances for the following targets:
|
||||
# - Pypi
|
||||
# - Docker Hub
|
||||
# This pipeline aims at building Glances Pypi packages
|
||||
|
||||
name: build
|
||||
|
||||
env:
|
||||
DEFAULT_DOCKER_IMAGE: nicolargo/glances
|
||||
NODE_ENV: ${{ (contains('refs/heads/master', github.ref) || startsWith(github.ref, 'refs/tags/v')) && 'prod' || 'dev' }}
|
||||
PUSH_BRANCH: ${{ 'refs/heads/develop' == github.ref || 'refs/heads/master' == github.ref || startsWith(github.ref, 'refs/tags/v') }}
|
||||
# Alpine image platform: https://hub.docker.com/_/alpine
|
||||
# linux/arm/v6,linux/arm/v7 do not work (timeout during the build)
|
||||
DOCKER_PLATFORMS: linux/amd64,linux/arm64/v8
|
||||
# Ubuntu image platforms list: https://hub.docker.com/_/ubuntu
|
||||
# linux/arm/v7 do not work (Cargo/Rust not available)
|
||||
DOCKER_PLATFORMS_UBUNTU: linux/amd64,linux/arm64/v8
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
secrets:
|
||||
TEST_PYPI_API_TOKEN:
|
||||
description: 'Test PyPI API token'
|
||||
required: true
|
||||
PYPI_API_TOKEN:
|
||||
description: 'PyPI API token'
|
||||
required: true
|
||||
DOCKER_USERNAME:
|
||||
description: 'Docker Hub username'
|
||||
required: true
|
||||
DOCKER_TOKEN:
|
||||
description: 'Docker Hub token'
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
|
||||
pypi:
|
||||
build:
|
||||
name: Build distribution 📦
|
||||
if: github.event_name == 'push'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Upgrade pip
|
||||
- uses: actions/checkout@v5
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: "3.13"
|
||||
- name: Install pypa/build
|
||||
run: >-
|
||||
python -m
|
||||
pip install
|
||||
--upgrade
|
||||
pip
|
||||
|
||||
- name: Install build tools
|
||||
run: >-
|
||||
python -m
|
||||
python3 -m
|
||||
pip install
|
||||
build
|
||||
--user
|
||||
|
||||
- name: Build a binary wheel and a source tarball
|
||||
run: >-
|
||||
python -m
|
||||
build
|
||||
--sdist
|
||||
--wheel
|
||||
--outdir dist/
|
||||
run: python3 -m build
|
||||
- name: Store the distribution packages
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: python-package-distributions
|
||||
path: dist/
|
||||
|
||||
- name: Publish distribution package to Test PyPI
|
||||
pypi:
|
||||
name: Publish Python 🐍 distribution 📦 to PyPI
|
||||
if: startsWith(github.ref, 'refs/tags')
|
||||
needs:
|
||||
- build
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: pypi
|
||||
url: https://pypi.org/p/glances
|
||||
permissions:
|
||||
attestations: write
|
||||
id-token: write
|
||||
steps:
|
||||
- name: Download all the dists
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
name: python-package-distributions
|
||||
path: dist/
|
||||
- name: Publish distribution 📦 to PyPI
|
||||
uses: pypa/gh-action-pypi-publish@release/v1
|
||||
with:
|
||||
skip-existing: true
|
||||
attestations: false
|
||||
print-hash: true
|
||||
|
||||
pypi_test:
|
||||
name: Publish Python 🐍 distribution 📦 to TestPyPI
|
||||
if: github.ref == 'refs/heads/develop'
|
||||
needs:
|
||||
- build
|
||||
runs-on: ubuntu-latest
|
||||
environment:
|
||||
name: testpypi
|
||||
url: https://pypi.org/p/glances
|
||||
permissions:
|
||||
attestations: write
|
||||
id-token: write
|
||||
steps:
|
||||
- name: Download all the dists
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
name: python-package-distributions
|
||||
path: dist/
|
||||
- name: Publish distribution 📦 to TestPyPI
|
||||
uses: pypa/gh-action-pypi-publish@release/v1
|
||||
with:
|
||||
user: __token__
|
||||
password: ${{ secrets.TEST_PYPI_API_TOKEN }}
|
||||
repository-url: https://test.pypi.org/legacy/
|
||||
skip-existing: true
|
||||
|
||||
- name: Publish distribution package to PyPI
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags')
|
||||
uses: pypa/gh-action-pypi-publish@release/v1
|
||||
with:
|
||||
user: __token__
|
||||
password: ${{ secrets.PYPI_API_TOKEN }}
|
||||
|
||||
create_Docker_builds:
|
||||
runs-on: ubuntu-latest
|
||||
# Make sure we release the python package first. So we are sure to get the latest.
|
||||
needs:
|
||||
- pypi
|
||||
outputs:
|
||||
tags: ${{ steps.config.outputs.tags }}
|
||||
steps:
|
||||
- name: Determine image tags
|
||||
id: config
|
||||
shell: bash
|
||||
run: |
|
||||
TAG_ARRAY='['
|
||||
|
||||
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||
VERSION=${GITHUB_REF#refs/tags/v}
|
||||
TAG_ARRAY="$TAG_ARRAY { \"target\": \"minimal\", \"tag\": \"${VERSION}\" },"
|
||||
TAG_ARRAY="$TAG_ARRAY { \"target\": \"full\", \"tag\": \"${VERSION}-full\" },"
|
||||
|
||||
elif [[ $GITHUB_REF == refs/heads/develop ]]; then
|
||||
TAG_ARRAY="$TAG_ARRAY { \"target\": \"dev\", \"tag\": \"dev\" },"
|
||||
|
||||
else
|
||||
TAG_ARRAY="$TAG_ARRAY { \"target\": \"minimal\", \"tag\": \"latest\" },"
|
||||
TAG_ARRAY="$TAG_ARRAY { \"target\": \"full\", \"tag\": \"latest-full\" },"
|
||||
fi
|
||||
|
||||
TAG_ARRAY="${TAG_ARRAY::-1} ]"
|
||||
|
||||
echo "Tags to build: $TAG_ARRAY"
|
||||
echo "tags=$TAG_ARRAY" >> $GITHUB_OUTPUT
|
||||
|
||||
build_Docker_image:
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- create_Docker_builds
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: ['alpine', 'ubuntu']
|
||||
tag: ${{ fromJson(needs.create_Docker_builds.outputs.tags) }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Retrieve Repository Docker metadata
|
||||
id: docker_meta
|
||||
uses: crazy-max/ghaction-docker-meta@v5.0.0
|
||||
with:
|
||||
images: ${{ env.DEFAULT_DOCKER_IMAGE }}
|
||||
labels: |
|
||||
org.opencontainers.image.url=https://nicolargo.github.io/glances/
|
||||
|
||||
- name: Cache Docker layers
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: /tmp/.buildx-cache
|
||||
key: ${{ runner.os }}-buildx-${{ env.NODE_ENV }}-${{ matrix.os }}-${{ matrix.tag.tag }}
|
||||
restore-keys: ${{ runner.os }}-buildx-${{ env.NODE_ENV }}-${{ matrix.os }}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
with:
|
||||
platforms: all
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
version: latest
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@v3
|
||||
if: ${{ env.PUSH_BRANCH == 'true' }}
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_TOKEN }}
|
||||
|
||||
- name: Build and push image
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
push: ${{ env.PUSH_BRANCH == 'true' }}
|
||||
tags: "${{ env.DEFAULT_DOCKER_IMAGE }}:${{ matrix.os != 'alpine' && format('{0}-', matrix.os) || '' }}${{ matrix.tag.tag }}"
|
||||
build-args: |
|
||||
CHANGING_ARG=${{ github.sha }}
|
||||
context: .
|
||||
file: "docker-files/${{ matrix.os }}.Dockerfile"
|
||||
platforms: ${{ matrix.os != 'ubuntu' && env.DOCKER_PLATFORMS || env.DOCKER_PLATFORMS_UBUNTU }}
|
||||
target: ${{ matrix.tag.target }}
|
||||
labels: ${{ steps.docker_meta.outputs.labels }}
|
||||
cache-from: type=local,src=/tmp/.buildx-cache
|
||||
cache-to: type=local,dest=/tmp/.buildx-cache,mode=max
|
||||
attestations: false
|
||||
|
|
|
|||
|
|
@ -0,0 +1,105 @@
|
|||
# This pipeline aims at building Glances Docker images
|
||||
|
||||
name: build_docker
|
||||
|
||||
env:
|
||||
DEFAULT_DOCKER_IMAGE: nicolargo/glances
|
||||
PUSH_BRANCH: ${{ 'refs/heads/develop' == github.ref || startsWith(github.ref, 'refs/tags/v') }}
|
||||
# Alpine image platform: https://hub.docker.com/_/alpine
|
||||
# linux/arm/v6,linux/arm/v7 do not work (timeout during the build)
|
||||
DOCKER_PLATFORMS: linux/amd64,linux/arm64/v8
|
||||
# Ubuntu image platforms list: https://hub.docker.com/_/ubuntu
|
||||
# linux/arm/v7 do not work (Cargo/Rust not available)
|
||||
DOCKER_PLATFORMS_UBUNTU: linux/amd64,linux/arm64/v8
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
secrets:
|
||||
DOCKER_USERNAME:
|
||||
description: 'Docker Hub username'
|
||||
required: true
|
||||
DOCKER_TOKEN:
|
||||
description: 'Docker Hub token'
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
|
||||
create_docker_images_list:
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
tags: ${{ steps.config.outputs.tags }}
|
||||
steps:
|
||||
- name: Determine image tags
|
||||
id: config
|
||||
shell: bash
|
||||
run: |
|
||||
if [[ $GITHUB_REF == refs/tags/* ]]; then
|
||||
VERSION=${GITHUB_REF#refs/tags/v}
|
||||
TAG_ARRAY="[{ \"target\": \"minimal\", \"tag\": \"${VERSION}\" },"
|
||||
TAG_ARRAY="$TAG_ARRAY { \"target\": \"minimal\", \"tag\": \"latest\" },"
|
||||
TAG_ARRAY="$TAG_ARRAY { \"target\": \"full\", \"tag\": \"${VERSION}-full\" },"
|
||||
TAG_ARRAY="$TAG_ARRAY { \"target\": \"full\", \"tag\": \"latest-full\" }]"
|
||||
elif [[ $GITHUB_REF == refs/heads/develop ]]; then
|
||||
TAG_ARRAY="[{ \"target\": \"dev\", \"tag\": \"dev\" }]"
|
||||
else
|
||||
TAG_ARRAY="[]"
|
||||
fi
|
||||
|
||||
echo "Tags to build: $TAG_ARRAY"
|
||||
echo "tags=$TAG_ARRAY" >> $GITHUB_OUTPUT
|
||||
|
||||
build_docker_images:
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- create_docker_images_list
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
os: ['alpine', 'ubuntu']
|
||||
tag: ${{ fromJson(needs.create_docker_images_list.outputs.tags) }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Retrieve Repository Docker metadata
|
||||
id: docker_meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: ${{ env.DEFAULT_DOCKER_IMAGE }}
|
||||
labels: |
|
||||
org.opencontainers.image.url=https://nicolargo.github.io/glances/
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
with:
|
||||
platforms: all
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
with:
|
||||
version: latest
|
||||
|
||||
- name: Login to DockerHub
|
||||
uses: docker/login-action@v3
|
||||
if: ${{ env.PUSH_BRANCH == 'true' }}
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_TOKEN }}
|
||||
|
||||
- name: Build and push image
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
push: ${{ env.PUSH_BRANCH == 'true' }}
|
||||
tags: "${{ env.DEFAULT_DOCKER_IMAGE }}:${{ matrix.os != 'alpine' && format('{0}-', matrix.os) || '' }}${{ matrix.tag.tag }}"
|
||||
build-args: |
|
||||
CHANGING_ARG=${{ github.sha }}
|
||||
context: .
|
||||
file: "docker-files/${{ matrix.os }}.Dockerfile"
|
||||
platforms: ${{ matrix.os != 'ubuntu' && env.DOCKER_PLATFORMS || env.DOCKER_PLATFORMS_UBUNTU }}
|
||||
target: ${{ matrix.tag.target }}
|
||||
labels: ${{ steps.docker_meta.outputs.labels }}
|
||||
# GHA default behaviour overwrites last build cache. Causes alpine and ubuntu cache to overwrite each other.
|
||||
# Use `scope` with the os name to prevent that
|
||||
cache-from: 'type=gha,scope=${{ matrix.os }}'
|
||||
cache-to: 'type=gha,mode=max,scope=${{ matrix.os }}'
|
||||
|
|
@ -17,9 +17,11 @@ jobs:
|
|||
build:
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: ./.github/workflows/build.yml
|
||||
needs: [quality, test]
|
||||
build_docker:
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: ./.github/workflows/build_docker.yml
|
||||
secrets:
|
||||
TEST_PYPI_API_TOKEN: ${{ secrets.TEST_PYPI_API_TOKEN }}
|
||||
PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
|
||||
DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
|
||||
DOCKER_TOKEN: ${{ secrets.DOCKER_TOKEN }}
|
||||
needs: [quality, test]
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Run Trivy vulnerability scanner in repo mode
|
||||
uses: aquasecurity/trivy-action@master
|
||||
|
|
|
|||
|
|
@ -0,0 +1,22 @@
|
|||
name: Label inactive issues
|
||||
on:
|
||||
schedule:
|
||||
- cron: "30 1 * * *"
|
||||
|
||||
jobs:
|
||||
close-issues:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/stale@v10
|
||||
with:
|
||||
days-before-issue-stale: 90
|
||||
days-before-issue-close: -1
|
||||
stale-issue-label: "inactive"
|
||||
stale-issue-message: "This issue is stale because it has been open for 3 months with no activity."
|
||||
close-issue-message: "This issue was closed because it has been inactive for 30 days since being marked as stale."
|
||||
days-before-pr-stale: -1
|
||||
days-before-pr-close: -1
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
name: Add a message when needs contributor tag is used
|
||||
on:
|
||||
issues:
|
||||
types:
|
||||
- labeled
|
||||
jobs:
|
||||
add-comment:
|
||||
if: github.event.label.name == 'needs contributor'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
issues: write
|
||||
steps:
|
||||
- name: Add comment
|
||||
run: gh issue comment "$NUMBER" --body "$BODY"
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
GH_REPO: ${{ github.repository }}
|
||||
NUMBER: ${{ github.event.issue.number }}
|
||||
BODY: >
|
||||
This issue is available for anyone to work on.
|
||||
**Make sure to reference this issue in your pull request.**
|
||||
:sparkles: Thank you for your contribution ! :sparkles:
|
||||
|
|
@ -22,7 +22,7 @@ jobs:
|
|||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
|
|
|
|||
|
|
@ -8,10 +8,10 @@ on:
|
|||
jobs:
|
||||
|
||||
source-code-checks:
|
||||
runs-on: ubuntu-22.04
|
||||
runs-on: ubuntu-24.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Check formatting with Ruff
|
||||
uses: chartboost/ruff-action@v1
|
||||
|
|
@ -23,102 +23,101 @@ jobs:
|
|||
with:
|
||||
args: 'check'
|
||||
|
||||
- name: Static type check
|
||||
run: |
|
||||
echo "Skipping static type check for the moment, too much error...";
|
||||
# pip install pyright
|
||||
# pyright glances
|
||||
# - name: Static type check
|
||||
# run: |
|
||||
# echo "Skipping static type check for the moment, too much error...";
|
||||
# # pip install pyright
|
||||
# # pyright glances
|
||||
|
||||
|
||||
test-linux:
|
||||
|
||||
needs: source-code-checks
|
||||
# https://github.com/actions/runner-images?tab=readme-ov-file#available-images
|
||||
runs-on: ubuntu-22.04
|
||||
runs-on: ubuntu-24.04
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
|
||||
# Python EOL version are note tested
|
||||
# Multiple Python version only tested for Linux
|
||||
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
cache: 'pip'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
||||
if [ -f dev-requirements.txt ]; then python -m pip install -r dev-requirements.txt; fi
|
||||
if [ -f requirements.txt ]; then python -m pip install -r requirements.txt; fi
|
||||
|
||||
- name: Unitary tests
|
||||
run: |
|
||||
python ./unittest-core.py
|
||||
python -m pytest ./tests/test_core.py
|
||||
|
||||
# Error appear with h11, not related to Glances
|
||||
# Should be tested if correction is done
|
||||
# Installed c:\hostedtoolcache\windows\python\3.9.13\x64\lib\site-packages\exceptiongroup-1.2.1-py3.9.egg
|
||||
# error: h11 0.14.0 is installed but h11<0.13,>=0.11 is required by {'httpcore'}
|
||||
# Error: Process completed with exit code 1.
|
||||
# test-windows:
|
||||
test-windows:
|
||||
|
||||
# # https://github.com/actions/runner-images?tab=readme-ov-file#available-images
|
||||
# runs-on: windows-2022
|
||||
# strategy:
|
||||
# matrix:
|
||||
# # Python version "3.12" introduce this issue:
|
||||
# # https://github.com/nicolargo/glances/actions/runs/6439648370/job/17487567454
|
||||
# python-version: ["3.8", "3.9", "3.10", "3.11"]
|
||||
# steps:
|
||||
needs: source-code-checks
|
||||
# https://github.com/actions/runner-images?tab=readme-ov-file#available-images
|
||||
runs-on: windows-2025
|
||||
strategy:
|
||||
matrix:
|
||||
# Windows-curses not available for Python 3.14 for the moment
|
||||
# See https://github.com/zephyrproject-rtos/windows-curses/issues/76
|
||||
python-version: ["3.13"]
|
||||
steps:
|
||||
|
||||
# - uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
# - name: Set up Python ${{ matrix.python-version }}
|
||||
# uses: actions/setup-python@v5
|
||||
# with:
|
||||
# python-version: ${{ matrix.python-version }}
|
||||
# cache: 'pip'
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
cache: 'pip'
|
||||
|
||||
# - name: Install dependencies
|
||||
# run: |
|
||||
# python -m pip install --upgrade pip
|
||||
# if (Test-Path -PathType Leaf "requirements.txt") { python -m pip install -r requirements.txt }
|
||||
# python setup.py install
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
if (Test-Path -PathType Leaf "dev-requirements.txt") { python -m pip install -r dev-requirements.txt }
|
||||
if (Test-Path -PathType Leaf "requirements.txt") { python -m pip install -r requirements.txt }
|
||||
pip install .
|
||||
|
||||
# - name: Unitary tests
|
||||
# run: |
|
||||
# python ./unittest-core.py
|
||||
- name: Unitary tests
|
||||
run: |
|
||||
python -m pytest ./tests/test_core.py
|
||||
|
||||
test-macos:
|
||||
|
||||
needs: source-code-checks
|
||||
# https://github.com/actions/runner-images?tab=readme-ov-file#available-images
|
||||
runs-on: macos-14
|
||||
runs-on: macos-15
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
|
||||
# Only test the latest stable version
|
||||
python-version: ["3.14"]
|
||||
|
||||
steps:
|
||||
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
cache: 'pip'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
|
||||
if [ -f dev-requirements.txt ]; then python -m pip install -r dev-requirements.txt; fi
|
||||
if [ -f requirements.txt ]; then python -m pip install -r requirements.txt; fi
|
||||
|
||||
- name: Unitary tests
|
||||
run: |
|
||||
python ./unittest-core.py
|
||||
python -m pytest ./tests/test_core.py
|
||||
|
||||
# Error when trying to implement #2749
|
||||
# pkg: No packages available to install matching 'py-pip' have been found in the repositories
|
||||
|
|
@ -135,8 +134,10 @@ jobs:
|
|||
# with:
|
||||
# usesh: true
|
||||
# prepare: |
|
||||
# pkg install -y python3 py-pip
|
||||
# pkg install -y python3
|
||||
# run: |
|
||||
# set -e -x
|
||||
# python3 -m pip install pytest
|
||||
# python3 -m pip install --user -r dev-requirements.txt
|
||||
# python3 -m pip install --user -r requirements.txt
|
||||
# python ./unittest-core.py
|
||||
# python3 -m pytest ./tests/test_core.py
|
||||
|
|
|
|||
|
|
@ -14,17 +14,18 @@ jobs:
|
|||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
- name: Glances will be build with Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
cache-dependency-path: ./glances/outputs/static/package-lock.json
|
||||
- name: Build Glances WebUI
|
||||
working-directory: ./glances/outputs/static
|
||||
# TODO: add the following line when https://github.com/nicolargo/glances/issues/2914 will be solved
|
||||
# npm audit fix
|
||||
run: |
|
||||
npm audit fix
|
||||
npm ci
|
||||
npm run build
|
||||
- name: Commit and push WebUI
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@ local.properties
|
|||
.classpath
|
||||
.settings/
|
||||
.loadpath
|
||||
.ipynb_checkpoints/
|
||||
|
||||
# External tool builders
|
||||
.externalToolBuilders/
|
||||
|
|
@ -63,5 +64,14 @@ bower_components/
|
|||
/*_source.tar.bz2
|
||||
|
||||
# Virtual env
|
||||
/venv*/
|
||||
.venv-uv/
|
||||
.venv/
|
||||
uv.lock
|
||||
.python-version
|
||||
|
||||
# Test
|
||||
.coverage
|
||||
tests-data/issues/*/config/
|
||||
|
||||
# Local SSL certificates
|
||||
glances.local*.pem
|
||||
|
|
|
|||
|
|
@ -1,22 +1,107 @@
|
|||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v4.5.0
|
||||
- repo: https://github.com/gitleaks/gitleaks
|
||||
rev: v8.24.2
|
||||
hooks:
|
||||
- id: check-ast
|
||||
- id: check-docstring-first
|
||||
- id: check-json
|
||||
- id: check-merge-conflict
|
||||
- id: check-shebang-scripts-are-executable
|
||||
- id: check-toml
|
||||
- id: check-yaml
|
||||
- id: debug-statements
|
||||
- id: detect-private-key
|
||||
- id: mixed-line-ending
|
||||
- id: requirements-txt-fixer
|
||||
- id: gitleaks
|
||||
name: "🔒 security · Detect hardcoded secrets"
|
||||
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.4.4
|
||||
rev: v0.14.10
|
||||
hooks:
|
||||
- id: ruff-format
|
||||
- id: ruff
|
||||
args: [--fix, --exit-non-zero-on-fix]
|
||||
- id: ruff-format
|
||||
name: "🐍 python · Formatter with Ruff"
|
||||
types_or: [ python, pyi ]
|
||||
args: [ --config, './pyproject.toml' ]
|
||||
- id: ruff-check
|
||||
name: "🐍 python · Linter with Ruff"
|
||||
types_or: [ python, pyi ]
|
||||
args: [ --fix, --exit-non-zero-on-fix, --config, './pyproject.toml' ]
|
||||
|
||||
# - repo: https://github.com/RobertCraigie/pyright-python
|
||||
# rev: v1.1.391
|
||||
# hooks:
|
||||
# - id: pyright
|
||||
# name: "🐍 python · Check types"
|
||||
|
||||
# - repo: https://github.com/biomejs/pre-commit
|
||||
# rev: "v2.3.7"
|
||||
# hooks:
|
||||
# - id: biome-check
|
||||
# name: "🟨 javascript · Lint, format, and safe fixes with Biome"
|
||||
|
||||
- repo: https://github.com/python-jsonschema/check-jsonschema
|
||||
rev: 0.35.0
|
||||
hooks:
|
||||
- id: check-github-workflows
|
||||
name: "🐙 github-actions · Validate gh workflow files"
|
||||
args: ["--verbose"]
|
||||
|
||||
- repo: https://github.com/shellcheck-py/shellcheck-py
|
||||
rev: v0.11.0.1
|
||||
hooks:
|
||||
- id: shellcheck
|
||||
name: "🐚 shell · Lint shell scripts"
|
||||
|
||||
- repo: https://github.com/openstack/bashate
|
||||
rev: 2.1.1
|
||||
hooks:
|
||||
- id: bashate
|
||||
name: "🐚 shell · Check shell script code style"
|
||||
entry: bashate --error . --ignore=E006
|
||||
|
||||
# - repo: https://github.com/mrtazz/checkmake.git
|
||||
# rev: 0.2.2
|
||||
# hooks:
|
||||
# - id: checkmake
|
||||
# name: "🐮 Makefile · Lint Makefile"
|
||||
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v6.0.0
|
||||
hooks:
|
||||
- id: check-executables-have-shebangs
|
||||
name: "📁 filesystem/⚙️ exec · Verify shebang presence"
|
||||
- id: check-shebang-scripts-are-executable
|
||||
name: "📁 filesystem/⚙️ exec · Verify script permissions"
|
||||
- id: check-case-conflict
|
||||
name: "📁 filesystem/📝 names · Check case sensitivity"
|
||||
- id: destroyed-symlinks
|
||||
name: "📁 filesystem/🔗 symlink · Detect broken symlinks"
|
||||
- id: check-merge-conflict
|
||||
name: "🌳 git · Detect conflict markers"
|
||||
- id: forbid-new-submodules
|
||||
name: "🌳 git · Prevent submodule creation"
|
||||
- id: no-commit-to-branch
|
||||
name: "🌳 git · Protect main branches"
|
||||
args: ["--branch", "main", "--branch", "master"]
|
||||
- id: check-added-large-files
|
||||
name: "🌳 git · Block large file commits"
|
||||
args: ['--maxkb=5000']
|
||||
- id: check-ast
|
||||
name: "🐍 python/🔍 quality · Validate Python AST"
|
||||
- id: check-docstring-first
|
||||
name: "🐍 python/📝 style · Enforce docstring at top"
|
||||
- id: check-json
|
||||
name: "📄 formats/json · Validate JSON files"
|
||||
- id: check-shebang-scripts-are-executable
|
||||
name: "📁 filesystem/⚙️ exec · Ensure scripts are executable"
|
||||
- id: check-toml
|
||||
name: "📄 formats/toml · Validate TOML files"
|
||||
- id: check-yaml
|
||||
name: "📄 formats/yaml · Validate YAML syntax"
|
||||
- id: debug-statements
|
||||
name: "🐍 python/🪲 debug · Detect debug statements"
|
||||
- id: detect-private-key
|
||||
name: "🔐 security · Detect private keys"
|
||||
- id: mixed-line-ending
|
||||
name: "📄 text/↩️ newline · Normalize line endings"
|
||||
- id: requirements-txt-fixer
|
||||
name: "🐍 python/📦 deps · Sort requirements.txt"
|
||||
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: find-duplicate-lines
|
||||
name: "❗️local script · Find duplicate lines at the end of file"
|
||||
entry: bash tests-data/tools/find-duplicate-lines.sh
|
||||
language: system
|
||||
types: [python]
|
||||
pass_filenames: false
|
||||
|
|
|
|||
|
|
@ -0,0 +1,34 @@
|
|||
# Read the Docs configuration file for Glances projects
|
||||
|
||||
# Required
|
||||
version: 2
|
||||
|
||||
# Set the OS, Python version and other tools you might need
|
||||
build:
|
||||
os: ubuntu-22.04
|
||||
tools:
|
||||
python: "3.12"
|
||||
# You can also specify other tool versions:
|
||||
# nodejs: "20"
|
||||
# rust: "1.70"
|
||||
# golang: "1.20"
|
||||
|
||||
# Build documentation in the "docs/" directory with Sphinx
|
||||
sphinx:
|
||||
configuration: docs/conf.py
|
||||
# You can configure Sphinx to use a different builder, for instance use the dirhtml builder for simpler URLs
|
||||
# builder: "dirhtml"
|
||||
# Fail on all warnings to avoid broken references
|
||||
# fail_on_warning: true
|
||||
|
||||
# Optionally build your docs in additional formats such as PDF and ePub
|
||||
# formats:
|
||||
# - pdf
|
||||
# - epub
|
||||
|
||||
# Optional but recommended, declare the Python requirements required
|
||||
# to build your documentation
|
||||
# See https://docs.readthedocs.io/en/stable/guides/reproducible-builds.html
|
||||
python:
|
||||
install:
|
||||
- requirements: dev-requirements.txt
|
||||
3
AUTHORS
|
|
@ -13,6 +13,9 @@ PGP Public key: gpg --keyserver pgp.mit.edu --recv-keys 0xba43c11f2c8b4347
|
|||
RazCrimson (maintainer of the Glances project)
|
||||
https://github.com/RazCrimson
|
||||
|
||||
Ariel Otibili (aka) ariel-anieli (for the huge work on code quality)
|
||||
https://github.com/ariel-anieli
|
||||
|
||||
Alessio Sergi (aka) Al3hex (thanks you for the great job on this project)
|
||||
https://twitter.com/al3hex
|
||||
https://github.com/asergi
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ In the interest of fostering an open and welcoming environment, we as
|
|||
contributors and maintainers pledge to making participation in our project and
|
||||
our community a harassment-free experience for everyone, regardless of age, body
|
||||
size, disability, ethnicity, gender identity and expression, level of experience,
|
||||
education, socio-economic status, nationality, personal appearance, race,
|
||||
education, socioeconomic status, nationality, personal appearance, race,
|
||||
religion, or sexual identity and orientation.
|
||||
|
||||
## Our Standards
|
||||
|
|
|
|||
|
|
@ -3,9 +3,12 @@ include CONTRIBUTING.md
|
|||
include COPYING
|
||||
include NEWS.rst
|
||||
include README.rst
|
||||
include README-pypi.rst
|
||||
include SECURITY.md
|
||||
include conf/glances.conf
|
||||
include conf/fetch-templates/*.jinja
|
||||
include requirements.txt
|
||||
include all-requirements.txt
|
||||
recursive-include docs *
|
||||
recursive-include glances *.py
|
||||
recursive-include glances/outputs/static *
|
||||
|
|
|
|||
358
Makefile
|
|
@ -1,157 +1,242 @@
|
|||
PORT?=8008
|
||||
LASTTAG = $(shell git describe --tags --abbrev=0)
|
||||
PORT ?= 8008
|
||||
CONF := conf/glances.conf
|
||||
LASTTAG = $(shell git describe --tags --abbrev=0)
|
||||
|
||||
IMAGES_TYPES := full minimal
|
||||
DISTROS := alpine ubuntu
|
||||
alpine_images := $(IMAGES_TYPES:%=docker-alpine-%)
|
||||
ubuntu_images := $(IMAGES_TYPES:%=docker-ubuntu-%)
|
||||
DOCKER_IMAGES := $(alpine_images) $(ubuntu_images)
|
||||
DOCKER_RUNTIMES := $(DOCKER_IMAGES:%=run-%)
|
||||
UNIT_TESTS := test-core test-restful test-xmlrpc
|
||||
DOCKER_BUILD := docker buildx build
|
||||
DOCKER_RUN := docker run
|
||||
PODMAN_SOCK ?= /run/user/$(shell id -u)/podman/podman.sock
|
||||
DOCKER_SOCK ?= /var/run/docker.sock
|
||||
DOCKER_SOCKS := -v $(PODMAN_SOCK):$(PODMAN_SOCK):ro -v $(DOCKER_SOCK):$(DOCKER_SOCK):ro
|
||||
DOCKER_OPTS := --rm -e TZ="${TZ}" -e GLANCES_OPT="" --pid host --network host
|
||||
UV_RUN := .venv-uv/bin/uv
|
||||
|
||||
# if the command is only `make`, the default tasks will be the printing of the help.
|
||||
.DEFAULT_GOAL := help
|
||||
|
||||
.PHONY: help
|
||||
.PHONY: help test docs docs-server venv requirements profiling docker all clean all test
|
||||
|
||||
help: ## List all make commands available
|
||||
@grep -E '^[\.a-zA-Z_%-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk -F ":" '{print $1}' | grep -v % | sed 's/\\//g' | sort | awk 'BEGIN {FS = ":[^:]*?##"}; {printf "\033[1;34mmake %-50s\033[0m %s\n", $$1, $$2}'
|
||||
@grep -E '^[\.a-zA-Z_%-]+:.*?## .*$$' $(MAKEFILE_LIST) | \
|
||||
awk -F ":" '{print $1}' | \
|
||||
grep -v % | sed 's/\\//g' | sort | \
|
||||
awk 'BEGIN {FS = ":[^:]*?##"}; {printf "\033[1;34mmake %-50s\033[0m %s\n", $$1, $$2}'
|
||||
|
||||
# ===================================================================
|
||||
# Virtualenv
|
||||
# ===================================================================
|
||||
|
||||
venv-python: venv-full-python venv-min-python venv-dev-python ## Install all Python 3 venv
|
||||
# install-uv: ## Instructions to install the UV tool
|
||||
# @echo "Install the UV tool (https://astral.sh/uv/)"
|
||||
# @echo "Please install the UV tool manually"
|
||||
# @echo "For example with: curl -LsSf https://astral.sh/uv/install.sh | sh"
|
||||
# @echo "Or via a package manager of your distribution"
|
||||
# @echo "For example for Snap: snap install astral-uv"
|
||||
|
||||
venv: venv-full venv-min venv-dev ## Install all Python 3 dependencies
|
||||
install-uv: ## Install UV tool in a specific virtualenv
|
||||
python3 -m venv .venv-uv
|
||||
.venv-uv/bin/pip install uv
|
||||
|
||||
venv-upgrade: venv-full-upgrade venv-min-upgrade venv-dev-upgrade ## Upgrade all Python 3 dependencies
|
||||
upgrade-uv: ## Upgrade the UV tool
|
||||
.venv-uv/bin/pip install --upgrade pip
|
||||
.venv-uv/bin/pip install --upgrade uv
|
||||
|
||||
# For full installation (with optional dependencies)
|
||||
venv: ## Create the virtualenv with all dependencies
|
||||
$(UV_RUN) sync --all-extras --no-group dev
|
||||
|
||||
venv-full-python: ## Install Python 3 venv
|
||||
virtualenv -p /usr/bin/python3 venv
|
||||
venv-upgrade venv-switch-to-full: ## Upgrade the virtualenv with all dependencies
|
||||
$(UV_RUN) sync --upgrade --all-extras
|
||||
|
||||
venv-full: venv-python ## Install Python 3 run-time dependencies
|
||||
./venv/bin/pip install -r requirements.txt
|
||||
./venv/bin/pip install -r optional-requirements.txt
|
||||
venv-min: ## Create the virtualenv with minimal dependencies
|
||||
$(UV_RUN) sync
|
||||
|
||||
venv-full-upgrade: ## Upgrade Python 3 run-time dependencies
|
||||
./venv/bin/pip install --upgrade pip
|
||||
./venv/bin/pip install --upgrade -r requirements.txt
|
||||
./venv/bin/pip install --upgrade -r optional-requirements.txt
|
||||
venv-upgrade-min venv-switch-to-min: ## Upgrade the virtualenv with minimal dependencies
|
||||
$(UV_RUN) sync --upgrade
|
||||
|
||||
# For minimal installation (without optional dependencies)
|
||||
venv-clean: ## Remove the virtualenv
|
||||
rm -rf .venv
|
||||
|
||||
venv-min-python: ## Install Python 3 venv minimal
|
||||
virtualenv -p /usr/bin/python3 venv-min
|
||||
venv-dev: ## Create the virtualenv with dev dependencies
|
||||
$(UV_RUN) sync --dev --all-extras
|
||||
$(UV_RUN) run pre-commit install --hook-type pre-commit
|
||||
|
||||
venv-min: venv-min-python ## Install Python 3 minimal run-time dependencies
|
||||
./venv-min/bin/pip install -r requirements.txt
|
||||
# ===================================================================
|
||||
# Requirements
|
||||
#
|
||||
# Note: the --no-hashes option should be used because pip (in CI) has
|
||||
# issues with hashes.
|
||||
# ===================================================================
|
||||
|
||||
venv-min-upgrade: ## Upgrade Python 3 minimal run-time dependencies
|
||||
./venv-min/bin/pip install --upgrade pip
|
||||
./venv-min/bin/pip install --upgrade -r requirements.txt
|
||||
requirements-min: ## Generate the requirements.txt files (minimal dependencies)
|
||||
$(UV_RUN) export --no-emit-workspace --no-hashes --no-group dev --output-file requirements.txt
|
||||
|
||||
# For development
|
||||
requirements-all: ## Generate the all-requirements.txt files (all dependencies)
|
||||
$(UV_RUN) export --no-emit-workspace --no-hashes --all-extras --no-group dev --output-file all-requirements.txt
|
||||
|
||||
venv-dev-python: ## Install Python 3 venv
|
||||
virtualenv -p /usr/bin/python3 venv-dev
|
||||
requirements-docker: ## Generate the docker-requirements.txt files (Docker specific dependencies)
|
||||
$(UV_RUN) export --no-emit-workspace --no-hashes --no-group dev --extra containers --extra web --output-file docker-requirements.txt
|
||||
|
||||
venv-dev: venv-python ## Install Python 3 dev dependencies
|
||||
./venv-dev/bin/pip install -r dev-requirements.txt
|
||||
./venv-dev/bin/pip install -r doc-requirements.txt
|
||||
./venv-dev/bin/pre-commit install --hook-type pre-commit
|
||||
requirements-dev: ## Generate the dev-requirements.txt files (dev dependencies)
|
||||
$(UV_RUN) export --no-hashes --only-dev --output-file dev-requirements.txt
|
||||
|
||||
venv-dev-upgrade: ## Upgrade Python 3 dev dependencies
|
||||
./venv-dev/bin/pip install --upgrade pip
|
||||
./venv-dev/bin/pip install --upgrade -r dev-requirements.txt
|
||||
./venv-dev/bin/pip install --upgrade -r doc-requirements.txt
|
||||
requirements: requirements-min requirements-all requirements-dev requirements-docker ## Generate all the requirements files
|
||||
|
||||
requirements-upgrade: venv-upgrade requirements ## Upgrade the virtualenv and regenerate all the requirements files
|
||||
|
||||
# ===================================================================
|
||||
# Tests
|
||||
# ===================================================================
|
||||
|
||||
test-core: ## Run core unit tests
|
||||
./venv/bin/python ./unittest-core.py
|
||||
test: ## Run All unit tests
|
||||
$(UV_RUN) run pytest
|
||||
|
||||
test-restful: ## Run Restful unit tests
|
||||
./venv/bin/python ./unittest-restful.py
|
||||
test-core: ## Run Core unit tests
|
||||
$(UV_RUN) run pytest tests/test_core.py
|
||||
|
||||
test-xmlrpc: ## Run XMLRPC unit tests
|
||||
./venv/bin/python ./unittest-xmlrpc.py
|
||||
test-api: ## Run API unit tests
|
||||
$(UV_RUN) run pytest tests/test_api.py
|
||||
|
||||
test: test-core test-restful test-xmlrpc ## Run unit tests
|
||||
test-memoryleak: ## Run Memory-leak unit tests
|
||||
$(UV_RUN) run pytest tests/test_memoryleak.py
|
||||
|
||||
test-with-upgrade: venv-upgrade venv-dev-upgrade test ## Upgrade deps and run unit tests
|
||||
test-perf: ## Run Perf unit tests
|
||||
$(UV_RUN) run pytest tests/test_perf.py
|
||||
|
||||
test-min: ## Run core unit tests in minimal environment
|
||||
./venv-min/bin/python ./unittest-core.py
|
||||
test-restful: ## Run Restful API unit tests
|
||||
$(UV_RUN) run pytest tests/test_restful.py
|
||||
|
||||
test-min-with-upgrade: venv-min-upgrade ## Upgrade deps and run unit tests in minimal environment
|
||||
./venv-min/bin/python ./unittest-core.py
|
||||
test-webui: ## Run WebUI unit tests
|
||||
$(UV_RUN) run pytest tests/test_webui.py
|
||||
|
||||
test-xmlrpc: ## Run XMLRPC API unit tests
|
||||
$(UV_RUN) run pytest tests/test_xmlrpc.py
|
||||
|
||||
test-with-upgrade: venv-upgrade test ## Upgrade deps and run unit tests
|
||||
|
||||
test-export-csv: ## Run interface tests with CSV
|
||||
/bin/bash ./tests/test_export_csv.sh
|
||||
|
||||
test-export-json: ## Run interface tests with JSON
|
||||
/bin/bash ./tests/test_export_json.sh
|
||||
|
||||
test-export-influxdb-v1: ## Run interface tests with InfluxDB version 1 (Legacy)
|
||||
/bin/bash ./tests/test_export_influxdb_v1.sh
|
||||
|
||||
test-export-influxdb-v3: ## Run interface tests with InfluxDB version 3 (Core)
|
||||
/bin/bash ./tests/test_export_influxdb_v3.sh
|
||||
|
||||
test-export-timescaledb: ## Run interface tests with TimescaleDB
|
||||
/bin/bash ./tests/test_export_timescaledb.sh
|
||||
|
||||
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
|
||||
# ===================================================================
|
||||
|
||||
pre-commit: ## Run pre-commit hooks
|
||||
$(UV_RUN) run pre-commit run --all-files
|
||||
|
||||
find-duplicate-lines: ## Search for duplicate lines in files
|
||||
/bin/bash tests-data/tools/find-duplicate-lines.sh
|
||||
|
||||
format: ## Format the code
|
||||
./venv-dev/bin/python -m ruff format .
|
||||
$(UV_RUN) run ruff format .
|
||||
|
||||
lint: ## Lint the code.
|
||||
./venv-dev/bin/python -m ruff check . --fix
|
||||
$(UV_RUN) run ruff check . --fix
|
||||
|
||||
lint-readme: ## Lint the main README.rst file
|
||||
$(UV_RUN) run rstcheck README.rst
|
||||
$(UV_RUN) run rstcheck README-pypi.rst
|
||||
|
||||
codespell: ## Run codespell to fix common misspellings in text files
|
||||
./venv-dev/bin/codespell -S .git,./docs/_build,./Glances.egg-info,./venv*,./glances/outputs,*.svg -L hart,bu,te,statics
|
||||
$(UV_RUN) run codespell -S .git,./docs/_build,./Glances.egg-info,./venv*,./glances/outputs,*.svg -L hart,bu,te,statics -w
|
||||
|
||||
semgrep: ## Run semgrep to find bugs and enforce code standards
|
||||
./venv-dev/bin/semgrep scan --config=auto
|
||||
$(UV_RUN) run semgrep scan --config=auto
|
||||
|
||||
profiling-%: SLEEP = 3
|
||||
profiling-%: TIMES = 30
|
||||
profiling-%: OUT_DIR = docs/_static
|
||||
|
||||
define DISPLAY-BANNER
|
||||
@echo "Start Glances for $(TIMES) iterations (more or less 1 mins, please do not exit !)"
|
||||
sleep $(SLEEP)
|
||||
endef
|
||||
|
||||
profiling-gprof: CPROF = glances.cprof
|
||||
profiling-gprof: ## Callgraph profiling (need "apt install graphviz")
|
||||
@echo "Start Glances for 30 iterations (more or less 1 mins, please do not exit !)"
|
||||
sleep 3
|
||||
./venv/bin/python -m cProfile -o ./glances.cprof ./run.py --stop-after 30
|
||||
./venv-dev/bin/gprof2dot -f pstats ./glances.cprof | dot -Tsvg -o ./docs/_static/glances-cgraph.svg
|
||||
rm -f ./glances.cprof
|
||||
$(DISPLAY-BANNER)
|
||||
$(UV_RUN) run python -m cProfile -o $(CPROF) run-venv.py -C $(CONF) --stop-after $(TIMES)
|
||||
$(UV_RUN) run gprof2dot -f pstats $(CPROF) | dot -Tsvg -o $(OUT_DIR)/glances-cgraph.svg
|
||||
rm -f $(CPROF)
|
||||
|
||||
profiling-pyinstrument: ## PyInstrument profiling
|
||||
@echo "Start Glances for 30 iterations (more or less 1 mins, please do not exit !)"
|
||||
sleep 3
|
||||
./venv/bin/pip install pyinstrument
|
||||
./venv/bin/python -m pyinstrument -r html -o ./docs/_static/glances-pyinstrument.html -m glances --stop-after 30
|
||||
$(DISPLAY-BANNER)
|
||||
$(UV_RUN) add pyinstrument
|
||||
$(UV_RUN) run pyinstrument -r html -o $(OUT_DIR)/glances-pyinstrument.html -m glances -C $(CONF) --stop-after $(TIMES)
|
||||
|
||||
profiling-pyspy: ## Flame profiling (currently not compatible with Python 3.12)
|
||||
@echo "Start Glances for 30 iterations (more or less 1 mins, please do not exit !)"
|
||||
sleep 3
|
||||
./venv-dev/bin/py-spy record -o ./docs/_static/glances-flame.svg -d 60 -s -- ./venv/bin/python ./run.py --stop-after 30
|
||||
profiling-pyspy: ## Flame profiling
|
||||
$(DISPLAY-BANNER)
|
||||
$(UV_RUN) run py-spy record -o $(OUT_DIR)/glances-flame.svg -d 60 -s -- .venv-uv/bin/uvrun python run-venv.py -C $(CONF) --stop-after $(TIMES)
|
||||
|
||||
profiling: profiling-gprof profiling-pyinstrument profiling-pyspy ## Profiling of the Glances software
|
||||
|
||||
trace-malloc: ## Trace the malloc() calls
|
||||
@echo "Malloc test is running, please wait ~30 secondes..."
|
||||
./venv/bin/python -m glances -C ./conf/glances.conf --trace-malloc --stop-after 15 --quiet
|
||||
$(UV_RUN) run python -m glances -C $(CONF) --trace-malloc --stop-after 15 --quiet
|
||||
|
||||
memory-leak: ## Profile memory leaks
|
||||
./venv/bin/python -m glances -C ./conf/glances.conf --memory-leak
|
||||
$(UV_RUN) run python -m glances -C $(CONF) --memory-leak
|
||||
|
||||
memory-profiling: TIMES = 2400
|
||||
memory-profiling: PROFILE = mprofile_*.dat
|
||||
memory-profiling: OUT_DIR = docs/_static
|
||||
memory-profiling: ## Profile memory usage
|
||||
@echo "It's a very long test (~4 hours)..."
|
||||
rm -f mprofile_*.dat
|
||||
rm -f $(PROFILE)
|
||||
@echo "1/2 - Start memory profiling with the history option enable"
|
||||
./venv-dev/bin/mprof run -T 1 -C run.py -C ./conf/glances.conf --stop-after 2400 --quiet
|
||||
./venv-dev/bin/mprof plot --output ./docs/_static/glances-memory-profiling-with-history.png
|
||||
rm -f mprofile_*.dat
|
||||
$(UV_RUN) run mprof run -T 1 -C run-venv.py -C $(CONF) --stop-after $(TIMES) --quiet
|
||||
$(UV_RUN) run mprof plot --output $(OUT_DIR)/glances-memory-profiling-with-history.png
|
||||
rm -f $(PROFILE)
|
||||
@echo "2/2 - Start memory profiling with the history option disable"
|
||||
./venv-dev/bin/mprof run -T 1 -C run.py -C ./conf/glances.conf --disable-history --stop-after 2400 --quiet
|
||||
./venv-dev/bin/mprof plot --output ./docs/_static/glances-memory-profiling-without-history.png
|
||||
rm -f mprofile_*.dat
|
||||
$(UV_RUN) run mprof run -T 1 -C run-venv.py -C $(CONF) --disable-history --stop-after $(TIMES) --quiet
|
||||
$(UV_RUN) run mprof plot --output $(OUT_DIR)/glances-memory-profiling-without-history.png
|
||||
rm -f $(PROFILE)
|
||||
|
||||
# Trivy installation: https://aquasecurity.github.io/trivy/latest/getting-started/installation/
|
||||
trivy: ## Run Trivy to find vulnerabilities in container images
|
||||
trivy fs .
|
||||
trivy: ## Run Trivy to find vulnerabilities
|
||||
$(UV_RUN) run trivy fs ./glances/
|
||||
|
||||
bandit: ## Run Bandit to find vulnerabilities
|
||||
$(UV_RUN) run bandit glances -r
|
||||
|
||||
# ===================================================================
|
||||
# Docs
|
||||
# ===================================================================
|
||||
|
||||
docs: ## Create the documentation
|
||||
./venv/bin/python -m glances -C ./conf/glances.conf --api-doc > ./docs/api.rst
|
||||
$(UV_RUN) run python -m glances -C $(CONF) --api-doc > ./docs/api/python.rst
|
||||
$(UV_RUN) run python ./generate_openapi.py
|
||||
$(UV_RUN) run python -m glances -C $(CONF) --api-restful-doc > ./docs/api/restful.rst
|
||||
cd docs && ./build.sh && cd ..
|
||||
|
||||
docs-server: docs ## Start a Web server to serve the documentation
|
||||
(sleep 2 && sensible-browser "http://localhost:$(PORT)") &
|
||||
cd docs/_build/html/ && ../../../venv/bin/python -m http.server $(PORT)
|
||||
cd docs/_build/html/ && .venv-uv/bin/uvrun python -m http.server $(PORT)
|
||||
|
||||
docs-jupyter: ## Start Jupyter Notebook
|
||||
$(UV_RUN) run --with jupyter jupyter lab
|
||||
|
||||
release-note: ## Generate release note
|
||||
git --no-pager log $(LASTTAG)..HEAD --first-parent --pretty=format:"* %s"
|
||||
|
|
@ -166,26 +251,34 @@ install: ## Open a Web Browser to the installation procedure
|
|||
# Follow ./glances/outputs/static/README.md for more information
|
||||
# ===================================================================
|
||||
|
||||
webui: ## Build the Web UI
|
||||
cd glances/outputs/static/ && npm ci && npm run build
|
||||
webui webui%: DIR = glances/outputs/static/
|
||||
|
||||
webui-gen-config: ## Generate the Web UI config file
|
||||
$(UV_RUN) run python ./generate_webui_conf.py > ./glances/outputs/static/js/uiconfig.json
|
||||
|
||||
webui: webui-gen-config ## Build the Web UI
|
||||
cd $(DIR) && npm ci && npm run build
|
||||
|
||||
webui-audit: ## Audit the Web UI
|
||||
cd glances/outputs/static/ && npm audit
|
||||
cd $(DIR) && npm audit
|
||||
|
||||
webui-audit-fix: ## Fix audit the Web UI
|
||||
cd glances/outputs/static/ && npm audit fix && npm ci && npm run build
|
||||
webui-audit-fix: webui-gen-config ## Fix audit the Web UI
|
||||
cd $(DIR) && npm audit fix && npm ci && npm run build
|
||||
|
||||
webui-update: webui-gen-config ## Update JS dependencies
|
||||
cd $(DIR) && npm update --save && npm ci && npm run build
|
||||
|
||||
# ===================================================================
|
||||
# Packaging
|
||||
# ===================================================================
|
||||
|
||||
flatpak: venv-dev-upgrade ## Generate FlatPack JSON file
|
||||
flatpak: venv-upgrade ## Generate FlatPack JSON file
|
||||
git clone https://github.com/flatpak/flatpak-builder-tools.git
|
||||
./venv/bin/python ./flatpak-builder-tools/pip/flatpak-pip-generator glances
|
||||
$(UV_RUN) run python ./flatpak-builder-tools/pip/flatpak-pip-generator glances
|
||||
rm -rf ./flatpak-builder-tools
|
||||
@echo "Now follow: https://github.com/flathub/flathub/wiki/App-Submission"
|
||||
|
||||
# Snap package is automaticaly build on the Snapcraft.io platform
|
||||
# Snap package is automatically build on the Snapcraft.io platform
|
||||
# https://snapcraft.io/glances
|
||||
# But you can try an offline build with the following command
|
||||
snapcraft:
|
||||
|
|
@ -196,98 +289,99 @@ snapcraft:
|
|||
# Need Docker Buildx package (apt install docker-buildx on Ubuntu)
|
||||
# ===================================================================
|
||||
|
||||
define MAKE_DOCKER_BUILD_RULES
|
||||
$($(DISTRO)_images): docker-$(DISTRO)-%: docker-files/$(DISTRO).Dockerfile
|
||||
$(DOCKER_BUILD) --target $$* -f $$< -t glances:local-$(DISTRO)-$$* .
|
||||
endef
|
||||
|
||||
$(foreach DISTRO,$(DISTROS),$(eval $(MAKE_DOCKER_BUILD_RULES)))
|
||||
|
||||
docker: docker-alpine docker-ubuntu ## Generate local docker images
|
||||
|
||||
docker-alpine: docker-alpine-full docker-alpine-minimal docker-alpine-dev ## Generate local docker images (Alpine)
|
||||
docker-alpine: $(alpine_images) ## Generate local docker images (Alpine)
|
||||
docker-ubuntu: $(ubuntu_images) ## Generate local docker images (Ubuntu)
|
||||
|
||||
docker-alpine-full: ## Generate local docker image (Alpine full)
|
||||
docker buildx build --target full -f ./docker-files/alpine.Dockerfile -t glances:local-alpine-full .
|
||||
|
||||
docker-alpine-minimal: ## Generate local docker image (Alpine minimal)
|
||||
docker buildx build --target minimal -f ./docker-files/alpine.Dockerfile -t glances:local-alpine-minimal .
|
||||
|
||||
docker-alpine-dev: ## Generate local docker image (Alpine dev)
|
||||
docker buildx build --target dev -f ./docker-files/alpine.Dockerfile -t glances:local-alpine-dev .
|
||||
|
||||
docker-ubuntu: docker-ubuntu-full docker-ubuntu-minimal docker-ubuntu-dev ## Generate local docker images (Ubuntu)
|
||||
|
||||
docker-ubuntu-full: ## Generate local docker image (Ubuntu full)
|
||||
docker buildx build --target full -f ./docker-files/ubuntu.Dockerfile -t glances:local-ubuntu-full .
|
||||
|
||||
docker-ubuntu-minimal: ## Generate local docker image (Ubuntu minimal)
|
||||
docker buildx build --target minimal -f ./docker-files/ubuntu.Dockerfile -t glances:local-ubuntu-minimal .
|
||||
|
||||
docker-ubuntu-dev: ## Generate local docker image (Ubuntu dev)
|
||||
docker buildx build --target dev -f ./docker-files/ubuntu.Dockerfile -t glances:local-ubuntu-dev .
|
||||
|
||||
trivy-docker: ## Run Trivy to find vulnerabilities in Docker images
|
||||
$(UV_RUN) run trivy image glances:local-alpine-full
|
||||
$(UV_RUN) run trivy image glances:local-alpine-minimal
|
||||
$(UV_RUN) run trivy image glances:local-ubuntu-full
|
||||
$(UV_RUN) run trivy image glances:local-ubuntu-minimal
|
||||
|
||||
# ===================================================================
|
||||
# Run
|
||||
# ===================================================================
|
||||
|
||||
run: ## Start Glances in console mode (also called standalone)
|
||||
./venv/bin/python -m glances -C ./conf/glances.conf
|
||||
$(UV_RUN) run python -m glances -C $(CONF)
|
||||
|
||||
run-debug: ## Start Glances in debug console mode (also called standalone)
|
||||
./venv/bin/python -m glances -C ./conf/glances.conf -d
|
||||
$(UV_RUN) run python -m glances -C $(CONF) -d
|
||||
|
||||
run-local-conf: ## Start Glances in console mode with the system conf file
|
||||
./venv/bin/python -m glances
|
||||
$(UV_RUN) run python -m glances
|
||||
|
||||
run-local-conf-hide-public: ## Start Glances in console mode with the system conf file and hide public information
|
||||
./venv/bin/python -m glances --hide-public-info
|
||||
$(UV_RUN) run python -m glances --hide-public-info
|
||||
|
||||
run-min: ## Start minimal Glances in console mode (also called standalone)
|
||||
./venv-min/bin/python -m glances -C ./conf/glances.conf
|
||||
run-like-htop: ## Start Glances with the same features than Htop
|
||||
$(UV_RUN) run python -m glances --disable-plugin network,ports,wifi,connections,diskio,fs,irq,folders,raid,smart,sensors,vms,containers,ip,amps --disable-left-sidebar
|
||||
|
||||
run-min-debug: ## Start minimal Glances in debug console mode (also called standalone)
|
||||
./venv-min/bin/python -m glances -C ./conf/glances.conf -d
|
||||
run-fetch: ## Start Glances in fetch mode
|
||||
$(UV_RUN) run python -m glances --fetch
|
||||
|
||||
run-min-local-conf: ## Start minimal Glances in console mode with the system conf file
|
||||
./venv-min/bin/python -m glances
|
||||
$(DOCKER_RUNTIMES): run-docker-%:
|
||||
$(DOCKER_RUN) $(DOCKER_OPTS) $(DOCKER_SOCKS) -it glances:local-$*
|
||||
|
||||
run-docker-alpine-minimal: ## Start Glances Alpine Docker minimal in console mode
|
||||
docker run --rm -e TZ="${TZ}" -e GLANCES_OPT="" -v /run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:ro -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-alpine-minimal
|
||||
|
||||
run-docker-alpine-full: ## Start Glances Alpine Docker full in console mode
|
||||
docker run --rm -e TZ="${TZ}" -e GLANCES_OPT="" -v /run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:ro -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-alpine-full
|
||||
|
||||
run-docker-alpine-dev: ## Start Glances Alpine Docker dev in console mode
|
||||
docker run --rm -e TZ="${TZ}" -e GLANCES_OPT="" -v /run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:ro -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-alpine-dev
|
||||
|
||||
run-docker-ubuntu-minimal: ## Start Glances Ubuntu Docker minimal in console mode
|
||||
docker run --rm -e TZ="${TZ}" -e GLANCES_OPT="" -v /run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:ro -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-ubuntu-minimal
|
||||
|
||||
run-docker-ubuntu-full: ## Start Glances Ubuntu Docker full in console mode
|
||||
docker run --rm -e TZ="${TZ}" -e GLANCES_OPT="" -v /run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:ro -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-ubuntu-full
|
||||
|
||||
run-docker-ubuntu-dev: ## Start Glances Ubuntu Docker dev in console mode
|
||||
docker run --rm -e TZ="${TZ}" -e GLANCES_OPT="" -v /run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:ro -v /var/run/docker.sock:/var/run/docker.sock:ro --pid host --network host -it glances:local-ubuntu-dev
|
||||
|
||||
generate-ssl: ## Generate local and sel signed SSL certificates for dev (need mkcert)
|
||||
mkcert glances.local localhost 120.0.0.1 0.0.0.0
|
||||
|
||||
run-webserver: ## Start Glances in Web server mode
|
||||
./venv/bin/python -m glances -C ./conf/glances.conf -w
|
||||
$(UV_RUN) run python -m glances -C $(CONF) -w
|
||||
|
||||
run-webserver-local-conf: ## Start Glances in Web server mode with the system conf file
|
||||
./venv/bin/python -m glances -w
|
||||
$(UV_RUN) run python -m glances -w
|
||||
|
||||
run-webserver-local-conf-hide-public: ## Start Glances in Web server mode with the system conf file and hide public info
|
||||
./venv/bin/python -m glances -w --hide-public-info
|
||||
$(UV_RUN) run python -m glances -w --hide-public-info
|
||||
|
||||
run-restapiserver: ## Start Glances in REST API server mode
|
||||
./venv/bin/python -m glances -C ./conf/glances.conf -w --disable-webui
|
||||
$(UV_RUN) run python -m glances -C $(CONF) -w --disable-webui
|
||||
|
||||
run-server: ## Start Glances in server mode (RPC)
|
||||
./venv/bin/python -m glances -C ./conf/glances.conf -s
|
||||
$(UV_RUN) run python -m glances -C $(CONF) -s
|
||||
|
||||
run-client: ## Start Glances in client mode (RPC)
|
||||
./venv/bin/python -m glances -C ./conf/glances.conf -c localhost
|
||||
$(UV_RUN) run python -m glances -C $(CONF) -c localhost
|
||||
|
||||
run-browser: ## Start Glances in browser mode (RPC)
|
||||
./venv/bin/python -m glances -C ./conf/glances.conf --browser
|
||||
$(UV_RUN) run python -m glances -C $(CONF) --browser
|
||||
|
||||
run-web-browser: ## Start Web Central Browser
|
||||
$(UV_RUN) run python -m glances -C $(CONF) -w --browser
|
||||
|
||||
run-issue: ## Start Glances in issue mode
|
||||
./venv/bin/python -m glances -C ./conf/glances.conf --issue
|
||||
$(UV_RUN) run python -m glances -C $(CONF) --issue
|
||||
|
||||
run-multipass: ## Install and start Glances in a VM (only available on Ubuntu with multipass already installed)
|
||||
multipass launch -n glances-on-lts lts
|
||||
multipass exec glances-on-lts -- sudo snap install glances
|
||||
multipass exec glances-on-lts -- glances
|
||||
multipass stop glances-on-lts
|
||||
multipass delete glances-on-lts
|
||||
|
||||
show-version: ## Show Glances version number
|
||||
./venv/bin/python -m glances -C ./conf/glances.conf -V
|
||||
|
||||
.PHONY: test docs docs-server venv venv-min venv-dev
|
||||
$(UV_RUN) run python -m glances -C $(CONF) -V
|
||||
|
|
|
|||
487
NEWS.rst
|
|
@ -2,6 +2,463 @@
|
|||
Glances ChangeLog
|
||||
==============================================================================
|
||||
|
||||
=============
|
||||
Version 4.4.1
|
||||
=============
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* Restful API issue after a while (stats are no more updated) #3333
|
||||
|
||||
=============
|
||||
Version 4.4.0
|
||||
=============
|
||||
|
||||
Breaking changes:
|
||||
|
||||
* A new Python API is now available to use Glances as a Python lib in your hown development #3237
|
||||
* In the process list, the long command line is now truncated by default. Use the arrow keys to show the full command line. SHIFT + arrow keys are used to switch between column sorts (TUI).
|
||||
* Prometheus export format is now more user friendly (see detail in #3283)
|
||||
|
||||
Enhancements:
|
||||
|
||||
* Make a Glances API in order to use Glances as a Python lib #3237
|
||||
* Add a new --fetch (neofetch like) option to display a snapshot of the current system status #3281
|
||||
* Show used port in container section #2054
|
||||
* Show long command line with arrow key #1553
|
||||
* Sensors plugin refresh by default every 10 seconds
|
||||
* Do not call update if a call is done to a specific plugin through the API #3033
|
||||
* [UI] Process virtual memory display can be disable by configuration #3299
|
||||
* Choose between used or available in the mem plugin #3288
|
||||
* [Experimental] Add export to DuckDB database #3205
|
||||
* Add Disk I/O Latency stats #1070
|
||||
* Filter fields to export #3258
|
||||
* Remove .keys() from loops over dicts #3253
|
||||
* Remove iterator helpers #3252
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* [MACOS] Glances not showing Processes on MacOS #3100
|
||||
* Last dev build broke Homepage API calls ? only 1 widget still working #3322
|
||||
* Cloud plugin always generate communication with 169.254.169.254, even if the plugin is disabled #3316
|
||||
* API response delay (3+ minutes) when VMs are running #3317
|
||||
* [WINDOWS] Glances do not display CPU stat correctly #3155
|
||||
* Glances hangs if network device (NFS) is no available #3290
|
||||
* Fix prometheus export format #3283
|
||||
* Issue #3279 zfs cache and memory math issues #3289
|
||||
* [MACOS] Glances crashes when I try to filter #3266
|
||||
* Glances hang when killing process with muliple CTRL-C #3264
|
||||
* Issues after disabling system and processcount plugins #3248
|
||||
* Headers missing from predefined fields in TUI browser machine list #3250
|
||||
* Add another check for the famous Netifaces issue - Related to #3219
|
||||
* Key error 'type' in server_list_static.py (load_server_list) #3247
|
||||
|
||||
Continious integration and documentation:
|
||||
|
||||
* Glances now use uv for the dev environment #3025
|
||||
* Glances is compatible with Python 3.14 #3319
|
||||
* Glances provides requirements files with specific versions for each release
|
||||
* Requirements files are now generated dynamically with the make requirements or requirements-upgrade target
|
||||
* Add duplicate line check in pre-commit (strange behavor with some VScode extension)
|
||||
* Solve issue with multiprocessing exception with Snap package
|
||||
* Add a test script for identify CPU consumption of sensor plugin
|
||||
* Refactor port to take into account netifaces2
|
||||
* Correct issue with Chrome driver in WebUI unit test
|
||||
* Upgrade export test with InfluxDB 1.12
|
||||
* Fix typo of --export-process-filter help message #3314
|
||||
* In the outdated feature, catch error message if Pypi server not reachable
|
||||
* Add unit test for auto_unit
|
||||
* Label error in docs #3286
|
||||
* Put WebUI conf generator in a dedicated script
|
||||
* Refactor the Makefile to generate WebUI config file for all webui targets
|
||||
* Update sensors documentation #3275
|
||||
* Update docker compose env quote #3273
|
||||
* Update docker-compose.yml #3249
|
||||
* Update API doc generation
|
||||
* Update README with nice icons #3236
|
||||
* Add documentation for WebUI test
|
||||
|
||||
Thanks to all contributors and bug reporters !
|
||||
|
||||
Special thanks to:
|
||||
- Adi
|
||||
- Bennett Kanuka
|
||||
- Tim Potter
|
||||
- Ariel Otilibili
|
||||
- Boris Okassa
|
||||
- Lawrence
|
||||
- Shohei YOSHIDA
|
||||
- jmwallach
|
||||
- korn3r
|
||||
|
||||
=============
|
||||
Version 4.3.3
|
||||
=============
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* Something in 4.3.2 broke the home assistant add-on for Glances #3238
|
||||
|
||||
Thanks to the FastAPI and Home Assistant community for the support.
|
||||
|
||||
=============
|
||||
Version 4.3.2
|
||||
=============
|
||||
|
||||
Enhancements:
|
||||
|
||||
* Add stats about running VMS (qemu/libvirt/kvm support through virsh) #1531
|
||||
* Add support for InfluxDB 3 Core #3182
|
||||
* (postgre)SQL export support / TimeScaleDB #2814
|
||||
* CSV column name now include the plugin name - Related to #2394
|
||||
* Make all results from amps plugins exportable #2394
|
||||
* Make --stdout (csv and json) compliant with client/server mode #3235
|
||||
* API history endpoints shows times without timezone #3218
|
||||
* FR: Sort Sensors my name in proper number order #3132
|
||||
* In the FS module, do not display threshold for volume mounted in 'ro' (read-only) #3143
|
||||
* Add a new field in the process list to identifie Zombie process #3178
|
||||
* Update plugin containers display and order #3186
|
||||
* Implement a basic memory cache with TTL for API call (set to ~1 second) #3202
|
||||
* Add container inactive_file & limit to InfluxDB2 export #3206
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* [GPU] AMD Plugin: Operation not permitted #3125
|
||||
* Container memory stats not displayed #3142
|
||||
* [WEBUI] Irix mode (per core instead of per CPU percentage) not togglable #3158
|
||||
* Related to iteritems, itervalues, and iterkeys are not more needed in Python 3 #3181
|
||||
* Glances Central Browser should use name instead of IP adress for redirection #3103
|
||||
* Glances breaks if Podman container is started while it is running #3199
|
||||
|
||||
Continious integration and documentation:
|
||||
|
||||
* Add a new option --print-completion to generate shell tab completion - #3111
|
||||
* Improve Restful API documentation embeded in FastAPI #2632
|
||||
* Upgrade JS libs #3147
|
||||
* Improve unittest for CSV export #3150
|
||||
* Improve unittest for InfluxDB plugin #3149
|
||||
* Code refactoring - Rename plugin class to <Plugin name>Plugin instead of PluginModel #3169
|
||||
* Refactor code to limit the complexity of update_views method in plugins #3171
|
||||
|
||||
Thanks to all contributors and bug reporters !
|
||||
|
||||
Special thanks to:
|
||||
- Ariel Otilibili
|
||||
- kenrmayfield
|
||||
|
||||
=============
|
||||
Version 4.3.1
|
||||
=============
|
||||
|
||||
Enhancements:
|
||||
|
||||
* [WebUI] Top processes extended stats and processes filter in Web server mode #410
|
||||
* I'd like a feature to make the forground color for colored background white #3119
|
||||
* -disable-bg in ~/.config/glances.conf #3113
|
||||
* Entry point in the API to get extended process stats #3095
|
||||
* Replace netifaces by netifaces-plus dependencies #3053
|
||||
* Replace docker by containers in glances-grafana-flux.json #3118
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* default_config_dir: Fix config path to include glances/ directory #3106
|
||||
* Cannot set warning/critical temperature for a specific sensor needs test #3102
|
||||
* Try to reduce latency between stat's update and view - #3086
|
||||
* Error on Cloud plugin initialisation make TUI crash #3085
|
||||
|
||||
Continious integration:
|
||||
|
||||
* Add Selenium to test WebUI #3044
|
||||
|
||||
Thanks to all contributors and bug reporters !
|
||||
|
||||
Special thanks to:
|
||||
- Alexander Kuznetsov
|
||||
- Jonathan Chemla
|
||||
- mizulike
|
||||
|
||||
===============
|
||||
Version 4.3.0.8
|
||||
===============
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* IP plugin broken with Netifaces2 #3076
|
||||
* WebUI if is notresponsive on mobile #3059 (second run)
|
||||
|
||||
===============
|
||||
Version 4.3.0.7
|
||||
===============
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* WebUI if is notresponsive on mobile #3059
|
||||
|
||||
===============
|
||||
Version 4.3.0.6
|
||||
===============
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* Browser mode do not working with the sensors plugin #3069
|
||||
* netifaces is deprecated, use netifaces-plus or netifaces2 #3055
|
||||
|
||||
Continuous integration and documentation:
|
||||
|
||||
* Update alpine Docker tag to v3.21 #3061
|
||||
|
||||
===============
|
||||
Version 4.3.0.5
|
||||
===============
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* WebUI errors in 4.3.0.4 on iPad Air (and Browser with low resolution) #3057
|
||||
|
||||
===============
|
||||
Version 4.3.0.4
|
||||
===============
|
||||
|
||||
Continuous integration and documentation:
|
||||
|
||||
* Pin Python version in Ubuntu image to 3.12
|
||||
|
||||
===============
|
||||
Version 4.3.0.3
|
||||
===============
|
||||
|
||||
Continuous integration and documentation:
|
||||
|
||||
* Pin Alpine image to 3.20 (3.21 is not compliant with Netifaces) Related to #3053
|
||||
|
||||
===============
|
||||
Version 4.3.0.2
|
||||
===============
|
||||
|
||||
Enhancements:
|
||||
|
||||
* Revert "Replace netifaces by netifaces-plus" #3053 because it break build on Alpine Image
|
||||
|
||||
===============
|
||||
Version 4.3.0.1
|
||||
===============
|
||||
|
||||
Enhancements:
|
||||
|
||||
* Replace netifaces by netifaces-plus #3053
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* CONTAINERS section missing in 4.3.0 WebUI #3052
|
||||
|
||||
===============
|
||||
Version 4.3.0
|
||||
===============
|
||||
|
||||
Enhancements:
|
||||
|
||||
* Web Based Glances Central Browser #1121
|
||||
* Ability to specify hide or show for smart plugin #2996
|
||||
* Thread mode ('j' hotkey) is not taken into accound in the WebUI #3019
|
||||
* [WEBUI] Clear old alert messages in the WebUI #3042
|
||||
* Raise an (Alert) Event for a group of sensors #3049
|
||||
* Allow processlist columns to be selected in config file #1524
|
||||
* Allow containers columns to be selected in config file #2722
|
||||
* [WebUI] Unecessary space between Processcount and processlist #3032
|
||||
* Add comparable NVML_LIB check for Windows #3000
|
||||
* Change the default path for graph export to /tmp/glances
|
||||
* Improve CCS of WebUI #3024
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* Thresholds not displayed in the WebUI for the DiskIO plugin #1498
|
||||
* FS module alias configuration do not taken into account everytime #3010
|
||||
* Unexpected behaviour while running glances in docker with --export influxdb2 #2904
|
||||
* Correct issue when key name contains space - Related to #2983
|
||||
* Issue with ports plugin (for URL request) #3008
|
||||
* Network problem when no bitrate available #3014
|
||||
* SyntaxError: f-string: unmatched '[' in server list (on the DEVELOP branch only) #3018
|
||||
* Uptime for Docker containers not working #3021
|
||||
* WebUI doesn't display valid time for process list #2902
|
||||
* Bug In the Web-UI, Timestamps for 'Warning or critical alerts' are showing incorrect month #3023
|
||||
* Correct display issue on Containers plugin in WebUI #3028
|
||||
|
||||
Continuous integration and documentation:
|
||||
|
||||
* Bumped minimal Python version to 3.9 #3005
|
||||
* Make the glances/outputs/static/js/uiconfig.json generated automaticaly from the make webui task
|
||||
* Update unit-test for Glances Central Browser
|
||||
* Add unit-test for new entry point in the API (plugin/item/key)
|
||||
* Add a target to start Glances with Htop features
|
||||
* Try new build and publish to Pypi CI actions
|
||||
|
||||
Thanks to all contributors and bug reporters !
|
||||
|
||||
Special thanks to:
|
||||
|
||||
* Ariel Otilibili for code quality improvements #2801
|
||||
|
||||
===============
|
||||
Version 4.2.1
|
||||
===============
|
||||
|
||||
Enhancements:
|
||||
|
||||
* [WEBUI] Came back to default Black Theme / Reduce font size #2993
|
||||
* Improve hide_zero option #2958
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* Possible memory leak #2976
|
||||
* Docker/Podman shoud not flood log file with ERROR if containers list can not be retreived #2994
|
||||
* Using "-w" option gives error: NameError: name 'Any' is not defined #2992
|
||||
* Non blocking error message when Glances starts from a container (alpine-dev image) #2991
|
||||
|
||||
Continuous integration and documentation:
|
||||
|
||||
* Migrate from setup.py to pyproject.yml #2956
|
||||
* Make pyproject.toml's version dynamic #2990
|
||||
|
||||
Thanks to all contributors and bug reporters !
|
||||
|
||||
Special thanks to:
|
||||
|
||||
* @branchvincent for pyproject migration
|
||||
|
||||
===============
|
||||
Version 4.2.0
|
||||
===============
|
||||
|
||||
Enhancements:
|
||||
|
||||
* [WEBUI] Migration to bootstrap 5 #2914
|
||||
* New Ubuntu Multipass VM orchestartor plugin #2252
|
||||
* Show only active Disk I/O (and network interface) #2929
|
||||
* Make the central client UI configurable (example: GPU status) #1289
|
||||
* Please make py-orjson optional: it pulls in dependency on Rust #2930
|
||||
* Use defusedxml lib #2979
|
||||
* Do not display Unknown information in the cloud plugin #2485
|
||||
* Filter Docker containers - #2962
|
||||
* Add retain to availability topic in MQTT plugin #2974
|
||||
* Make fields labelled in Green easier to see #2882
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* In TUI, when processes are filtered, column are not aligned #2980
|
||||
* Can't kill process. Standalone, Ubuntu 24.04 #2942
|
||||
* Internal Server Error #2943
|
||||
* Timezone for warning/errors is incorrect #2901
|
||||
* Error while initializing the containers plugin ('type' object is not subscriptable) #2922
|
||||
* url_prefix do not work in Glances < 4.2.0 - Correct issue with mount #2912
|
||||
* Raid plugin breaks with inactive raid0 arrays #2908
|
||||
* Crash when terminal is resized #2872
|
||||
* Check if server name is not null in the Glances browser - Related to #2861
|
||||
* Only display VMs with a running status (in the Vms plugin)
|
||||
|
||||
Continuous integration and documentation:
|
||||
|
||||
* Incomplete pipx install to allow webui + containers #2955
|
||||
* Stick FastAPI version to 0.82.0 or higher (latest is better) - Related to #2926
|
||||
* api/4/vms returns a dict, thus breaking make test-restful #2918
|
||||
* Migration to Alpine 3.20 and Python 3.12 for Alpine Docker
|
||||
|
||||
Improve code quality (thanks to Ariel Otilibili !):
|
||||
|
||||
* Merge pull request #2959 from ariel-anieli/plugins-port-alerts
|
||||
* Merge pull request #2957 from ariel-anieli/plugin-port-msg
|
||||
* Merge pull request #2954 from ariel-anieli/makefile
|
||||
* Merge pull request #2941 from ariel-anieli/refactor-alert
|
||||
* Merge pull request #2950 from ariel-anieli/revert-commit-01823df9
|
||||
* Merge pull request #2932 from ariel-anieli/refactorize-display-plugin
|
||||
* Merge pull request #2924 from ariel-anieli/makefile
|
||||
* Merge pull request #2919 from ariel-anieli/refactor-plugin-model-msg-curse
|
||||
* Merge pull request #2917 from ariel-anieli/makefile
|
||||
* Merge pull request #2915 from ariel-anieli/refactor-process-thread
|
||||
* Merge pull request #2913 from ariel-anieli/makefile
|
||||
* Merge pull request #2910 from ariel-anieli/makefile
|
||||
* Merge pull request #2900 from ariel-anieli/issue-2801-catch-key
|
||||
* Merge pull request #2907 from ariel-anieli/refactorize-makefile
|
||||
* Merge pull request #2891 from ariel-anieli/issue-2801-plugin-msg-curse
|
||||
* Merge pull request #2884 from ariel-anieli/issue-2801-plugin-update
|
||||
|
||||
Thanks to all contributors and bug reporters !
|
||||
|
||||
Special thanks to:
|
||||
|
||||
* Ariel Otilibili, he has made an incredible work to improve Glances code quality !
|
||||
* RazCrimson, thanks for all your contributions !
|
||||
* Bharath Vignesh J K
|
||||
* Neveda
|
||||
* ey-jo
|
||||
|
||||
===============
|
||||
Version 4.1.2
|
||||
===============
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* AttributeError: 'CpuPercent' object has no attribute 'cpu_percent' #2859
|
||||
|
||||
===============
|
||||
Version 4.1.1
|
||||
===============
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* Sensors data is not exported using InfluxDB2 exporter #2856
|
||||
|
||||
===============
|
||||
Version 4.1.0
|
||||
===============
|
||||
|
||||
Enhancements:
|
||||
|
||||
* Call process_iter.clear_cache() (PsUtil 6+) when Glances user force a refresh (F5 or CTRL-R) #2753
|
||||
* PsUtil 6+ no longer check PID reused #2755
|
||||
* Add support for automatically hiding network interfaces that are down or that don't have any IP addresses #2799
|
||||
|
||||
Bug corrected:
|
||||
|
||||
* API: Network module is disabled but appears in endpoint "all" #2815
|
||||
* API is not compatible with requests containing special/encoding char #2820
|
||||
* 'j' hot key crashes Glances #2831
|
||||
* Raspberry PI - CPU info is not correct #2616
|
||||
* Graph export is broken if there is no graph section in Glances configuration file #2839
|
||||
* Glances API status check returns Error 405 - Method Not Allowed #2841
|
||||
* Rootless podman containers cause glances to fail with KeyError #2827
|
||||
* --export-process-filter Filter using complete command #2824
|
||||
* Exception when Glances is ran with limited plugin list #2822
|
||||
* Disable separator option do not work #2823
|
||||
|
||||
Continuous integration and documentation:
|
||||
|
||||
* test test_107_fs_plugin_method fails on aarch64-linux #2819
|
||||
|
||||
Thanks to all contributors and bug reporters !
|
||||
|
||||
Special thanks to:
|
||||
|
||||
* Bharath Vignesh J K
|
||||
* RazCrimson
|
||||
* Vadim Small
|
||||
|
||||
===============
|
||||
Version 4.0.8
|
||||
===============
|
||||
|
||||
* Make CORS option configurable security webui #2812
|
||||
* When Glances is installed via venv, default configuration file is not used documentation packaging #2803
|
||||
* GET /1272f6e9e8f9d6bfd6de.png results in 404 bug webui #2781 by Emporea was closed May 25, 2024
|
||||
* Screen frequently flickers when outputting to local display bug needs test #2490
|
||||
* Retire ujson for being in maintenance mode dependencies enhancement #2791
|
||||
|
||||
===============
|
||||
Version 4.0.7
|
||||
===============
|
||||
|
||||
* cpu_hz_current not available on NetBSD #2792
|
||||
* SensorType change in REST API breaks compatibility in 4.0.4 #2788
|
||||
|
||||
===============
|
||||
Version 4.0.6
|
||||
===============
|
||||
|
|
@ -56,7 +513,7 @@ See release note in Wiki format: https://github.com/nicolargo/glances/wiki/Glanc
|
|||
**BREAKING CHANGES:**
|
||||
|
||||
* The minimal Python version is 3.8
|
||||
* The Glances API version 3 is replaced by the version 4. So Restfull API URL is now /api/4/ #2610
|
||||
* The Glances API version 3 is replaced by the version 4. So Restful API URL is now /api/4/ #2610
|
||||
* Alias definition change in the configuration file #1735
|
||||
|
||||
Glances version 3.x and lower:
|
||||
|
|
@ -81,9 +538,9 @@ Minimal requirements for Glances version 4 are:
|
|||
* packaging
|
||||
* ujson
|
||||
* pydantic
|
||||
* fastapi (for WebUI / RestFull API)
|
||||
* uvicorn (for WebUI / RestFull API)
|
||||
* jinja2 (for WebUI / RestFull API)
|
||||
* fastapi (for WebUI / RestFul API)
|
||||
* uvicorn (for WebUI / RestFul API)
|
||||
* jinja2 (for WebUI / RestFul API)
|
||||
|
||||
Majors changes between Glances version 3 and version 4:
|
||||
|
||||
|
|
@ -143,7 +600,7 @@ Bug corrected:
|
|||
CI and documentation:
|
||||
|
||||
* New logo for Glances version 4.0 #2713
|
||||
* Update api.rst documentation #2496
|
||||
* Update api-restful.rst documentation #2496
|
||||
* Change Renovate config #2729
|
||||
* Docker compose password unrecognized arguments when applying docs #2698
|
||||
* Docker includes OS Release Volume mount info #2473
|
||||
|
|
@ -158,7 +615,7 @@ Many thinks to the contributors:
|
|||
* Christoph Zimmermann
|
||||
* RazCrimson
|
||||
* Robin Candau
|
||||
* Github GPG acces
|
||||
* Github GPG access
|
||||
* Continuous Integration
|
||||
* Georgiy Timchenko
|
||||
* turbocrime
|
||||
|
|
@ -332,7 +789,7 @@ Documentation and CI:
|
|||
* Update Makefile with comments
|
||||
* Update Python minimal requirement for py3nvlm
|
||||
* Update security policy (user can open private issue directly in Github)
|
||||
* Add a simple run script. Entry point for IDE debuger
|
||||
* Add a simple run script. Entry point for IDE debugger
|
||||
|
||||
Cyber security update:
|
||||
|
||||
|
|
@ -361,7 +818,7 @@ And also a big thanks to @RazCrimson (https://github.com/RazCrimson) for the sup
|
|||
Version 3.3.0.4
|
||||
===============
|
||||
|
||||
Refactor the Docker images factory, from now, only Alpine image wll be provided.
|
||||
Refactor the Docker images factory, from now, only Alpine image will be provided.
|
||||
|
||||
The following Docker images (nicolargo/glances) are availables:
|
||||
|
||||
|
|
@ -409,9 +866,9 @@ Bug corrected:
|
|||
* Correct issue with the regexp filter (use fullmatch instead of match)
|
||||
* Errors when running Glances as web service #1702
|
||||
* Apply alias to Duplicate sensor name #1686
|
||||
* Make the hide function in sensors section compliant with lower/upercase #1590
|
||||
* Make the hide function in sensors section compliant with lower/uppercase #1590
|
||||
* Web UI truncates the days part of CPU time counter of the process list #2108
|
||||
* Correct alignement issue with the diskio plugin (Console UI)
|
||||
* Correct alignment issue with the diskio plugin (Console UI)
|
||||
|
||||
Documentation and CI:
|
||||
|
||||
|
|
@ -521,7 +978,7 @@ Bugs corrected:
|
|||
* Threading.Event.isSet is deprecated in Python 3.10 #2017
|
||||
* Fix code scanning alert - Clear-text logging of sensitive information security #2006
|
||||
* The gpu temperature unit are displayed incorrectly in web ui bug #2002
|
||||
* Doc for 'alert' Restfull/JSON API response documentation #1994
|
||||
* Doc for 'alert' Restful/JSON API response documentation #1994
|
||||
* Show the spinning state of a disk documentation #1993
|
||||
* Web server status check endpoint enhancement #1988
|
||||
* --time parameter being ignored for client/server mode bug #1978
|
||||
|
|
@ -616,7 +1073,7 @@ Bugs corrected:
|
|||
* [3.2.0/3.2.1] keybinding not working anymore #1904
|
||||
* InfluxDB/InfluxDB2 Export object has no attribute hostname #1899
|
||||
|
||||
Documentation: The "make docs" generate RestFull/API documentation file.
|
||||
Documentation: The "make docs" generate RestFul/API documentation file.
|
||||
|
||||
===============
|
||||
Version 3.2.1
|
||||
|
|
@ -678,7 +1135,7 @@ Bugs corrected:
|
|||
* Docker containers information missing with Docker 20.10.x #1878
|
||||
* Get system sensors temperatures thresholds #1864
|
||||
|
||||
Contibutors for this version:
|
||||
Contributors for this version:
|
||||
|
||||
* Nicolargo
|
||||
* Markus Pöschl
|
||||
|
|
@ -1285,7 +1742,7 @@ Enhancements and new features:
|
|||
* Add ZeroMQ exporter (issue #939)
|
||||
* Add CouchDB exporter (issue #928)
|
||||
* Add hotspot Wifi information (issue #937)
|
||||
* Add default interface speed and automatic rate thresolds (issue #718)
|
||||
* Add default interface speed and automatic rate thresholds (issue #718)
|
||||
* Highlight max stats in the processes list (issue #878)
|
||||
* Docker alerts and actions (issue #875)
|
||||
* Glances API returns the processes PPID (issue #926)
|
||||
|
|
@ -1643,7 +2100,7 @@ Version 2.1
|
|||
* Add Glances log message (in the /tmp/glances.log file)
|
||||
The default log level is INFO, you can switch to the DEBUG mode using the -d option on the command line.
|
||||
* Add RESTful API to the Web server mode
|
||||
RESTful API doc: https://github.com/nicolargo/glances/wiki/The-Glances-RESTFULL-JSON-API
|
||||
RESTful API doc: https://github.com/nicolargo/glances/wiki/The-Glances-RESTFUL-JSON-API
|
||||
* Improve SNMP fallback mode for Cisco IOS, VMware ESXi
|
||||
* Add --theme-white feature to optimize display for white background
|
||||
* Experimental history feature (--enable-history option on the command line)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,385 @@
|
|||
Glances 🌟
|
||||
==========
|
||||
|
||||
**Glances** is an open-source system cross-platform monitoring tool.
|
||||
It allows real-time monitoring of various aspects of your system such as
|
||||
CPU, memory, disk, network usage etc. It also allows monitoring of running processes,
|
||||
logged in users, temperatures, voltages, fan speeds etc.
|
||||
It also supports container monitoring, it supports different container management
|
||||
systems such as Docker, LXC. The information is presented in an easy to read dashboard
|
||||
and can also be used for remote monitoring of systems via a web interface or command
|
||||
line interface. It is easy to install and use and can be customized to show only
|
||||
the information that you are interested in.
|
||||
|
||||
In client/server mode, remote monitoring could be done via terminal,
|
||||
Web interface or API (XML-RPC and RESTful).
|
||||
Stats can also be exported to files or external time/value databases, CSV or direct
|
||||
output to STDOUT.
|
||||
|
||||
Glances is written in Python and uses libraries to grab information from
|
||||
your system. It is based on an open architecture where developers can
|
||||
add new plugins or exports modules.
|
||||
|
||||
Usage 👋
|
||||
========
|
||||
|
||||
For the standalone mode, just run:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances
|
||||
|
||||
.. image:: https://github.com/nicolargo/glances/raw/refs/heads/master/docs/_static/glances-responsive-webdesign.png
|
||||
|
||||
For the Web server mode, run:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances -w
|
||||
|
||||
and enter the URL ``http://<ip>:61208`` in your favorite web browser.
|
||||
|
||||
In this mode, a HTTP/Restful API is exposed, see document `RestfulApi`_ for more details.
|
||||
|
||||
.. image:: https://github.com/nicolargo/glances/raw/refs/heads/master/docs/_static/screenshot-web.png
|
||||
|
||||
For the client/server mode (remote monitoring through XML-RPC), run the following command on the server:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances -s
|
||||
|
||||
and this one on the client:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances -c <ip>
|
||||
|
||||
You can also detect and display all Glances servers available on your
|
||||
network (or defined in the configuration file) in TUI:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --browser
|
||||
|
||||
or WebUI:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances -w --browser
|
||||
|
||||
It possible to display raw stats on stdout:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --stdout cpu.user,mem.used,load
|
||||
cpu.user: 30.7
|
||||
mem.used: 3278204928
|
||||
load: {'cpucore': 4, 'min1': 0.21, 'min5': 0.4, 'min15': 0.27}
|
||||
cpu.user: 3.4
|
||||
mem.used: 3275251712
|
||||
load: {'cpucore': 4, 'min1': 0.19, 'min5': 0.39, 'min15': 0.27}
|
||||
...
|
||||
|
||||
or in a CSV format thanks to the stdout-csv option:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --stdout-csv now,cpu.user,mem.used,load
|
||||
now,cpu.user,mem.used,load.cpucore,load.min1,load.min5,load.min15
|
||||
2018-12-08 22:04:20 CEST,7.3,5948149760,4,1.04,0.99,1.04
|
||||
2018-12-08 22:04:23 CEST,5.4,5949136896,4,1.04,0.99,1.04
|
||||
...
|
||||
|
||||
or in a JSON format thanks to the stdout-json option (attribute not supported in this mode in order to have a real JSON object in output):
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --stdout-json cpu,mem
|
||||
cpu: {"total": 29.0, "user": 24.7, "nice": 0.0, "system": 3.8, "idle": 71.4, "iowait": 0.0, "irq": 0.0, "softirq": 0.0, "steal": 0.0, "guest": 0.0, "guest_nice": 0.0, "time_since_update": 1, "cpucore": 4, "ctx_switches": 0, "interrupts": 0, "soft_interrupts": 0, "syscalls": 0}
|
||||
mem: {"total": 7837949952, "available": 2919079936, "percent": 62.8, "used": 4918870016, "free": 2919079936, "active": 2841214976, "inactive": 3340550144, "buffers": 546799616, "cached": 3068141568, "shared": 788156416}
|
||||
...
|
||||
|
||||
Last but not least, you can use the fetch mode to get a quick look of a machine:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --fetch
|
||||
|
||||
Results look like this:
|
||||
|
||||
.. image:: https://github.com/nicolargo/glances/raw/refs/heads/master/docs/_static/screenshot-fetch.png
|
||||
|
||||
Use Glances as a Python library 📚
|
||||
==================================
|
||||
|
||||
You can access the Glances API by importing the `glances.api` module and creating an
|
||||
instance of the `GlancesAPI` class. This instance provides access to all Glances plugins
|
||||
and their fields. For example, to access the CPU plugin and its total field, you can
|
||||
use the following code:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> from glances import api
|
||||
>>> gl = api.GlancesAPI()
|
||||
>>> gl.cpu
|
||||
{'cpucore': 16,
|
||||
'ctx_switches': 1214157811,
|
||||
'guest': 0.0,
|
||||
'idle': 91.4,
|
||||
'interrupts': 991768733,
|
||||
'iowait': 0.3,
|
||||
'irq': 0.0,
|
||||
'nice': 0.0,
|
||||
'soft_interrupts': 423297898,
|
||||
'steal': 0.0,
|
||||
'syscalls': 0,
|
||||
'system': 5.4,
|
||||
'total': 7.3,
|
||||
'user': 3.0}
|
||||
>>> gl.cpu["total"]
|
||||
7.3
|
||||
>>> gl.mem["used"]
|
||||
12498582144
|
||||
>>> gl.auto_unit(gl.mem["used"])
|
||||
11.6G
|
||||
|
||||
If the stats return a list of items (like network interfaces or processes), you can
|
||||
access them by their name:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> gl.network.keys()
|
||||
['wlp0s20f3', 'veth33b370c', 'veth19c7711']
|
||||
>>> gl.network["wlp0s20f3"]
|
||||
{'alias': None,
|
||||
'bytes_all': 362,
|
||||
'bytes_all_gauge': 9242285709,
|
||||
'bytes_all_rate_per_sec': 1032.0,
|
||||
'bytes_recv': 210,
|
||||
'bytes_recv_gauge': 7420522678,
|
||||
'bytes_recv_rate_per_sec': 599.0,
|
||||
'bytes_sent': 152,
|
||||
'bytes_sent_gauge': 1821763031,
|
||||
'bytes_sent_rate_per_sec': 433.0,
|
||||
'interface_name': 'wlp0s20f3',
|
||||
'key': 'interface_name',
|
||||
'speed': 0,
|
||||
'time_since_update': 0.3504955768585205}
|
||||
|
||||
For a complete example of how to use Glances as a library, have a look to the `PythonApi`_.
|
||||
|
||||
Documentation 📜
|
||||
================
|
||||
|
||||
For complete documentation have a look at the readthedocs_ website.
|
||||
|
||||
If you have any question (after RTFM! and the `FAQ`_), please post it on the official Reddit `forum`_ or in GitHub `Discussions`_.
|
||||
|
||||
Gateway to other services 🌐
|
||||
============================
|
||||
|
||||
Glances can export stats to:
|
||||
|
||||
- ``CSV`` file
|
||||
- ``JSON`` file
|
||||
- ``InfluxDB`` server
|
||||
- ``Cassandra`` server
|
||||
- ``CouchDB`` server
|
||||
- ``OpenTSDB`` server
|
||||
- ``Prometheus`` server
|
||||
- ``StatsD`` server
|
||||
- ``ElasticSearch`` server
|
||||
- ``PostgreSQL/TimeScale`` server
|
||||
- ``RabbitMQ/ActiveMQ`` broker
|
||||
- ``ZeroMQ`` broker
|
||||
- ``Kafka`` broker
|
||||
- ``Riemann`` server
|
||||
- ``Graphite`` server
|
||||
- ``RESTful`` endpoint
|
||||
|
||||
Installation 🚀
|
||||
===============
|
||||
|
||||
There are several methods to test/install Glances on your system. Choose your weapon!
|
||||
|
||||
PyPI: Pip, the standard way
|
||||
---------------------------
|
||||
|
||||
Glances is on ``PyPI``. By using PyPI, you will be using the latest stable version.
|
||||
|
||||
To install Glances, simply use the ``pip`` command line.
|
||||
|
||||
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
|
||||
|
||||
pip install --user glances
|
||||
|
||||
*Note*: Python headers are required to install `psutil`_, a Glances
|
||||
dependency. For example, on Debian/Ubuntu **the simplest** is
|
||||
``apt install python3-psutil`` or alternatively need to install first
|
||||
the *python-dev* package and gcc (*python-devel* on Fedora/CentOS/RHEL).
|
||||
For Windows, just install psutil from the binary installation file.
|
||||
|
||||
By default, Glances is installed **without** the Web interface dependencies.
|
||||
To install it, use the following command:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
pip install --user 'glances[web]'
|
||||
|
||||
For a full installation (with all features, see features list bellow):
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
pip install --user 'glances[all]'
|
||||
|
||||
Features list:
|
||||
|
||||
- all: install dependencies for all features
|
||||
- action: install dependencies for action feature
|
||||
- browser: install dependencies for Glances centram browser
|
||||
- cloud: install dependencies for cloud plugin
|
||||
- containers: install dependencies for container plugin
|
||||
- export: install dependencies for all exports modules
|
||||
- gpu: install dependencies for GPU plugin
|
||||
- graph: install dependencies for graph export
|
||||
- ip: install dependencies for IP public option
|
||||
- raid: install dependencies for RAID plugin
|
||||
- sensors: install dependencies for sensors plugin
|
||||
- smart: install dependencies for smart plugin
|
||||
- snmp: install dependencies for SNMP
|
||||
- sparklines: install dependencies for sparklines option
|
||||
- web: install dependencies for Webserver (WebUI) and Web API
|
||||
- wifi: install dependencies for Wifi plugin
|
||||
|
||||
To upgrade Glances to the latest version:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
pip install --user --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
|
||||
-------------------------------
|
||||
|
||||
Install PipX on your system (apt install pipx on Ubuntu).
|
||||
|
||||
Install Glances (with all features):
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
pipx install 'glances[all]'
|
||||
|
||||
The glances script will be installed in the ~/.local/bin folder.
|
||||
|
||||
Shell tab completion 🔍
|
||||
=======================
|
||||
|
||||
Glances 4.3.2 and higher includes shell tab autocompletion thanks to the --print-completion option.
|
||||
|
||||
For example, on a Linux operating system with bash shell:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ mkdir -p ${XDG_DATA_HOME:="$HOME/.local/share"}/bash-completion
|
||||
$ glances --print-completion bash > ${XDG_DATA_HOME:="$HOME/.local/share"}/bash-completion/glances
|
||||
$ source ${XDG_DATA_HOME:="$HOME/.local/share"}/bash-completion/glances
|
||||
|
||||
Following shells are supported: bash, zsh and tcsh.
|
||||
|
||||
Requirements 🧩
|
||||
===============
|
||||
|
||||
Glances is developed in Python. A minimal Python version 3.10 or higher
|
||||
should be installed on your system.
|
||||
|
||||
*Note for Python 2 users*
|
||||
|
||||
Glances version 4 or higher do not support Python 2 (and Python 3 < 3.10).
|
||||
Please uses Glances version 3.4.x if you need Python 2 support.
|
||||
|
||||
Dependencies:
|
||||
|
||||
- ``psutil`` (better with latest version)
|
||||
- ``defusedxml`` (in order to monkey patch xmlrpc)
|
||||
- ``packaging`` (for the version comparison)
|
||||
- ``windows-curses`` (Windows Curses implementation) [Windows-only]
|
||||
- ``shtab`` (Shell autocompletion) [All but Windows]
|
||||
- ``jinja2`` (for fetch mode and templating)
|
||||
|
||||
Extra dependencies:
|
||||
|
||||
- ``batinfo`` (for battery monitoring)
|
||||
- ``bernhard`` (for the Riemann export module)
|
||||
- ``cassandra-driver`` (for the Cassandra export module)
|
||||
- ``chevron`` (for the action script feature)
|
||||
- ``docker`` (for the Containers Docker monitoring support)
|
||||
- ``elasticsearch`` (for the Elastic Search export module)
|
||||
- ``FastAPI`` and ``Uvicorn`` (for Web server mode)
|
||||
- ``graphitesender`` (For the Graphite export module)
|
||||
- ``hddtemp`` (for HDD temperature monitoring support) [Linux-only]
|
||||
- ``influxdb`` (for the InfluxDB version 1 export module)
|
||||
- ``influxdb-client`` (for the InfluxDB version 2 export module)
|
||||
- ``kafka-python`` (for the Kafka export module)
|
||||
- ``nvidia-ml-py`` (for the GPU plugin)
|
||||
- ``pycouchdb`` (for the CouchDB export module)
|
||||
- ``pika`` (for the RabbitMQ/ActiveMQ export module)
|
||||
- ``podman`` (for the Containers Podman monitoring support)
|
||||
- ``potsdb`` (for the OpenTSDB export module)
|
||||
- ``prometheus_client`` (for the Prometheus export module)
|
||||
- ``psycopg[binary]`` (for the PostgreSQL/TimeScale export module)
|
||||
- ``pygal`` (for the graph export module)
|
||||
- ``pymdstat`` (for RAID support) [Linux-only]
|
||||
- ``pymongo`` (for the MongoDB export module)
|
||||
- ``pysnmp-lextudio`` (for SNMP support)
|
||||
- ``pySMART.smartx`` (for HDD Smart support) [Linux-only]
|
||||
- ``pyzmq`` (for the ZeroMQ export module)
|
||||
- ``requests`` (for the Ports, Cloud plugins and RESTful export module)
|
||||
- ``sparklines`` (for the Quick Plugin sparklines option)
|
||||
- ``statsd`` (for the StatsD export module)
|
||||
- ``wifi`` (for the wifi plugin) [Linux-only]
|
||||
- ``zeroconf`` (for the autodiscover mode)
|
||||
|
||||
Project sponsorship 🙌
|
||||
======================
|
||||
|
||||
You can help me to achieve my goals of improving this open-source project
|
||||
or just say "thank you" by:
|
||||
|
||||
- sponsor me using one-time or monthly tier Github sponsors_ page
|
||||
- send me some pieces of bitcoin: 185KN9FCix3svJYp7JQM7hRMfSKyeaJR4X
|
||||
- buy me a gift on my wishlist_ page
|
||||
|
||||
Any and all contributions are greatly appreciated.
|
||||
|
||||
Authors and Contributors 🔥
|
||||
===========================
|
||||
|
||||
Nicolas Hennion (@nicolargo) <nicolas@nicolargo.com>
|
||||
|
||||
.. image:: https://img.shields.io/twitter/url/https/twitter.com/cloudposse.svg?style=social&label=Follow%20%40nicolargo
|
||||
:target: https://twitter.com/nicolargo
|
||||
|
||||
License 📜
|
||||
==========
|
||||
|
||||
Glances is distributed under the LGPL version 3 license. See ``COPYING`` for more details.
|
||||
|
||||
.. _psutil: https://github.com/giampaolo/psutil
|
||||
.. _readthedocs: https://glances.readthedocs.io/
|
||||
.. _forum: https://www.reddit.com/r/glances/
|
||||
.. _sponsors: https://github.com/sponsors/nicolargo
|
||||
.. _wishlist: https://www.amazon.fr/hz/wishlist/ls/BWAAQKWFR3FI?ref_=wl_share
|
||||
.. _PythonApi: https://glances.readthedocs.io/en/develop/api/python.html
|
||||
.. _RestfulApi: https://glances.readthedocs.io/en/develop/api/restful.html
|
||||
.. _FAQ: https://github.com/nicolargo/glances/blob/develop/docs/faq.rst
|
||||
.. _Discussions: https://github.com/nicolargo/glances/discussions
|
||||
567
README.rst
|
|
@ -1,10 +1,18 @@
|
|||
===============================
|
||||
Glances - An eye on your system
|
||||
===============================
|
||||
.. raw:: html
|
||||
|
||||
| |pypi| |test| |contibutors| |quality|
|
||||
| |starts| |docker| |pypistat|
|
||||
| |sponsors| |twitter|
|
||||
<div align="center">
|
||||
|
||||
.. image:: ./docs/_static/glances-responsive-webdesign.png
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<h1>Glances</h1>
|
||||
|
||||
An Eye on your System
|
||||
|
||||
| |pypi| |test| |contributors| |quality|
|
||||
| |starts| |docker| |pypistat| |sponsors|
|
||||
| |reddit|
|
||||
|
||||
.. |pypi| image:: https://img.shields.io/pypi/v/glances.svg
|
||||
:target: https://pypi.python.org/pypi/Glances
|
||||
|
|
@ -25,9 +33,9 @@ Glances - An eye on your system
|
|||
:target: https://github.com/nicolargo/glances/actions
|
||||
:alt: Linux tests (GitHub Actions)
|
||||
|
||||
.. |contibutors| image:: https://img.shields.io/github/contributors/nicolargo/glances
|
||||
.. |contributors| image:: https://img.shields.io/github/contributors/nicolargo/glances
|
||||
:target: https://github.com/nicolargo/glances/issues?q=is%3Aissue+is%3Aopen+label%3A%22needs+contributor%22
|
||||
:alt: Contibutors
|
||||
:alt: Contributors
|
||||
|
||||
.. |quality| image:: https://scrutinizer-ci.com/g/nicolargo/glances/badges/quality-score.png?b=develop
|
||||
:target: https://scrutinizer-ci.com/g/nicolargo/glances/?branch=develop
|
||||
|
|
@ -37,12 +45,20 @@ Glances - An eye on your system
|
|||
:target: https://github.com/sponsors/nicolargo
|
||||
:alt: Sponsors
|
||||
|
||||
.. |twitter| image:: https://img.shields.io/twitter/url/https/twitter.com/cloudposse.svg?style=social&label=Follow%20%40nicolargo
|
||||
.. |twitter| image:: https://img.shields.io/badge/X-000000?style=for-the-badge&logo=x&logoColor=white
|
||||
:target: https://twitter.com/nicolargo
|
||||
:alt: @nicolargo
|
||||
|
||||
Summary
|
||||
=======
|
||||
.. |reddit| image:: https://img.shields.io/badge/Reddit-FF4500?style=for-the-badge&logo=reddit&logoColor=white
|
||||
:target: https://www.reddit.com/r/glances/
|
||||
:alt: @reddit
|
||||
|
||||
.. raw:: html
|
||||
|
||||
</div>
|
||||
|
||||
Summary 🌟
|
||||
==========
|
||||
|
||||
**Glances** is an open-source system cross-platform monitoring tool.
|
||||
It allows real-time monitoring of various aspects of your system such as
|
||||
|
|
@ -54,99 +70,199 @@ and can also be used for remote monitoring of systems via a web interface or com
|
|||
line interface. It is easy to install and use and can be customized to show only
|
||||
the information that you are interested in.
|
||||
|
||||
.. image:: https://raw.githubusercontent.com/nicolargo/glances/develop/docs/_static/glances-summary.png
|
||||
|
||||
In client/server mode, remote monitoring could be done via terminal,
|
||||
Web interface or API (XML-RPC and RESTful).
|
||||
Stats can also be exported to files or external time/value databases, CSV or direct
|
||||
output to STDOUT.
|
||||
|
||||
.. image:: https://raw.githubusercontent.com/nicolargo/glances/develop/docs/_static/glances-responsive-webdesign.png
|
||||
|
||||
Glances is written in Python and uses libraries to grab information from
|
||||
your system. It is based on an open architecture where developers can
|
||||
add new plugins or exports modules.
|
||||
|
||||
Project sponsorship
|
||||
===================
|
||||
Usage 👋
|
||||
========
|
||||
|
||||
You can help me to achieve my goals of improving this open-source project
|
||||
or just say "thank you" by:
|
||||
For the standalone mode, just run:
|
||||
|
||||
- sponsor me using one-time or monthly tier Github sponsors_ page
|
||||
- send me some pieces of bitcoin: 185KN9FCix3svJYp7JQM7hRMfSKyeaJR4X
|
||||
- buy me a gift on my wishlist_ page
|
||||
.. code-block:: console
|
||||
|
||||
Any and all contributions are greatly appreciated.
|
||||
$ glances
|
||||
|
||||
Requirements
|
||||
============
|
||||
.. image:: ./docs/_static/glances-summary.png
|
||||
|
||||
- ``python>=3.8`` (use Glances 3.4.x for lower Python version)
|
||||
- ``psutil`` (better with latest version)
|
||||
- ``defusedxml`` (in order to monkey patch xmlrpc)
|
||||
- ``packaging`` (for the version comparison)
|
||||
- ``ujson`` (an optimized alternative to the standard json module)
|
||||
For the Web server mode, run:
|
||||
|
||||
*Note for Python 2 users*
|
||||
.. code-block:: console
|
||||
|
||||
Glances version 4 or higher do not support Python 2 (and Python 3 < 3.8).
|
||||
Please uses Glances version 3.4.x if you need Python 2 support.
|
||||
$ glances -w
|
||||
|
||||
Optional dependencies:
|
||||
and enter the URL ``http://<ip>:61208`` in your favorite web browser.
|
||||
|
||||
- ``batinfo`` (for battery monitoring)
|
||||
- ``bernhard`` (for the Riemann export module)
|
||||
- ``cassandra-driver`` (for the Cassandra export module)
|
||||
- ``chevron`` (for the action script feature)
|
||||
- ``docker`` (for the Containers Docker monitoring support)
|
||||
- ``elasticsearch`` (for the Elastic Search export module)
|
||||
- ``FastAPI`` and ``Uvicorn`` (for Web server mode)
|
||||
- ``graphitesender`` (For the Graphite export module)
|
||||
- ``hddtemp`` (for HDD temperature monitoring support) [Linux-only]
|
||||
- ``influxdb`` (for the InfluxDB version 1 export module)
|
||||
- ``influxdb-client`` (for the InfluxDB version 2 export module)
|
||||
- ``jinja2`` (for templating, used under the hood by FastAPI)
|
||||
- ``kafka-python`` (for the Kafka export module)
|
||||
- ``netifaces`` (for the IP plugin)
|
||||
- ``nvidia-ml-py`` (for the GPU plugin)
|
||||
- ``pycouchdb`` (for the CouchDB export module)
|
||||
- ``pika`` (for the RabbitMQ/ActiveMQ export module)
|
||||
- ``podman`` (for the Containers Podman monitoring support)
|
||||
- ``potsdb`` (for the OpenTSDB export module)
|
||||
- ``prometheus_client`` (for the Prometheus export module)
|
||||
- ``py-cpuinfo`` (for the Quicklook CPU info module)
|
||||
- ``pygal`` (for the graph export module)
|
||||
- ``pymdstat`` (for RAID support) [Linux-only]
|
||||
- ``pymongo`` (for the MongoDB export module)
|
||||
- ``pysnmp-lextudio`` (for SNMP support)
|
||||
- ``pySMART.smartx`` (for HDD Smart support) [Linux-only]
|
||||
- ``pyzmq`` (for the ZeroMQ export module)
|
||||
- ``requests`` (for the Ports, Cloud plugins and RESTful export module)
|
||||
- ``sparklines`` (for the Quick Plugin sparklines option)
|
||||
- ``statsd`` (for the StatsD export module)
|
||||
- ``wifi`` (for the wifi plugin) [Linux-only]
|
||||
- ``zeroconf`` (for the autodiscover mode)
|
||||
In this mode, a HTTP/Restful API is exposed, see document `RestfulApi`_ for more details.
|
||||
|
||||
Installation
|
||||
============
|
||||
.. image:: ./docs/_static/screenshot-web.png
|
||||
|
||||
For the client/server mode (remote monitoring through XML-RPC), run the following command on the server:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances -s
|
||||
|
||||
and this one on the client:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances -c <ip>
|
||||
|
||||
You can also detect and display all Glances servers available on your
|
||||
network (or defined in the configuration file) in TUI:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --browser
|
||||
|
||||
or WebUI:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances -w --browser
|
||||
|
||||
It possible to display raw stats on stdout:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --stdout cpu.user,mem.used,load
|
||||
cpu.user: 30.7
|
||||
mem.used: 3278204928
|
||||
load: {'cpucore': 4, 'min1': 0.21, 'min5': 0.4, 'min15': 0.27}
|
||||
cpu.user: 3.4
|
||||
mem.used: 3275251712
|
||||
load: {'cpucore': 4, 'min1': 0.19, 'min5': 0.39, 'min15': 0.27}
|
||||
...
|
||||
|
||||
or in a CSV format thanks to the stdout-csv option:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --stdout-csv now,cpu.user,mem.used,load
|
||||
now,cpu.user,mem.used,load.cpucore,load.min1,load.min5,load.min15
|
||||
2018-12-08 22:04:20 CEST,7.3,5948149760,4,1.04,0.99,1.04
|
||||
2018-12-08 22:04:23 CEST,5.4,5949136896,4,1.04,0.99,1.04
|
||||
...
|
||||
|
||||
or in a JSON format thanks to the stdout-json option (attribute not supported in this mode in order to have a real JSON object in output):
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --stdout-json cpu,mem
|
||||
cpu: {"total": 29.0, "user": 24.7, "nice": 0.0, "system": 3.8, "idle": 71.4, "iowait": 0.0, "irq": 0.0, "softirq": 0.0, "steal": 0.0, "guest": 0.0, "guest_nice": 0.0, "time_since_update": 1, "cpucore": 4, "ctx_switches": 0, "interrupts": 0, "soft_interrupts": 0, "syscalls": 0}
|
||||
mem: {"total": 7837949952, "available": 2919079936, "percent": 62.8, "used": 4918870016, "free": 2919079936, "active": 2841214976, "inactive": 3340550144, "buffers": 546799616, "cached": 3068141568, "shared": 788156416}
|
||||
...
|
||||
|
||||
Last but not least, you can use the fetch mode to get a quick look of a machine:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --fetch
|
||||
|
||||
Results look like this:
|
||||
|
||||
.. image:: ./docs/_static/screenshot-fetch.png
|
||||
|
||||
Use Glances as a Python library 📚
|
||||
==================================
|
||||
|
||||
You can access the Glances API by importing the `glances.api` module and creating an
|
||||
instance of the `GlancesAPI` class. This instance provides access to all Glances plugins
|
||||
and their fields. For example, to access the CPU plugin and its total field, you can
|
||||
use the following code:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> from glances import api
|
||||
>>> gl = api.GlancesAPI()
|
||||
>>> gl.cpu
|
||||
{'cpucore': 16,
|
||||
'ctx_switches': 1214157811,
|
||||
'guest': 0.0,
|
||||
'idle': 91.4,
|
||||
'interrupts': 991768733,
|
||||
'iowait': 0.3,
|
||||
'irq': 0.0,
|
||||
'nice': 0.0,
|
||||
'soft_interrupts': 423297898,
|
||||
'steal': 0.0,
|
||||
'syscalls': 0,
|
||||
'system': 5.4,
|
||||
'total': 7.3,
|
||||
'user': 3.0}
|
||||
>>> gl.cpu.get("total")
|
||||
7.3
|
||||
>>> gl.mem.get("used")
|
||||
12498582144
|
||||
>>> gl.auto_unit(gl.mem.get("used"))
|
||||
11.6G
|
||||
|
||||
If the stats return a list of items (like network interfaces or processes), you can
|
||||
access them by their name:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> gl.network.keys()
|
||||
['wlp0s20f3', 'veth33b370c', 'veth19c7711']
|
||||
>>> gl.network.get("wlp0s20f3")
|
||||
{'alias': None,
|
||||
'bytes_all': 362,
|
||||
'bytes_all_gauge': 9242285709,
|
||||
'bytes_all_rate_per_sec': 1032.0,
|
||||
'bytes_recv': 210,
|
||||
'bytes_recv_gauge': 7420522678,
|
||||
'bytes_recv_rate_per_sec': 599.0,
|
||||
'bytes_sent': 152,
|
||||
'bytes_sent_gauge': 1821763031,
|
||||
'bytes_sent_rate_per_sec': 433.0,
|
||||
'interface_name': 'wlp0s20f3',
|
||||
'key': 'interface_name',
|
||||
'speed': 0,
|
||||
'time_since_update': 0.3504955768585205}
|
||||
|
||||
For a complete example of how to use Glances as a library, have a look to the `PythonApi`_.
|
||||
|
||||
Documentation 📜
|
||||
================
|
||||
|
||||
For complete documentation have a look at the readthedocs_ website.
|
||||
|
||||
If you have any question (after RTFM! and the `FAQ`_), please post it on the official Reddit `forum`_ or in GitHub `Discussions`_.
|
||||
|
||||
Gateway to other services 🌐
|
||||
============================
|
||||
|
||||
Glances can export stats to:
|
||||
|
||||
- files: ``CSV`` and ``JSON``
|
||||
- databases: ``InfluxDB``, ``ElasticSearch``, ``PostgreSQL/TimeScale``, ``Cassandra``, ``CouchDB``, ``OpenTSDB``, ``Prometheus``, ``StatsD``, ``Riemann`` and ``Graphite``
|
||||
- brokers: ``RabbitMQ/ActiveMQ``, ``NATS``, ``ZeroMQ`` and ``Kafka``
|
||||
- others: ``RESTful`` endpoint
|
||||
|
||||
Installation 🚀
|
||||
===============
|
||||
|
||||
There are several methods to test/install Glances on your system. Choose your weapon!
|
||||
|
||||
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.
|
||||
|
||||
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 bellow.
|
||||
To install Glances, simply use the ``pip`` command line in an virtual environment.
|
||||
|
||||
.. 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
|
||||
dependency. For example, on Debian/Ubuntu **the simplest** is
|
||||
|
|
@ -154,38 +270,55 @@ dependency. For example, on Debian/Ubuntu **the simplest** is
|
|||
the *python-dev* package and gcc (*python-devel* on Fedora/CentOS/RHEL).
|
||||
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:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
pip install --user 'glances[web]'
|
||||
pip install 'glances[web]'
|
||||
|
||||
For a full installation (with all features):
|
||||
For a full installation (with all features, see features list bellow):
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
pip install --user 'glances[all]'
|
||||
pip install 'glances[all]'
|
||||
|
||||
Features list:
|
||||
|
||||
- all: install dependencies for all features
|
||||
- action: install dependencies for action feature
|
||||
- browser: install dependencies for Glances centram browser
|
||||
- cloud: install dependencies for cloud plugin
|
||||
- containers: install dependencies for container plugin
|
||||
- export: install dependencies for all exports modules
|
||||
- gpu: install dependencies for GPU plugin
|
||||
- graph: install dependencies for graph export
|
||||
- ip: install dependencies for IP public option
|
||||
- raid: install dependencies for RAID plugin
|
||||
- sensors: install dependencies for sensors plugin
|
||||
- smart: install dependencies for smart plugin
|
||||
- snmp: install dependencies for SNMP
|
||||
- sparklines: install dependencies for sparklines option
|
||||
- web: install dependencies for Webserver (WebUI) and Web API
|
||||
- wifi: install dependencies for Wifi plugin
|
||||
|
||||
To upgrade Glances to the latest version:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
pip install --user --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
|
||||
pip install --upgrade glances
|
||||
|
||||
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
|
||||
|
||||
|
|
@ -193,19 +326,19 @@ Install Glances (with all features):
|
|||
|
||||
The glances script will be installed in the ~/.local/bin folder.
|
||||
|
||||
Docker: the cloudy way
|
||||
----------------------
|
||||
|
||||
Glances Docker images are availables. You can use it to monitor your
|
||||
server and all your containers !
|
||||
|
||||
Get the Glances container:
|
||||
To upgrade Glances to the latest version:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
docker pull nicolargo/glances:latest-full
|
||||
pipx upgrade glances
|
||||
|
||||
The following tags are availables:
|
||||
Docker: the cloudy way
|
||||
----------------------
|
||||
|
||||
Glances Docker images are available. You can use it to monitor your
|
||||
server and all your containers !
|
||||
|
||||
The following tags are available:
|
||||
|
||||
- *latest-full* for a full Alpine Glances image (latest release) with all dependencies
|
||||
- *latest* for a basic Alpine Glances (latest release) version with minimal dependencies (FastAPI and Docker)
|
||||
|
|
@ -222,8 +355,6 @@ Run last version of Glances container in *console mode*:
|
|||
|
||||
By default, the /etc/glances/glances.conf file is used (based on docker-compose/glances.conf).
|
||||
|
||||
By default, the /etc/glances/glances.conf file is used (based on docker-compose/glances.conf).
|
||||
|
||||
Additionally, if you want to use your own glances.conf file, you can
|
||||
create your own Dockerfile:
|
||||
|
||||
|
|
@ -251,13 +382,32 @@ Run the container in *Web server mode*:
|
|||
|
||||
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
|
||||
-----------------
|
||||
|
||||
`Glances` is available on many Linux distributions, so you should be
|
||||
able to install it using your favorite package manager. Be aware that
|
||||
when you use this method the operating system `package`_ for `Glances`
|
||||
may not be the latest version and only basics plugins are enabled.
|
||||
able to install it using your favorite package manager. Nevetheless,
|
||||
i do not recommend it. Be aware that when you use this method the operating
|
||||
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
|
||||
not include anymore the JS statics files used by the Web interface
|
||||
|
|
@ -268,13 +418,30 @@ higher, the path to the statics file is configurable (see ``issue2612``).
|
|||
FreeBSD
|
||||
-------
|
||||
|
||||
To install the binary package:
|
||||
On FreeBSD, package name depends on the Python version.
|
||||
|
||||
Check for Python version:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# pkg install py39-glances
|
||||
# python --version
|
||||
|
||||
To install Glances from ports:
|
||||
Install the Glances package:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# pkg install pyXY-glances
|
||||
|
||||
Where X and Y are the Major and Minor Values of your Python System.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
# Example for Python 3.11.3: pkg install py311-glances
|
||||
|
||||
**NOTE:** Check Glances Binary Package Version for your System Architecture.
|
||||
You must have the Correct Python Version Installed which corresponds to the Glances Binary Package.
|
||||
|
||||
To install Glances from Ports:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
|
|
@ -284,9 +451,7 @@ To install Glances from ports:
|
|||
macOS
|
||||
-----
|
||||
|
||||
If you do not want to use the glancesautoinstall script, follow this procedure.
|
||||
|
||||
macOS users can install Glances using ``Homebrew`` or ``MacPorts``.
|
||||
MacOS users can install Glances using ``Homebrew`` or ``MacPorts``.
|
||||
|
||||
Homebrew
|
||||
````````
|
||||
|
|
@ -306,11 +471,7 @@ Windows
|
|||
-------
|
||||
|
||||
Install `Python`_ for Windows (Python 3.4+ ship with pip) and
|
||||
then run the following command:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ pip install glances
|
||||
follow the Glances Pip install procedure.
|
||||
|
||||
Android
|
||||
-------
|
||||
|
|
@ -344,9 +505,7 @@ To install Glances from source:
|
|||
|
||||
.. code-block:: console
|
||||
|
||||
$ wget https://github.com/nicolargo/glances/archive/vX.Y.tar.gz -O - | tar xz
|
||||
$ cd glances-*
|
||||
# python setup.py install
|
||||
$ pip install https://github.com/nicolargo/glances/archive/vX.Y.tar.gz
|
||||
|
||||
*Note*: Python headers are required to install psutil.
|
||||
|
||||
|
|
@ -366,94 +525,77 @@ Ansible
|
|||
|
||||
A Glances ``Ansible`` role is available: https://galaxy.ansible.com/zaxos/glances-ansible-role/
|
||||
|
||||
Usage
|
||||
=====
|
||||
Shell tab completion 🔍
|
||||
=======================
|
||||
|
||||
For the standalone mode, just run:
|
||||
Glances 4.3.2 and higher includes shell tab autocompletion thanks to the --print-completion option.
|
||||
|
||||
For example, on a Linux operating system with bash shell:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances
|
||||
$ mkdir -p ${XDG_DATA_HOME:="$HOME/.local/share"}/bash-completion
|
||||
$ glances --print-completion bash > ${XDG_DATA_HOME:="$HOME/.local/share"}/bash-completion/glances
|
||||
$ source ${XDG_DATA_HOME:="$HOME/.local/share"}/bash-completion/glances
|
||||
|
||||
For the Web server mode, run:
|
||||
Following shells are supported: bash, zsh and tcsh.
|
||||
|
||||
.. code-block:: console
|
||||
Requirements 🧩
|
||||
===============
|
||||
|
||||
$ glances -w
|
||||
Glances is developed in Python. A minimal Python version 3.10 or higher
|
||||
should be installed on your system.
|
||||
|
||||
and enter the URL ``http://<ip>:61208`` in your favorite web browser.
|
||||
*Note for Python 2 users*
|
||||
|
||||
For the client/server mode, run:
|
||||
Glances version 4 or higher do not support Python 2 (and Python 3 < 3.10).
|
||||
Please uses Glances version 3.4.x if you need Python 2 support.
|
||||
|
||||
.. code-block:: console
|
||||
Dependencies:
|
||||
|
||||
$ glances -s
|
||||
- ``psutil`` (better with latest version)
|
||||
- ``defusedxml`` (in order to monkey patch xmlrpc)
|
||||
- ``packaging`` (for the version comparison)
|
||||
- ``windows-curses`` (Windows Curses implementation) [Windows-only]
|
||||
- ``shtab`` (Shell autocompletion) [All but Windows]
|
||||
- ``jinja2`` (for fetch mode and templating)
|
||||
|
||||
on the server side and run:
|
||||
Extra dependencies:
|
||||
|
||||
.. code-block:: console
|
||||
- ``batinfo`` (for battery monitoring)
|
||||
- ``bernhard`` (for the Riemann export module)
|
||||
- ``cassandra-driver`` (for the Cassandra export module)
|
||||
- ``chevron`` (for the action script feature)
|
||||
- ``docker`` (for the Containers Docker monitoring support)
|
||||
- ``elasticsearch`` (for the Elastic Search export module)
|
||||
- ``FastAPI`` and ``Uvicorn`` (for Web server mode)
|
||||
- ``graphitesender`` (For the Graphite export module)
|
||||
- ``hddtemp`` (for HDD temperature monitoring support) [Linux-only]
|
||||
- ``influxdb`` (for the InfluxDB version 1 export module)
|
||||
- ``influxdb-client`` (for the InfluxDB version 2 export module)
|
||||
- ``kafka-python`` (for the Kafka export module)
|
||||
- ``nats-py`` (for the NATS export module)
|
||||
- ``nvidia-ml-py`` (for the GPU plugin)
|
||||
- ``pycouchdb`` (for the CouchDB export module)
|
||||
- ``pika`` (for the RabbitMQ/ActiveMQ export module)
|
||||
- ``podman`` (for the Containers Podman monitoring support)
|
||||
- ``potsdb`` (for the OpenTSDB export module)
|
||||
- ``prometheus_client`` (for the Prometheus export module)
|
||||
- ``psycopg[binary]`` (for the PostgreSQL/TimeScale export module)
|
||||
- ``pygal`` (for the graph export module)
|
||||
- ``pymdstat`` (for RAID support) [Linux-only]
|
||||
- ``pymongo`` (for the MongoDB export module)
|
||||
- ``pysnmp-lextudio`` (for SNMP support)
|
||||
- ``pySMART.smartx`` (for HDD Smart support) [Linux-only]
|
||||
- ``pyzmq`` (for the ZeroMQ export module)
|
||||
- ``requests`` (for the Ports, Cloud plugins and RESTful export module)
|
||||
- ``sparklines`` (for the Quick Plugin sparklines option)
|
||||
- ``statsd`` (for the StatsD export module)
|
||||
- ``wifi`` (for the wifi plugin) [Linux-only]
|
||||
- ``zeroconf`` (for the autodiscover mode)
|
||||
|
||||
$ glances -c <ip>
|
||||
|
||||
on the client one.
|
||||
|
||||
You can also detect and display all Glances servers available on your
|
||||
network or defined in the configuration file:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --browser
|
||||
|
||||
You can also display raw stats on stdout:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --stdout cpu.user,mem.used,load
|
||||
cpu.user: 30.7
|
||||
mem.used: 3278204928
|
||||
load: {'cpucore': 4, 'min1': 0.21, 'min5': 0.4, 'min15': 0.27}
|
||||
cpu.user: 3.4
|
||||
mem.used: 3275251712
|
||||
load: {'cpucore': 4, 'min1': 0.19, 'min5': 0.39, 'min15': 0.27}
|
||||
...
|
||||
|
||||
or in a CSV format thanks to the stdout-csv option:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --stdout-csv now,cpu.user,mem.used,load
|
||||
now,cpu.user,mem.used,load.cpucore,load.min1,load.min5,load.min15
|
||||
2018-12-08 22:04:20 CEST,7.3,5948149760,4,1.04,0.99,1.04
|
||||
2018-12-08 22:04:23 CEST,5.4,5949136896,4,1.04,0.99,1.04
|
||||
...
|
||||
|
||||
or in a JSON format thanks to the stdout-json option (attribute not supported in this mode in order to have a real JSON object in output):
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --stdout-json cpu,mem
|
||||
cpu: {"total": 29.0, "user": 24.7, "nice": 0.0, "system": 3.8, "idle": 71.4, "iowait": 0.0, "irq": 0.0, "softirq": 0.0, "steal": 0.0, "guest": 0.0, "guest_nice": 0.0, "time_since_update": 1, "cpucore": 4, "ctx_switches": 0, "interrupts": 0, "soft_interrupts": 0, "syscalls": 0}
|
||||
mem: {"total": 7837949952, "available": 2919079936, "percent": 62.8, "used": 4918870016, "free": 2919079936, "active": 2841214976, "inactive": 3340550144, "buffers": 546799616, "cached": 3068141568, "shared": 788156416}
|
||||
...
|
||||
|
||||
and RTFM, always.
|
||||
|
||||
Documentation
|
||||
=============
|
||||
|
||||
For complete documentation have a look at the readthedocs_ website.
|
||||
|
||||
If you have any question (after RTFM!), please post it on the official Q&A `forum`_.
|
||||
|
||||
Gateway to other services
|
||||
=========================
|
||||
|
||||
Glances can export stats to: ``CSV`` file, ``JSON`` file, ``InfluxDB``, ``Cassandra``, ``CouchDB``,
|
||||
``OpenTSDB``, ``Prometheus``, ``StatsD``, ``ElasticSearch``, ``RabbitMQ/ActiveMQ``,
|
||||
``ZeroMQ``, ``Kafka``, ``Riemann``, ``Graphite`` and ``RESTful`` server.
|
||||
|
||||
How to contribute ?
|
||||
===================
|
||||
How to contribute ? 🤝
|
||||
======================
|
||||
|
||||
If you want to contribute to the Glances project, read this `wiki`_ page.
|
||||
|
||||
|
|
@ -462,30 +604,53 @@ There is also a chat dedicated to the Glances developers:
|
|||
.. image:: https://badges.gitter.im/Join%20Chat.svg
|
||||
:target: https://gitter.im/nicolargo/glances?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
|
||||
|
||||
Author
|
||||
======
|
||||
Project sponsorship 🙌
|
||||
======================
|
||||
|
||||
You can help me to achieve my goals of improving this open-source project
|
||||
or just say "thank you" by:
|
||||
|
||||
- sponsor me using one-time or monthly tier Github sponsors_ page
|
||||
- send me some pieces of bitcoin: 185KN9FCix3svJYp7JQM7hRMfSKyeaJR4X
|
||||
- buy me a gift on my wishlist_ page
|
||||
|
||||
Any and all contributions are greatly appreciated.
|
||||
|
||||
Authors and Contributors 🔥
|
||||
===========================
|
||||
|
||||
Nicolas Hennion (@nicolargo) <nicolas@nicolargo.com>
|
||||
|
||||
.. image:: https://img.shields.io/twitter/url/https/twitter.com/cloudposse.svg?style=social&label=Follow%20%40nicolargo
|
||||
:target: https://twitter.com/nicolargo
|
||||
|
||||
License
|
||||
=======
|
||||
License 📜
|
||||
==========
|
||||
|
||||
Glances is distributed under the LGPL version 3 license. See ``COPYING`` for more details.
|
||||
|
||||
More stars ! 🌟
|
||||
===============
|
||||
|
||||
Please give us a star on `GitHub`_ if you like this project.
|
||||
|
||||
.. image:: https://api.star-history.com/svg?repos=nicolargo/glances&type=Date
|
||||
:target: https://www.star-history.com/#nicolargo/glances&Date
|
||||
:alt: Star history
|
||||
|
||||
.. _psutil: https://github.com/giampaolo/psutil
|
||||
.. _glancesautoinstall: https://github.com/nicolargo/glancesautoinstall
|
||||
.. _Brew: https://formulae.brew.sh/formula/glances
|
||||
.. _Python: https://www.python.org/getit/
|
||||
.. _Termux: https://play.google.com/store/apps/details?id=com.termux
|
||||
.. _readthedocs: https://glances.readthedocs.io/
|
||||
.. _forum: https://groups.google.com/forum/?hl=en#!forum/glances-users
|
||||
.. _forum: https://www.reddit.com/r/glances/
|
||||
.. _wiki: https://github.com/nicolargo/glances/wiki/How-to-contribute-to-Glances-%3F
|
||||
.. _package: https://repology.org/project/glances/versions
|
||||
.. _sponsors: https://github.com/sponsors/nicolargo
|
||||
.. _wishlist: https://www.amazon.fr/hz/wishlist/ls/BWAAQKWFR3FI?ref_=wl_share
|
||||
.. _issue2021: https://github.com/nicolargo/glances/issues/2021
|
||||
.. _issue2021comment: https://github.com/nicolargo/glances/issues/2021#issuecomment-1197831157
|
||||
.. _issue2612: https://github.com/nicolargo/glances/issues/2612
|
||||
.. _Docker: https://github.com/nicolargo/glances/blob/develop/docs/docker.rst
|
||||
.. _Docker: https://github.com/nicolargo/glances/blob/master/docs/docker.rst
|
||||
.. _GitHub: https://github.com/nicolargo/glances
|
||||
.. _PythonApi: https://glances.readthedocs.io/en/develop/api/python.html
|
||||
.. _RestfulApi: https://glances.readthedocs.io/en/develop/api/restful.html
|
||||
.. _FAQ: https://github.com/nicolargo/glances/blob/develop/docs/faq.rst
|
||||
.. _Discussions: https://github.com/nicolargo/glances/discussions
|
||||
|
|
|
|||
|
|
@ -2,13 +2,10 @@
|
|||
|
||||
## Supported Versions
|
||||
|
||||
Use this section to tell people about which versions of your project are
|
||||
currently being supported with security updates.
|
||||
|
||||
| Version | Support security updates |
|
||||
| ------- | ------------------------ |
|
||||
| 3.x | :white_check_mark: |
|
||||
| < 3.0 | :x: |
|
||||
| 4.x | :white_check_mark: |
|
||||
| < 4.0 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
|
|
@ -31,4 +28,3 @@ If there are any vulnerabilities in {{cookiecutter.project_name}}, don't hesitat
|
|||
4. Please do not disclose the vulnerability publicly until a fix is released!
|
||||
|
||||
Once we have either a) published a fix, or b) declined to address the vulnerability for whatever reason, you are free to publicly disclose it.
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,237 @@
|
|||
# This file was autogenerated by uv via the following command:
|
||||
# uv export --no-emit-workspace --no-hashes --all-extras --no-group dev --output-file all-requirements.txt
|
||||
annotated-doc==0.0.4
|
||||
# via fastapi
|
||||
annotated-types==0.7.0
|
||||
# via pydantic
|
||||
anyio==4.12.0
|
||||
# via
|
||||
# elasticsearch
|
||||
# starlette
|
||||
batinfo==0.4.2 ; sys_platform == 'linux'
|
||||
# via glances
|
||||
bernhard==0.2.6
|
||||
# via glances
|
||||
cassandra-driver==3.29.3
|
||||
# via glances
|
||||
certifi==2025.11.12
|
||||
# via
|
||||
# elastic-transport
|
||||
# influxdb-client
|
||||
# influxdb3-python
|
||||
# requests
|
||||
cffi==2.0.0 ; implementation_name == 'pypy' or platform_python_implementation != 'PyPy'
|
||||
# via
|
||||
# cryptography
|
||||
# pyzmq
|
||||
chardet==5.2.0
|
||||
# via pysmart
|
||||
charset-normalizer==3.4.4
|
||||
# via requests
|
||||
chevron==0.14.0
|
||||
# via glances
|
||||
click==8.1.8
|
||||
# via
|
||||
# geomet
|
||||
# uvicorn
|
||||
colorama==0.4.6 ; sys_platform == 'win32'
|
||||
# via click
|
||||
cryptography==46.0.3
|
||||
# via pysnmpcrypto
|
||||
defusedxml==0.7.1
|
||||
# via glances
|
||||
dnspython==2.8.0
|
||||
# via pymongo
|
||||
docker==7.1.0
|
||||
# via glances
|
||||
elastic-transport==9.2.1
|
||||
# via elasticsearch
|
||||
elasticsearch==9.2.1
|
||||
# via glances
|
||||
exceptiongroup==1.2.2 ; python_full_version < '3.11'
|
||||
# via anyio
|
||||
fastapi==0.128.0
|
||||
# via glances
|
||||
geomet==1.1.0
|
||||
# via cassandra-driver
|
||||
graphitesender==0.11.2
|
||||
# via glances
|
||||
h11==0.16.0
|
||||
# via uvicorn
|
||||
humanfriendly==10.0
|
||||
# via pysmart
|
||||
ibm-cloud-sdk-core==3.24.2
|
||||
# via ibmcloudant
|
||||
ibmcloudant==0.11.2
|
||||
# via glances
|
||||
idna==3.11
|
||||
# via
|
||||
# anyio
|
||||
# requests
|
||||
ifaddr==0.2.0
|
||||
# via zeroconf
|
||||
importlib-metadata==8.7.1
|
||||
# via pygal
|
||||
influxdb==5.3.2
|
||||
# via glances
|
||||
influxdb-client==1.49.0
|
||||
# via glances
|
||||
influxdb3-python==0.16.0
|
||||
# via glances
|
||||
jinja2==3.1.6
|
||||
# via
|
||||
# glances
|
||||
# pysmi-lextudio
|
||||
kafka-python==2.3.0
|
||||
# via glances
|
||||
markupsafe==3.0.3
|
||||
# via jinja2
|
||||
msgpack==1.1.2
|
||||
# via influxdb
|
||||
nats-py==2.12.0
|
||||
# via glances
|
||||
nvidia-ml-py==13.590.44
|
||||
# via glances
|
||||
packaging==25.0
|
||||
# via glances
|
||||
paho-mqtt==2.1.0
|
||||
# via glances
|
||||
pbkdf2==1.3
|
||||
# via wifi
|
||||
pika==1.3.2
|
||||
# via glances
|
||||
ply==3.11
|
||||
# via pysmi-lextudio
|
||||
podman==5.6.0
|
||||
# via glances
|
||||
potsdb==1.0.3
|
||||
# via glances
|
||||
prometheus-client==0.23.1
|
||||
# via glances
|
||||
protobuf==6.33.2
|
||||
# via bernhard
|
||||
psutil==7.2.1
|
||||
# via glances
|
||||
psycopg==3.3.2
|
||||
# via glances
|
||||
psycopg-binary==3.3.2 ; implementation_name != 'pypy'
|
||||
# via psycopg
|
||||
pyarrow==22.0.0
|
||||
# via influxdb3-python
|
||||
pyasn1==0.6.1
|
||||
# via pysnmp-lextudio
|
||||
pycparser==2.23 ; (implementation_name != 'PyPy' and platform_python_implementation != 'PyPy') or (implementation_name == 'pypy' and platform_python_implementation == 'PyPy')
|
||||
# via cffi
|
||||
pydantic==2.12.5
|
||||
# via fastapi
|
||||
pydantic-core==2.41.5
|
||||
# via pydantic
|
||||
pygal==3.1.0
|
||||
# via glances
|
||||
pyjwt==2.10.1
|
||||
# via
|
||||
# ibm-cloud-sdk-core
|
||||
# ibmcloudant
|
||||
pymdstat==0.4.3
|
||||
# via glances
|
||||
pymongo==4.15.5
|
||||
# via glances
|
||||
pyreadline3==3.5.4 ; sys_platform == 'win32'
|
||||
# via humanfriendly
|
||||
pysmart==1.4.2
|
||||
# via glances
|
||||
pysmi-lextudio==1.4.3
|
||||
# via pysnmp-lextudio
|
||||
pysnmp-lextudio==6.1.2
|
||||
# via glances
|
||||
pysnmpcrypto==0.0.4
|
||||
# via pysnmp-lextudio
|
||||
python-dateutil==2.9.0.post0
|
||||
# via
|
||||
# elasticsearch
|
||||
# glances
|
||||
# ibm-cloud-sdk-core
|
||||
# ibmcloudant
|
||||
# influxdb
|
||||
# influxdb-client
|
||||
# influxdb3-python
|
||||
pytz==2025.2
|
||||
# via influxdb
|
||||
pywin32==311 ; sys_platform == 'win32'
|
||||
# via docker
|
||||
pyzmq==27.1.0
|
||||
# via glances
|
||||
reactivex==4.1.0
|
||||
# via
|
||||
# influxdb-client
|
||||
# influxdb3-python
|
||||
requests==2.32.5
|
||||
# via
|
||||
# docker
|
||||
# glances
|
||||
# ibm-cloud-sdk-core
|
||||
# ibmcloudant
|
||||
# influxdb
|
||||
# podman
|
||||
# pysmi-lextudio
|
||||
setuptools==80.9.0
|
||||
# via
|
||||
# influxdb-client
|
||||
# wifi
|
||||
shtab==1.8.0 ; sys_platform != 'win32'
|
||||
# via glances
|
||||
six==1.17.0
|
||||
# via
|
||||
# glances
|
||||
# influxdb
|
||||
# python-dateutil
|
||||
sniffio==1.3.1
|
||||
# via
|
||||
# elastic-transport
|
||||
# elasticsearch
|
||||
sparklines==0.7.0
|
||||
# via glances
|
||||
starlette==0.50.0
|
||||
# via fastapi
|
||||
statsd==4.0.1
|
||||
# via glances
|
||||
termcolor==3.3.0
|
||||
# via sparklines
|
||||
tomli==2.0.2 ; python_full_version < '3.11'
|
||||
# via podman
|
||||
typing-extensions==4.15.0
|
||||
# via
|
||||
# anyio
|
||||
# cryptography
|
||||
# elasticsearch
|
||||
# fastapi
|
||||
# psycopg
|
||||
# pydantic
|
||||
# pydantic-core
|
||||
# reactivex
|
||||
# starlette
|
||||
# typing-inspection
|
||||
# uvicorn
|
||||
typing-inspection==0.4.2
|
||||
# via pydantic
|
||||
tzdata==2025.3 ; sys_platform == 'win32'
|
||||
# via psycopg
|
||||
urllib3==2.6.2
|
||||
# via
|
||||
# docker
|
||||
# elastic-transport
|
||||
# ibm-cloud-sdk-core
|
||||
# influxdb-client
|
||||
# influxdb3-python
|
||||
# podman
|
||||
# requests
|
||||
uvicorn==0.40.0
|
||||
# via glances
|
||||
wifi==0.3.8
|
||||
# via glances
|
||||
windows-curses==2.4.1 ; sys_platform == 'win32'
|
||||
# via glances
|
||||
zeroconf==0.148.0
|
||||
# via glances
|
||||
zipp==3.23.0
|
||||
# via importlib-metadata
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
✨ {{ gl.system['hostname'] }}{{ ' - ' + gl.ip['address'] if gl.ip['address'] else '' }}
|
||||
⚙️ {{ gl.system['hr_name'] }} | Uptime: {{ gl.uptime }}
|
||||
|
||||
💡 LOAD {{ '%0.2f'| format(gl.load['min1']) }} {{ '%0.2f'| format(gl.load['min5']) }} {{ '%0.2f'| format(gl.load['min15']) }}
|
||||
⚡ CPU {{ gl.bar(gl.cpu['total']) }} {{ gl.cpu['total'] }}% of {{ gl.core['log'] }} cores
|
||||
🧠 MEM {{ gl.bar(gl.mem['percent']) }} {{ gl.mem['percent'] }}% ({{ gl.auto_unit(gl.mem['used']) }} {{ gl.auto_unit(gl.mem['total']) }})
|
||||
{% for fs in gl.fs.keys() %}💾 {% if loop.index == 1 %}DISK{% else %} {% endif %} {{ gl.bar(gl.fs[fs]['percent']) }} {{ gl.fs[fs]['percent'] }}% ({{ gl.auto_unit(gl.fs[fs]['used']) }} {{ gl.auto_unit(gl.fs[fs]['size']) }}) for {{ fs }}
|
||||
{% endfor %}{% for net in gl.network.keys() %}📡 {% if loop.index == 1 %}NET{% else %} {% endif %} ↓ {{ gl.auto_unit(gl.network[net]['bytes_recv_rate_per_sec']) }}b/s ↑ {{ gl.auto_unit(gl.network[net]['bytes_sent_rate_per_sec']) }}b/s for {{ net }}
|
||||
{% endfor %}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
_____ _
|
||||
/ ____| |
|
||||
| | __| | __ _ _ __ ___ ___ ___
|
||||
| | |_ | |/ _` | '_ \ / __/ _ \/ __|
|
||||
| |__| | | (_| | | | | (_| __/\__
|
||||
\_____|_|\__,_|_| |_|\___\___||___/
|
||||
|
||||
|
||||
✨ {{ gl.system['hostname'] }}{{ ' - ' + gl.ip['address'] if gl.ip['address'] else '' }}
|
||||
⚙️ {{ gl.system['hr_name'] }} | Uptime: {{ gl.uptime }}
|
||||
|
||||
💡 LOAD {{ '%0.2f'| format(gl.load['min1']) }} {{ '%0.2f'| format(gl.load['min5']) }} {{ '%0.2f'| format(gl.load['min15']) }}
|
||||
⚡ CPU {{ gl.bar(gl.cpu['total']) }} {{ gl.cpu['total'] }}% of {{ gl.core['log'] }} cores
|
||||
🧠 MEM {{ gl.bar(gl.mem['percent']) }} {{ gl.mem['percent'] }}% ({{ gl.auto_unit(gl.mem['used']) }} {{ gl.auto_unit(gl.mem['total']) }})
|
||||
{% for fs in gl.fs.keys() %}💾 {% if loop.index == 1 %}DISK{% else %} {% endif %} {{ gl.bar(gl.fs[fs]['percent']) }} {{ gl.fs[fs]['percent'] }}% ({{ gl.auto_unit(gl.fs[fs]['used']) }} {{ gl.auto_unit(gl.fs[fs]['size']) }}) for {{ fs }}
|
||||
{% endfor %}{% for net in gl.network.keys() %}📡 {% if loop.index == 1 %}NET{% else %} {% endif %} ↓ {{ gl.auto_unit(gl.network[net]['bytes_recv_rate_per_sec']) }}b/s ↑ {{ gl.auto_unit(gl.network[net]['bytes_sent_rate_per_sec']) }}b/s for {{ net }}
|
||||
{% endfor %}
|
||||
🔥 TOP PROCESS by CPU
|
||||
{% for process in gl.top_process() %}{{ loop.index }}️⃣ {{ process['name'][:20] }}{{ ' ' * (20 - process['name'][:20] | length) }} ⚡ {{ process['cpu_percent'] }}% CPU{{ ' ' * (8 - (gl.auto_unit(process['cpu_percent']) | length)) }} 🧠 {{ gl.auto_unit(process['memory_info']['rss']) }}B MEM
|
||||
{% endfor %}
|
||||
🔥 TOP PROCESS by MEM
|
||||
{% for process in gl.top_process(sorted_by='memory_percent', sorted_by_secondary='cpu_percent') %}{{ loop.index }}️⃣ {{ process['name'][:20] }}{{ ' ' * (20 - process['name'][:20] | length) }} 🧠 {{ gl.auto_unit(process['memory_info']['rss']) }}B MEM{{ ' ' * (7 - (gl.auto_unit(process['memory_info']['rss']) | length)) }} ⚡ {{ process['cpu_percent'] }}% CPU
|
||||
{% endfor %}
|
||||
|
|
@ -13,7 +13,7 @@ check_update=true
|
|||
# Default is 1200 values (~1h with the default refresh rate)
|
||||
history_size=1200
|
||||
# Set the way Glances should display the date (default is %Y-%m-%d %H:%M:%S %Z)
|
||||
#strftime_format="%Y-%m-%d %H:%M:%S %Z"
|
||||
#strftime_format=%Y-%m-%d %H:%M:%S %Z
|
||||
# Define external directory for loading additional plugins
|
||||
# The layout follows the glances standard for plugin definitions
|
||||
#plugin_dir=/home/user/dev/plugins
|
||||
|
|
@ -23,12 +23,22 @@ history_size=1200
|
|||
##############################################################################
|
||||
|
||||
[outputs]
|
||||
# Options for all UIs
|
||||
#--------------------
|
||||
# Separator in the Curses and WebUI interface (between top and others plugins)
|
||||
separator=True
|
||||
#separator=True
|
||||
# Set the the Curses and WebUI interface left menu plugin list (comma-separated)
|
||||
#left_menu=network,wifi,connections,ports,diskio,fs,irq,folders,raid,smart,sensors,now
|
||||
# Limit the number of processes to display (in the WebUI)
|
||||
max_processes_display=25
|
||||
#max_processes_display=25
|
||||
#
|
||||
# Specifics options for TUI
|
||||
#--------------------------
|
||||
# Disable background color
|
||||
#disable_bg=True
|
||||
#
|
||||
# Specifics options for WebUI
|
||||
#----------------------------
|
||||
# Set URL prefix for the WebUI and the API
|
||||
# Example: url_prefix=/glances/ => http://localhost/glances/
|
||||
# Note: The final / is mandatory
|
||||
|
|
@ -39,11 +49,28 @@ max_processes_display=25
|
|||
# You can download it in a specific folder
|
||||
# thanks to https://github.com/nicolargo/glances/issues/2021
|
||||
# then configure this folder with the webui_root_path key
|
||||
# Default is folder where glances_restfull_api.py is hosted
|
||||
# Default is folder where glances_restful_api.py is hosted
|
||||
#webui_root_path=
|
||||
# CORS options
|
||||
# Comma separated list of origins that should be permitted to make cross-origin requests.
|
||||
# Default is *
|
||||
#cors_origins=*
|
||||
# Indicate that cookies should be supported for cross-origin requests.
|
||||
# Default is True
|
||||
#cors_credentials=True
|
||||
# Comma separated list of HTTP methods that should be allowed for cross-origin requests.
|
||||
# Default is *
|
||||
#cors_methods=*
|
||||
# Comma separated list of HTTP request headers that should be supported for cross-origin requests.
|
||||
# Default is *
|
||||
#cors_headers=*
|
||||
# Define SSL files (keyfile_password is optional)
|
||||
#ssl_keyfile_password=kfp
|
||||
#ssl_keyfile=./glances.local+3-key.pem
|
||||
#ssl_certfile=./glances.local+3.pem
|
||||
|
||||
##############################################################################
|
||||
# plugins
|
||||
# Plugins
|
||||
##############################################################################
|
||||
|
||||
[quicklook]
|
||||
|
|
@ -104,7 +131,7 @@ user_careful=50
|
|||
user_warning=70
|
||||
user_critical=90
|
||||
user_log=False
|
||||
#user_critical_action=echo {{user}} {{value}} {{max}} > /tmp/cpu.alert
|
||||
#user_critical_action=echo "{{time}} User CPU {{user}} higher than {{critical}}" > /tmp/cpu.alert
|
||||
#
|
||||
system_careful=50
|
||||
system_warning=70
|
||||
|
|
@ -158,12 +185,14 @@ temperature_critical=80
|
|||
|
||||
[mem]
|
||||
disable=False
|
||||
# Display available memory instead of used memory
|
||||
#available=True
|
||||
# Define RAM thresholds in %
|
||||
# Default values if not defined: 50/70/90
|
||||
careful=50
|
||||
#careful_action_repeat=echo {{percent}} >> /tmp/memory.alert
|
||||
warning=70
|
||||
critical=90
|
||||
#critical_action_repeat=echo "{{time}} {{percent}} higher than {{critical}}"" >> /tmp/memory.alert
|
||||
|
||||
[memswap]
|
||||
disable=False
|
||||
|
|
@ -172,6 +201,7 @@ disable=False
|
|||
careful=50
|
||||
warning=70
|
||||
critical=90
|
||||
#warning_action=echo "{{time}} {{percent}} higher than {{warning}}"" > /tmp/memory.alert
|
||||
|
||||
[load]
|
||||
disable=False
|
||||
|
|
@ -199,6 +229,15 @@ tx_critical=90
|
|||
hide=docker.*,lo
|
||||
# Define the list of wireless network interfaces to be show (comma-separated)
|
||||
#show=docker.*
|
||||
# Automatically hide interface not up (default is False)
|
||||
hide_no_up=True
|
||||
# Automatically hide interface with no IP address (default is False)
|
||||
hide_no_ip=True
|
||||
# Set hide_zero to True to automatically hide interface with no traffic
|
||||
hide_zero=False
|
||||
# Set hide_threshold_bytes to an integer value to automatically hide
|
||||
# interface with traffic less or equal than this value
|
||||
#hide_threshold_bytes=0
|
||||
# It is possible to overwrite the bitrate thresholds per interface
|
||||
# WLAN 0 Default limits (in bits per second aka bps) for interface bitrate
|
||||
#wlan0_rx_careful=4000000
|
||||
|
|
@ -209,8 +248,9 @@ hide=docker.*,lo
|
|||
#wlan0_tx_warning=900000
|
||||
#wlan0_tx_critical=1000000
|
||||
#wlan0_tx_log=True
|
||||
#wlan0_rx_critical_action=echo "{{time}} {{interface_name}} RX {{bytes_recv_rate_per_sec}}Bps" > /tmp/network.alert
|
||||
# Alias for network interface name
|
||||
#alias=wlp2s0:WIFI
|
||||
#alias=wlp0s20f3:WIFI
|
||||
|
||||
[ip]
|
||||
# Disable display of private IP address
|
||||
|
|
@ -259,10 +299,41 @@ disable=False
|
|||
# Define the list of hidden disks (comma-separated regexp)
|
||||
#hide=sda2,sda5,loop.*
|
||||
hide=loop.*,/dev/loop.*
|
||||
# Set hide_zero to True to automatically hide disk with no read/write
|
||||
hide_zero=False
|
||||
# Set hide_threshold_bytes to an integer value to automatically hide
|
||||
# interface with traffic less or equal than this value
|
||||
#hide_threshold_bytes=0
|
||||
# Define the list of disks to be show (comma-separated)
|
||||
#show=sda.*
|
||||
# Alias for sda1 and sdb1
|
||||
#alias=sda1:SystemDisk,sdb1:DataDisk
|
||||
# Default latency thresholds (in ms) (rx = read / tx = write)
|
||||
rx_latency_careful=10
|
||||
rx_latency_warning=20
|
||||
rx_latency_critical=50
|
||||
tx_latency_careful=10
|
||||
tx_latency_warning=20
|
||||
tx_latency_critical=50
|
||||
# Set latency thresholds (latency in ms) for a given disk name (rx = read / tx = write)
|
||||
# dm-0_rx_latency_careful=10
|
||||
# dm-0_rx_latency_warning=20
|
||||
# dm-0_rx_latency_critical=50
|
||||
# dm-0_rx_latency_log=False
|
||||
# dm-0_tx_latency_careful=10
|
||||
# dm-0_tx_latency_warning=20
|
||||
# dm-0_tx_latency_critical=50
|
||||
# dm-0_tx_latency_log=False
|
||||
# There is no default bitrate thresholds for disk (because it is not possible to know the disk speed)
|
||||
# Set bitrate thresholds (in bytes per second) for a given disk name (rx = read / tx = write)
|
||||
#dm-0_rx_careful=4000000000
|
||||
#dm-0_rx_warning=5000000000
|
||||
#dm-0_rx_critical=6000000000
|
||||
#dm-0_rx_log=False
|
||||
#dm-0_tx_careful=700000000
|
||||
#dm-0_tx_warning=900000000
|
||||
#dm-0_tx_critical=1000000000
|
||||
#dm-0_tx_log=False
|
||||
|
||||
[fs]
|
||||
disable=False
|
||||
|
|
@ -272,15 +343,19 @@ hide=/boot.*,.*/snap.*
|
|||
#show=/,/srv
|
||||
# Define filesystem space thresholds in %
|
||||
# Default values if not defined: 50/70/90
|
||||
# It is also possible to define per mount point value
|
||||
# Example: /_careful=40
|
||||
careful=50
|
||||
warning=70
|
||||
critical=90
|
||||
# It is also possible to define per mount point value
|
||||
# Example: /_careful=40
|
||||
#/_careful=1
|
||||
#/_warning=5
|
||||
#/_critical=10
|
||||
#/_critical_action=echo "{{time}} {{mnt_point}} filesystem space {{percent}}% higher than {{critical}}%" > /tmp/fs.alert
|
||||
# Allow additional file system types (comma-separated FS type)
|
||||
#allow=shm
|
||||
# Alias for root file system
|
||||
#alias=/:Root
|
||||
#alias=/:Root,/zfspool:ZFS
|
||||
|
||||
[irq]
|
||||
# Documentation: https://glances.readthedocs.io/en/latest/aoa/irq.html
|
||||
|
|
@ -323,6 +398,12 @@ disable=True
|
|||
# Documentation: https://glances.readthedocs.io/en/latest/aoa/smart.html
|
||||
# This plugin is disabled by default
|
||||
disable=True
|
||||
# Define the list of sensors to hide (comma-separated regexp)
|
||||
#hide=.*Hide_this_driver.*
|
||||
# Define the list of sensors to show (comma-separated regexp)
|
||||
#show=.*Drive_Temperature.*
|
||||
# List of attributes to hide (comma separated)
|
||||
#hide_attributes=Self-tests,Errors
|
||||
|
||||
[hddtemp]
|
||||
disable=False
|
||||
|
|
@ -334,27 +415,35 @@ port=7634
|
|||
# Documentation: https://glances.readthedocs.io/en/latest/aoa/sensors.html
|
||||
disable=False
|
||||
# Set the refresh multiplicator for the sensors
|
||||
# By default refresh every Glances refresh * 3 (increase to reduce CPU consumption)
|
||||
#refresh=3
|
||||
# By default refresh every Glances refresh * 5 (increase to reduce CPU consumption)
|
||||
#refresh=5
|
||||
# Hide some sensors (comma separated list of regexp)
|
||||
hide=unknown.*
|
||||
# Show only the following sensors (comma separated list of regexp)
|
||||
#show=CPU.*
|
||||
# Sensors core thresholds (in Celsius...)
|
||||
# Default values are grabbed from the system
|
||||
# By default values are grabbed from the system
|
||||
# Overwrite thresholds for a specific sensor
|
||||
# temperature_core_Ambient_careful=40
|
||||
# temperature_core_Ambient_warning=60
|
||||
# temperature_core_Ambient_critical=85
|
||||
# temperature_core_Ambient_log=True
|
||||
# temperature_core_Ambient_critical_action=echo "{{time}} {{label}} temperature {{value}}{{unit}} higher than {{critical}}{{unit}}" > /tmp/temperature.alert
|
||||
# Overwrite thresholds for a specific type of sensor
|
||||
#temperature_core_careful=45
|
||||
#temperature_core_warning=65
|
||||
#temperature_core_critical=80
|
||||
# Temperatures threshold in °C for hddtemp
|
||||
# Default values if not defined: 45/52/60
|
||||
temperature_hdd_careful=45
|
||||
temperature_hdd_warning=52
|
||||
temperature_hdd_critical=60
|
||||
#temperature_hdd_careful=45
|
||||
#temperature_hdd_warning=52
|
||||
#temperature_hdd_critical=60
|
||||
# Battery threshold in %
|
||||
battery_careful=80
|
||||
battery_warning=90
|
||||
battery_critical=95
|
||||
# Fan speed threashold in RPM
|
||||
# Default values if not defined: 70/80/90
|
||||
#battery_careful=70
|
||||
#battery_warning=80
|
||||
#battery_critical=90
|
||||
# Fan speed threshold in RPM
|
||||
#fan_speed_careful=100
|
||||
# Sensors alias
|
||||
#alias=core 0:CPU Core 0,core 1:CPU Core 1
|
||||
|
|
@ -370,6 +459,12 @@ disable=False
|
|||
# Should be one of the following:
|
||||
# cpu_percent, memory_percent, io_counters, name, cpu_times, username
|
||||
#sort_key=memory_percent
|
||||
# List of stats to disable (not grabed and not display)
|
||||
# Stats that can be disabled: cpu_percent,memory_info,memory_percent,username,cpu_times,num_threads,nice,status,io_counters,cmdline
|
||||
# Stats that can not be disable: pid,name
|
||||
#disable_stats=cpu_percent,memory_info,memory_percent,username,cpu_times,num_threads,nice,status,io_counters,cmdline
|
||||
# Disable display of virtual memory
|
||||
#disable_virtual_memory=True
|
||||
# Define CPU/MEM (per process) thresholds in %
|
||||
# Default values if not defined: 50/70/90
|
||||
cpu_careful=50
|
||||
|
|
@ -386,13 +481,20 @@ mem_critical=90
|
|||
nice_warning=-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
|
||||
#
|
||||
# Nice: Example 2, low priority processes escalate from careful to critical
|
||||
#nice_ok=O
|
||||
#nice_careful=1,2,3,4,5,6,7,8,9
|
||||
#nice_warning=10,11,12,13,14
|
||||
#nice_critical=15,16,17,18,19
|
||||
#
|
||||
# Status: define threshold regarding the process status (first letter of process status)
|
||||
# R: Running, S: Sleeping, Z: Zombie (complete list here https://psutil.readthedocs.io/en/latest/#process-status-constants)
|
||||
status_ok=R,W,P,I
|
||||
status_critical=Z,D
|
||||
# Define the list of processes to export using:
|
||||
# a comma-separated list of Glances filter
|
||||
#export=.*firefox.*,pid:1234
|
||||
# Define a list of process to focus on (comma-separated list of Glances filter)
|
||||
#focus=.*firefox.*,.*python.*
|
||||
|
||||
[ports]
|
||||
disable=False
|
||||
|
|
@ -440,6 +542,15 @@ port_default_gateway=True
|
|||
#web_4_url=https://blog.nicolargo.com/nonexist
|
||||
#web_4_description=Intranet
|
||||
|
||||
[vms]
|
||||
disable=True
|
||||
# Define the maximum VMs size name (default is 20 chars)
|
||||
max_name_size=20
|
||||
# By default, Glances only display running VMs with states:
|
||||
# 'Running', 'Paused', 'Starting' or 'Restarting'
|
||||
# Set the following key to True to display all VMs regarding their states
|
||||
all=False
|
||||
|
||||
[containers]
|
||||
disable=False
|
||||
# Only show specific containers (comma-separated list of container name or regular expression)
|
||||
|
|
@ -450,8 +561,11 @@ disable=False
|
|||
; hide=telegraf
|
||||
# Define the maximum docker size name (default is 20 chars)
|
||||
max_name_size=20
|
||||
; cpu_careful=50
|
||||
# List of stats to disable (not display)
|
||||
# Following stats can be disabled: name,status,uptime,cpu,mem,diskio,networkio,ports,command
|
||||
disable_stats=command
|
||||
# Thresholds for CPU and MEM (in %)
|
||||
; cpu_careful=50
|
||||
; cpu_warning=70
|
||||
; cpu_critical=90
|
||||
; mem_careful=20
|
||||
|
|
@ -485,20 +599,30 @@ disable=False
|
|||
;min_interval=6
|
||||
|
||||
##############################################################################
|
||||
# Client/server
|
||||
# Browser mode - Static servers definition
|
||||
##############################################################################
|
||||
|
||||
[serverlist]
|
||||
# Define columns (comma separated list of <plugin>:<field>:(<key>)) to grab/display
|
||||
# Default is: system:hr_name,load:min5,cpu:total,mem:percent
|
||||
# You can also add stats with key, like sensors:value:Ambient (key is case sensitive)
|
||||
#columns=system:hr_name,load:min5,cpu:total,mem:percent,memswap:percent,sensors:value:Ambient,sensors:value:Composite
|
||||
# Define the static servers list
|
||||
# _protocol can be: rpc (default if not defined) or rest
|
||||
# List is limited to 256 servers max (1 to 256)
|
||||
#server_1_name=localhost
|
||||
#server_1_alias=My local PC
|
||||
#server_1_port=61209
|
||||
#server_1_alias=Local WebUI
|
||||
#server_1_port=61266
|
||||
#server_1_protocol=rest
|
||||
#server_2_name=localhost
|
||||
#server_2_port=61235
|
||||
#server_2_alias=My local PC
|
||||
#server_2_port=61209
|
||||
#server_2_protocol=rpc
|
||||
#server_3_name=192.168.0.17
|
||||
#server_3_alias=Another PC on my network
|
||||
#server_3_port=61209
|
||||
#server_4_name=pasbon
|
||||
#server_1_protocol=rpc
|
||||
#server_4_name=notagooddefinition
|
||||
#server_4_port=61237
|
||||
|
||||
[passwords]
|
||||
|
|
@ -517,11 +641,16 @@ disable=False
|
|||
# Exports
|
||||
##############################################################################
|
||||
|
||||
[export]
|
||||
# Common section for all exporters
|
||||
# Do not export following fields (comma separated list of regex)
|
||||
#exclude_fields=.*_critical,.*_careful,.*_warning,.*\.key$
|
||||
|
||||
[graph]
|
||||
# Configuration for the --export graph option
|
||||
# Set the path where the graph (.svg files) will be created
|
||||
# Can be overwrite by the --graph-path command line option
|
||||
path=/tmp
|
||||
path=/tmp/glances
|
||||
# It is possible to generate the graphs automatically by setting the
|
||||
# generate_every to a non zero value corresponding to the seconds between
|
||||
# two generation. Set it to 0 to disable graph auto generation.
|
||||
|
|
@ -535,7 +664,7 @@ style=DarkStyle
|
|||
[influxdb]
|
||||
# !!!
|
||||
# Will be DEPRECATED in future release.
|
||||
# Please have a look on the new influxdb2 export module (compatible with InfluxDB 1.8.x and 2.x)
|
||||
# Please have a look on the new influxdb3 export module
|
||||
# !!!
|
||||
# Configuration for the --export influxdb option
|
||||
# https://influxdb.com/
|
||||
|
|
@ -564,7 +693,28 @@ port=8086
|
|||
protocol=http
|
||||
org=nicolargo
|
||||
bucket=glances
|
||||
token=EjFUTWe8U-MIseEAkaVIgVnej_TrnbdvEcRkaB1imstW7gapSqy6_6-8XD-yd51V0zUUpDy-kAdVD1purDLuxA==
|
||||
token=PUT_YOUR_INFLUXDB2_TOKEN_HERE
|
||||
# Set the interval between two exports (in seconds)
|
||||
# If the interval is set to 0, the Glances refresh time is used (default behavor)
|
||||
#interval=0
|
||||
# Prefix will be added for all measurement name
|
||||
# Ex: prefix=foo
|
||||
# => foo.cpu
|
||||
# => foo.mem
|
||||
# You can also use dynamic values
|
||||
#prefix=foo
|
||||
# Following tags will be added for all measurements
|
||||
# You can also use dynamic values.
|
||||
# Note: hostname and name (for process) are always added as a tag
|
||||
#tags=foo:bar,spam:eggs,domain:`domainname`
|
||||
|
||||
[influxdb3]
|
||||
# Configuration for the --export influxdb3 option
|
||||
# https://influxdb.com/
|
||||
host=http://localhost:8181
|
||||
org=nicolargo
|
||||
database=glances
|
||||
token=PUT_YOUR_INFLUXDB3_TOKEN_HERE
|
||||
# Set the interval between two exports (in seconds)
|
||||
# If the interval is set to 0, the Glances refresh time is used (default behavor)
|
||||
#interval=0
|
||||
|
|
@ -730,6 +880,26 @@ prefix=glances
|
|||
# By default, system_name = FQDN
|
||||
#system_name=mycomputer
|
||||
|
||||
[timescaledb]
|
||||
# Configuration for the --export timescaledb option
|
||||
# https://www.timescale.com/
|
||||
host=localhost
|
||||
port=5432
|
||||
db=glances
|
||||
user=postgres
|
||||
password=password
|
||||
# Overwrite device name (default is the FQDN)
|
||||
# Most of the time, you should not overwrite this value
|
||||
#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
|
||||
# * enable: Enable (true) or disable (false) the AMP
|
||||
|
|
@ -765,13 +935,13 @@ refresh=3
|
|||
countmax=20
|
||||
|
||||
[amp_conntrack]
|
||||
# Use comma separated for multiple commands (no space around the comma)
|
||||
# Use && separator for multiple commands
|
||||
# If the regex key is not defined, the AMP will be executed every refresh second
|
||||
# and the process count will not be displayed (countmin and countmax will be ignore)
|
||||
enable=false
|
||||
refresh=30
|
||||
one_line=false
|
||||
command=sysctl net.netfilter.nf_conntrack_count;sysctl net.netfilter.nf_conntrack_max
|
||||
command=sysctl net.netfilter.nf_conntrack_count && sysctl net.netfilter.nf_conntrack_max
|
||||
|
||||
[amp_nginx]
|
||||
# Use the NGinx AMP
|
||||
|
|
|
|||
|
|
@ -1,14 +1,395 @@
|
|||
codespell
|
||||
fonttools>=4.43.0 # not directly required, pinned by Snyk to avoid a vulnerability
|
||||
gprof2dot
|
||||
matplotlib
|
||||
memory-profiler
|
||||
numpy>=1.22.2 # not directly required, pinned by Snyk to avoid a vulnerability
|
||||
pillow>=10.0.1 # not directly required, pinned by Snyk to avoid a vulnerability
|
||||
pre-commit
|
||||
py-spy
|
||||
pyright
|
||||
requirements-parser
|
||||
ruff
|
||||
semgrep
|
||||
setuptools>=65.5.1 # not directly required, pinned by Snyk to avoid a vulnerability
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv export --no-hashes --only-dev --output-file dev-requirements.txt
|
||||
alabaster==1.0.0
|
||||
# via sphinx
|
||||
annotated-types==0.7.0
|
||||
# via pydantic
|
||||
anyio==4.12.0
|
||||
# via
|
||||
# httpx
|
||||
# mcp
|
||||
# sse-starlette
|
||||
# starlette
|
||||
attrs==25.4.0
|
||||
# via
|
||||
# glom
|
||||
# jsonschema
|
||||
# outcome
|
||||
# referencing
|
||||
# reuse
|
||||
# semgrep
|
||||
# trio
|
||||
babel==2.17.0
|
||||
# via sphinx
|
||||
boltons==21.0.0
|
||||
# via
|
||||
# face
|
||||
# glom
|
||||
# semgrep
|
||||
boolean-py==5.0
|
||||
# via license-expression
|
||||
bracex==2.6
|
||||
# via wcmatch
|
||||
certifi==2025.11.12
|
||||
# via
|
||||
# httpcore
|
||||
# httpx
|
||||
# requests
|
||||
# selenium
|
||||
cffi==2.0.0 ; (implementation_name != 'pypy' and os_name == 'nt') or platform_python_implementation != 'PyPy'
|
||||
# via
|
||||
# cryptography
|
||||
# trio
|
||||
cfgv==3.5.0
|
||||
# via pre-commit
|
||||
charset-normalizer==3.4.4
|
||||
# via
|
||||
# python-debian
|
||||
# requests
|
||||
click==8.1.8
|
||||
# via
|
||||
# click-option-group
|
||||
# reuse
|
||||
# semgrep
|
||||
# typer
|
||||
# uvicorn
|
||||
click-option-group==0.5.9
|
||||
# via semgrep
|
||||
codespell==2.4.1
|
||||
colorama==0.4.6
|
||||
# via
|
||||
# click
|
||||
# pytest
|
||||
# semgrep
|
||||
# sphinx
|
||||
contourpy==1.3.2 ; python_full_version < '3.11'
|
||||
# via matplotlib
|
||||
contourpy==1.3.3 ; python_full_version >= '3.11'
|
||||
# via matplotlib
|
||||
cryptography==46.0.3
|
||||
# via pyjwt
|
||||
cycler==0.12.1
|
||||
# via matplotlib
|
||||
distlib==0.4.0
|
||||
# via virtualenv
|
||||
docutils==0.21.2
|
||||
# via
|
||||
# rstcheck-core
|
||||
# sphinx
|
||||
# sphinx-rtd-theme
|
||||
exceptiongroup==1.2.2
|
||||
# via
|
||||
# anyio
|
||||
# pytest
|
||||
# semgrep
|
||||
# trio
|
||||
# trio-websocket
|
||||
face==24.0.0
|
||||
# via glom
|
||||
filelock==3.20.2
|
||||
# via virtualenv
|
||||
fonttools==4.61.1
|
||||
# via matplotlib
|
||||
glom==22.1.0
|
||||
# via semgrep
|
||||
googleapis-common-protos==1.72.0
|
||||
# via opentelemetry-exporter-otlp-proto-http
|
||||
gprof2dot==2025.4.14
|
||||
h11==0.16.0
|
||||
# via
|
||||
# httpcore
|
||||
# uvicorn
|
||||
# wsproto
|
||||
httpcore==1.0.9
|
||||
# via httpx
|
||||
httpx==0.28.1
|
||||
# via mcp
|
||||
httpx-sse==0.4.3
|
||||
# via mcp
|
||||
identify==2.6.15
|
||||
# via pre-commit
|
||||
idna==3.11
|
||||
# via
|
||||
# anyio
|
||||
# httpx
|
||||
# requests
|
||||
# trio
|
||||
imagesize==1.4.1
|
||||
# via sphinx
|
||||
importlib-metadata==8.7.1
|
||||
# via opentelemetry-api
|
||||
iniconfig==2.3.0
|
||||
# via pytest
|
||||
jinja2==3.1.6
|
||||
# via
|
||||
# reuse
|
||||
# sphinx
|
||||
jsonschema==4.25.1
|
||||
# via
|
||||
# mcp
|
||||
# semgrep
|
||||
jsonschema-specifications==2025.9.1
|
||||
# via jsonschema
|
||||
kiwisolver==1.4.9
|
||||
# via matplotlib
|
||||
license-expression==30.4.4
|
||||
# via reuse
|
||||
markdown-it-py==4.0.0
|
||||
# via rich
|
||||
markupsafe==3.0.3
|
||||
# via jinja2
|
||||
matplotlib==3.10.8
|
||||
mcp==1.23.3
|
||||
# via semgrep
|
||||
mdurl==0.1.2
|
||||
# via markdown-it-py
|
||||
memory-profiler==0.61.0
|
||||
nodeenv==1.10.0
|
||||
# via
|
||||
# pre-commit
|
||||
# pyright
|
||||
numpy==2.2.6 ; python_full_version < '3.11'
|
||||
# via
|
||||
# contourpy
|
||||
# matplotlib
|
||||
numpy==2.4.0 ; python_full_version >= '3.11'
|
||||
# via
|
||||
# contourpy
|
||||
# matplotlib
|
||||
opentelemetry-api==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.37.0
|
||||
# via opentelemetry-exporter-otlp-proto-http
|
||||
opentelemetry-exporter-otlp-proto-http==1.37.0
|
||||
# via semgrep
|
||||
opentelemetry-instrumentation==0.58b0
|
||||
# via opentelemetry-instrumentation-requests
|
||||
opentelemetry-instrumentation-requests==0.58b0
|
||||
# via semgrep
|
||||
opentelemetry-proto==1.37.0
|
||||
# via
|
||||
# opentelemetry-exporter-otlp-proto-common
|
||||
# opentelemetry-exporter-otlp-proto-http
|
||||
opentelemetry-sdk==1.37.0
|
||||
# via
|
||||
# opentelemetry-exporter-otlp-proto-http
|
||||
# semgrep
|
||||
opentelemetry-semantic-conventions==0.58b0
|
||||
# via
|
||||
# opentelemetry-instrumentation
|
||||
# opentelemetry-instrumentation-requests
|
||||
# opentelemetry-sdk
|
||||
opentelemetry-util-http==0.58b0
|
||||
# via opentelemetry-instrumentation-requests
|
||||
outcome==1.3.0.post0
|
||||
# via
|
||||
# trio
|
||||
# trio-websocket
|
||||
packaging==25.0
|
||||
# via
|
||||
# matplotlib
|
||||
# opentelemetry-instrumentation
|
||||
# pytest
|
||||
# requirements-parser
|
||||
# semgrep
|
||||
# sphinx
|
||||
# webdriver-manager
|
||||
peewee==3.18.3
|
||||
# via semgrep
|
||||
pillow==12.1.0
|
||||
# via matplotlib
|
||||
platformdirs==4.5.1
|
||||
# via virtualenv
|
||||
pluggy==1.6.0
|
||||
# via pytest
|
||||
pre-commit==4.5.1
|
||||
protobuf==6.33.2
|
||||
# via
|
||||
# googleapis-common-protos
|
||||
# opentelemetry-proto
|
||||
psutil==7.2.1
|
||||
# via memory-profiler
|
||||
py-spy==0.4.1
|
||||
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
|
||||
pydantic==2.12.5
|
||||
# via
|
||||
# mcp
|
||||
# pydantic-settings
|
||||
# rstcheck-core
|
||||
pydantic-core==2.41.5
|
||||
# via pydantic
|
||||
pydantic-settings==2.12.0
|
||||
# via mcp
|
||||
pygments==2.19.2
|
||||
# via
|
||||
# pytest
|
||||
# rich
|
||||
# sphinx
|
||||
pyinstrument==5.1.1
|
||||
pyjwt==2.10.1
|
||||
# via mcp
|
||||
pyparsing==3.3.1
|
||||
# via matplotlib
|
||||
pyright==1.1.407
|
||||
pysocks==1.7.1
|
||||
# via urllib3
|
||||
pytest==9.0.2
|
||||
python-dateutil==2.9.0.post0
|
||||
# via matplotlib
|
||||
python-debian==1.0.1
|
||||
# via reuse
|
||||
python-dotenv==1.2.1
|
||||
# via
|
||||
# pydantic-settings
|
||||
# webdriver-manager
|
||||
python-magic==0.4.27
|
||||
# via reuse
|
||||
python-multipart==0.0.21
|
||||
# via mcp
|
||||
pywin32==311 ; sys_platform == 'win32'
|
||||
# via
|
||||
# mcp
|
||||
# semgrep
|
||||
pyyaml==6.0.3
|
||||
# via pre-commit
|
||||
referencing==0.37.0
|
||||
# via
|
||||
# jsonschema
|
||||
# jsonschema-specifications
|
||||
requests==2.32.5
|
||||
# via
|
||||
# opentelemetry-exporter-otlp-proto-http
|
||||
# semgrep
|
||||
# sphinx
|
||||
# webdriver-manager
|
||||
requirements-parser==0.13.0
|
||||
reuse==6.2.0
|
||||
rich==13.5.3
|
||||
# via
|
||||
# semgrep
|
||||
# typer
|
||||
roman-numerals==4.1.0 ; python_full_version >= '3.11'
|
||||
# via roman-numerals-py
|
||||
roman-numerals-py==4.1.0 ; python_full_version >= '3.11'
|
||||
# via sphinx
|
||||
rpds-py==0.30.0
|
||||
# via
|
||||
# jsonschema
|
||||
# referencing
|
||||
rstcheck==6.2.5
|
||||
rstcheck-core==1.2.2
|
||||
# via rstcheck
|
||||
ruamel-yaml==0.19.1
|
||||
# via semgrep
|
||||
ruamel-yaml-clib==0.2.14
|
||||
# via semgrep
|
||||
ruff==0.14.10
|
||||
selenium==4.39.0
|
||||
semgrep==1.146.0
|
||||
setuptools==80.9.0
|
||||
shellingham==1.5.4
|
||||
# via typer
|
||||
six==1.17.0
|
||||
# via python-dateutil
|
||||
sniffio==1.3.1
|
||||
# via trio
|
||||
snowballstemmer==3.0.1
|
||||
# via sphinx
|
||||
sortedcontainers==2.4.0
|
||||
# via trio
|
||||
sphinx==8.1.3 ; python_full_version < '3.11'
|
||||
# via
|
||||
# sphinx-rtd-theme
|
||||
# sphinxcontrib-jquery
|
||||
sphinx==8.2.3 ; python_full_version >= '3.11'
|
||||
# via
|
||||
# sphinx-rtd-theme
|
||||
# sphinxcontrib-jquery
|
||||
sphinx-rtd-theme==3.0.2
|
||||
sphinxcontrib-applehelp==2.0.0
|
||||
# via sphinx
|
||||
sphinxcontrib-devhelp==2.0.0
|
||||
# via sphinx
|
||||
sphinxcontrib-htmlhelp==2.1.0
|
||||
# via sphinx
|
||||
sphinxcontrib-jquery==4.1
|
||||
# via sphinx-rtd-theme
|
||||
sphinxcontrib-jsmath==1.0.1
|
||||
# via sphinx
|
||||
sphinxcontrib-qthelp==2.0.0
|
||||
# via sphinx
|
||||
sphinxcontrib-serializinghtml==2.0.0
|
||||
# via sphinx
|
||||
sse-starlette==3.1.2
|
||||
# via mcp
|
||||
starlette==0.50.0
|
||||
# via
|
||||
# mcp
|
||||
# sse-starlette
|
||||
tomli==2.0.2
|
||||
# via
|
||||
# pytest
|
||||
# semgrep
|
||||
# sphinx
|
||||
tomlkit==0.13.3
|
||||
# via reuse
|
||||
trio==0.32.0
|
||||
# via
|
||||
# selenium
|
||||
# trio-websocket
|
||||
trio-websocket==0.12.2
|
||||
# via selenium
|
||||
typer==0.21.0
|
||||
# via rstcheck
|
||||
typing-extensions==4.15.0
|
||||
# via
|
||||
# anyio
|
||||
# cryptography
|
||||
# mcp
|
||||
# opentelemetry-api
|
||||
# opentelemetry-exporter-otlp-proto-http
|
||||
# opentelemetry-sdk
|
||||
# opentelemetry-semantic-conventions
|
||||
# pydantic
|
||||
# pydantic-core
|
||||
# pyright
|
||||
# referencing
|
||||
# selenium
|
||||
# semgrep
|
||||
# starlette
|
||||
# typer
|
||||
# typing-inspection
|
||||
# uvicorn
|
||||
# virtualenv
|
||||
typing-inspection==0.4.2
|
||||
# via
|
||||
# mcp
|
||||
# pydantic
|
||||
# pydantic-settings
|
||||
urllib3==2.6.2
|
||||
# via
|
||||
# requests
|
||||
# selenium
|
||||
# semgrep
|
||||
uvicorn==0.40.0 ; sys_platform != 'emscripten'
|
||||
# via mcp
|
||||
virtualenv==20.35.4
|
||||
# via pre-commit
|
||||
wcmatch==8.5.2
|
||||
# via semgrep
|
||||
webdriver-manager==4.0.2
|
||||
websocket-client==1.9.0
|
||||
# via selenium
|
||||
wrapt==1.17.3
|
||||
# via opentelemetry-instrumentation
|
||||
wsproto==1.3.2
|
||||
# via trio-websocket
|
||||
zipp==3.23.0
|
||||
# via importlib-metadata
|
||||
|
|
|
|||
|
|
@ -1,5 +0,0 @@
|
|||
reuse
|
||||
setuptools>=65.5.1 # not directly required, pinned by Snyk to avoid a vulnerability
|
||||
sphinx
|
||||
sphinx_rtd_theme
|
||||
ujson
|
||||
|
|
@ -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 compatibilty (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,25 +1,55 @@
|
|||
version: '3.9'
|
||||
services:
|
||||
glances:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: Dockerfile
|
||||
# See all images tags here: https://hub.docker.com/r/nicolargo/glances/tags
|
||||
image: nicolargo/glances:latest-full
|
||||
restart: always
|
||||
|
||||
pid: "host"
|
||||
privileged: true
|
||||
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:
|
||||
- "/:/rootfs:ro"
|
||||
- "/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"
|
||||
# Uncomment for proper distro information in upper panel.
|
||||
# # Works only for distros that do have this file (most of distros do).
|
||||
# - "/etc/os-release:/etc/os-release:ro"
|
||||
|
||||
tmpfs:
|
||||
- /tmp
|
||||
|
||||
environment:
|
||||
- TZ=${TZ}
|
||||
- "GLANCES_OPT=-C /glances/conf/glances.conf -w"
|
||||
# Uncomment for GPU compatibilty (Nvidia) inside the container
|
||||
# deploy:
|
||||
# resources:
|
||||
# reservations:
|
||||
# devices:
|
||||
# - driver: nvidia
|
||||
# count: 1
|
||||
# capabilities: [gpu]
|
||||
# Please set to your local timezone (or use local ${TZ} environment variable if set on your host)
|
||||
- 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
|
||||
# deploy:
|
||||
# resources:
|
||||
# reservations:
|
||||
# devices:
|
||||
# - driver: nvidia
|
||||
# count: 1
|
||||
# capabilities: [gpu]
|
||||
|
||||
# Uncomment to protect Glances WebUI by a login/password (add --password to GLANCES_OPT)
|
||||
# secrets:
|
||||
# - source: glances_password
|
||||
# target: /root/.config/glances/<login>.pwd
|
||||
|
||||
# secrets:
|
||||
# glances_password:
|
||||
# file: ./secrets/glances_password
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ check_update=False
|
|||
# Default is 1200 values (~1h with the default refresh rate)
|
||||
history_size=1200
|
||||
# Set the way Glances should display the date (default is %Y-%m-%d %H:%M:%S %Z)
|
||||
#strftime_format="%Y-%m-%d %H:%M:%S %Z"
|
||||
#strftime_format=%Y-%m-%d %H:%M:%S %Z
|
||||
# Define external directory for loading additional plugins
|
||||
# The layout follows the glances standard for plugin definitions
|
||||
#plugin_dir=/home/user/dev/plugins
|
||||
|
|
@ -23,12 +23,22 @@ history_size=1200
|
|||
##############################################################################
|
||||
|
||||
[outputs]
|
||||
# Options for all UIs
|
||||
#--------------------
|
||||
# Separator in the Curses and WebUI interface (between top and others plugins)
|
||||
separator=True
|
||||
#separator=True
|
||||
# Set the the Curses and WebUI interface left menu plugin list (comma-separated)
|
||||
#left_menu=network,wifi,connections,ports,diskio,fs,irq,folders,raid,smart,sensors,now
|
||||
# Limit the number of processes to display (in the WebUI)
|
||||
max_processes_display=25
|
||||
#
|
||||
# Specifics options for TUI
|
||||
#--------------------------
|
||||
# Disable background color
|
||||
#disable_bg=True
|
||||
#
|
||||
# Specifics options for WebUI
|
||||
#----------------------------
|
||||
# Set URL prefix for the WebUI and the API
|
||||
# Example: url_prefix=/glances/ => http://localhost/glances/
|
||||
# Note: The final / is mandatory
|
||||
|
|
@ -39,11 +49,28 @@ max_processes_display=25
|
|||
# You can download it in a specific folder
|
||||
# thanks to https://github.com/nicolargo/glances/issues/2021
|
||||
# then configure this folder with the webui_root_path key
|
||||
# Default is folder where glances_restfull_api.py is hosted
|
||||
# Default is folder where glances_restful_api.py is hosted
|
||||
#webui_root_path=
|
||||
# CORS options
|
||||
# Comma separated list of origins that should be permitted to make cross-origin requests.
|
||||
# Default is *
|
||||
#cors_origins=*
|
||||
# Indicate that cookies should be supported for cross-origin requests.
|
||||
# Default is True
|
||||
#cors_credentials=True
|
||||
# Comma separated list of HTTP methods that should be allowed for cross-origin requests.
|
||||
# Default is *
|
||||
#cors_methods=*
|
||||
# Comma separated list of HTTP request headers that should be supported for cross-origin requests.
|
||||
# Default is *
|
||||
#cors_headers=*
|
||||
# Define SSL files (keyfile_password is optional)
|
||||
#ssl_keyfile_password=kfp
|
||||
#ssl_keyfile=./glances.local+3-key.pem
|
||||
#ssl_certfile=./glances.local+3.pem
|
||||
|
||||
##############################################################################
|
||||
# plugins
|
||||
# Plugins
|
||||
##############################################################################
|
||||
|
||||
[quicklook]
|
||||
|
|
@ -104,7 +131,7 @@ user_careful=50
|
|||
user_warning=70
|
||||
user_critical=90
|
||||
user_log=False
|
||||
#user_critical_action=echo {{user}} {{value}} {{max}} > /tmp/cpu.alert
|
||||
#user_critical_action=echo "{{time}} User CPU {{user}} higher than {{critical}}" > /tmp/cpu.alert
|
||||
#
|
||||
system_careful=50
|
||||
system_warning=70
|
||||
|
|
@ -158,12 +185,14 @@ temperature_critical=80
|
|||
|
||||
[mem]
|
||||
disable=False
|
||||
# Display available memory instead of used memory
|
||||
#available=True
|
||||
# Define RAM thresholds in %
|
||||
# Default values if not defined: 50/70/90
|
||||
careful=50
|
||||
#careful_action_repeat=echo {{percent}} >> /tmp/memory.alert
|
||||
warning=70
|
||||
critical=90
|
||||
#critical_action_repeat=echo "{{time}} {{percent}} higher than {{critical}}"" >> /tmp/memory.alert
|
||||
|
||||
[memswap]
|
||||
disable=False
|
||||
|
|
@ -172,6 +201,7 @@ disable=False
|
|||
careful=50
|
||||
warning=70
|
||||
critical=90
|
||||
#warning_action=echo "{{time}} {{percent}} higher than {{warning}}"" > /tmp/memory.alert
|
||||
|
||||
[load]
|
||||
disable=False
|
||||
|
|
@ -199,6 +229,15 @@ tx_critical=90
|
|||
#hide=docker.*,lo
|
||||
# Define the list of wireless network interfaces to be show (comma-separated)
|
||||
#show=docker.*
|
||||
# Automatically hide interface not up (default is False)
|
||||
hide_no_up=True
|
||||
# Automatically hide interface with no IP address (default is False)
|
||||
hide_no_ip=True
|
||||
# Set hide_zero to True to automatically hide interface with no traffic
|
||||
hide_zero=False
|
||||
# Set hide_threshold_bytes to an integer value to automatically hide
|
||||
# interface with traffic less or equal than this value
|
||||
#hide_threshold_bytes=0
|
||||
# It is possible to overwrite the bitrate thresholds per interface
|
||||
# WLAN 0 Default limits (in bits per second aka bps) for interface bitrate
|
||||
#wlan0_rx_careful=4000000
|
||||
|
|
@ -209,8 +248,9 @@ tx_critical=90
|
|||
#wlan0_tx_warning=900000
|
||||
#wlan0_tx_critical=1000000
|
||||
#wlan0_tx_log=True
|
||||
#wlan0_rx_critical_action=echo "{{time}} {{interface_name}} RX {{bytes_recv_rate_per_sec}}Bps" > /tmp/network.alert
|
||||
# Alias for network interface name
|
||||
#alias=wlp2s0:WIFI
|
||||
#alias=wlp0s20f3:WIFI
|
||||
|
||||
[ip]
|
||||
# Disable display of private IP address
|
||||
|
|
@ -259,10 +299,41 @@ disable=False
|
|||
# Define the list of hidden disks (comma-separated regexp)
|
||||
#hide=sda2,sda5,loop.*
|
||||
hide=loop.*,/dev/loop.*
|
||||
# Set hide_zero to True to automatically hide disk with no read/write
|
||||
hide_zero=False
|
||||
# Set hide_threshold_bytes to an integer value to automatically hide
|
||||
# interface with traffic less or equal than this value
|
||||
#hide_threshold_bytes=0
|
||||
# Define the list of disks to be show (comma-separated)
|
||||
#show=sda.*
|
||||
# Alias for sda1 and sdb1
|
||||
#alias=sda1:SystemDisk,sdb1:DataDisk
|
||||
# Default latency thresholds (in ms) (rx = read / tx = write)
|
||||
rx_latency_careful=10
|
||||
rx_latency_warning=20
|
||||
rx_latency_critical=50
|
||||
tx_latency_careful=10
|
||||
tx_latency_warning=20
|
||||
tx_latency_critical=50
|
||||
# Set latency thresholds (latency in ms) for a given disk name (rx = read / tx = write)
|
||||
# dm-0_rx_latency_careful=10
|
||||
# dm-0_rx_latency_warning=20
|
||||
# dm-0_rx_latency_critical=50
|
||||
# dm-0_rx_latency_log=False
|
||||
# dm-0_tx_latency_careful=10
|
||||
# dm-0_tx_latency_warning=20
|
||||
# dm-0_tx_latency_critical=50
|
||||
# dm-0_tx_latency_log=False
|
||||
# There is no default bitrate thresholds for disk (because it is not possible to know the disk speed)
|
||||
# Set bitrate thresholds (in bytes per second) for a given disk name (rx = read / tx = write)
|
||||
#dm-0_rx_careful=4000000000
|
||||
#dm-0_rx_warning=5000000000
|
||||
#dm-0_rx_critical=6000000000
|
||||
#dm-0_rx_log=False
|
||||
#dm-0_tx_careful=700000000
|
||||
#dm-0_tx_warning=900000000
|
||||
#dm-0_tx_critical=1000000000
|
||||
#dm-0_tx_log=False
|
||||
|
||||
[fs]
|
||||
disable=False
|
||||
|
|
@ -272,15 +343,19 @@ hide=/boot.*,.*/snap.*
|
|||
#show=/,/srv
|
||||
# Define filesystem space thresholds in %
|
||||
# Default values if not defined: 50/70/90
|
||||
# It is also possible to define per mount point value
|
||||
# Example: /_careful=40
|
||||
careful=50
|
||||
warning=70
|
||||
critical=90
|
||||
# It is also possible to define per mount point value
|
||||
# Example: /_careful=40
|
||||
#/_careful=1
|
||||
#/_warning=5
|
||||
#/_critical=10
|
||||
#/_critical_action=echo "{{time}} {{mnt_point}} filesystem space {{percent}}% higher than {{critical}}%" > /tmp/fs.alert
|
||||
# Allow additional file system types (comma-separated FS type)
|
||||
#allow=shm
|
||||
# Alias for root file system
|
||||
#alias=/:Root
|
||||
#alias=/:Root,/zsfpool:ZSF
|
||||
|
||||
[irq]
|
||||
# Documentation: https://glances.readthedocs.io/en/latest/aoa/irq.html
|
||||
|
|
@ -323,6 +398,12 @@ disable=True
|
|||
# Documentation: https://glances.readthedocs.io/en/latest/aoa/smart.html
|
||||
# This plugin is disabled by default
|
||||
disable=True
|
||||
# Define the list of sensors to hide (comma-separated regexp)
|
||||
#hide=.*Hide_this_driver.*
|
||||
# Define the list of sensors to show (comma-separated regexp)
|
||||
#show=.*Drive_Temperature.*
|
||||
# List of attributes to hide (comma separated)
|
||||
#hide_attributes=Self-tests,Errors
|
||||
|
||||
[hddtemp]
|
||||
disable=False
|
||||
|
|
@ -334,27 +415,35 @@ port=7634
|
|||
# Documentation: https://glances.readthedocs.io/en/latest/aoa/sensors.html
|
||||
disable=False
|
||||
# Set the refresh multiplicator for the sensors
|
||||
# By default refresh every Glances refresh * 3 (increase to reduce CPU consumption)
|
||||
#refresh=3
|
||||
# By default refresh every Glances refresh * 5 (increase to reduce CPU consumption)
|
||||
#refresh=5
|
||||
# Hide some sensors (comma separated list of regexp)
|
||||
hide=unknown.*
|
||||
# Show only the following sensors (comma separated list of regexp)
|
||||
#show=CPU.*
|
||||
# Sensors core thresholds (in Celsius...)
|
||||
# Default values are grabbed from the system
|
||||
# By default values are grabbed from the system
|
||||
# Overwrite thresholds for a specific sensor
|
||||
# temperature_core_Ambient_careful=40
|
||||
# temperature_core_Ambient_warning=60
|
||||
# temperature_core_Ambient_critical=85
|
||||
# temperature_core_Ambient_log=True
|
||||
# temperature_core_Ambient_critical_action=echo "{{time}} {{label}} temperature {{value}}{{unit}} higher than {{critical}}{{unit}}" > /tmp/temperature.alert
|
||||
# Overwrite thresholds for a specific type of sensor
|
||||
#temperature_core_careful=45
|
||||
#temperature_core_warning=65
|
||||
#temperature_core_critical=80
|
||||
# Temperatures threshold in °C for hddtemp
|
||||
# Default values if not defined: 45/52/60
|
||||
temperature_hdd_careful=45
|
||||
temperature_hdd_warning=52
|
||||
temperature_hdd_critical=60
|
||||
#temperature_hdd_careful=45
|
||||
#temperature_hdd_warning=52
|
||||
#temperature_hdd_critical=60
|
||||
# Battery threshold in %
|
||||
battery_careful=80
|
||||
battery_warning=90
|
||||
battery_critical=95
|
||||
# Fan speed threashold in RPM
|
||||
# Default values if not defined: 70/80/90
|
||||
#battery_careful=70
|
||||
#battery_warning=80
|
||||
#battery_critical=90
|
||||
# Fan speed threshold in RPM
|
||||
#fan_speed_careful=100
|
||||
# Sensors alias
|
||||
#alias=core 0:CPU Core 0,core 1:CPU Core 1
|
||||
|
|
@ -370,6 +459,12 @@ disable=False
|
|||
# Should be one of the following:
|
||||
# cpu_percent, memory_percent, io_counters, name, cpu_times, username
|
||||
#sort_key=memory_percent
|
||||
# List of stats to disable (not grabed and not display)
|
||||
# Stats that can be disabled: cpu_percent,memory_info,memory_percent,username,cpu_times,num_threads,nice,status,io_counters,cmdline
|
||||
# Stats that can not be disable: pid,name
|
||||
#disable_stats=cpu_percent,memory_info,memory_percent,username,cpu_times,num_threads,nice,status,io_counters,cmdline
|
||||
# Disable display of virtual memory
|
||||
#disable_virtual_memory=True
|
||||
# Define CPU/MEM (per process) thresholds in %
|
||||
# Default values if not defined: 50/70/90
|
||||
cpu_careful=50
|
||||
|
|
@ -386,13 +481,20 @@ mem_critical=90
|
|||
nice_warning=-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
|
||||
#
|
||||
# Nice: Example 2, low priority processes escalate from careful to critical
|
||||
#nice_ok=O
|
||||
#nice_careful=1,2,3,4,5,6,7,8,9
|
||||
#nice_warning=10,11,12,13,14
|
||||
#nice_critical=15,16,17,18,19
|
||||
#
|
||||
# Status: define threshold regarding the process status (first letter of process status)
|
||||
# R: Running, S: Sleeping, Z: Zombie (complete list here https://psutil.readthedocs.io/en/latest/#process-status-constants)
|
||||
status_ok=R,W,P,I
|
||||
status_critical=Z,D
|
||||
# Define the list of processes to export using:
|
||||
# a comma-separated list of Glances filter
|
||||
#export=.*firefox.*,pid:1234
|
||||
# Define a list of process to focus on (comma-separated list of Glances filter)
|
||||
#focus=.*firefox.*,.*python.*
|
||||
|
||||
[ports]
|
||||
disable=False
|
||||
|
|
@ -440,6 +542,15 @@ port_default_gateway=False
|
|||
#web_4_url=https://blog.nicolargo.com/nonexist
|
||||
#web_4_description=Intranet
|
||||
|
||||
[vms]
|
||||
disable=True
|
||||
# Define the maximum VMs size name (default is 20 chars)
|
||||
max_name_size=20
|
||||
# By default, Glances only display running VMs with states:
|
||||
# 'Running', 'Paused', 'Starting' or 'Restarting'
|
||||
# Set the following key to True to display all VMs regarding their states
|
||||
all=False
|
||||
|
||||
[containers]
|
||||
disable=False
|
||||
# Only show specific containers (comma-separated list of container name or regular expression)
|
||||
|
|
@ -450,8 +561,11 @@ disable=False
|
|||
; hide=telegraf
|
||||
# Define the maximum docker size name (default is 20 chars)
|
||||
max_name_size=20
|
||||
; cpu_careful=50
|
||||
# List of stats to disable (not display)
|
||||
# Following stats can be disabled: name,status,uptime,cpu,mem,diskio,networkio,ports,command
|
||||
disable_stats=command
|
||||
# Thresholds for CPU and MEM (in %)
|
||||
; cpu_careful=50
|
||||
; cpu_warning=70
|
||||
; cpu_critical=90
|
||||
; mem_careful=20
|
||||
|
|
@ -485,20 +599,30 @@ disable=False
|
|||
;min_interval=6
|
||||
|
||||
##############################################################################
|
||||
# Client/server
|
||||
# Browser mode - Static servers definition
|
||||
##############################################################################
|
||||
|
||||
[serverlist]
|
||||
# Define columns (comma separated list of <plugin>:<field>:(<key>)) to grab/display
|
||||
# Default is: system:hr_name,load:min5,cpu:total,mem:percent
|
||||
# You can also add stats with key, like sensors:value:Ambient (key is case sensitive)
|
||||
#columns=system:hr_name,load:min5,cpu:total,mem:percent,memswap:percent,sensors:value:Ambient,sensors:value:Composite
|
||||
# Define the static servers list
|
||||
# _protocol can be: rpc (default if not defined) or rest
|
||||
# List is limited to 256 servers max (1 to 256)
|
||||
#server_1_name=localhost
|
||||
#server_1_alias=My local PC
|
||||
#server_1_port=61209
|
||||
#server_1_alias=Local WebUI
|
||||
#server_1_port=61266
|
||||
#server_1_protocol=rest
|
||||
#server_2_name=localhost
|
||||
#server_2_port=61235
|
||||
#server_2_alias=My local PC
|
||||
#server_2_port=61209
|
||||
#server_2_protocol=rpc
|
||||
#server_3_name=192.168.0.17
|
||||
#server_3_alias=Another PC on my network
|
||||
#server_3_port=61209
|
||||
#server_4_name=pasbon
|
||||
#server_1_protocol=rpc
|
||||
#server_4_name=notagooddefinition
|
||||
#server_4_port=61237
|
||||
|
||||
[passwords]
|
||||
|
|
@ -517,11 +641,16 @@ disable=False
|
|||
# Exports
|
||||
##############################################################################
|
||||
|
||||
[export]
|
||||
# Common section for all exporters
|
||||
# Do not export following fields (comma separated list of regex)
|
||||
#exclude_fields=.*_critical,.*_careful,.*_warning,.*\.key$
|
||||
|
||||
[graph]
|
||||
# Configuration for the --export graph option
|
||||
# Set the path where the graph (.svg files) will be created
|
||||
# Can be overwrite by the --graph-path command line option
|
||||
path=/tmp
|
||||
path=/tmp/glances
|
||||
# It is possible to generate the graphs automatically by setting the
|
||||
# generate_every to a non zero value corresponding to the seconds between
|
||||
# two generation. Set it to 0 to disable graph auto generation.
|
||||
|
|
@ -535,7 +664,7 @@ style=DarkStyle
|
|||
[influxdb]
|
||||
# !!!
|
||||
# Will be DEPRECATED in future release.
|
||||
# Please have a look on the new influxdb2 export module (compatible with InfluxDB 1.8.x and 2.x)
|
||||
# Please have a look on the new influxdb3 export module
|
||||
# !!!
|
||||
# Configuration for the --export influxdb option
|
||||
# https://influxdb.com/
|
||||
|
|
@ -564,7 +693,28 @@ port=8086
|
|||
protocol=http
|
||||
org=nicolargo
|
||||
bucket=glances
|
||||
token=EjFUTWe8U-MIseEAkaVIgVnej_TrnbdvEcRkaB1imstW7gapSqy6_6-8XD-yd51V0zUUpDy-kAdVD1purDLuxA==
|
||||
token=PUT_YOUR_INFLUXDB2_TOKEN_HERE
|
||||
# Set the interval between two exports (in seconds)
|
||||
# If the interval is set to 0, the Glances refresh time is used (default behavor)
|
||||
#interval=0
|
||||
# Prefix will be added for all measurement name
|
||||
# Ex: prefix=foo
|
||||
# => foo.cpu
|
||||
# => foo.mem
|
||||
# You can also use dynamic values
|
||||
#prefix=foo
|
||||
# Following tags will be added for all measurements
|
||||
# You can also use dynamic values.
|
||||
# Note: hostname and name (for process) are always added as a tag
|
||||
#tags=foo:bar,spam:eggs,domain:`domainname`
|
||||
|
||||
[influxdb3]
|
||||
# Configuration for the --export influxdb3 option
|
||||
# https://influxdb.com/
|
||||
host=http://localhost:8181
|
||||
org=nicolargo
|
||||
database=glances
|
||||
token=PUT_YOUR_INFLUXDB3_TOKEN_HERE
|
||||
# Set the interval between two exports (in seconds)
|
||||
# If the interval is set to 0, the Glances refresh time is used (default behavor)
|
||||
#interval=0
|
||||
|
|
@ -730,6 +880,26 @@ prefix=glances
|
|||
# By default, system_name = FQDN
|
||||
#system_name=mycomputer
|
||||
|
||||
[timescaledb]
|
||||
# Configuration for the --export timescaledb option
|
||||
# https://www.timescale.com/
|
||||
host=localhost
|
||||
port=5432
|
||||
db=glances
|
||||
user=postgres
|
||||
password=password
|
||||
# Overwrite device name (default is the FQDN)
|
||||
# Most of the time, you should not overwrite this value
|
||||
#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
|
||||
# * enable: Enable (true) or disable (false) the AMP
|
||||
|
|
@ -765,13 +935,13 @@ refresh=3
|
|||
countmax=20
|
||||
|
||||
[amp_conntrack]
|
||||
# Use comma separated for multiple commands (no space around the comma)
|
||||
# Use && separator for multiple commands
|
||||
# If the regex key is not defined, the AMP will be executed every refresh second
|
||||
# and the process count will not be displayed (countmin and countmax will be ignore)
|
||||
enable=false
|
||||
refresh=30
|
||||
one_line=false
|
||||
command=sysctl net.netfilter.nf_conntrack_count;sysctl net.netfilter.nf_conntrack_max
|
||||
command=sysctl net.netfilter.nf_conntrack_count && sysctl net.netfilter.nf_conntrack_max
|
||||
|
||||
[amp_nginx]
|
||||
# Use the NGinx AMP
|
||||
|
|
|
|||
|
|
@ -9,13 +9,12 @@
|
|||
# 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.
|
||||
# Be aware that if you change the Alpine version, you may have to change the Python version.
|
||||
|
||||
ARG IMAGE_VERSION=3.19
|
||||
ARG PYTHON_VERSION=3.11
|
||||
ARG IMAGE_VERSION=3.23
|
||||
ARG PYTHON_VERSION=3.12
|
||||
|
||||
##############################################################################
|
||||
# Base layer to be used for building dependencies and the release images
|
||||
FROM alpine:${IMAGE_VERSION} as base
|
||||
FROM alpine:${IMAGE_VERSION} AS base
|
||||
|
||||
# Upgrade the system
|
||||
RUN apk update \
|
||||
|
|
@ -35,7 +34,7 @@ RUN apk add --no-cache \
|
|||
# BUILD Stages
|
||||
##############################################################################
|
||||
# BUILD: Base image shared by all build images
|
||||
FROM base as build
|
||||
FROM base AS build
|
||||
ARG PYTHON_VERSION
|
||||
|
||||
RUN apk add --no-cache \
|
||||
|
|
@ -56,31 +55,27 @@ RUN apk add --no-cache \
|
|||
pkgconfig \
|
||||
libffi-dev \
|
||||
openssl-dev \
|
||||
cmake # Issue: https://github.com/nicolargo/glances/issues/2735
|
||||
|
||||
RUN python${PYTHON_VERSION} -m venv venv-build
|
||||
RUN /venv-build/bin/python${PYTHON_VERSION} -m pip install --upgrade pip
|
||||
cmake
|
||||
# for cmake: Issue: https://github.com/nicolargo/glances/issues/2735
|
||||
|
||||
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
|
||||
|
||||
COPY requirements.txt docker-requirements.txt webui-requirements.txt optional-requirements.txt ./
|
||||
COPY pyproject.toml docker-requirements.txt all-requirements.txt ./
|
||||
|
||||
##############################################################################
|
||||
# BUILD: Install the minimal image deps
|
||||
FROM build as buildMinimal
|
||||
FROM build AS buildminimal
|
||||
ARG PYTHON_VERSION
|
||||
|
||||
RUN /venv-build/bin/python${PYTHON_VERSION} -m pip install --target="/venv/lib/python${PYTHON_VERSION}/site-packages" \
|
||||
-r requirements.txt \
|
||||
-r docker-requirements.txt \
|
||||
-r webui-requirements.txt
|
||||
-r docker-requirements.txt
|
||||
|
||||
##############################################################################
|
||||
# BUILD: Install all the deps
|
||||
FROM build as buildFull
|
||||
FROM build AS buildfull
|
||||
ARG PYTHON_VERSION
|
||||
|
||||
# Required for optional dependency cassandra-driver
|
||||
|
|
@ -89,14 +84,13 @@ ARG CASS_DRIVER_NO_CYTHON=1
|
|||
ARG CARGO_NET_GIT_FETCH_WITH_CLI=true
|
||||
|
||||
RUN /venv-build/bin/python${PYTHON_VERSION} -m pip install --target="/venv/lib/python${PYTHON_VERSION}/site-packages" \
|
||||
-r requirements.txt \
|
||||
-r optional-requirements.txt
|
||||
-r all-requirements.txt
|
||||
|
||||
##############################################################################
|
||||
# RELEASE Stages
|
||||
##############################################################################
|
||||
# Base image shared by all releases
|
||||
FROM base as release
|
||||
FROM base AS release
|
||||
ARG PYTHON_VERSION
|
||||
|
||||
# Copy source code and config file
|
||||
|
|
@ -108,36 +102,48 @@ COPY docker-bin.sh /usr/local/bin/glances
|
|||
RUN chmod a+x /usr/local/bin/glances
|
||||
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 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.
|
||||
WORKDIR /app
|
||||
CMD /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
|
||||
FROM release as minimal
|
||||
FROM release AS minimal
|
||||
|
||||
COPY --from=buildMinimal /venv /venv
|
||||
COPY --from=buildminimal /venv /venv
|
||||
|
||||
# USER glances
|
||||
|
||||
################################################################################
|
||||
# RELEASE: full
|
||||
FROM release as full
|
||||
FROM release AS full
|
||||
|
||||
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
|
||||
FROM full as dev
|
||||
FROM full AS dev
|
||||
|
||||
# Forward access and error logs to Docker's log collector
|
||||
RUN ln -sf /dev/stdout /tmp/glances-root.log \
|
||||
&& ln -sf /dev/stderr /var/log/error.log
|
||||
# Add the specific logger configuration file for Docker dev
|
||||
# All logs will be forwarded to stdout
|
||||
COPY ./docker-files/docker-logger.json /app
|
||||
ENV LOG_CFG=/app/docker-logger.json
|
||||
|
||||
# USER glances
|
||||
|
||||
WORKDIR /app
|
||||
ENV PYTHON_VERSION=${PYTHON_VERSION}
|
||||
CMD ["/bin/sh", "-c", "/venv/bin/python${PYTHON_VERSION} -m glances ${GLANCES_OPT}"]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,24 @@
|
|||
{
|
||||
"version": 1,
|
||||
"disable_existing_loggers": "False",
|
||||
"root": { "level": "INFO", "handlers": ["console"] },
|
||||
"formatters": {
|
||||
"standard": { "format": "%(asctime)s -- %(levelname)s -- %(message)s" },
|
||||
"short": { "format": "%(levelname)s -- %(message)s" },
|
||||
"long": {
|
||||
"format": "%(asctime)s -- %(levelname)s -- %(message)s (%(funcName)s in %(filename)s)"
|
||||
},
|
||||
"free": { "format": "%(message)s" }
|
||||
},
|
||||
"handlers": {
|
||||
"console": { "class": "logging.StreamHandler", "formatter": "standard" }
|
||||
},
|
||||
"loggers": {
|
||||
"debug": { "handlers": ["console"], "level": "DEBUG" },
|
||||
"verbose": { "handlers": ["console"], "level": "INFO" },
|
||||
"standard": { "handlers": ["console"], "level": "INFO" },
|
||||
"requests": { "handlers": ["console"], "level": "ERROR" },
|
||||
"elasticsearch": { "handlers": ["console"], "level": "ERROR" },
|
||||
"elasticsearch.trace": { "handlers": ["console"], "level": "ERROR" }
|
||||
}
|
||||
}
|
||||
|
|
@ -13,7 +13,7 @@ ARG PYTHON_VERSION=3.12
|
|||
|
||||
##############################################################################
|
||||
# Base layer to be used for building dependencies and the release images
|
||||
FROM ubuntu:${IMAGE_VERSION} as base
|
||||
FROM ubuntu:${IMAGE_VERSION} AS base
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update \
|
||||
|
|
@ -32,7 +32,7 @@ RUN apt-get update \
|
|||
# BUILD Stages
|
||||
##############################################################################
|
||||
# BUILD: Base image shared by all build images
|
||||
FROM base as build
|
||||
FROM base AS build
|
||||
ARG PYTHON_VERSION
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
|
|
@ -55,32 +55,29 @@ RUN apt-get clean \
|
|||
|
||||
RUN python3 -m venv --without-pip venv
|
||||
|
||||
COPY requirements.txt docker-requirements.txt webui-requirements.txt optional-requirements.txt ./
|
||||
COPY pyproject.toml docker-requirements.txt all-requirements.txt ./
|
||||
|
||||
##############################################################################
|
||||
# BUILD: Install the minimal image deps
|
||||
FROM build as buildMinimal
|
||||
FROM build AS buildminimal
|
||||
ARG PYTHON_VERSION
|
||||
|
||||
RUN python3 -m pip install --target="/venv/lib/python${PYTHON_VERSION}/site-packages" \
|
||||
-r requirements.txt \
|
||||
-r docker-requirements.txt \
|
||||
-r webui-requirements.txt
|
||||
-r docker-requirements.txt
|
||||
|
||||
##############################################################################
|
||||
# BUILD: Install all the deps
|
||||
FROM build as buildFull
|
||||
FROM build AS buildfull
|
||||
ARG PYTHON_VERSION
|
||||
|
||||
RUN python3 -m pip install --target="/venv/lib/python${PYTHON_VERSION}/site-packages" \
|
||||
-r requirements.txt \
|
||||
-r optional-requirements.txt
|
||||
-r all-requirements.txt
|
||||
|
||||
##############################################################################
|
||||
# RELEASE Stages
|
||||
##############################################################################
|
||||
# Base image shared by all releases
|
||||
FROM base as release
|
||||
FROM base AS release
|
||||
ARG PYTHON_VERSION
|
||||
|
||||
# Copy Glances source code and config file
|
||||
|
|
@ -92,28 +89,34 @@ COPY docker-bin.sh /usr/local/bin/glances
|
|||
RUN chmod a+x /usr/local/bin/glances
|
||||
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 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.
|
||||
WORKDIR /app
|
||||
CMD /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
|
||||
FROM release as minimal
|
||||
FROM release AS minimal
|
||||
ARG PYTHON_VERSION
|
||||
|
||||
COPY --from=buildMinimal /venv /venv
|
||||
|
||||
# USER glances
|
||||
|
||||
################################################################################
|
||||
# RELEASE: full
|
||||
FROM release as full
|
||||
FROM release AS full
|
||||
ARG PYTHON_VERSION
|
||||
|
||||
RUN apt-get update \
|
||||
|
|
@ -121,13 +124,22 @@ RUN apt-get update \
|
|||
&& apt-get clean \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY --from=buildFull /venv /venv
|
||||
COPY --from=buildfull /venv /venv
|
||||
|
||||
# USER glances
|
||||
|
||||
################################################################################
|
||||
# RELEASE: dev - to be compatible with CI
|
||||
FROM full as dev
|
||||
FROM full AS dev
|
||||
ARG PYTHON_VERSION
|
||||
|
||||
# Forward access and error logs to Docker's log collector
|
||||
RUN ln -sf /dev/stdout /tmp/glances-root.log \
|
||||
&& ln -sf /dev/stderr /var/log/error.log
|
||||
# Add the specific logger configuration file for Docker dev
|
||||
# All logs will be forwarded to stdout
|
||||
COPY ./docker-files/docker-logger.json /app
|
||||
ENV LOG_CFG=/app/docker-logger.json
|
||||
|
||||
# USER glances
|
||||
|
||||
WORKDIR /app
|
||||
ENV PYTHON_VERSION=${PYTHON_VERSION}
|
||||
CMD ["/bin/sh", "-c", "/venv/bin/python${PYTHON_VERSION} -m glances ${GLANCES_OPT}"]
|
||||
|
|
|
|||
|
|
@ -1,10 +1,83 @@
|
|||
# install with base requirements file
|
||||
-r requirements.txt
|
||||
|
||||
docker>=6.1.1; python_version >= "3.7"
|
||||
packaging; python_version >= "3.7"
|
||||
podman; python_version >= "3.6"
|
||||
python-dateutil
|
||||
requests
|
||||
six
|
||||
urllib3
|
||||
# This file was autogenerated by uv via the following command:
|
||||
# uv export --no-emit-workspace --no-hashes --no-group dev --extra containers --extra web --output-file docker-requirements.txt
|
||||
annotated-doc==0.0.4
|
||||
# via fastapi
|
||||
annotated-types==0.7.0
|
||||
# via pydantic
|
||||
anyio==4.12.0
|
||||
# via starlette
|
||||
certifi==2025.11.12
|
||||
# via requests
|
||||
charset-normalizer==3.4.4
|
||||
# via requests
|
||||
click==8.1.8
|
||||
# via uvicorn
|
||||
colorama==0.4.6 ; sys_platform == 'win32'
|
||||
# via click
|
||||
defusedxml==0.7.1
|
||||
# via glances
|
||||
docker==7.1.0
|
||||
# via glances
|
||||
exceptiongroup==1.2.2 ; python_full_version < '3.11'
|
||||
# via anyio
|
||||
fastapi==0.128.0
|
||||
# via glances
|
||||
h11==0.16.0
|
||||
# via uvicorn
|
||||
idna==3.11
|
||||
# via
|
||||
# anyio
|
||||
# requests
|
||||
jinja2==3.1.6
|
||||
# via glances
|
||||
markupsafe==3.0.3
|
||||
# via jinja2
|
||||
packaging==25.0
|
||||
# via glances
|
||||
podman==5.6.0
|
||||
# via glances
|
||||
psutil==7.2.1
|
||||
# via glances
|
||||
pydantic==2.12.5
|
||||
# via fastapi
|
||||
pydantic-core==2.41.5
|
||||
# via pydantic
|
||||
python-dateutil==2.9.0.post0
|
||||
# via glances
|
||||
pywin32==311 ; sys_platform == 'win32'
|
||||
# via docker
|
||||
requests==2.32.5
|
||||
# via
|
||||
# docker
|
||||
# glances
|
||||
# podman
|
||||
shtab==1.8.0 ; sys_platform != 'win32'
|
||||
# via glances
|
||||
six==1.17.0
|
||||
# via
|
||||
# glances
|
||||
# python-dateutil
|
||||
starlette==0.50.0
|
||||
# via fastapi
|
||||
tomli==2.0.2 ; python_full_version < '3.11'
|
||||
# via podman
|
||||
typing-extensions==4.15.0
|
||||
# via
|
||||
# anyio
|
||||
# fastapi
|
||||
# pydantic
|
||||
# pydantic-core
|
||||
# starlette
|
||||
# typing-inspection
|
||||
# uvicorn
|
||||
typing-inspection==0.4.2
|
||||
# via pydantic
|
||||
urllib3==2.6.2
|
||||
# via
|
||||
# docker
|
||||
# podman
|
||||
# requests
|
||||
uvicorn==0.40.0
|
||||
# via glances
|
||||
windows-curses==2.4.1 ; sys_platform == 'win32'
|
||||
# via glances
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
|
||||
# You can set these variables from the command line.
|
||||
SPHINXOPTS =
|
||||
SPHINXBUILD = ../venv-dev/bin/sphinx-build
|
||||
SPHINXBUILD = ../.venv/bin/sphinx-build
|
||||
PAPER =
|
||||
BUILDDIR = _build
|
||||
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 203 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 83 KiB |
|
|
@ -3,7 +3,7 @@
|
|||
Actions
|
||||
=======
|
||||
|
||||
Glances can trigger actions on events.
|
||||
Glances can trigger actions on events for warning and critical thresholds.
|
||||
|
||||
By ``action``, we mean all shell command line. For example, if you want
|
||||
to execute the ``foo.py`` script if the last 5 minutes load are critical
|
||||
|
|
@ -18,6 +18,13 @@ then add the ``_action`` line to the Glances configuration file:
|
|||
All the stats are available in the command line through the use of the
|
||||
`Mustache`_ syntax. `Chevron`_ is required to render the mustache's template syntax.
|
||||
|
||||
Additionaly to the stats of the current plugin, the following variables are
|
||||
also available:
|
||||
- ``{{time}}``: current time in ISO format
|
||||
- ``{{critical}}``: critical threshold value
|
||||
- ``{{warning}}``: warning threshold value
|
||||
- ``{{careful}}``: careful threshold value
|
||||
|
||||
Another example would be to create a log file
|
||||
containing used vs total disk space if a space trigger warning is
|
||||
reached:
|
||||
|
|
@ -26,7 +33,7 @@ reached:
|
|||
|
||||
[fs]
|
||||
warning=70
|
||||
warning_action=echo {{mnt_point}} {{used}}/{{size}} > /tmp/fs.alert
|
||||
warning_action=echo "{{time}} {{mnt_point}} {{used}}/{{size}}" > /tmp/fs.alert
|
||||
|
||||
A last example would be to create a log file containing the total user disk
|
||||
space usage for a device and notify by email each time a space trigger
|
||||
|
|
@ -36,13 +43,11 @@ critical is reached:
|
|||
|
||||
[fs]
|
||||
critical=90
|
||||
critical_action_repeat=echo {{device_name}} {{percent}} > /tmp/fs.alert && python /etc/glances/actions.d/fs-critical.py
|
||||
|
||||
critical_action_repeat=echo "{{time}} {{device_name}} {{percent}}" > /tmp/fs.alert && python /etc/glances/actions.d/fs-critical.py
|
||||
|
||||
.. note::
|
||||
Use && as separator for multiple commands
|
||||
|
||||
|
||||
Within ``/etc/glances/actions.d/fs-critical.py``:
|
||||
|
||||
.. code-block:: python
|
||||
|
|
@ -63,7 +68,7 @@ Within ``/etc/glances/actions.d/fs-critical.py``:
|
|||
.. note::
|
||||
|
||||
You can use all the stats for the current plugin. See
|
||||
https://github.com/nicolargo/glances/wiki/The-Glances-RESTFULL-JSON-API
|
||||
https://github.com/nicolargo/glances/wiki/The-Glances-RESTFUL-JSON-API
|
||||
for the stats list.
|
||||
|
||||
It is also possible to repeat action until the end of the alert.
|
||||
|
|
|
|||
|
|
@ -61,9 +61,11 @@ For example:
|
|||
enable=false
|
||||
refresh=30
|
||||
one_line=false
|
||||
command=sysctl net.netfilter.nf_conntrack_count;sysctl net.netfilter.nf_conntrack_max
|
||||
command=sysctl net.netfilter.nf_conntrack_count && sysctl net.netfilter.nf_conntrack_max
|
||||
|
||||
For security reason, pipe is not directly allowed in a AMP command but you create a sheel
|
||||
Note: for multiple command, please use the '&&'' separator.
|
||||
|
||||
For security reason, pipe is not directly allowed in a AMP command but you create a shell
|
||||
script with your command:
|
||||
|
||||
.. code-block:: ini
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
CLOUD
|
||||
=====
|
||||
|
||||
This plugin diplays information about the cloud provider if your host is running on OpenStack.
|
||||
This plugin displays information about the cloud provider if your host is running on OpenStack.
|
||||
|
||||
The plugin use the standard OpenStack `metadata`_ service to retrieve the information.
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,9 @@ under the ``[containers]`` section:
|
|||
#show=showthisone,andthose.*
|
||||
# Define the maximum containers size name (default is 20 chars)
|
||||
max_name_size=20
|
||||
# List of stats to disable (not display)
|
||||
# Following stats can be disabled: name,status,uptime,cpu,mem,diskio,networkio,ports,command
|
||||
disable_stats=command
|
||||
# Global containers' thresholds for CPU and MEM (in %)
|
||||
cpu_careful=50
|
||||
cpu_warning=70
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ To switch to per-CPU stats, just hit the ``1`` key:
|
|||
.. image:: ../_static/per-cpu.png
|
||||
|
||||
In this case, Glances will show on line per logical CPU on the system.
|
||||
If you have multiple core, it is possible to define the maximun number
|
||||
If you have multiple core, it is possible to define the maximum number
|
||||
of CPU to display. The top 'max_cpu_display' will be display and an
|
||||
extra line with the mean of all others CPU will be added.
|
||||
|
||||
|
|
|
|||
|
|
@ -5,21 +5,16 @@ Disk I/O
|
|||
|
||||
.. image:: ../_static/diskio.png
|
||||
|
||||
Glances displays the disk I/O throughput. The unit is adapted
|
||||
dynamically.
|
||||
|
||||
You can display:
|
||||
|
||||
Glances displays the disk I/O throughput, count and mean latency:
|
||||
- bytes per second (default behavior / Bytes/s, KBytes/s, MBytes/s, etc)
|
||||
- requests per second (using --diskio-iops option or *B* hotkey)
|
||||
- mean latency (using --diskio-latency option or *L* hotkey)
|
||||
|
||||
There is no alert on this information.
|
||||
|
||||
It's possible to define:
|
||||
It's also possible to define:
|
||||
|
||||
- a list of disk to show (white list)
|
||||
- a list of disks to hide
|
||||
- aliases for disk name
|
||||
- aliases for disk name (use \ to espace special characters)
|
||||
|
||||
under the ``[diskio]`` section in the configuration file.
|
||||
|
||||
|
|
@ -42,4 +37,38 @@ Filtering is based on regular expression. Please be sure that your regular
|
|||
expression works as expected. You can use an online tool like `regex101`_ in
|
||||
order to test your regular expression.
|
||||
|
||||
It is also possible to define thesholds for latency and bytes read and write per second:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[diskio]
|
||||
# Alias for sda1 and sdb1
|
||||
#alias=sda1:SystemDisk,sdb1:DataDisk
|
||||
# Default latency thresholds (in ms) (rx = read / tx = write)
|
||||
rx_latency_careful=10
|
||||
rx_latency_warning=20
|
||||
rx_latency_critical=50
|
||||
tx_latency_careful=10
|
||||
tx_latency_warning=20
|
||||
tx_latency_critical=50
|
||||
# Set thresholds (in bytes per second) for a given disk name (rx = read / tx = write)
|
||||
dm-0_rx_careful=4000000000
|
||||
dm-0_rx_warning=5000000000
|
||||
dm-0_rx_critical=6000000000
|
||||
dm-0_rx_log=True
|
||||
dm-0_tx_careful=700000000
|
||||
dm-0_tx_warning=900000000
|
||||
dm-0_tx_critical=1000000000
|
||||
dm-0_tx_log=True
|
||||
|
||||
You also can automatically hide disk with no read or write using the
|
||||
``hide_zero`` configuration key. The optional ``hide_threshold_bytes`` option
|
||||
can also be used to set a threshold higher than zero.
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[diskio]
|
||||
hide_zero=True
|
||||
hide_threshold_bytes=0
|
||||
|
||||
.. _regex101: https://regex101.com/
|
||||
|
|
@ -35,6 +35,11 @@ system:
|
|||
[fs]
|
||||
allow=shm
|
||||
|
||||
With the above configuration key, it is also possible to monitor NFS
|
||||
mount points (allow=nfs). Be aware that this can slow down the
|
||||
performance of the plugin if the NFS server is not reachable. In this
|
||||
case, the plugin will wait for a 2 seconds timeout.
|
||||
|
||||
Also, you can hide mount points using regular expressions.
|
||||
|
||||
To hide all mount points starting with /boot and /snap:
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ Example:
|
|||
|
||||
**NOTE:** Setting low values for `public_refresh_interval` will result in frequent
|
||||
HTTP requests to the onlive service defined in public_api. Recommended range: 120-600 seconds.
|
||||
Glances uses online services in order to get the IP addresses and the additional informations.
|
||||
Glances uses online services in order to get the IP addresses and the additional information.
|
||||
Your IP address could be blocked if too many requests are done.
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ Legend:
|
|||
hddtemp
|
||||
ps
|
||||
containers
|
||||
vms
|
||||
amps
|
||||
events
|
||||
actions
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ Trend Status
|
|||
======== ==============================================================
|
||||
``-`` Mean 15 lasts values equal mean 15 previous values
|
||||
``↓`` Mean 15 lasts values is lower mean 15 previous values
|
||||
``↑`` Mean 15 lasts values is higher mean 15 previous valuess
|
||||
``↑`` Mean 15 lasts values is higher mean 15 previous values
|
||||
======== ==============================================================
|
||||
|
||||
Legend:
|
||||
|
|
|
|||
|
|
@ -27,7 +27,7 @@ Stats description:
|
|||
is in RAM.
|
||||
- **inactive**: (UNIX): memory that is marked as not used.
|
||||
- **buffers**: (Linux, BSD): cache for things like file system metadata.
|
||||
- **cached**: (Linux, BSD): cache for various things.
|
||||
- **cached**: (Linux, BSD): cache for various things (including ZFS cache).
|
||||
|
||||
Additional stats available in through the API:
|
||||
|
||||
|
|
@ -41,6 +41,10 @@ Additional stats available in through the API:
|
|||
- **shared**: (BSD): memory that may be simultaneously accessed by multiple
|
||||
processes.
|
||||
|
||||
It is possible to display the available memory instead of the used memory
|
||||
by setting the ``available`` option to ``True`` in the configuration file
|
||||
under the ``[mem]`` section.
|
||||
|
||||
A character is also displayed just after the MEM header and shows the
|
||||
trend value:
|
||||
|
||||
|
|
@ -49,7 +53,7 @@ Trend Status
|
|||
======== ==============================================================
|
||||
``-`` Mean 15 lasts values equal mean 15 previous values
|
||||
``↓`` Mean 15 lasts values is lower mean 15 previous values
|
||||
``↑`` Mean 15 lasts values is higher mean 15 previous valuess
|
||||
``↑`` Mean 15 lasts values is higher mean 15 previous values
|
||||
======== ==============================================================
|
||||
|
||||
Alerts are only set for used memory and used swap.
|
||||
|
|
|
|||
|
|
@ -17,8 +17,10 @@ In this case thresholds values are define in bps.
|
|||
Additionally, you can define:
|
||||
|
||||
- a list of network interfaces to hide
|
||||
- automatically hide interfaces not up
|
||||
- automatically hide interfaces without IP address
|
||||
- per-interface limit values
|
||||
- aliases for interface name
|
||||
- aliases for interface name (use \ to espace special characters)
|
||||
|
||||
The configuration should be done in the ``[network]`` section of the
|
||||
Glances configuration file.
|
||||
|
|
@ -41,8 +43,14 @@ virtual docker interface (docker0, docker1, ...):
|
|||
hide=docker.*,lo
|
||||
# Define the list of network interfaces to show (comma-separated regexp)
|
||||
#show=eth0,eth1
|
||||
# Automatically hide interface not up (default is False)
|
||||
hide_no_up=True
|
||||
# Automatically hide interface with no IP address (default is False)
|
||||
hide_no_ip=True
|
||||
# Set hide_zero to True to automatically hide interface with no traffic
|
||||
hide_zero=False
|
||||
# WLAN 0 alias
|
||||
wlan0_alias=Wireless IF
|
||||
alias=wlan0:Wireless IF
|
||||
# It is possible to overwrite the bitrate thresholds per interface
|
||||
# WLAN 0 Default limits (in bits per second aka bps) for interface bitrate
|
||||
wlan0_rx_careful=4000000
|
||||
|
|
@ -58,4 +66,14 @@ Filtering is based on regular expression. Please be sure that your regular
|
|||
expression works as expected. You can use an online tool like `regex101`_ in
|
||||
order to test your regular expression.
|
||||
|
||||
.. _regex101: https://regex101.com/
|
||||
You also can automatically hide interface with no traffic using the
|
||||
``hide_zero`` configuration key. The optional ``hide_threshold_bytes`` option
|
||||
can also be used to set a threshold higher than zero.
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[network]
|
||||
hide_zero=True
|
||||
hide_threshold_bytes=0
|
||||
|
||||
.. _regex101: https://regex101.com/
|
||||
|
|
|
|||
|
|
@ -102,7 +102,8 @@ Columns display
|
|||
``CPU%`` % of CPU used by the process
|
||||
|
||||
If Irix/Solaris mode is off ('0' key), the value
|
||||
is divided by logical core number
|
||||
is divided by logical core number (the column
|
||||
name became CPUi)
|
||||
``MEM%`` % of MEM used by the process (RES divided by
|
||||
the total RAM you have)
|
||||
``VIRT`` Virtual Memory Size
|
||||
|
|
@ -123,6 +124,7 @@ Columns display
|
|||
The non-swapped physical memory a process is
|
||||
using (what's currently in the physical memory).
|
||||
``PID`` Process ID (column is replaced by NPROCS in accumulated mode)
|
||||
``NPROCS`` Number of process + childs (only in accumulated mode)
|
||||
``USER`` User ID
|
||||
``THR`` Threads number of the process
|
||||
``TIME+`` Cumulative CPU time used by the process
|
||||
|
|
@ -147,12 +149,24 @@ Columns display
|
|||
pressing on the ``'/'`` key
|
||||
========================= ==============================================
|
||||
|
||||
Disable display of virtual memory
|
||||
---------------------------------
|
||||
|
||||
It's possible to disable the display of the VIRT column (virtual memory) by adding the
|
||||
``disable_virtual_memory=True`` option in the ``[processlist]`` section of the configuration
|
||||
file (glances.conf):
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[processlist]
|
||||
disable_virtual_memory=True
|
||||
|
||||
Process filtering
|
||||
-----------------
|
||||
|
||||
It's possible to filter the processes list using the ``ENTER`` key.
|
||||
|
||||
Filter syntax is the following (examples):
|
||||
Glances filter syntax is the following (examples):
|
||||
|
||||
- ``python``: Filter processes name or command line starting with
|
||||
*python* (regexp)
|
||||
|
|
@ -161,6 +175,25 @@ Filter syntax is the following (examples):
|
|||
- ``username:nicolargo``: Processes of nicolargo user (key:regexp)
|
||||
- ``cmdline:\/usr\/bin.*``: Processes starting by */usr/bin*
|
||||
|
||||
Process focus
|
||||
-------------
|
||||
|
||||
It's also possible to select a processes list to focus on.
|
||||
|
||||
A list of Glances filters (see upper) can be define from the command line:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
glances --process-focus .*python.*,.*firefox.*
|
||||
|
||||
|
||||
or the glances.conf file:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[processlist]
|
||||
focus=.*python.*,.*firefox.*
|
||||
|
||||
Extended info
|
||||
-------------
|
||||
|
||||
|
|
|
|||
|
|
@ -13,30 +13,45 @@ Glances can display the sensors information using ``psutil``,
|
|||
- hard disk temperature
|
||||
- battery capacity
|
||||
|
||||
There is no alert on this information.
|
||||
Limit values and sensors alias names can be defined in the configuration
|
||||
file under the ``[sensors]`` section.
|
||||
|
||||
Limit can be defined for a specific sensor, a type of sensor or defineby the system
|
||||
thresholds (default behavor).
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[sensors]
|
||||
# Sensors core thresholds (in Celsius...)
|
||||
# By default values are grabbed from the system
|
||||
# Overwrite thresholds for a specific sensor
|
||||
temperature_core_Ambient_careful=45
|
||||
temperature_core_Ambient_warning=65
|
||||
temperature_core_Ambient_critical=80
|
||||
temperature_core_Ambient_log=False
|
||||
# Overwrite thresholds for a specific type of sensor
|
||||
#temperature_core_careful=45
|
||||
#temperature_core_warning=65
|
||||
#temperature_core_critical=80
|
||||
#alias=temp1:Motherboard 0,core 0:CPU Core 0
|
||||
|
||||
.. note 1::
|
||||
Limit values and sensors alias names can be defined in the
|
||||
configuration file under the ``[sensors]`` section.
|
||||
|
||||
.. note 2::
|
||||
The support for multiple batteries is only available if
|
||||
you have the batinfo Python lib installed on your system
|
||||
because for the moment PSUtil only support one battery.
|
||||
|
||||
.. note 3::
|
||||
.. note 2::
|
||||
If a sensors has temperature and fan speed with the same name unit,
|
||||
it is possible to alias it using:
|
||||
unitname_temperature_core_alias=Alias for temp
|
||||
unitname_fan_speed_alias=Alias for fan speed
|
||||
alias=unitname_temperature_core_alias:Alias for temp,unitname_fan_speed_alias:Alias for fan speed
|
||||
|
||||
.. note 4::
|
||||
.. note 3::
|
||||
If a sensors has multiple identical features names (see #2280), then
|
||||
Glances will add a suffix to the feature name.
|
||||
For example, if you have one sensor with two Composite features, the
|
||||
second one will be named Composite_1.
|
||||
|
||||
.. note 5::
|
||||
.. note 4::
|
||||
The plugin could crash on some operating system (FreeBSD) with the
|
||||
TCP or UDP blackhole option > 0 (see issue #2106). In this case, you
|
||||
should disable the sensors (--disable-plugin sensors or from the
|
||||
|
|
|
|||
|
|
@ -22,3 +22,33 @@ How to read the information:
|
|||
|
||||
.. warning::
|
||||
This plugin needs administrator rights. Please run Glances as root/admin.
|
||||
|
||||
Also, you can hide driver using regular expressions.
|
||||
|
||||
To hide device you should use the hide option:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[smart]
|
||||
hide=.*Hide_this_device.*
|
||||
|
||||
It is also possible to configure a white list of devices to display.
|
||||
Example to show only the specified drive:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[smart]
|
||||
show=.*Show_this_device.*
|
||||
|
||||
Filtering is based on regular expression. Please be sure that your regular
|
||||
expression works as expected. You can use an online tool like `regex101`_ in
|
||||
order to test your regular expression.
|
||||
|
||||
.. _regex101: https://regex101.com/
|
||||
|
||||
You can also hide attributes, for example Self-tests, Errors, etc. Use a comma separated list.
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[smart]
|
||||
hide_attributes=attribute_name1,attribute_name2
|
||||
|
|
|
|||
|
|
@ -0,0 +1,36 @@
|
|||
.. _vms:
|
||||
|
||||
VMs
|
||||
===
|
||||
|
||||
Glances ``vms`` plugin is designed to display stats about VMs ran on the host.
|
||||
|
||||
It's actually support two engines: `Multipass` and `Virsh`.
|
||||
|
||||
No Python dependency is needed but Multipass and Virsh binary should be available:
|
||||
- multipass should be executable from /snap/bin/multipass
|
||||
- virsh should be executable from /usr/bin/virsh
|
||||
|
||||
Note: CPU information is not availble for Multipass VM. Load is not available for Virsh VM.
|
||||
|
||||
Configuration file options:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[vms]
|
||||
disable=True
|
||||
# Define the maximum VMs size name (default is 20 chars)
|
||||
max_name_size=20
|
||||
# By default, Glances only display running VMs with states:
|
||||
# 'Running', 'Paused', 'Starting' or 'Restarting'
|
||||
# Set the following key to True to display all VMs regarding their states
|
||||
all=False
|
||||
|
||||
You can use all the variables ({{foo}}) available in the containers plugin.
|
||||
|
||||
Filtering (for hide or show) is based on regular expression. Please be sure that your regular
|
||||
expression works as expected. You can use an online tool like `regex101`_ in
|
||||
order to test your regular expression.
|
||||
|
||||
.. _Multipass: https://canonical.com/multipass
|
||||
.. _Virsh: https://www.libvirt.org/manpages/virsh.html
|
||||
|
|
@ -1,2 +1,5 @@
|
|||
#!/bin/sh
|
||||
|
||||
make clean
|
||||
make html
|
||||
LC_ALL=C make man
|
||||
|
|
|
|||
|
|
@ -18,6 +18,10 @@ Command-Line Options
|
|||
|
||||
enable debug mode
|
||||
|
||||
.. option:: --print-completion
|
||||
|
||||
generate shell tab completion scripts for Glances CLI
|
||||
|
||||
.. option:: -C CONF_FILE, --config CONF_FILE
|
||||
|
||||
path to the configuration file
|
||||
|
|
@ -120,7 +124,8 @@ Command-Line Options
|
|||
|
||||
.. option:: --browser
|
||||
|
||||
start the client browser (list of servers)
|
||||
start TUI Central Glances Browser
|
||||
use --browser -w to start WebUI Central Glances Browser
|
||||
|
||||
.. option:: --disable-autodiscover
|
||||
|
||||
|
|
@ -347,7 +352,7 @@ The following commands (key pressed) are supported while in Glances:
|
|||
Show/hide RAID plugin
|
||||
|
||||
``s``
|
||||
Show/hide sensors stats
|
||||
Show/hide sensors plugin
|
||||
|
||||
``S``
|
||||
Enable/disable spark lines
|
||||
|
|
@ -364,6 +369,9 @@ The following commands (key pressed) are supported while in Glances:
|
|||
``U``
|
||||
View cumulative network I/O
|
||||
|
||||
``V``
|
||||
Show/hide VMS plugin
|
||||
|
||||
``w``
|
||||
Delete finished warning log messages
|
||||
|
||||
|
|
@ -408,12 +416,18 @@ The following commands (key pressed) are supported while in Glances:
|
|||
``F5`` or ``CTRL-R``
|
||||
Refresh user interface
|
||||
|
||||
``LEFT``
|
||||
``SHIFT-LEFT``
|
||||
Navigation left through the process sort
|
||||
|
||||
``RIGHT``
|
||||
``SHIFT-RIGHT``
|
||||
Navigation right through the process sort
|
||||
|
||||
``LEFT``
|
||||
Navigation left through the process name
|
||||
|
||||
``RIGHT``
|
||||
Navigation right through the process name
|
||||
|
||||
``UP``
|
||||
Up in the processes list
|
||||
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ try:
|
|||
year = datetime.utcfromtimestamp(int(os.environ['SOURCE_DATE_EPOCH'])).year
|
||||
except (KeyError, ValueError):
|
||||
year = datetime.now().year
|
||||
copyright = '%d, %s' % (year, author)
|
||||
copyright = f'{year}, {author}'
|
||||
|
||||
# The version info for the project you're documenting, acts as replacement for
|
||||
# |version| and |release|, also used in various other places throughout the
|
||||
|
|
|
|||
|
|
@ -17,10 +17,11 @@ Location
|
|||
You can place your ``glances.conf`` file in the following locations:
|
||||
|
||||
==================== =============================================================
|
||||
``Linux``, ``SunOS`` ~/.config/glances/, /etc/glances/, /usr/share/docs/glances/
|
||||
``*BSD`` ~/.config/glances/, /usr/local/etc/glances/, /usr/share/docs/glances/
|
||||
``macOS`` ~/.config/glances/, ~/Library/Application Support/glances/, /usr/local/etc/glances/, /usr/share/docs/glances/
|
||||
``Linux``, ``SunOS`` ~/.config/glances/, /etc/glances/, /usr/share/doc/glances/
|
||||
``*BSD`` ~/.config/glances/, /usr/local/etc/glances/, /usr/share/doc/glances/
|
||||
``macOS`` ~/.config/glances/, ~/Library/Application Support/glances/, /usr/local/etc/glances/, /usr/share/doc/glances/
|
||||
``Windows`` %APPDATA%\\glances\\glances.conf
|
||||
``All`` + <venv_root_folder>/share/doc/glances/
|
||||
==================== =============================================================
|
||||
|
||||
- On Windows XP, ``%APPDATA%`` is: ``C:\Documents and Settings\<USERNAME>\Application Data``.
|
||||
|
|
@ -44,10 +45,10 @@ A first section (called global) is available:
|
|||
# It is also possible to overwrite it in each plugin section
|
||||
refresh=2
|
||||
# Should Glances check if a newer version is available on PyPI ?
|
||||
check_update=false
|
||||
check_update=true
|
||||
# History size (maximum number of values)
|
||||
# Default is 28800: 1 day with 1 point every 3 seconds
|
||||
history_size=28800
|
||||
# Default is 1200 values (~1h with the default refresh rate)
|
||||
history_size=1200
|
||||
# Set the way Glances should display the date (default is %Y-%m-%d %H:%M:%S %Z)
|
||||
#strftime_format="%Y-%m-%d %H:%M:%S %Z"
|
||||
# Define external directory for loading additional plugins
|
||||
|
|
@ -59,17 +60,45 @@ than a second one concerning the user interface:
|
|||
.. code-block:: ini
|
||||
|
||||
[outputs]
|
||||
# Options for all UIs
|
||||
#--------------------
|
||||
# Separator in the Curses and WebUI interface (between top and others plugins)
|
||||
separator=True
|
||||
# Set the the Curses and WebUI interface left menu plugin list (comma-separated)
|
||||
#left_menu=network,wifi,connections,ports,diskio,fs,irq,folders,raid,smart,sensors,now
|
||||
# Limit the number of processes to display (for the WebUI)
|
||||
# Limit the number of processes to display (in the WebUI)
|
||||
max_processes_display=25
|
||||
# Set the URL prefix (for the WebUI and the API)
|
||||
# Options for WebUI
|
||||
#------------------
|
||||
# Set URL prefix for the WebUI and the API
|
||||
# Example: url_prefix=/glances/ => http://localhost/glances/
|
||||
# The final / is mandatory
|
||||
# Note: The final / is mandatory
|
||||
# Default is no prefix (/)
|
||||
#url_prefix=/glances/
|
||||
# Set root path for WebUI statics files
|
||||
# Why ? On Debian system, WebUI statics files are not provided.
|
||||
# You can download it in a specific folder
|
||||
# thanks to https://github.com/nicolargo/glances/issues/2021
|
||||
# then configure this folder with the webui_root_path key
|
||||
# Default is folder where glances_restful_api.py is hosted
|
||||
#webui_root_path=
|
||||
# CORS options
|
||||
# Comma separated list of origins that should be permitted to make cross-origin requests.
|
||||
# Default is *
|
||||
#cors_origins=*
|
||||
# Indicate that cookies should be supported for cross-origin requests.
|
||||
# Default is True
|
||||
#cors_credentials=True
|
||||
# Comma separated list of HTTP methods that should be allowed for cross-origin requests.
|
||||
# Default is *
|
||||
#cors_methods=*
|
||||
# Comma separated list of HTTP request headers that should be supported for cross-origin requests.
|
||||
# Default is *
|
||||
#cors_headers=*
|
||||
# Define SSL files (keyfile_password is optional)
|
||||
#ssl_keyfile=./glances.local+3-key.pem
|
||||
#ssl_keyfile_password=kfp
|
||||
#ssl_certfile=./glances.local+3.pem
|
||||
|
||||
Each plugin, export module, and application monitoring process (AMP) can
|
||||
have a section. Below is an example for the CPU plugin:
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ Alternatively, you can specify something along the same lines with docker run op
|
|||
|
||||
.. code-block:: console
|
||||
|
||||
docker run -v `pwd`/glances.conf:/glances/conf/glances.conf -v /var/run/docker.sock:/var/run/docker.sock:ro -v /run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:ro --pid host -it docker.io/nicolargo/glances
|
||||
docker run -v `pwd`/glances.conf:/etc/glances/glances.conf -v /var/run/docker.sock:/var/run/docker.sock:ro -v /run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:ro --pid host -it docker.io/nicolargo/glances
|
||||
|
||||
Where \`pwd\`/glances.conf is a local directory containing your glances.conf file.
|
||||
|
||||
|
|
@ -187,7 +187,7 @@ and make it visible to your container by adding it to ``docker-compose.yml`` as
|
|||
image: nicolargo/glances:latest
|
||||
restart: always
|
||||
environment:
|
||||
- GLANCES_OPT="-w --password"
|
||||
- "GLANCES_OPT=-w --password"
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
# Uncomment the below line if you want glances to display host OS detail instead of container's
|
||||
|
|
|
|||
45
docs/faq.rst
|
|
@ -3,8 +3,51 @@
|
|||
F.A.Q
|
||||
=====
|
||||
|
||||
*Any encoding issue ?*
|
||||
Any encoding issue ?
|
||||
--------------------
|
||||
|
||||
Try to run Glances with the following command line:
|
||||
|
||||
LANG=en_US.UTF-8 LC_ALL= glances
|
||||
|
||||
Container memory stats not displayed ?
|
||||
--------------------------------------
|
||||
|
||||
On ARM64, Docker needs to be configured to allow access to the memory stats.
|
||||
|
||||
Edit the /boot/firmware/cmdline.txt and add the following configuration key:
|
||||
|
||||
cgroup_enable=memory
|
||||
|
||||
Netifaces issue ?
|
||||
-----------------
|
||||
|
||||
Previously, Glances uses Netifaces to get network interfaces information.
|
||||
|
||||
Now, Glances uses Netifaces2.
|
||||
|
||||
Please uninstall Netifaces and install Netifaces2 instead.
|
||||
|
||||
Extra note: Glances 4.5 or higher do not use Netifaces/Netifaces2 anymore.
|
||||
|
||||
On Debian/Ubuntu Operating Systems, Webserver display a blank screen ?
|
||||
----------------------------------------------------------------------
|
||||
|
||||
For some reason, the Glances Debian/Ubuntu packages do not include the Web UI static files.
|
||||
|
||||
Please read: https://github.com/nicolargo/glances/issues/2021 for workaround and more information.
|
||||
|
||||
Glances said that my computer has no free memory, is it normal ?
|
||||
----------------------------------------------------------------
|
||||
|
||||
On Linux, Glances shows by default the free memory.
|
||||
|
||||
Free memory can be low, it's a "normal" behavior because Linux uses free memory for disk caching
|
||||
to improve performance. More information can be found here: https://linuxatemyram.com/.
|
||||
|
||||
If you want to display the "available" memory instead of the "free" memory, you can uses the
|
||||
the following configuration key in the Glances configuration file:
|
||||
|
||||
[mem]
|
||||
# Display available memory instead of used memory
|
||||
available=True
|
||||
|
|
|
|||
|
|
@ -0,0 +1,46 @@
|
|||
.. _fetch:
|
||||
|
||||
Fetch
|
||||
=====
|
||||
|
||||
The fetch mode is used to get and share a quick look of a machine using the
|
||||
``fetch`` option. In this mode, current stats are displayed on the console in
|
||||
a fancy way.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --fetch
|
||||
|
||||
Results look like this:
|
||||
|
||||
.. image:: _static/screenshot-fetch.png
|
||||
|
||||
It is also possible to use a custom template with the ``--fetch-template </path/to/template.jinja>`` option.
|
||||
|
||||
Some examples are provided in the ``conf/fetch-templates/`` directory. Please feel free to
|
||||
customize them or create your own template (contribution via PR are welcome).
|
||||
|
||||
The format of the template is based on the Jinja2 templating engine and can use all the stats
|
||||
available in Glances through the ``gl`` variable (an instance of the :ref:`Glances Python API<api>`).
|
||||
|
||||
For example, the default template is define as:
|
||||
|
||||
.. code-block:: jinja
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
✨ {{ gl.system['hostname'] }}{{ ' - ' + gl.ip['address'] if gl.ip['address'] else '' }}
|
||||
⚙️ {{ gl.system['hr_name'] }} | Uptime: {{ gl.uptime }}
|
||||
|
||||
💡 LOAD {{ '%0.2f'| format(gl.load['min1']) }} {{ '%0.2f'| format(gl.load['min5']) }} {{ '%0.2f'| format(gl.load['min15']) }}
|
||||
⚡ CPU {{ gl.bar(gl.cpu['total']) }} {{ gl.cpu['total'] }}% of {{ gl.core['log'] }} cores
|
||||
🧠 MEM {{ gl.bar(gl.mem['percent']) }} {{ gl.mem['percent'] }}% ({{ gl.auto_unit(gl.mem['used']) }} {{ gl.auto_unit(gl.mem['total']) }})
|
||||
{% for fs in gl.fs.keys() %}💾 {% if loop.index == 1 %}DISK{% else %} {% endif %} {{ gl.bar(gl.fs[fs]['percent']) }} {{ gl.fs[fs]['percent'] }}% ({{ gl.auto_unit(gl.fs[fs]['used']) }} {{ gl.auto_unit(gl.fs[fs]['size']) }}) for {{ fs }}
|
||||
{% endfor %}{% for net in gl.network.keys() %}📡 {% if loop.index == 1 %}NET{% else %} {% endif %} ↓ {{ gl.auto_unit(gl.network[net]['bytes_recv_rate_per_sec']) }}b/s ↑ {{ gl.auto_unit(gl.network[net]['bytes_sent_rate_per_sec']) }}b/s for {{ net }}
|
||||
{% endfor %}
|
||||
🔥 TOP PROCESS by CPU
|
||||
{% for process in gl.top_process() %}{{ loop.index }}️⃣ {{ process['name'][:20] }}{{ ' ' * (20 - process['name'][:20] | length) }} ⚡ {{ process['cpu_percent'] }}% CPU{{ ' ' * (8 - (gl.auto_unit(process['cpu_percent']) | length)) }} 🧠 {{ gl.auto_unit(process['memory_info']['rss']) }}B MEM
|
||||
{% endfor %}
|
||||
🔥 TOP PROCESS by MEM
|
||||
{% for process in gl.top_process(sorted_by='memory_percent', sorted_by_secondary='cpu_percent') %}{{ loop.index }}️⃣ {{ process['name'][:20] }}{{ ' ' * (20 - process['name'][:20] | length) }} 🧠 {{ gl.auto_unit(process['memory_info']['rss']) }}B MEM{{ ' ' * (7 - (gl.auto_unit(process['memory_info']['rss']) | length)) }} ⚡ {{ process['cpu_percent'] }}% CPU
|
||||
{% endfor %}
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
|
@ -34,16 +34,17 @@ CONFIGURATION
|
|||
EXAMPLES
|
||||
--------
|
||||
|
||||
Monitor local machine (standalone mode):
|
||||
Monitor local machine, also called standalone mode,
|
||||
with the Text-based user interface (TUI):
|
||||
|
||||
$ glances
|
||||
|
||||
To monitor the local machine with the web interface (Web UI),
|
||||
To monitor the local machine with the Web user interface (WebUI),
|
||||
, run the following command line:
|
||||
|
||||
$ glances -w
|
||||
|
||||
then, open a web browser to the provided URL.
|
||||
then, open a Web Browser to the provided URL.
|
||||
|
||||
Monitor local machine and export stats to a CSV file:
|
||||
|
||||
|
|
@ -71,10 +72,16 @@ Connect to a Glances server and export stats to a StatsD server:
|
|||
|
||||
$ glances -c <ip_server> --export statsd
|
||||
|
||||
Start the client browser (browser mode):
|
||||
Start the TUI Central Glances Browser:
|
||||
|
||||
$ glances --browser
|
||||
|
||||
Start the WebUI Central Glances Browser (new in Glances 4.3 or higher):
|
||||
|
||||
$ glances --browser -w
|
||||
|
||||
If you do not want to see the local Glances Web Server in the browser list please use --disable-autodiscover option.
|
||||
|
||||
AUTHOR
|
||||
------
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,110 @@
|
|||
.. _duckdb:
|
||||
|
||||
DuckDB
|
||||
===========
|
||||
|
||||
DuckDB is an in-process SQL OLAP database management system.
|
||||
|
||||
You can export statistics to a ``DuckDB`` server.
|
||||
|
||||
The connection should be defined in the Glances configuration file as
|
||||
following:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[duckdb]
|
||||
# database defines where data are stored, can be one of:
|
||||
# /path/to/glances.db (see https://duckdb.org/docs/stable/clients/python/dbapi#file-based-connection)
|
||||
# :memory:glances (see https://duckdb.org/docs/stable/clients/python/dbapi#in-memory-connection)
|
||||
# Or anyone else supported by the API (see https://duckdb.org/docs/stable/clients/python/dbapi)
|
||||
database=/tmp/glances.db
|
||||
|
||||
and run Glances with:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --export duckdb
|
||||
|
||||
Data model
|
||||
-----------
|
||||
|
||||
The data model is composed of one table per Glances plugin.
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: python
|
||||
|
||||
>>> import duckdb
|
||||
>>> db = duckdb.connect(database='/tmp/glances.db', read_only=True)
|
||||
|
||||
>>> db.sql("SELECT * from cpu")
|
||||
┌─────────────────────┬─────────────────┬────────┬────────┬────────┬───┬────────────────────┬─────────────────────┬──────────────────────┬──────────────────────┬──────────────────────┐
|
||||
│ time │ hostname_id │ total │ user │ nice │ … │ cpu_iowait_warning │ cpu_iowait_critical │ cpu_ctx_switches_c… │ cpu_ctx_switches_w… │ cpu_ctx_switches_c… │
|
||||
│ time with time zone │ varchar │ double │ double │ double │ │ double │ double │ double │ double │ double │
|
||||
├─────────────────────┼─────────────────┼────────┼────────┼────────┼───┼────────────────────┼─────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
|
||||
│ 11:50:25+00 │ nicolargo-xps15 │ 8.0 │ 5.6 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:50:27+00 │ nicolargo-xps15 │ 4.3 │ 3.2 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:50:29+00 │ nicolargo-xps15 │ 4.3 │ 3.2 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:50:31+00 │ nicolargo-xps15 │ 14.9 │ 15.7 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:50:33+00 │ nicolargo-xps15 │ 14.9 │ 15.7 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:50:35+00 │ nicolargo-xps15 │ 8.2 │ 7.8 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:50:37+00 │ nicolargo-xps15 │ 8.2 │ 7.8 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:50:39+00 │ nicolargo-xps15 │ 12.7 │ 10.3 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:50:41+00 │ nicolargo-xps15 │ 12.7 │ 10.3 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:50:43+00 │ nicolargo-xps15 │ 12.2 │ 10.3 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │
|
||||
│ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │
|
||||
│ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │
|
||||
│ 11:51:29+00 │ nicolargo-xps15 │ 10.1 │ 7.4 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:51:32+00 │ nicolargo-xps15 │ 10.1 │ 7.4 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:51:34+00 │ nicolargo-xps15 │ 6.6 │ 4.9 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:51:36+00 │ nicolargo-xps15 │ 6.6 │ 4.9 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:51:38+00 │ nicolargo-xps15 │ 9.9 │ 7.5 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:51:40+00 │ nicolargo-xps15 │ 9.9 │ 7.5 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:51:42+00 │ nicolargo-xps15 │ 4.0 │ 3.1 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:51:44+00 │ nicolargo-xps15 │ 4.0 │ 3.1 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:51:46+00 │ nicolargo-xps15 │ 11.1 │ 8.8 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
│ 11:51:48+00 │ nicolargo-xps15 │ 11.1 │ 8.8 │ 0.0 │ … │ 5.625 │ 6.25 │ 640000.0 │ 720000.0 │ 800000.0 │
|
||||
├─────────────────────┴─────────────────┴────────┴────────┴────────┴───┴────────────────────┴─────────────────────┴──────────────────────┴──────────────────────┴──────────────────────┤
|
||||
│ 41 rows (20 shown) 47 columns (10 shown) │
|
||||
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
>>> db.sql("SELECT * from cpu").fetchall()[0]
|
||||
(datetime.time(11, 50, 25, tzinfo=datetime.timezone.utc), 'nicolargo-xps15', 8.0, 5.6, 0.0, 2.3, 91.9, 0.1, 0.0, 0.0, 0.0, 0, 0, 0, 0, 16, 2.4103684425354004, 90724823, 0, 63323797, 0, 30704572, 0, 0, 0, 1200.0, 65.0, 75.0, 85.0, True, 50.0, 70.0, 90.0, True, 50.0, 70.0, 90.0, True, 50.0, 70.0, 90.0, 5.0, 5.625, 6.25, 640000.0, 720000.0, 800000.0)
|
||||
|
||||
|
||||
>>> db.sql("SELECT * from network")
|
||||
┌─────────────────────┬─────────────────┬────────────────┬────────────┬────────────┬───┬─────────────────────┬────────────────┬────────────────────┬────────────────────┬───────────────────┐
|
||||
│ time │ hostname_id │ key_id │ bytes_sent │ bytes_recv │ … │ network_tx_critical │ network_hide │ network_hide_no_up │ network_hide_no_ip │ network_hide_zero │
|
||||
│ time with time zone │ varchar │ varchar │ int64 │ int64 │ │ double │ varchar │ boolean │ boolean │ boolean │
|
||||
├─────────────────────┼─────────────────┼────────────────┼────────────┼────────────┼───┼─────────────────────┼────────────────┼────────────────────┼────────────────────┼───────────────────┤
|
||||
│ 11:50:25+00 │ nicolargo-xps15 │ interface_name │ 407761 │ 32730 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:50:27+00 │ nicolargo-xps15 │ interface_name │ 2877 │ 4857 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:50:29+00 │ nicolargo-xps15 │ interface_name │ 44504 │ 32555 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:50:31+00 │ nicolargo-xps15 │ interface_name │ 1092285 │ 48600 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:50:33+00 │ nicolargo-xps15 │ interface_name │ 150119 │ 43805 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:50:35+00 │ nicolargo-xps15 │ interface_name │ 34424 │ 14825 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:50:37+00 │ nicolargo-xps15 │ interface_name │ 19382 │ 33614 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:50:39+00 │ nicolargo-xps15 │ interface_name │ 53060 │ 39780 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:50:41+00 │ nicolargo-xps15 │ interface_name │ 371914 │ 78626 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:50:43+00 │ nicolargo-xps15 │ interface_name │ 82356 │ 60612 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │
|
||||
│ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │
|
||||
│ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │ · │
|
||||
│ 11:51:29+00 │ nicolargo-xps15 │ interface_name │ 3766 │ 9977 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:51:32+00 │ nicolargo-xps15 │ interface_name │ 188036 │ 18668 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:51:34+00 │ nicolargo-xps15 │ interface_name │ 543 │ 2451 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:51:36+00 │ nicolargo-xps15 │ interface_name │ 8247 │ 7275 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:51:38+00 │ nicolargo-xps15 │ interface_name │ 7252 │ 986 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:51:40+00 │ nicolargo-xps15 │ interface_name │ 172 │ 132 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:51:42+00 │ nicolargo-xps15 │ interface_name │ 8080 │ 6640 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:51:44+00 │ nicolargo-xps15 │ interface_name │ 19660 │ 17830 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:51:46+00 │ nicolargo-xps15 │ interface_name │ 1007030 │ 84170 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
│ 11:51:48+00 │ nicolargo-xps15 │ interface_name │ 128947 │ 18087 │ … │ 90.0 │ [docker.*, lo] │ true │ true │ true │
|
||||
├─────────────────────┴─────────────────┴────────────────┴────────────┴────────────┴───┴─────────────────────┴────────────────┴────────────────────┴────────────────────┴───────────────────┤
|
||||
│ 41 rows (20 shown) 28 columns (10 shown) │
|
||||
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
|
||||
|
||||
.. _duckdb: https://duckdb.org/
|
||||
|
||||
|
|
@ -3,8 +3,24 @@
|
|||
Gateway To Other Services
|
||||
=========================
|
||||
|
||||
Glances can exports stats to a CSV file. Also, it can act as a gateway
|
||||
to providing stats to multiple services (see list below).
|
||||
Glances can exports stats in files or to other services like databases, message queues, etc.
|
||||
|
||||
Each exporter has its own configuration options, which can be set in the Glances
|
||||
configuration file (`glances.conf`).
|
||||
|
||||
A common options section is also available:
|
||||
|
||||
is the `exclude_fields` option, which allows you to specify
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[export]
|
||||
# Common section for all exporters
|
||||
# Do not export following fields (comma separated list of regex)
|
||||
exclude_fields=.*_critical,.*_careful,.*_warning,.*\.key$
|
||||
|
||||
|
||||
This section describes the available exporters and how to configure them:
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
|
@ -14,15 +30,18 @@ to providing stats to multiple services (see list below).
|
|||
couchdb
|
||||
elastic
|
||||
graph
|
||||
graphite
|
||||
influxdb
|
||||
json
|
||||
kafka
|
||||
mqtt
|
||||
mongodb
|
||||
nats
|
||||
opentsdb
|
||||
prometheus
|
||||
rabbitmq
|
||||
restful
|
||||
riemann
|
||||
statsd
|
||||
timescaledb
|
||||
zeromq
|
||||
|
|
|
|||
|
|
@ -17,19 +17,19 @@ Glances InfluxDB data model:
|
|||
+---------------+-----------------------+-----------------------+
|
||||
| Measurement | Fields | Tags |
|
||||
+===============+=======================+=======================+
|
||||
| cpu | user | hostname |
|
||||
| cpu | user | hostname |
|
||||
| | system | |
|
||||
| | iowait... | |
|
||||
+---------------+-----------------------+-----------------------+
|
||||
| network | read_bytes | hostname |
|
||||
| | write_bytes | disk_name |
|
||||
| | time_since_update... | |
|
||||
| | | |
|
||||
| | | |
|
||||
+---------------+-----------------------+-----------------------+
|
||||
| diskio | rx | hostname |
|
||||
| | tx | interface_name |
|
||||
| | time_since_update... | |
|
||||
| | | |
|
||||
| | | |
|
||||
+---------------+-----------------------+-----------------------+
|
||||
| docker | cpu_percent | hostname |
|
||||
| | memory_usage... | name |
|
||||
|
|
@ -78,7 +78,7 @@ configuration file (no limit on columns number).
|
|||
Note: if you want to use SSL, please set 'protocol=https'.
|
||||
|
||||
|
||||
InfluxDB v2 (from InfluxDB v1.8.x/Flux and InfluxDB v2.x)
|
||||
InfluxDB v2 (from InfluxDB v1.8.x/Flux and InfluxDB <v3.x)
|
||||
---------------------------------------------------------
|
||||
|
||||
Note: The InfluxDB v2 client (https://pypi.org/project/influxdb-client/)
|
||||
|
|
@ -90,12 +90,14 @@ following:
|
|||
.. code-block:: ini
|
||||
|
||||
[influxdb2]
|
||||
# Configuration for the --export influxdb2 option
|
||||
# https://influxdb.com/
|
||||
host=localhost
|
||||
port=8086
|
||||
protocol=http
|
||||
org=nicolargo
|
||||
bucket=glances
|
||||
token=EjFUTWe8U-MIseEAkaVIgVnej_TrnbdvEcRkaB1imstW7gapSqy6_6-8XD-yd51V0zUUpDy-kAdVD1purDLuxA==
|
||||
token=PUT_YOUR_INFLUXDB2_TOKEN_HERE
|
||||
# Set the interval between two exports (in seconds)
|
||||
# If the interval is set to 0, the Glances refresh time is used (default behavor)
|
||||
#interval=0
|
||||
|
|
@ -107,7 +109,7 @@ following:
|
|||
#prefix=foo
|
||||
# Following tags will be added for all measurements
|
||||
# You can also use dynamic values.
|
||||
# Note: hostname is always added as a tag
|
||||
# Note: hostname and name (for process) are always added as a tag
|
||||
#tags=foo:bar,spam:eggs,domain:`domainname`
|
||||
|
||||
and run Glances with:
|
||||
|
|
@ -118,6 +120,46 @@ and run Glances with:
|
|||
|
||||
Note: if you want to use SSL, please set 'protocol=https'.
|
||||
|
||||
InfluxDB v3 (for InfluxDB 3.x)
|
||||
------------------------------
|
||||
|
||||
Note: The InfluxDB v3 client (https://pypi.org/project/influxdb3-python/)
|
||||
is only available for Python 3.8 or higher.
|
||||
|
||||
The connection should be defined in the Glances configuration file as
|
||||
following:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[influxdb3]
|
||||
# Configuration for the --export influxdb3 option
|
||||
# https://influxdb.com/
|
||||
host=http://localhost:8181
|
||||
org=nicolargo
|
||||
database=glances
|
||||
token=PUT_YOUR_INFLUXDB3_TOKEN_HERE
|
||||
# Set the interval between two exports (in seconds)
|
||||
# If the interval is set to 0, the Glances refresh time is used (default behavor)
|
||||
#interval=0
|
||||
# Prefix will be added for all measurement name
|
||||
# Ex: prefix=foo
|
||||
# => foo.cpu
|
||||
# => foo.mem
|
||||
# You can also use dynamic values
|
||||
#prefix=foo
|
||||
# Following tags will be added for all measurements
|
||||
# You can also use dynamic values.
|
||||
# Note: hostname and name (for process) are always added as a tag
|
||||
#tags=foo:bar,spam:eggs,domain:`domainname`
|
||||
|
||||
and run Glances with:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --export influxdb3
|
||||
|
||||
Note: if you want to use SSL, please set host with 'https' scheme instead of 'http'.
|
||||
|
||||
Grafana
|
||||
-------
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
.. _timescale:
|
||||
|
||||
TimeScaleDB
|
||||
===========
|
||||
|
||||
TimescaleDB is a time-series database built on top of PostgreSQL.
|
||||
|
||||
You can export statistics to a ``TimescaleDB`` server.
|
||||
|
||||
The connection should be defined in the Glances configuration file as
|
||||
following:
|
||||
|
||||
.. code-block:: ini
|
||||
|
||||
[timescaledb]
|
||||
host=localhost
|
||||
port=5432
|
||||
db=glances
|
||||
user=postgres
|
||||
password=password
|
||||
|
||||
and run Glances with:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --export timescaledb
|
||||
|
||||
Data model
|
||||
-----------
|
||||
|
||||
Each plugin will create an `hypertable`_ in the TimescaleDB database.
|
||||
|
||||
Tables are partitionned by time (using the ``time`` column).
|
||||
|
||||
Tables are segmented by hostname (in order to have multiple host stored in the Glances database).
|
||||
|
||||
For plugin with a key (example network where the key is the interface name), the key will
|
||||
be added as a column in the table (named key_id) and added to the timescaledb.segmentby option.
|
||||
|
||||
Current limitations
|
||||
-------------------
|
||||
|
||||
Sensors, Fs and DiskIO plugins are not supported by the TimescaleDB exporter.
|
||||
|
||||
In the cpu plugin, the user field is exported as user_cpu (user_percpu in the percpu plugin)
|
||||
because user is a reserved keyword in PostgreSQL.
|
||||
|
||||
.. _hypertable: https://docs.tigerdata.com/use-timescale/latest/hypertables/
|
||||
|
|
@ -11,12 +11,11 @@ information depending on the terminal size.
|
|||
It can also work in client/server mode. Remote monitoring can be
|
||||
done via terminal, Web interface, or API (XMLRPC and RESTful).
|
||||
|
||||
Glances is written in Python and uses the `psutil`_ library to get
|
||||
information from your system.
|
||||
Stats can also be exported to :ref:`files or external databases<gw>`.
|
||||
|
||||
Stats can also be exported to external time/value databases.
|
||||
|
||||
.. _psutil: https://github.com/giampaolo/psutil
|
||||
It is also possible to use it in your own Python scripts thanks to
|
||||
the :ref:`Glances API<api>` or in any other application through
|
||||
the :ref:`RESTful API<api_restful>`.
|
||||
|
||||
Table of Contents
|
||||
=================
|
||||
|
|
@ -30,7 +29,11 @@ Table of Contents
|
|||
config
|
||||
aoa/index
|
||||
gw/index
|
||||
api
|
||||
api/python
|
||||
api/restful
|
||||
docker
|
||||
faq
|
||||
support
|
||||
|
||||
.. _psutil: https://github.com/giampaolo/psutil
|
||||
|
||||
|
|
|
|||
|
|
@ -34,5 +34,19 @@ To upgrade Glances and all its dependencies to the latest versions:
|
|||
|
||||
For additional installation methods, read the official `README`_ file.
|
||||
|
||||
Shell tab completion
|
||||
====================
|
||||
|
||||
Glances 4.3.2 and higher includes shell tab autocompletion thanks to the --print-completion option.
|
||||
|
||||
For example, on a Linux operating system with Bash shell:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --print-completion bash | sudo tee -a /etc/bash_completion.d/glances
|
||||
$ source /etc/bash_completion.d/glances
|
||||
|
||||
Following shells are supported: bash, zsh and tcsh.
|
||||
|
||||
.. _psutil: https://github.com/giampaolo/psutil
|
||||
.. _README: https://github.com/nicolargo/glances/blob/master/README.rst
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
'\" t
|
||||
.\" Man page generated from reStructuredText.
|
||||
.
|
||||
.
|
||||
|
|
@ -27,7 +28,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
|||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "GLANCES" "1" "May 25, 2024" "4.0.6" "Glances"
|
||||
.TH "GLANCES" "1" "Jan 03, 2026" "4.4.2_dev1" "Glances"
|
||||
.SH NAME
|
||||
glances \- An eye on your system
|
||||
.SH SYNOPSIS
|
||||
|
|
@ -63,6 +64,11 @@ enable debug mode
|
|||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-print\-completion
|
||||
generate shell tab completion scripts for Glances CLI
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-C CONF_FILE, \-\-config CONF_FILE
|
||||
path to the configuration file
|
||||
.UNINDENT
|
||||
|
|
@ -189,7 +195,8 @@ run Glances in server mode
|
|||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-browser
|
||||
start the client browser (list of servers)
|
||||
start TUI Central Glances Browser
|
||||
use –browser \-w to start WebUI Central Glances Browser
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
|
|
@ -451,7 +458,7 @@ Reset history
|
|||
Show/hide RAID plugin
|
||||
.TP
|
||||
.B \fBs\fP
|
||||
Show/hide sensors stats
|
||||
Show/hide sensors plugin
|
||||
.TP
|
||||
.B \fBS\fP
|
||||
Enable/disable spark lines
|
||||
|
|
@ -468,6 +475,9 @@ Sort processes by USER
|
|||
.B \fBU\fP
|
||||
View cumulative network I/O
|
||||
.TP
|
||||
.B \fBV\fP
|
||||
Show/hide VMS plugin
|
||||
.TP
|
||||
.B \fBw\fP
|
||||
Delete finished warning log messages
|
||||
.TP
|
||||
|
|
@ -512,12 +522,18 @@ Switch between process command line or command name
|
|||
.B \fBF5\fP or \fBCTRL\-R\fP
|
||||
Refresh user interface
|
||||
.TP
|
||||
.B \fBLEFT\fP
|
||||
.B \fBSHIFT\-LEFT\fP
|
||||
Navigation left through the process sort
|
||||
.TP
|
||||
.B \fBRIGHT\fP
|
||||
.B \fBSHIFT\-RIGHT\fP
|
||||
Navigation right through the process sort
|
||||
.TP
|
||||
.B \fBLEFT\fP
|
||||
Navigation left through the process name
|
||||
.TP
|
||||
.B \fBRIGHT\fP
|
||||
Navigation right through the process name
|
||||
.TP
|
||||
.B \fBUP\fP
|
||||
Up in the processes list
|
||||
.TP
|
||||
|
|
@ -558,25 +574,24 @@ A template is available in the \fB/usr{,/local}/share/doc/glances\fP
|
|||
.sp
|
||||
You can place your \fBglances.conf\fP file in the following locations:
|
||||
.TS
|
||||
center;
|
||||
|l|l|.
|
||||
_
|
||||
box center;
|
||||
l|l.
|
||||
T{
|
||||
\fBLinux\fP, \fBSunOS\fP
|
||||
T} T{
|
||||
~/.config/glances/, /etc/glances/, /usr/share/docs/glances/
|
||||
~/.config/glances/, /etc/glances/, /usr/share/doc/glances/
|
||||
T}
|
||||
_
|
||||
T{
|
||||
\fB*BSD\fP
|
||||
T} T{
|
||||
~/.config/glances/, /usr/local/etc/glances/, /usr/share/docs/glances/
|
||||
~/.config/glances/, /usr/local/etc/glances/, /usr/share/doc/glances/
|
||||
T}
|
||||
_
|
||||
T{
|
||||
\fBmacOS\fP
|
||||
T} T{
|
||||
~/.config/glances/, ~/Library/Application Support/glances/, /usr/local/etc/glances/, /usr/share/docs/glances/
|
||||
~/.config/glances/, ~/Library/Application Support/glances/, /usr/local/etc/glances/, /usr/share/doc/glances/
|
||||
T}
|
||||
_
|
||||
T{
|
||||
|
|
@ -585,6 +600,14 @@ T} T{
|
|||
%APPDATA%\eglances\eglances.conf
|
||||
T}
|
||||
_
|
||||
T{
|
||||
\fBAll\fP
|
||||
T} T{
|
||||
.INDENT 0.0
|
||||
.IP \(bu 2
|
||||
<venv_root_folder>/share/doc/glances/
|
||||
.UNINDENT
|
||||
T}
|
||||
.TE
|
||||
.INDENT 0.0
|
||||
.IP \(bu 2
|
||||
|
|
@ -603,25 +626,23 @@ A first section (called global) is available:
|
|||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
.EX
|
||||
[global]
|
||||
# Refresh rate (default is a minimum of 2 seconds)
|
||||
# Can be overwritten by the \-t <sec> option
|
||||
# It is also possible to overwrite it in each plugin section
|
||||
refresh=2
|
||||
# Should Glances check if a newer version is available on PyPI ?
|
||||
check_update=false
|
||||
check_update=true
|
||||
# History size (maximum number of values)
|
||||
# Default is 28800: 1 day with 1 point every 3 seconds
|
||||
history_size=28800
|
||||
# Default is 1200 values (~1h with the default refresh rate)
|
||||
history_size=1200
|
||||
# Set the way Glances should display the date (default is %Y\-%m\-%d %H:%M:%S %Z)
|
||||
#strftime_format=\(dq%Y\-%m\-%d %H:%M:%S %Z\(dq
|
||||
# Define external directory for loading additional plugins
|
||||
# The layout follows the glances standard for plugin definitions
|
||||
#plugin_dir=/home/user/dev/plugins
|
||||
.ft P
|
||||
.fi
|
||||
.EE
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
|
|
@ -629,22 +650,48 @@ than a second one concerning the user interface:
|
|||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
.EX
|
||||
[outputs]
|
||||
# Options for all UIs
|
||||
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
|
||||
# Separator in the Curses and WebUI interface (between top and others plugins)
|
||||
separator=True
|
||||
# Set the the Curses and WebUI interface left menu plugin list (comma\-separated)
|
||||
#left_menu=network,wifi,connections,ports,diskio,fs,irq,folders,raid,smart,sensors,now
|
||||
# Limit the number of processes to display (for the WebUI)
|
||||
# Limit the number of processes to display (in the WebUI)
|
||||
max_processes_display=25
|
||||
# Set the URL prefix (for the WebUI and the API)
|
||||
# Options for WebUI
|
||||
#\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
|
||||
# Set URL prefix for the WebUI and the API
|
||||
# Example: url_prefix=/glances/ => http://localhost/glances/
|
||||
# The final / is mandatory
|
||||
# Note: The final / is mandatory
|
||||
# Default is no prefix (/)
|
||||
#url_prefix=/glances/
|
||||
.ft P
|
||||
.fi
|
||||
# Set root path for WebUI statics files
|
||||
# Why ? On Debian system, WebUI statics files are not provided.
|
||||
# You can download it in a specific folder
|
||||
# thanks to https://github.com/nicolargo/glances/issues/2021
|
||||
# then configure this folder with the webui_root_path key
|
||||
# Default is folder where glances_restful_api.py is hosted
|
||||
#webui_root_path=
|
||||
# CORS options
|
||||
# Comma separated list of origins that should be permitted to make cross\-origin requests.
|
||||
# Default is *
|
||||
#cors_origins=*
|
||||
# Indicate that cookies should be supported for cross\-origin requests.
|
||||
# Default is True
|
||||
#cors_credentials=True
|
||||
# Comma separated list of HTTP methods that should be allowed for cross\-origin requests.
|
||||
# Default is *
|
||||
#cors_methods=*
|
||||
# Comma separated list of HTTP request headers that should be supported for cross\-origin requests.
|
||||
# Default is *
|
||||
#cors_headers=*
|
||||
# Define SSL files (keyfile_password is optional)
|
||||
#ssl_keyfile=./glances.local+3\-key.pem
|
||||
#ssl_keyfile_password=kfp
|
||||
#ssl_certfile=./glances.local+3.pem
|
||||
.EE
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
|
|
@ -653,8 +700,7 @@ have a section. Below is an example for the CPU plugin:
|
|||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
.EX
|
||||
[cpu]
|
||||
disable=False
|
||||
refresh=3
|
||||
|
|
@ -670,8 +716,7 @@ system_critical=90
|
|||
steal_careful=50
|
||||
steal_warning=70
|
||||
steal_critical=90
|
||||
.ft P
|
||||
.fi
|
||||
.EE
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
|
|
@ -679,8 +724,7 @@ an InfluxDB export module:
|
|||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
.EX
|
||||
[influxdb]
|
||||
# Configuration for the \-\-export influxdb option
|
||||
# https://influxdb.com/
|
||||
|
|
@ -691,8 +735,7 @@ password=root
|
|||
db=glances
|
||||
prefix=localhost
|
||||
#tags=foo:bar,spam:eggs
|
||||
.ft P
|
||||
.fi
|
||||
.EE
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
|
|
@ -700,8 +743,7 @@ or a Nginx AMP:
|
|||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
.EX
|
||||
[amp_nginx]
|
||||
# Nginx status page should be enabled (https://easyengine.io/tutorials/nginx/status\-page/)
|
||||
enable=true
|
||||
|
|
@ -709,8 +751,7 @@ regex=\e/usr\e/sbin\e/nginx
|
|||
refresh=60
|
||||
one_line=false
|
||||
status_url=http://localhost/nginx_status
|
||||
.ft P
|
||||
.fi
|
||||
.EE
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
|
|
@ -720,13 +761,11 @@ of an InfluxDB export to the current hostname, use:
|
|||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
.EX
|
||||
[influxdb]
|
||||
\&...
|
||||
prefix=\(gahostname\(ga
|
||||
.ft P
|
||||
.fi
|
||||
.EE
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
|
|
@ -734,13 +773,11 @@ Or if you want to add the Operating System name as a tag:
|
|||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
.EX
|
||||
[influxdb]
|
||||
\&...
|
||||
tags=system:\(gauname \-a\(ga
|
||||
.ft P
|
||||
.fi
|
||||
.EE
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.SH LOGGING
|
||||
|
|
@ -763,8 +800,7 @@ format):
|
|||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
.EX
|
||||
{
|
||||
\(dqversion\(dq: 1,
|
||||
\(dqdisable_existing_loggers\(dq: \(dqFalse\(dq,
|
||||
|
|
@ -823,8 +859,7 @@ format):
|
|||
}
|
||||
}
|
||||
}
|
||||
.ft P
|
||||
.fi
|
||||
.EE
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
|
|
@ -832,11 +867,9 @@ and start Glances using the following command line:
|
|||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
.EX
|
||||
LOG_CFG=<path>/glances.json glances
|
||||
.ft P
|
||||
.fi
|
||||
.EE
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
|
|
@ -849,14 +882,15 @@ is hosted.
|
|||
.UNINDENT
|
||||
.SH EXAMPLES
|
||||
.sp
|
||||
Monitor local machine (standalone mode):
|
||||
Monitor local machine, also called standalone mode,
|
||||
with the Text\-based user interface (TUI):
|
||||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
$ glances
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
To monitor the local machine with the web interface (Web UI),
|
||||
To monitor the local machine with the Web user interface (WebUI),
|
||||
, run the following command line:
|
||||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
|
|
@ -864,7 +898,7 @@ $ glances \-w
|
|||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
then, open a web browser to the provided URL.
|
||||
then, open a Web Browser to the provided URL.
|
||||
.sp
|
||||
Monitor local machine and export stats to a CSV file:
|
||||
.INDENT 0.0
|
||||
|
|
@ -910,16 +944,25 @@ $ glances \-c <ip_server> –export statsd
|
|||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
Start the client browser (browser mode):
|
||||
Start the TUI Central Glances Browser:
|
||||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
$ glances –browser
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
Start the WebUI Central Glances Browser (new in Glances 4.3 or higher):
|
||||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
$ glances –browser \-w
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
If you do not want to see the local Glances Web Server in the browser list please use –disable\-autodiscover option.
|
||||
.SH AUTHOR
|
||||
.sp
|
||||
Nicolas Hennion aka Nicolargo <\X'tty: link mailto:contact@nicolargo.com'\fI\%contact@nicolargo.com\fP\X'tty: link'>
|
||||
.SH COPYRIGHT
|
||||
2024, Nicolas Hennion
|
||||
2026, Nicolas Hennion
|
||||
.\" Generated by docutils manpage writer.
|
||||
.
|
||||
|
|
|
|||
|
|
@ -4,11 +4,12 @@ Quickstart
|
|||
==========
|
||||
|
||||
This page gives a good introduction to how to get started with Glances.
|
||||
Glances offers three modes:
|
||||
Glances offers multiple modes:
|
||||
|
||||
- Standalone
|
||||
- Client/Server
|
||||
- Web server
|
||||
- Fetch
|
||||
|
||||
Standalone Mode
|
||||
---------------
|
||||
|
|
@ -88,8 +89,8 @@ available network interfaces) and TCP port is ``61209``.
|
|||
|
||||
In client/server mode, limits are set by the server side.
|
||||
|
||||
Central client
|
||||
^^^^^^^^^^^^^^
|
||||
Central Glances Browser
|
||||
^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
.. image:: _static/browser.png
|
||||
|
||||
|
|
@ -102,6 +103,10 @@ Example:
|
|||
.. code-block:: ini
|
||||
|
||||
[serverlist]
|
||||
# Define columns (comma separated list of <plugin>:<field>:(<key>)) to grab/display
|
||||
# Default is: system:hr_name,load:min5,cpu:total,mem:percent
|
||||
# You can also add stats with key, like sensors:value:Ambient (key is case sensitive)
|
||||
columns=system:hr_name,load:min5,cpu:total,mem:percent,memswap:percent
|
||||
# Define the static servers list
|
||||
server_1_name=xps
|
||||
server_1_alias=xps
|
||||
|
|
@ -112,22 +117,30 @@ Example:
|
|||
Glances can also detect and display all Glances servers available on
|
||||
your network via the ``zeroconf`` protocol (not available on Windows):
|
||||
|
||||
To start the central client, use the following option:
|
||||
To start the TUI Central Glances Browser, use the following option:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
client$ glances --browser
|
||||
|
||||
.. note::
|
||||
|
||||
Use ``--disable-autodiscover`` to disable the auto-discovery mode.
|
||||
|
||||
When the list is displayed, you can navigate through the Glances servers with
|
||||
up/down keys. It is also possible to sort the server using:
|
||||
- '1' is normal (do not sort)
|
||||
- '2' is using sorting with ascending order (ONLINE > SNMP > PROTECTED > OFFLINE > UNKNOWN)
|
||||
- '3' is using sorting with descending order (UNKNOWN > OFFLINE > PROTECTED > SNMP > ONLINE)
|
||||
|
||||
To start the WebUI Central Glances Browser (new in Glances 4.3 or higher), use the following option:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
client$ glances --browser -w
|
||||
|
||||
Open the URL (/browser) and click on the server to display stats.
|
||||
|
||||
.. note::
|
||||
|
||||
Use ``--disable-autodiscover`` to disable the auto-discovery mode.
|
||||
|
||||
SNMP
|
||||
^^^^
|
||||
|
||||
|
|
@ -184,7 +197,7 @@ Here's a screenshot from Chrome on Android:
|
|||
.. image:: _static/screenshot-web2.png
|
||||
|
||||
How do you protect your server (or Web server) with a login/password ?
|
||||
------------------------------------------------------------------
|
||||
----------------------------------------------------------------------
|
||||
|
||||
You can set a password to access the server using the ``--password``.
|
||||
By default, the login is ``glances`` but you can change it with
|
||||
|
|
@ -210,3 +223,22 @@ file:
|
|||
# Additionally (and optionally) a default password could be defined
|
||||
localhost=mylocalhostpassword
|
||||
default=mydefaultpassword
|
||||
|
||||
Fetch mode
|
||||
----------
|
||||
|
||||
It is also possible to get and share a quick look of a machine using the
|
||||
``fetch`` mode. In this mode, current stats are display on the console in
|
||||
a fancy way.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
$ glances --fetch
|
||||
|
||||
Results look like this:
|
||||
|
||||
.. image:: _static/screenshot-fetch.png
|
||||
|
||||
It is also possible to use a custom template with the ``--fetch-template </path/to/template.jinja>`` option.
|
||||
|
||||
Have a look to the :ref:`fetch documentation page<fetch>` to learn how to create your own template.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,33 @@
|
|||
import json
|
||||
from unittest.mock import patch
|
||||
|
||||
from fastapi.openapi.utils import get_openapi
|
||||
|
||||
from glances.main import GlancesMain
|
||||
|
||||
# sys.path.append('./glances/outputs')
|
||||
from glances.outputs.glances_restful_api import GlancesRestfulApi
|
||||
|
||||
# Init Glances core
|
||||
testargs = ["glances", "-C", "./conf/glances.conf"]
|
||||
with patch('sys.argv', testargs):
|
||||
core = GlancesMain()
|
||||
test_config = core.get_config()
|
||||
test_args = core.get_args()
|
||||
|
||||
app = GlancesRestfulApi(config=test_config, args=test_args)._app
|
||||
|
||||
with open('./docs/api/openapi.json', 'w') as f:
|
||||
json.dump(
|
||||
get_openapi(
|
||||
title=app.title,
|
||||
version=app.version,
|
||||
# Set the OenAPI version
|
||||
# It's an hack to make openapi.json compatible with tools like https://editor.swagger.io/
|
||||
# Please read https://fastapi.tiangolo.com/reference/fastapi/?h=openapi#fastapi.FastAPI.openapi_version
|
||||
openapi_version="3.0.2",
|
||||
description=app.description,
|
||||
routes=app.routes,
|
||||
),
|
||||
f,
|
||||
)
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
import json
|
||||
|
||||
from glances.outputs.glances_curses import _GlancesCurses
|
||||
|
||||
print(
|
||||
json.dumps(
|
||||
{
|
||||
"topMenu": list(_GlancesCurses._top),
|
||||
"leftMenu": [p for p in _GlancesCurses._left_sidebar if p != "now"],
|
||||
},
|
||||
indent=4,
|
||||
)
|
||||
)
|
||||
|
|
@ -0,0 +1,523 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "592b8135-c06b-41b7-895e-9dd70787f6ac",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Use Glances API in your Python code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "e5ec86ae-ce2b-452f-b715-54e746026a96",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Init the Glances API"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"id": "ba9b3546-65a0-4eec-942b-1855ff5c5d32",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from glances import api"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"id": "e81ad928-3b61-4654-8589-13cb29e7f292",
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"gl = api.GlancesAPI()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "6ec912a3-0875-4cdb-8539-e84ffb27768a",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Get plugins list"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"id": "1ce57a13-a90d-4d65-b4a4-2bc45112697e",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['alert',\n",
|
||||
" 'ports',\n",
|
||||
" 'diskio',\n",
|
||||
" 'containers',\n",
|
||||
" 'processcount',\n",
|
||||
" 'programlist',\n",
|
||||
" 'gpu',\n",
|
||||
" 'percpu',\n",
|
||||
" 'vms',\n",
|
||||
" 'system',\n",
|
||||
" 'network',\n",
|
||||
" 'cpu',\n",
|
||||
" 'amps',\n",
|
||||
" 'processlist',\n",
|
||||
" 'load',\n",
|
||||
" 'sensors',\n",
|
||||
" 'uptime',\n",
|
||||
" 'now',\n",
|
||||
" 'connections',\n",
|
||||
" 'fs',\n",
|
||||
" 'wifi',\n",
|
||||
" 'ip',\n",
|
||||
" 'help',\n",
|
||||
" 'version',\n",
|
||||
" 'psutilversion',\n",
|
||||
" 'core',\n",
|
||||
" 'mem',\n",
|
||||
" 'folders',\n",
|
||||
" 'quicklook',\n",
|
||||
" 'memswap',\n",
|
||||
" 'raid']"
|
||||
]
|
||||
},
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.plugins()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "d5be2964-7a28-4b93-9dd0-1481afd2ee50",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Get CPU stats"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"id": "0d1636d2-3f3e-44d4-bb67-45487384f79f",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'total': 3.8, 'user': 3.0, 'nice': 0.0, 'system': 0.8, 'idle': 96.1, 'iowait': 0.1, 'irq': 0.0, 'steal': 0.0, 'guest': 0.0, 'ctx_switches': 0, 'interrupts': 0, 'soft_interrupts': 0, 'syscalls': 0, 'cpucore': 16, 'time_since_update': 141.46278643608093, 'ctx_switches_gauge': 12830371, 'ctx_switches_rate_per_sec': 0, 'interrupts_gauge': 9800040, 'interrupts_rate_per_sec': 0, 'soft_interrupts_gauge': 3875931, 'soft_interrupts_rate_per_sec': 0, 'syscalls_gauge': 0, 'syscalls_rate_per_sec': 0}"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.cpu"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 8,
|
||||
"id": "99681a33-045e-43bf-927d-88b15872fad0",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"3.1"
|
||||
]
|
||||
},
|
||||
"execution_count": 8,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.cpu.get('total')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "07e30de4-8f2a-4110-9c43-2a87d91dbf24",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Get MEMORY stats"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"id": "33502d93-acf9-49c5-8bcd-0a0404b47829",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'total': 16422858752, 'available': 6726169136, 'percent': 59.0, 'used': 9696689616, 'free': 541847552, 'active': 8672595968, 'inactive': 5456875520, 'buffers': 354791424, 'cached': 6520318384, 'shared': 729960448}"
|
||||
]
|
||||
},
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.mem"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"id": "404cd8d6-ac38-4830-8ead-4b747e0ca7b1",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"6779998768"
|
||||
]
|
||||
},
|
||||
"execution_count": 11,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.mem.get('available')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "74e27e9f-3240-4827-a754-3538b7d68119",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Display it in a user friendly way:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"id": "fa83b40a-51e8-45fa-b478-d0fcc9de4639",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'6.28G'"
|
||||
]
|
||||
},
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.auto_unit(gl.mem.get('available'))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "bfaf5b94-7c9c-4fdc-8a91-71f543cafa4b",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Get NETWORK stats"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"id": "a0ab2ce7-e9bd-4a60-9b90-095a9023dac7",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'wlp0s20f3': {'bytes_sent': 1130903, 'bytes_recv': 2213272, 'speed': 0, 'key': 'interface_name', 'interface_name': 'wlp0s20f3', 'alias': 'WIFI', 'bytes_all': 3344175, 'time_since_update': 354.35748958587646, 'bytes_recv_gauge': 1108380679, 'bytes_recv_rate_per_sec': 6245.0, 'bytes_sent_gauge': 21062113, 'bytes_sent_rate_per_sec': 3191.0, 'bytes_all_gauge': 1129442792, 'bytes_all_rate_per_sec': 9437.0}}"
|
||||
]
|
||||
},
|
||||
"execution_count": 16,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.network"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "b65f7280-d9f0-4719-9e10-8b78dc414bae",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Get the list of networks interfaces:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"id": "1a55d32a-bd7d-4dfa-b239-8875c01f205e",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"['wlp0s20f3']"
|
||||
]
|
||||
},
|
||||
"execution_count": 18,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.network.keys()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8c7e0215-e96a-4f7e-a187-9b7bee1abcf9",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Get stats for a specific network interface:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 20,
|
||||
"id": "9aacfb32-c0e3-4fc7-b1d2-d216e46088cd",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'bytes_sent': 118799,\n",
|
||||
" 'bytes_recv': 275052,\n",
|
||||
" 'speed': 0,\n",
|
||||
" 'key': 'interface_name',\n",
|
||||
" 'interface_name': 'wlp0s20f3',\n",
|
||||
" 'alias': 'WIFI',\n",
|
||||
" 'bytes_all': 393851,\n",
|
||||
" 'time_since_update': 46.24822926521301,\n",
|
||||
" 'bytes_recv_gauge': 1108795793,\n",
|
||||
" 'bytes_recv_rate_per_sec': 5947.0,\n",
|
||||
" 'bytes_sent_gauge': 21268464,\n",
|
||||
" 'bytes_sent_rate_per_sec': 2568.0,\n",
|
||||
" 'bytes_all_gauge': 1130064257,\n",
|
||||
" 'bytes_all_rate_per_sec': 8516.0}"
|
||||
]
|
||||
},
|
||||
"execution_count": 20,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.network.get('wlp0s20f3')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 21,
|
||||
"id": "4f5ae513-6022-4a52-8d6c-e8b62afacc24",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"5105.0"
|
||||
]
|
||||
},
|
||||
"execution_count": 21,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.network.get('wlp0s20f3').get('bytes_recv_rate_per_sec')"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "8b0bdbf4-e386-44aa-9585-1d042f0ded5d",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Additional information"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "5c52a0c7-06fb-432a-bdb7-9921f432d5a6",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Example for the LOAD plugin."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 29,
|
||||
"id": "99303a2b-52a3-440f-a896-ad4951a9de34",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'min1': 1.01123046875, 'min5': 0.83447265625, 'min15': 0.76171875, 'cpucore': 16}"
|
||||
]
|
||||
},
|
||||
"execution_count": 29,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.load"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "7a560824-2787-4436-b39b-63de0c455536",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Get the limit configured in the glances.conf:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 34,
|
||||
"id": "cbbc6a81-623f-4eff-9d08-e6a8b5981660",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'min1': {'description': 'Average sum of the number of processes waiting in the run-queue plus the number currently executing over 1 minute.',\n",
|
||||
" 'unit': 'float'},\n",
|
||||
" 'min5': {'description': 'Average sum of the number of processes waiting in the run-queue plus the number currently executing over 5 minutes.',\n",
|
||||
" 'unit': 'float'},\n",
|
||||
" 'min15': {'description': 'Average sum of the number of processes waiting in the run-queue plus the number currently executing over 15 minutes.',\n",
|
||||
" 'unit': 'float'},\n",
|
||||
" 'cpucore': {'description': 'Total number of CPU core.', 'unit': 'number'}}"
|
||||
]
|
||||
},
|
||||
"execution_count": 34,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.load.fields_description"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"id": "2bd51d13-77e3-48f0-aa53-af86df6425f8",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Get field description and unit:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 30,
|
||||
"id": "8682edcf-a8b9-424c-976f-2a301a05be6a",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'history_size': 1200.0,\n",
|
||||
" 'load_disable': ['False'],\n",
|
||||
" 'load_careful': 0.7,\n",
|
||||
" 'load_warning': 1.0,\n",
|
||||
" 'load_critical': 5.0}"
|
||||
]
|
||||
},
|
||||
"execution_count": 30,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.load.get_limits()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "raw",
|
||||
"id": "3c671ff8-3a0c-48d3-8247-6081c69c19a9",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Get current stats views regarding limits:"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 33,
|
||||
"id": "45e03e9b-233c-4359-bcbc-7d2f06aca1c6",
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{'min1': {'decoration': 'DEFAULT',\n",
|
||||
" 'optional': False,\n",
|
||||
" 'additional': False,\n",
|
||||
" 'splittable': False,\n",
|
||||
" 'hidden': False},\n",
|
||||
" 'min5': {'decoration': 'OK',\n",
|
||||
" 'optional': False,\n",
|
||||
" 'additional': False,\n",
|
||||
" 'splittable': False,\n",
|
||||
" 'hidden': False},\n",
|
||||
" 'min15': {'decoration': 'OK_LOG',\n",
|
||||
" 'optional': False,\n",
|
||||
" 'additional': False,\n",
|
||||
" 'splittable': False,\n",
|
||||
" 'hidden': False},\n",
|
||||
" 'cpucore': {'decoration': 'DEFAULT',\n",
|
||||
" 'optional': False,\n",
|
||||
" 'additional': False,\n",
|
||||
" 'splittable': False,\n",
|
||||
" 'hidden': False}}"
|
||||
]
|
||||
},
|
||||
"execution_count": 33,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"gl.load.get_views()"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.14.0"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 5
|
||||
}
|
||||
|
|
@ -2,36 +2,3 @@ You are in the main Glances source folder. This page is **ONLY** for developers.
|
|||
|
||||
If you are looking for the user manual, please follow this link:
|
||||
https://glances.readthedocs.io/en/stable/
|
||||
|
||||
===
|
||||
|
||||
__init__.py Global module init
|
||||
__main__.py Entry point for Glances module
|
||||
config.py Manage the configuration file
|
||||
globals.py Share variables upon modules
|
||||
main.py Main script to rule them up...
|
||||
client.py Glances client
|
||||
server.py Glances server
|
||||
webserver.py Glances web server (Based on FastAPI)
|
||||
autodiscover.py Glances autodiscover module (via zeroconf)
|
||||
standalone.py Glances standalone (curses interface)
|
||||
password.py Manage password for Glances client/server
|
||||
stats.py The stats manager
|
||||
timer.py The timer class
|
||||
actions.py Manage trigger actions (via mustache)
|
||||
snmp.py Glances SNMP client (via pysnmp)
|
||||
...
|
||||
plugins
|
||||
=> Glances plugins
|
||||
...
|
||||
outputs
|
||||
=> Glances UI
|
||||
glances_curses.py The curses interface
|
||||
glances_restful-api.py The HTTP/API & Web based interface
|
||||
...
|
||||
exports
|
||||
=> Glances exports
|
||||
...
|
||||
amps
|
||||
=> Glances Application Monitoring Processes (AMP)
|
||||
...
|
||||
|
|
|
|||
|
|
@ -19,7 +19,8 @@ import tracemalloc
|
|||
# Global name
|
||||
# Version should start and end with a numerical char
|
||||
# See https://packaging.python.org/specifications/core-metadata/#version
|
||||
__version__ = '4.0.6'
|
||||
# Examples: 1.0.0, 1.0.0rc1, 1.1.0_dev1
|
||||
__version__ = "4.4.2_dev1"
|
||||
__apiversion__ = '4'
|
||||
__author__ = 'Nicolas Hennion <nicolas@nicolargo.com>'
|
||||
__license__ = 'LGPLv3'
|
||||
|
|
@ -52,10 +53,10 @@ if psutil_version_info < psutil_min_version:
|
|||
|
||||
|
||||
# Trac malloc is only available on Python 3.4 or higher
|
||||
|
||||
|
||||
def __signal_handler(signal, frame):
|
||||
logger.debug(f"Signal {signal} catched")
|
||||
def __signal_handler(sig, frame):
|
||||
logger.debug(f"Signal {sig} caught")
|
||||
# Avoid Glances hang when killing process with muliple CTRL-C See #3264
|
||||
signal.signal(signal.SIGINT, signal.SIG_IGN)
|
||||
end()
|
||||
|
||||
|
||||
|
|
@ -74,6 +75,53 @@ def end():
|
|||
sys.exit(0)
|
||||
|
||||
|
||||
def start_main_loop(args, start_duration):
|
||||
logger.debug(f"Glances started in {start_duration.get()} seconds")
|
||||
if args.stop_after:
|
||||
logger.info(f'Glances will be stopped in ~{args.stop_after * args.time} seconds')
|
||||
|
||||
|
||||
def check_memleak(args, mode):
|
||||
if args.memory_leak:
|
||||
wait = args.stop_after * args.time * args.memory_leak * 2
|
||||
print(f'Memory leak detection, please wait ~{wait} seconds...')
|
||||
# First run without dump to fill the memory
|
||||
mode.serve_n(args.stop_after)
|
||||
# Then start the memory-leak loop
|
||||
snapshot_begin = tracemalloc.take_snapshot()
|
||||
else:
|
||||
snapshot_begin = None
|
||||
|
||||
return snapshot_begin
|
||||
|
||||
|
||||
def setup_server_mode(args, mode):
|
||||
if args.stdout_issue or args.stdout_api_restful_doc or args.stdout_api_doc:
|
||||
# Serve once for issue and API documentation modes
|
||||
mode.serve_issue()
|
||||
else:
|
||||
# Serve forever
|
||||
mode.serve_forever()
|
||||
|
||||
|
||||
def maybe_trace_memleak(args, snapshot_begin):
|
||||
if args.trace_malloc or args.memory_leak:
|
||||
snapshot_end = tracemalloc.take_snapshot()
|
||||
if args.memory_leak:
|
||||
snapshot_diff = snapshot_end.compare_to(snapshot_begin, 'filename')
|
||||
memory_leak = sum([s.size_diff for s in snapshot_diff])
|
||||
print(f"Memory consumption: {memory_leak / 1000:.1f}KB (see log for details)")
|
||||
logger.info("Memory consumption (top 5):")
|
||||
for stat in snapshot_diff[:5]:
|
||||
logger.info(stat)
|
||||
if args.trace_malloc:
|
||||
# See more options here: https://docs.python.org/3/library/tracemalloc.html
|
||||
top_stats = snapshot_end.statistics("filename")
|
||||
print("[ Trace malloc - Top 10 ]")
|
||||
for stat in top_stats[:10]:
|
||||
print(stat)
|
||||
|
||||
|
||||
def start(config, args):
|
||||
"""Start Glances."""
|
||||
|
||||
|
|
@ -101,40 +149,10 @@ def start(config, args):
|
|||
logger.info(f"Start {GlancesMode.__name__} mode")
|
||||
mode = GlancesMode(config=config, args=args)
|
||||
|
||||
# Start the main loop
|
||||
logger.debug(f"Glances started in {start_duration.get()} seconds")
|
||||
if args.stop_after:
|
||||
logger.info(f'Glances will be stopped in ~{args.stop_after * args.time} seconds')
|
||||
|
||||
if args.memory_leak:
|
||||
print(f'Memory leak detection, please wait ~{args.stop_after * args.time * args.memory_leak * 2} seconds...')
|
||||
# First run without dump to fill the memory
|
||||
mode.serve_n(args.stop_after)
|
||||
# Then start the memory-leak loop
|
||||
snapshot_begin = tracemalloc.take_snapshot()
|
||||
|
||||
if args.stdout_issue or args.stdout_apidoc:
|
||||
# Serve once for issue/test mode
|
||||
mode.serve_issue()
|
||||
else:
|
||||
# Serve forever
|
||||
mode.serve_forever()
|
||||
|
||||
if args.memory_leak:
|
||||
snapshot_end = tracemalloc.take_snapshot()
|
||||
snapshot_diff = snapshot_end.compare_to(snapshot_begin, 'filename')
|
||||
memory_leak = sum([s.size_diff for s in snapshot_diff])
|
||||
print(f"Memory consumption: {memory_leak / 1000:.1f}KB (see log for details)")
|
||||
logger.info("Memory consumption (top 5):")
|
||||
for stat in snapshot_diff[:5]:
|
||||
logger.info(stat)
|
||||
elif args.trace_malloc:
|
||||
# See more options here: https://docs.python.org/3/library/tracemalloc.html
|
||||
snapshot = tracemalloc.take_snapshot()
|
||||
top_stats = snapshot.statistics("filename")
|
||||
print("[ Trace malloc - Top 10 ]")
|
||||
for stat in top_stats[:10]:
|
||||
print(stat)
|
||||
start_main_loop(args, start_duration)
|
||||
snapshot_begin = check_memleak(args, mode)
|
||||
setup_server_mode(args, mode)
|
||||
maybe_trace_memleak(args, snapshot_begin)
|
||||
|
||||
# Shutdown
|
||||
mode.end()
|
||||
|
|
@ -171,3 +189,6 @@ def main():
|
|||
|
||||
# Glances can be ran in standalone, client or server mode
|
||||
start(config=core.get_config(), args=core.get_args())
|
||||
|
||||
|
||||
# End of glances/__init__.py
|
||||
|
|
|
|||
|
|
@ -24,11 +24,9 @@ one_line=false
|
|||
command=foo status
|
||||
"""
|
||||
|
||||
from subprocess import STDOUT, CalledProcessError, check_output
|
||||
|
||||
from glances.amps.amp import GlancesAmp
|
||||
from glances.globals import to_ascii, u
|
||||
from glances.logger import logger
|
||||
from glances.secure import secure_popen
|
||||
|
||||
|
||||
class Amp(GlancesAmp):
|
||||
|
|
@ -68,10 +66,7 @@ class Amp(GlancesAmp):
|
|||
# Run command(s)
|
||||
# Comma separated commands can be executed
|
||||
try:
|
||||
msg = ''
|
||||
for cmd in res.split(';'):
|
||||
msg += u(check_output(cmd.split(), stderr=STDOUT))
|
||||
self.set_result(to_ascii(msg.rstrip()))
|
||||
except CalledProcessError as e:
|
||||
self.set_result(secure_popen(res).rstrip())
|
||||
except Exception as e:
|
||||
self.set_result(e.output)
|
||||
return self.result()
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ class Amp(GlancesAmp):
|
|||
"""Update the AMP"""
|
||||
# Get the Nginx status
|
||||
logger.debug('{}: Update stats using status URL {}'.format(self.NAME, self.get('status_url')))
|
||||
res = requests.get(self.get('status_url'))
|
||||
res = requests.get(self.get('status_url'), timeout=15)
|
||||
if res.ok:
|
||||
# u'Active connections: 1 \nserver accepts handled requests\n 1 1 1 \nReading: 0 Writing: 1 Waiting: 0 \n'
|
||||
self.set_result(res.text.rstrip())
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ systemctl_cmd=/usr/bin/systemctl --plain
|
|||
from subprocess import CalledProcessError, check_output
|
||||
|
||||
from glances.amps.amp import GlancesAmp
|
||||
from glances.globals import iteritems, to_ascii
|
||||
from glances.globals import to_ascii
|
||||
from glances.logger import logger
|
||||
|
||||
|
||||
|
|
@ -45,7 +45,7 @@ class Amp(GlancesAmp):
|
|||
"""Glances' Systemd AMP."""
|
||||
|
||||
NAME = 'Systemd'
|
||||
VERSION = '1.0'
|
||||
VERSION = '1.1'
|
||||
DESCRIPTION = 'Get services list from systemctl (systemd)'
|
||||
AUTHOR = 'Nicolargo'
|
||||
EMAIL = 'contact@nicolargo.com'
|
||||
|
|
@ -77,7 +77,7 @@ class Amp(GlancesAmp):
|
|||
status[column[c]] = 1
|
||||
# Build the output (string) message
|
||||
output = 'Services\n'
|
||||
for k, v in iteritems(status):
|
||||
for k, v in status.items():
|
||||
output += f'{k}: {v}\n'
|
||||
self.set_result(output, separator=' ')
|
||||
|
||||
|
|
|
|||
|
|
@ -33,18 +33,16 @@ one_line=true
|
|||
service_cmd=/usr/bin/service --status-all
|
||||
"""
|
||||
|
||||
from subprocess import STDOUT, check_output
|
||||
|
||||
from glances.amps.amp import GlancesAmp
|
||||
from glances.globals import iteritems
|
||||
from glances.logger import logger
|
||||
from glances.secure import secure_popen
|
||||
|
||||
|
||||
class Amp(GlancesAmp):
|
||||
"""Glances' Systemd AMP."""
|
||||
|
||||
NAME = 'SystemV'
|
||||
VERSION = '1.0'
|
||||
VERSION = '1.1'
|
||||
DESCRIPTION = 'Get services list from service (initd)'
|
||||
AUTHOR = 'Nicolargo'
|
||||
EMAIL = 'contact@nicolargo.com'
|
||||
|
|
@ -58,8 +56,9 @@ class Amp(GlancesAmp):
|
|||
# Get the systemctl status
|
||||
logger.debug('{}: Update stats using service {}'.format(self.NAME, self.get('service_cmd')))
|
||||
try:
|
||||
res = check_output(self.get('service_cmd').split(), stderr=STDOUT).decode('utf-8')
|
||||
except OSError as e:
|
||||
# res = check_output(self.get('service_cmd').split(), stderr=STDOUT).decode('utf-8')
|
||||
res = secure_popen(self.get('service_cmd'))
|
||||
except Exception as e:
|
||||
logger.debug(f'{self.NAME}: Error while executing service ({e})')
|
||||
else:
|
||||
status = {'running': 0, 'stopped': 0, 'upstart': 0}
|
||||
|
|
@ -77,7 +76,7 @@ class Amp(GlancesAmp):
|
|||
status['upstart'] += 1
|
||||
# Build the output (string) message
|
||||
output = 'Services\n'
|
||||
for k, v in iteritems(status):
|
||||
for k, v in status.items():
|
||||
output += f'{k}: {v}\n'
|
||||
self.set_result(output, separator=' ')
|
||||
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ import os
|
|||
import re
|
||||
import threading
|
||||
|
||||
from glances.globals import amps_path, iteritems, listkeys
|
||||
from glances.globals import amps_path, listkeys
|
||||
from glances.logger import logger
|
||||
from glances.processes import glances_processes
|
||||
|
||||
|
|
@ -90,7 +90,7 @@ class AmpsList:
|
|||
processlist = glances_processes.get_list()
|
||||
|
||||
# Iter upon the AMPs dict
|
||||
for k, v in iteritems(self.get()):
|
||||
for k, v in self.get().items():
|
||||
if not v.enable():
|
||||
# Do not update if the enable tag is set
|
||||
continue
|
||||
|
|
@ -105,7 +105,7 @@ class AmpsList:
|
|||
|
||||
amps_list = self._build_amps_list(v, processlist)
|
||||
|
||||
if len(amps_list) > 0:
|
||||
if amps_list:
|
||||
# At least one process is matching the regex
|
||||
logger.debug(f"AMPS: {len(amps_list)} processes {k} detected ({amps_list})")
|
||||
# Call the AMP update method
|
||||
|
|
@ -125,18 +125,14 @@ class AmpsList:
|
|||
|
||||
Search application monitored processes by a regular expression
|
||||
"""
|
||||
ret = []
|
||||
try:
|
||||
# Search in both cmdline and name (for kernel thread, see #1261)
|
||||
for p in processlist:
|
||||
if (re.search(amp_value.regex(), p['name']) is not None) or (
|
||||
p['cmdline'] is not None
|
||||
and p['cmdline'] != []
|
||||
and re.search(amp_value.regex(), ' '.join(p['cmdline'])) is not None
|
||||
):
|
||||
ret.append(
|
||||
{'pid': p['pid'], 'cpu_percent': p['cpu_percent'], 'memory_percent': p['memory_percent']}
|
||||
)
|
||||
ret = [
|
||||
{'pid': p['pid'], 'cpu_percent': p['cpu_percent'], 'memory_percent': p['memory_percent']}
|
||||
for p in processlist
|
||||
if re.search(amp_value.regex(), p['name'])
|
||||
or ((cmdline := p.get('cmdline')) and re.search(amp_value.regex(), ' '.join(cmdline)))
|
||||
]
|
||||
|
||||
except (TypeError, KeyError) as e:
|
||||
logger.debug(f"Can not build AMPS list ({e})")
|
||||
|
|
|
|||
|
|
@ -0,0 +1,117 @@
|
|||
#
|
||||
# Glances - An eye on your system
|
||||
#
|
||||
# SPDX-FileCopyrightText: 2025 Nicolas Hennion <nicolas@nicolargo.com>
|
||||
#
|
||||
# SPDX-License-Identifier: LGPL-3.0-only
|
||||
#
|
||||
|
||||
from glances import __version__ as glances_version
|
||||
from glances.globals import auto_unit, weak_lru_cache
|
||||
from glances.main import GlancesMain
|
||||
from glances.outputs.glances_bars import Bar
|
||||
from glances.processes import sort_stats
|
||||
from glances.stats import GlancesStats
|
||||
|
||||
plugin_dependencies_tree = {
|
||||
'processlist': ['processcount'],
|
||||
}
|
||||
|
||||
|
||||
class GlancesAPI:
|
||||
ttl = 2.0 # Default cache TTL in seconds
|
||||
|
||||
def __init__(self, config=None, args=None):
|
||||
self.__version__ = glances_version.split('.')[0] # Get the major version
|
||||
|
||||
core = GlancesMain()
|
||||
self.args = args if args is not None else core.get_args()
|
||||
self.config = config if config is not None else core.get_config()
|
||||
self._stats = GlancesStats(config=self.config, args=self.args)
|
||||
|
||||
# Set the cache TTL for the API
|
||||
self.ttl = self.args.time if self.args.time is not None else self.ttl
|
||||
|
||||
# Init the stats of all plugins in order to ensure that rate are computed
|
||||
self._stats.update()
|
||||
|
||||
@weak_lru_cache(maxsize=1, ttl=ttl)
|
||||
def __getattr__(self, item):
|
||||
"""Fallback to the stats object for any missing attributes."""
|
||||
if item in self._stats.getPluginsList():
|
||||
if item in plugin_dependencies_tree:
|
||||
# Ensure dependencies are updated before accessing the plugin
|
||||
for dependency in plugin_dependencies_tree[item]:
|
||||
self._stats.get_plugin(dependency).update()
|
||||
# Update the plugin stats
|
||||
self._stats.get_plugin(item).update()
|
||||
return self._stats.get_plugin(item)
|
||||
raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{item}'")
|
||||
|
||||
def plugins(self):
|
||||
"""Return the list of available plugins."""
|
||||
return self._stats.getPluginsList()
|
||||
|
||||
def auto_unit(self, number, low_precision=False, min_symbol='K', none_symbol='-'):
|
||||
"""
|
||||
Converts a numeric value into a human-readable string with appropriate units.
|
||||
|
||||
Args:
|
||||
number (float or int): The numeric value to be converted.
|
||||
low_precision (bool, optional): If True, use lower precision for the output. Defaults to False.
|
||||
min_symbol (str, optional): The minimum unit symbol to use (e.g., 'K' for kilo). Defaults to 'K'.
|
||||
none_symbol (str, optional): The symbol to display if the number is None. Defaults to '-'.
|
||||
|
||||
Returns:
|
||||
str: A human-readable string representation of the number with units.
|
||||
"""
|
||||
return auto_unit(number, low_precision, min_symbol, none_symbol)
|
||||
|
||||
def bar(self, value, size=18, bar_char='■', empty_char='□', pre_char='', post_char=''):
|
||||
"""
|
||||
Generate a progress bar representation for a given value.
|
||||
|
||||
Args:
|
||||
value (float): The percentage value to represent in the bar (typically between 0 and 100).
|
||||
size (int, optional): The total length of the bar in characters. Defaults to 18.
|
||||
bar_char (str, optional): The character used to represent the filled portion of the bar. Defaults to '■'.
|
||||
empty_char (str, optional): The character used to represent the empty portion of the bar. Defaults to '□'.
|
||||
pre_char (str, optional): A string to prepend to the bar. Defaults to ''.
|
||||
post_char (str, optional): A string to append to the bar. Defaults to ''.
|
||||
|
||||
Returns:
|
||||
str: A string representing the progress bar.
|
||||
"""
|
||||
b = Bar(
|
||||
size, bar_char=bar_char, empty_char=empty_char, pre_char=pre_char, post_char=post_char, display_value=False
|
||||
)
|
||||
b.percent = value
|
||||
return b.get()
|
||||
|
||||
def top_process(self, limit=3, sorted_by='cpu_percent', sorted_by_secondary='memory_percent'):
|
||||
"""
|
||||
Returns a list of the top processes sorted by specified criteria.
|
||||
|
||||
Args:
|
||||
limit (int, optional): The maximum number of top processes to return. Defaults to 3.
|
||||
sorted_by (str, optional): The primary key to sort processes by (e.g., 'cpu_percent').
|
||||
Defaults to 'cpu_percent'.
|
||||
sorted_by_secondary (str, optional): The secondary key to sort processes by if primary keys are equal
|
||||
(e.g., 'memory_percent'). Defaults to 'memory_percent'.
|
||||
|
||||
Returns:
|
||||
list: A list of dictionaries representing the top processes, excluding those with 'glances' in their
|
||||
command line.
|
||||
|
||||
Note:
|
||||
The 'glances' process is excluded from the returned list to avoid self-generated CPU load affecting
|
||||
the results.
|
||||
"""
|
||||
# Exclude glances process from the top list
|
||||
# because in fetch mode, Glances generate a CPU load
|
||||
all_but_glances = [
|
||||
p
|
||||
for p in self._stats.get_plugin('processlist').get_raw()
|
||||
if p['cmdline'] and 'glances' not in (p['cmdline'] or ())
|
||||
]
|
||||
return sort_stats(all_but_glances, sorted_by=sorted_by, sorted_by_secondary=sorted_by_secondary)[:limit]
|
||||
|
|
@ -10,6 +10,14 @@
|
|||
|
||||
from datetime import datetime
|
||||
|
||||
# Ugly hack waiting for Python 3.10 deprecation
|
||||
try:
|
||||
from datetime import UTC
|
||||
except ImportError:
|
||||
from datetime import timezone
|
||||
|
||||
UTC = timezone.utc
|
||||
|
||||
|
||||
class GlancesAttribute:
|
||||
def __init__(self, name, description='', history_max_size=None):
|
||||
|
|
@ -73,7 +81,7 @@ class GlancesAttribute:
|
|||
|
||||
Value is a tuple: (<timestamp>, <new_value>)
|
||||
"""
|
||||
self._value = (datetime.now(), new_value)
|
||||
self._value = (datetime.now(UTC), new_value)
|
||||
self.history_add(self._value)
|
||||
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -11,17 +11,24 @@
|
|||
import sys
|
||||
import time
|
||||
|
||||
import ujson
|
||||
from defusedxml import xmlrpc
|
||||
|
||||
from glances import __version__
|
||||
from glances.globals import Fault, ProtocolError, ServerProxy, Transport
|
||||
from glances.globals import json_loads
|
||||
from glances.logger import logger
|
||||
from glances.outputs.glances_curses import GlancesCursesClient
|
||||
from glances.outputs.glances_stdout import GlancesStdout
|
||||
from glances.outputs.glances_stdout_csv import GlancesStdoutCsv
|
||||
from glances.outputs.glances_stdout_fetch import GlancesStdoutFetch
|
||||
from glances.outputs.glances_stdout_json import GlancesStdoutJson
|
||||
from glances.stats_client import GlancesStatsClient
|
||||
from glances.timer import Counter
|
||||
|
||||
# Correct issue #1025 by monkey path the xmlrpc lib
|
||||
xmlrpc.monkey_patch()
|
||||
|
||||
class GlancesClientTransport(Transport):
|
||||
|
||||
class GlancesClientTransport(xmlrpc.xmlrpc_client.Transport):
|
||||
"""This class overwrite the default XML-RPC transport and manage timeout."""
|
||||
|
||||
def set_timeout(self, timeout):
|
||||
|
|
@ -59,7 +66,7 @@ class GlancesClient:
|
|||
# Configure the server timeout
|
||||
transport.set_timeout(timeout)
|
||||
try:
|
||||
self.client = ServerProxy(self.uri, transport=transport)
|
||||
self.client = xmlrpc.xmlrpc_client.ServerProxy(self.uri, transport=transport)
|
||||
except Exception as e:
|
||||
self.log_and_exit(f"Client couldn't create socket {self.uri}: {e}")
|
||||
|
||||
|
|
@ -70,7 +77,7 @@ class GlancesClient:
|
|||
def log_and_exit(self, msg=''):
|
||||
"""Log and exit."""
|
||||
if not self.return_to_browser:
|
||||
logger.critical(msg)
|
||||
logger.critical(f"Error when connecting to Glances server: {msg}")
|
||||
sys.exit(2)
|
||||
else:
|
||||
logger.error(msg)
|
||||
|
|
@ -103,7 +110,7 @@ class GlancesClient:
|
|||
print(fall_back_msg)
|
||||
else:
|
||||
logger.info(fall_back_msg)
|
||||
except ProtocolError as err:
|
||||
except xmlrpc.xmlrpc_client.ProtocolError as err:
|
||||
# Other errors
|
||||
msg = f"Connection to server {self.uri} failed"
|
||||
if err.errcode == 401:
|
||||
|
|
@ -118,7 +125,7 @@ class GlancesClient:
|
|||
if __version__.split('.')[0] == client_version.split('.')[0]:
|
||||
# Init stats
|
||||
self.stats = GlancesStatsClient(config=self.config, args=self.args)
|
||||
self.stats.set_plugins(ujson.loads(self.client.getAllPlugins()))
|
||||
self.stats.set_plugins(json_loads(self.client.getAllPlugins()))
|
||||
logger.debug(f"Client version: {__version__} / Server version: {client_version}")
|
||||
else:
|
||||
self.log_and_exit(
|
||||
|
|
@ -169,6 +176,21 @@ class GlancesClient:
|
|||
if self.quiet:
|
||||
# In quiet mode, nothing is displayed
|
||||
logger.info("Quiet mode is ON: Nothing will be displayed")
|
||||
elif self.args.stdout:
|
||||
logger.info(f"Stdout mode is ON, following stats will be displayed: {self.args.stdout}")
|
||||
# Init screen
|
||||
self.screen = GlancesStdout(config=self.config, args=self.args)
|
||||
elif self.args.stdout_json:
|
||||
logger.info(f"Stdout JSON mode is ON, following stats will be displayed: {self.args.stdout_json}")
|
||||
# Init screen
|
||||
self.screen = GlancesStdoutJson(config=self.config, args=self.args)
|
||||
elif self.args.stdout_csv:
|
||||
logger.info(f"Stdout CSV mode is ON, following stats will be displayed: {self.args.stdout_csv}")
|
||||
# Init screen
|
||||
self.screen = GlancesStdoutCsv(config=self.config, args=self.args)
|
||||
elif self.args.stdout_fetch:
|
||||
logger.info("Fetch mode is ON")
|
||||
self.screen = GlancesStdoutFetch(config=self.config, args=self.args)
|
||||
else:
|
||||
self.screen = GlancesCursesClient(config=self.config, args=self.args)
|
||||
|
||||
|
|
@ -195,11 +217,11 @@ class GlancesClient:
|
|||
"""
|
||||
# Update the stats
|
||||
try:
|
||||
server_stats = ujson.loads(self.client.getAll())
|
||||
server_stats = json_loads(self.client.getAll())
|
||||
except OSError:
|
||||
# Client cannot get server stats
|
||||
return "Disconnected"
|
||||
except Fault:
|
||||
except xmlrpc.xmlrpc_client.Fault:
|
||||
# Client cannot get server stats (issue #375)
|
||||
return "Disconnected"
|
||||
else:
|
||||
|
|
@ -234,6 +256,7 @@ class GlancesClient:
|
|||
return self.client_mode
|
||||
|
||||
exit_key = False
|
||||
|
||||
try:
|
||||
while True and not exit_key:
|
||||
# Update the stats
|
||||
|
|
@ -261,8 +284,8 @@ class GlancesClient:
|
|||
else:
|
||||
# In quiet mode, we only wait adapated_refresh seconds
|
||||
time.sleep(adapted_refresh)
|
||||
except Exception as e:
|
||||
logger.critical(e)
|
||||
except Exception:
|
||||
logger.critical("Critical error in client serve_forever loop")
|
||||
self.end()
|
||||
|
||||
return self.client_mode
|
||||
|
|
|
|||
|
|
@ -1,24 +1,19 @@
|
|||
#
|
||||
# This file is part of Glances.
|
||||
#
|
||||
# SPDX-FileCopyrightText: 2022 Nicolas Hennion <nicolas@nicolargo.com>
|
||||
# SPDX-FileCopyrightText: 2024 Nicolas Hennion <nicolas@nicolargo.com>
|
||||
#
|
||||
# SPDX-License-Identifier: LGPL-3.0-only
|
||||
#
|
||||
|
||||
"""Manage the Glances client browser (list of Glances server)."""
|
||||
|
||||
import threading
|
||||
import webbrowser
|
||||
|
||||
import ujson
|
||||
|
||||
from glances.autodiscover import GlancesAutoDiscoverServer
|
||||
from glances.client import GlancesClient, GlancesClientTransport
|
||||
from glances.globals import Fault, ProtocolError, ServerProxy
|
||||
from glances.client import GlancesClient
|
||||
from glances.logger import LOG_FILENAME, logger
|
||||
from glances.outputs.glances_curses_browser import GlancesCursesBrowser
|
||||
from glances.password_list import GlancesPasswordList as GlancesPassword
|
||||
from glances.static_list import GlancesStaticServer
|
||||
from glances.servers_list import GlancesServersList
|
||||
|
||||
|
||||
class GlancesClientBrowser:
|
||||
|
|
@ -28,110 +23,28 @@ class GlancesClientBrowser:
|
|||
# Store the arg/config
|
||||
self.args = args
|
||||
self.config = config
|
||||
self.static_server = None
|
||||
self.password = None
|
||||
|
||||
# Load the configuration file
|
||||
self.load()
|
||||
|
||||
# Start the autodiscover mode (Zeroconf listener)
|
||||
if not self.args.disable_autodiscover:
|
||||
self.autodiscover_server = GlancesAutoDiscoverServer()
|
||||
else:
|
||||
self.autodiscover_server = None
|
||||
# Init the server list
|
||||
self.servers_list = GlancesServersList(config=config, args=args)
|
||||
|
||||
# Init screen
|
||||
self.screen = GlancesCursesBrowser(args=self.args)
|
||||
|
||||
def load(self):
|
||||
"""Load server and password list from the configuration file."""
|
||||
# Init the static server list (if defined)
|
||||
self.static_server = GlancesStaticServer(config=self.config)
|
||||
|
||||
# Init the password list (if defined)
|
||||
self.password = GlancesPassword(config=self.config)
|
||||
|
||||
def get_servers_list(self):
|
||||
"""Return the current server list (list of dict).
|
||||
|
||||
Merge of static + autodiscover servers list.
|
||||
"""
|
||||
ret = []
|
||||
|
||||
if self.args.browser:
|
||||
ret = self.static_server.get_servers_list()
|
||||
if self.autodiscover_server is not None:
|
||||
ret = self.static_server.get_servers_list() + self.autodiscover_server.get_servers_list()
|
||||
|
||||
return ret
|
||||
|
||||
def __get_uri(self, server):
|
||||
"""Return the URI for the given server dict."""
|
||||
# Select the connection mode (with or without password)
|
||||
if server['password'] != "":
|
||||
if server['status'] == 'PROTECTED':
|
||||
# Try with the preconfigure password (only if status is PROTECTED)
|
||||
clear_password = self.password.get_password(server['name'])
|
||||
if clear_password is not None:
|
||||
server['password'] = self.password.get_hash(clear_password)
|
||||
return 'http://{}:{}@{}:{}'.format(server['username'], server['password'], server['ip'], server['port'])
|
||||
return 'http://{}:{}'.format(server['ip'], server['port'])
|
||||
|
||||
def __update_stats(self, server):
|
||||
"""Update stats for the given server (picked from the server list)"""
|
||||
# Get the server URI
|
||||
uri = self.__get_uri(server)
|
||||
|
||||
# Try to connect to the server
|
||||
t = GlancesClientTransport()
|
||||
t.set_timeout(3)
|
||||
|
||||
# Get common stats
|
||||
try:
|
||||
s = ServerProxy(uri, transport=t)
|
||||
except Exception as e:
|
||||
logger.warning(f"Client browser couldn't create socket ({e})")
|
||||
else:
|
||||
# Mandatory stats
|
||||
try:
|
||||
# CPU%
|
||||
cpu_percent = 100 - ujson.loads(s.getCpu())['idle']
|
||||
server['cpu_percent'] = f'{cpu_percent:.1f}'
|
||||
# MEM%
|
||||
server['mem_percent'] = ujson.loads(s.getMem())['percent']
|
||||
# OS (Human Readable name)
|
||||
server['hr_name'] = ujson.loads(s.getSystem())['hr_name']
|
||||
except (OSError, Fault, KeyError) as e:
|
||||
logger.debug(f"Error while grabbing stats form server ({e})")
|
||||
server['status'] = 'OFFLINE'
|
||||
except ProtocolError as e:
|
||||
if e.errcode == 401:
|
||||
# Error 401 (Authentication failed)
|
||||
# Password is not the good one...
|
||||
server['password'] = None
|
||||
server['status'] = 'PROTECTED'
|
||||
else:
|
||||
server['status'] = 'OFFLINE'
|
||||
logger.debug(f"Cannot grab stats from server ({e.errcode} {e.errmsg})")
|
||||
else:
|
||||
# Status
|
||||
server['status'] = 'ONLINE'
|
||||
|
||||
# Optional stats (load is not available on Windows OS)
|
||||
try:
|
||||
# LOAD
|
||||
load_min5 = ujson.loads(s.getLoad())['min5']
|
||||
server['load_min5'] = f'{load_min5:.2f}'
|
||||
except Exception as e:
|
||||
logger.warning(f"Error while grabbing stats form server ({e})")
|
||||
|
||||
return server
|
||||
|
||||
def __display_server(self, server):
|
||||
"""Connect and display the given server"""
|
||||
# Display the Glances client for the selected server
|
||||
logger.debug(f"Selected server {server}")
|
||||
|
||||
if server['protocol'].lower() == 'rest':
|
||||
# Display a popup
|
||||
self.screen.display_popup(
|
||||
'Open the WebUI {}:{} in a Web Browser'.format(server['name'], server['port']), duration=1
|
||||
)
|
||||
# Try to open a Webbrowser
|
||||
webbrowser.open(self.servers_list.get_uri(server), new=2, autoraise=1)
|
||||
self.screen.active_server = None
|
||||
return
|
||||
|
||||
# Connection can take time
|
||||
# Display a popup
|
||||
self.screen.display_popup('Connect to {}:{}'.format(server['name'], server['port']), duration=1)
|
||||
|
|
@ -139,8 +52,11 @@ class GlancesClientBrowser:
|
|||
# A password is needed to access to the server's stats
|
||||
if server['password'] is None:
|
||||
# First of all, check if a password is available in the [passwords] section
|
||||
clear_password = self.password.get_password(server['name'])
|
||||
if clear_password is None or self.get_servers_list()[self.screen.active_server]['status'] == 'PROTECTED':
|
||||
clear_password = self.servers_list.password.get_password(server['name'])
|
||||
if (
|
||||
clear_password is None
|
||||
or self.servers_list.get_servers_list()[self.screen.active_server]['status'] == 'PROTECTED'
|
||||
):
|
||||
# Else, the password should be enter by the user
|
||||
# Display a popup to enter password
|
||||
clear_password = self.screen.display_popup(
|
||||
|
|
@ -148,7 +64,7 @@ class GlancesClientBrowser:
|
|||
)
|
||||
# Store the password for the selected server
|
||||
if clear_password is not None:
|
||||
self.set_in_selected('password', self.password.get_hash(clear_password))
|
||||
self.set_in_selected('password', self.servers_list.password.get_hash(clear_password))
|
||||
|
||||
# Display the Glance client on the selected server
|
||||
logger.info("Connect Glances client to the {} server".format(server['key']))
|
||||
|
|
@ -166,7 +82,7 @@ class GlancesClientBrowser:
|
|||
# Test if client and server are in the same major version
|
||||
if not client.login():
|
||||
self.screen.display_popup(
|
||||
"Sorry, cannot connect to '{}'\n" "See '{}' for more details".format(server['name'], LOG_FILENAME)
|
||||
"Sorry, cannot connect to '{}'\nSee '{}' for more details".format(server['name'], LOG_FILENAME)
|
||||
)
|
||||
|
||||
# Set the ONLINE status for the selected server
|
||||
|
|
@ -194,31 +110,16 @@ class GlancesClientBrowser:
|
|||
def __serve_forever(self):
|
||||
"""Main client loop."""
|
||||
# No need to update the server list
|
||||
# It's done by the GlancesAutoDiscoverListener class (autodiscover.py)
|
||||
# Or define statically in the configuration file (module static_list.py)
|
||||
# For each server in the list, grab elementary stats (CPU, LOAD, MEM, OS...)
|
||||
thread_list = {}
|
||||
while not self.screen.is_end:
|
||||
logger.debug(f"Iter through the following server list: {self.get_servers_list()}")
|
||||
for v in self.get_servers_list():
|
||||
key = v["key"]
|
||||
thread = thread_list.get(key, None)
|
||||
if thread is None or thread.is_alive() is False:
|
||||
thread = threading.Thread(target=self.__update_stats, args=[v])
|
||||
thread_list[key] = thread
|
||||
thread.start()
|
||||
# Update the stats in the servers list
|
||||
self.servers_list.update_servers_stats()
|
||||
|
||||
# Update the screen (list or Glances client)
|
||||
if self.screen.active_server is None:
|
||||
# Display the Glances browser
|
||||
self.screen.update(self.get_servers_list())
|
||||
# Display Glances browser (servers list)
|
||||
self.screen.update(self.servers_list.get_servers_list())
|
||||
else:
|
||||
# Display the active server
|
||||
self.__display_server(self.get_servers_list()[self.screen.active_server])
|
||||
|
||||
# exit key pressed
|
||||
for thread in thread_list.values():
|
||||
thread.join()
|
||||
# Display selected Glances server
|
||||
self.__display_server(self.servers_list.get_servers_list()[self.screen.active_server])
|
||||
|
||||
def serve_forever(self):
|
||||
"""Wrapper to the serve_forever function.
|
||||
|
|
@ -233,13 +134,7 @@ class GlancesClientBrowser:
|
|||
|
||||
def set_in_selected(self, key, value):
|
||||
"""Set the (key, value) for the selected server in the list."""
|
||||
# Static list then dynamic one
|
||||
if self.screen.active_server >= len(self.static_server.get_servers_list()):
|
||||
self.autodiscover_server.set_server(
|
||||
self.screen.active_server - len(self.static_server.get_servers_list()), key, value
|
||||
)
|
||||
else:
|
||||
self.static_server.set_server(self.screen.active_server, key, value)
|
||||
self.servers_list.set_in_selected(self.screen.active_server, key, value)
|
||||
|
||||
def end(self):
|
||||
"""End of the client browser session."""
|
||||
|
|
|
|||
|
|
@ -81,16 +81,31 @@ def default_config_dir():
|
|||
- Linux, SunOS, *BSD, macOS: /usr/share/doc (as defined in the setup.py files)
|
||||
- Windows: %APPDATA%\glances
|
||||
"""
|
||||
if LINUX or SUNOS or BSD or MACOS:
|
||||
path = '/usr/share/doc'
|
||||
else:
|
||||
path = os.environ.get('APPDATA')
|
||||
if path is None:
|
||||
path = ''
|
||||
else:
|
||||
path = os.path.join(path, 'glances')
|
||||
paths = []
|
||||
|
||||
return [path]
|
||||
# Add system path
|
||||
if LINUX or SUNOS or BSD or MACOS:
|
||||
paths.append(os.path.join(sys.prefix, 'share', 'doc'))
|
||||
else:
|
||||
paths.append(os.environ.get('APPDATA'))
|
||||
|
||||
# If we are in venv (issue #2803), sys.prefix != sys.base_prefix and we
|
||||
# already added venv path with sys.prefix. Add base_prefix path too
|
||||
if in_virtualenv():
|
||||
paths.append(os.path.join(sys.base_prefix, 'share', 'doc'))
|
||||
|
||||
return [os.path.join(path, 'glances') if path is not None else '' for path in paths]
|
||||
|
||||
|
||||
def in_virtualenv():
|
||||
# Source: https://stackoverflow.com/questions/1871549/how-to-determine-if-python-is-running-inside-a-virtualenv/1883251#1883251
|
||||
return sys.prefix != get_base_prefix_compat()
|
||||
|
||||
|
||||
def get_base_prefix_compat():
|
||||
"""Get base/real prefix, or sys.prefix if there is none."""
|
||||
# Source: https://stackoverflow.com/questions/1871549/how-to-determine-if-python-is-running-inside-a-virtualenv/1883251#1883251
|
||||
return getattr(sys, "base_prefix", None) or getattr(sys, "real_prefix", None) or sys.prefix
|
||||
|
||||
|
||||
class Config:
|
||||
|
|
@ -104,6 +119,7 @@ class Config:
|
|||
self.config_dir = config_dir
|
||||
self.config_filename = 'glances.conf'
|
||||
self._loaded_config_file = None
|
||||
self._config_file_paths = self.config_file_paths()
|
||||
|
||||
# Re pattern for optimize research of `foo`
|
||||
self.re_pattern = re.compile(r'(\`.+?\`)')
|
||||
|
|
@ -151,7 +167,7 @@ class Config:
|
|||
|
||||
def read(self):
|
||||
"""Read the config file, if it exists. Using defaults otherwise."""
|
||||
for config_file in self.config_file_paths():
|
||||
for config_file in self._config_file_paths:
|
||||
logger.debug(f'Search glances.conf file in {config_file}')
|
||||
if os.path.exists(config_file):
|
||||
try:
|
||||
|
|
@ -247,9 +263,8 @@ class Config:
|
|||
# Sensors
|
||||
if not self.parser.has_section('sensors'):
|
||||
self.parser.add_section('sensors')
|
||||
self.set_default_cwc('sensors', 'temperature_core', cwc=['60', '70', '80'])
|
||||
self.set_default_cwc('sensors', 'temperature_hdd', cwc=['45', '52', '60'])
|
||||
self.set_default_cwc('sensors', 'battery', cwc=['80', '90', '95'])
|
||||
self.set_default_cwc('sensors', 'battery', cwc=['70', '80', '90'])
|
||||
|
||||
# Process list
|
||||
if not self.parser.has_section('processlist'):
|
||||
|
|
|
|||
|
|
@ -8,46 +8,242 @@
|
|||
|
||||
"""CPU percent stats shared between CPU and Quicklook plugins."""
|
||||
|
||||
import platform
|
||||
from typing import TypedDict
|
||||
|
||||
import psutil
|
||||
|
||||
from glances.logger import logger
|
||||
from glances.timer import Timer
|
||||
|
||||
__all__ = ["cpu_percent"]
|
||||
|
||||
CPU_IMPLEMENTERS = {
|
||||
0x41: 'ARM Limited',
|
||||
0x42: 'Broadcom',
|
||||
0x43: 'Cavium',
|
||||
0x44: 'DEC',
|
||||
0x46: 'Fujitsu',
|
||||
0x48: 'HiSilicon',
|
||||
0x49: 'Infineon Technologies',
|
||||
0x4D: 'Motorola/Freescale',
|
||||
0x4E: 'NVIDIA',
|
||||
0x50: 'Applied Micro (APM)',
|
||||
0x51: 'Qualcomm',
|
||||
0x53: 'Samsung',
|
||||
0x56: 'Marvell',
|
||||
0x61: 'Apple',
|
||||
0x66: 'Faraday',
|
||||
0x69: 'Intel',
|
||||
0x6D: 'Microsoft',
|
||||
0x70: 'Phytium',
|
||||
0xC0: 'Ampere Computing',
|
||||
}
|
||||
|
||||
CPU_PARTS = {
|
||||
# ARM Limited (0x41)
|
||||
0x41: {
|
||||
0xD03: 'Cortex-A53',
|
||||
0xD04: 'Cortex-A35',
|
||||
0xD05: 'Cortex-A55',
|
||||
0xD06: 'Cortex-A65',
|
||||
0xD07: 'Cortex-A57',
|
||||
0xD08: 'Cortex-A72',
|
||||
0xD09: 'Cortex-A73',
|
||||
0xD0A: 'Cortex-A75',
|
||||
0xD0B: 'Cortex-A76',
|
||||
0xD0C: 'Neoverse N1',
|
||||
0xD0D: 'Cortex-A77',
|
||||
0xD0E: 'Cortex-A76AE',
|
||||
0xD13: 'Cortex-R52',
|
||||
0xD20: 'Cortex-M23',
|
||||
0xD21: 'Cortex-M33',
|
||||
0xD40: 'Neoverse V1',
|
||||
0xD41: 'Cortex-A78',
|
||||
0xD42: 'Cortex-A78AE',
|
||||
0xD43: 'Cortex-A65AE',
|
||||
0xD44: 'Cortex-X1',
|
||||
0xD46: 'Cortex-A510',
|
||||
0xD47: 'Cortex-A710',
|
||||
0xD48: 'Cortex-X2',
|
||||
0xD49: 'Neoverse N2',
|
||||
0xD4A: 'Neoverse E1',
|
||||
0xD4B: 'Cortex-A78C',
|
||||
0xD4C: 'Cortex-X1C',
|
||||
0xD4D: 'Cortex-A715',
|
||||
0xD4E: 'Cortex-X3',
|
||||
0xD4F: 'Neoverse V2',
|
||||
0xD80: 'Cortex-A520',
|
||||
0xD81: 'Cortex-A720',
|
||||
0xD82: 'Cortex-X4',
|
||||
0xD84: 'Neoverse V3',
|
||||
0xD85: 'Cortex-X925',
|
||||
0xD87: 'Cortex-A725',
|
||||
},
|
||||
# Apple (0x61)
|
||||
0x61: {
|
||||
0x000: 'Swift',
|
||||
0x001: 'Cyclone',
|
||||
0x002: 'Typhoon',
|
||||
0x003: 'Twister',
|
||||
0x004: 'Hurricane',
|
||||
0x005: 'Monsoon/Mistral',
|
||||
0x006: 'Vortex/Tempest',
|
||||
0x007: 'Lightning/Thunder',
|
||||
0x008: 'Firestorm/Icestorm (M1)',
|
||||
0x009: 'Avalanche/Blizzard (M2)',
|
||||
0x00E: 'Everest/Sawtooth (M3)',
|
||||
0x010: 'Blizzard/Avalanche (A16)',
|
||||
0x011: 'Coll (M4)',
|
||||
},
|
||||
# Qualcomm (0x51)
|
||||
0x51: {
|
||||
0x00F: 'Scorpion',
|
||||
0x02D: 'Scorpion',
|
||||
0x04D: 'Krait',
|
||||
0x06F: 'Krait',
|
||||
0x201: 'Kryo',
|
||||
0x205: 'Kryo',
|
||||
0x211: 'Kryo',
|
||||
0x800: 'Kryo 260/280 Gold (Cortex-A73)',
|
||||
0x801: 'Kryo 260/280 Silver (Cortex-A53)',
|
||||
0x802: 'Kryo 385 Gold (Cortex-A75)',
|
||||
0x803: 'Kryo 385 Silver (Cortex-A55)',
|
||||
0x804: 'Kryo 485 Gold (Cortex-A76)',
|
||||
0x805: 'Kryo 485 Silver (Cortex-A55)',
|
||||
0xC00: 'Falkor',
|
||||
0xC01: 'Saphira',
|
||||
},
|
||||
# Samsung (0x53)
|
||||
0x53: {
|
||||
0x001: 'Exynos M1/M2',
|
||||
0x002: 'Exynos M3',
|
||||
0x003: 'Exynos M4',
|
||||
0x004: 'Exynos M5',
|
||||
},
|
||||
# NVIDIA (0x4e)
|
||||
0x4E: {
|
||||
0x000: 'Denver',
|
||||
0x003: 'Denver 2',
|
||||
0x004: 'Carmel',
|
||||
},
|
||||
# Marvell (0x56)
|
||||
0x56: {
|
||||
0x131: 'Feroceon 88FR131',
|
||||
0x581: 'PJ4/PJ4b',
|
||||
0x584: 'PJ4B-MP',
|
||||
},
|
||||
# Cavium (0x43)
|
||||
0x43: {
|
||||
0x0A0: 'ThunderX',
|
||||
0x0A1: 'ThunderX 88XX',
|
||||
0x0A2: 'ThunderX 81XX',
|
||||
0x0A3: 'ThunderX 83XX',
|
||||
0x0AF: 'ThunderX2 99xx',
|
||||
0x0B0: 'OcteonTX2',
|
||||
0x0B1: 'OcteonTX2 T98',
|
||||
0x0B2: 'OcteonTX2 T96',
|
||||
0x0B3: 'OcteonTX2 F95',
|
||||
0x0B4: 'OcteonTX2 F95N',
|
||||
0x0B5: 'OcteonTX2 F95MM',
|
||||
},
|
||||
# Broadcom (0x42)
|
||||
0x42: {
|
||||
0x00F: 'Brahma B15',
|
||||
0x100: 'Brahma B53',
|
||||
0x516: 'Vulcan',
|
||||
},
|
||||
# HiSilicon (0x48)
|
||||
0x48: {
|
||||
0xD01: 'Kunpeng-920',
|
||||
0xD40: 'Cortex-A76 (Kirin)',
|
||||
},
|
||||
# Ampere (0xc0)
|
||||
0xC0: {
|
||||
0xAC3: 'Ampere-1',
|
||||
0xAC4: 'Ampere-1a',
|
||||
},
|
||||
# Fujitsu (0x46)
|
||||
0x46: {
|
||||
0x001: 'A64FX',
|
||||
},
|
||||
# Intel (0x69) - ARM-based chips
|
||||
0x69: {
|
||||
0x200: 'i80200',
|
||||
0x210: 'PXA250A',
|
||||
0x212: 'PXA210A',
|
||||
0x242: 'i80321-400',
|
||||
0x243: 'i80321-600',
|
||||
0x290: 'PXA250B/PXA26x',
|
||||
0x292: 'PXA210B',
|
||||
0x2C2: 'i80321-400-B0',
|
||||
0x2C3: 'i80321-600-B0',
|
||||
0x2D0: 'PXA250C/PXA255/PXA26x',
|
||||
0x2D2: 'PXA210C',
|
||||
0x411: 'PXA27x',
|
||||
0x41C: 'IPX425-533',
|
||||
0x41D: 'IPX425-400',
|
||||
0x41F: 'IPX425-266',
|
||||
0x682: 'PXA32x',
|
||||
0x683: 'PXA930/PXA935',
|
||||
0x688: 'PXA30x',
|
||||
0x689: 'PXA31x',
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
class CpuInfo(TypedDict):
|
||||
cpu_name: str
|
||||
cpu_hz: float | None
|
||||
cpu_hz_current: float | None
|
||||
|
||||
|
||||
class PerCpuPercentInfo(TypedDict):
|
||||
key: str
|
||||
cpu_number: int
|
||||
total: float
|
||||
user: float
|
||||
system: float
|
||||
idle: float
|
||||
nice: float | None
|
||||
iowait: float | None
|
||||
irq: float | None
|
||||
softirq: float | None
|
||||
steal: float | None
|
||||
guest: float | None
|
||||
guest_nice: float | None
|
||||
dpc: float | None
|
||||
interrupt: float | None
|
||||
|
||||
|
||||
class CpuPercent:
|
||||
"""Get and store the CPU percent."""
|
||||
|
||||
def __init__(self, cached_timer_cpu=3):
|
||||
self.cpu_info = {'cpu_name': None, 'cpu_hz_current': None, 'cpu_hz': None}
|
||||
self.cpu_percent = 0
|
||||
self.percpu_percent = []
|
||||
|
||||
# Get CPU name
|
||||
self.__get_cpu_name()
|
||||
|
||||
def __init__(self, cached_timer_cpu: int = 2):
|
||||
# cached_timer_cpu is the minimum time interval between stats updates
|
||||
# since last update is passed (will retrieve old cached info instead)
|
||||
self.cached_timer_cpu = cached_timer_cpu
|
||||
self.timer_cpu = Timer(0)
|
||||
self.timer_percpu = Timer(0)
|
||||
|
||||
# psutil.cpu_freq() consumes lots of CPU
|
||||
# So refresh the stats every refresh*2 (6 seconds)
|
||||
# So refresh CPU frequency stats every refresh * 2
|
||||
self.cached_timer_cpu_info = cached_timer_cpu * 2
|
||||
|
||||
# Get CPU name
|
||||
self.timer_cpu_info = Timer(0)
|
||||
self.cpu_info: CpuInfo = {'cpu_name': self.__get_cpu_name(), 'cpu_hz_current': None, 'cpu_hz': None}
|
||||
|
||||
# Warning from PsUtil documentation
|
||||
# The first time this function is called with interval = 0.0 or None
|
||||
# it will return a meaningless 0.0 value which you are supposed to ignore.
|
||||
self.timer_cpu = Timer(0)
|
||||
self.cpu_percent = self._compute_cpu()
|
||||
self.timer_percpu = Timer(0)
|
||||
self.percpu_percent = self._compute_percpu()
|
||||
|
||||
def get_key(self):
|
||||
"""Return the key of the per CPU list."""
|
||||
return 'cpu_number'
|
||||
|
||||
def get(self, percpu=False):
|
||||
"""Update and/or return the CPU using the psutil library.
|
||||
If percpu, return the percpu stats"""
|
||||
if percpu:
|
||||
return self.__get_percpu()
|
||||
return self.__get_cpu()
|
||||
|
||||
def get_info(self):
|
||||
def get_info(self) -> CpuInfo:
|
||||
"""Get additional information about the CPU"""
|
||||
# Never update more than 1 time per cached_timer_cpu_info
|
||||
if self.timer_cpu_info.finished() and hasattr(psutil, 'cpu_freq'):
|
||||
|
|
@ -61,7 +257,7 @@ class CpuPercent:
|
|||
self.cpu_info['cpu_hz_current'] = cpu_freq.current
|
||||
else:
|
||||
self.cpu_info['cpu_hz_current'] = None
|
||||
if hasattr(cpu_freq, 'max'):
|
||||
if hasattr(cpu_freq, 'max') and cpu_freq.max != 0.0:
|
||||
self.cpu_info['cpu_hz'] = cpu_freq.max
|
||||
else:
|
||||
self.cpu_info['cpu_hz'] = None
|
||||
|
|
@ -69,59 +265,79 @@ class CpuPercent:
|
|||
self.timer_cpu_info.reset(duration=self.cached_timer_cpu_info)
|
||||
return self.cpu_info
|
||||
|
||||
def __get_cpu_name(self):
|
||||
@staticmethod
|
||||
def __get_cpu_name() -> str:
|
||||
# Get the CPU name once from the /proc/cpuinfo file
|
||||
# TODO: Multisystem...
|
||||
# Read the first line with the "model name" ("Model" for Raspberry Pi)
|
||||
ret = f'CPU {platform.processor()}'
|
||||
try:
|
||||
self.cpu_info['cpu_name'] = open('/proc/cpuinfo').readlines()[4].split(':')[1].strip()
|
||||
except (FileNotFoundError, PermissionError, IndexError, KeyError, AttributeError):
|
||||
self.cpu_info['cpu_name'] = 'CPU'
|
||||
return self.cpu_info['cpu_name']
|
||||
cpuinfo_lines = open('/proc/cpuinfo').readlines()
|
||||
except (FileNotFoundError, PermissionError):
|
||||
logger.debug("No permission to read '/proc/cpuinfo'")
|
||||
return ret
|
||||
|
||||
def __get_cpu(self):
|
||||
cpu_implementer = None
|
||||
for line in cpuinfo_lines:
|
||||
# Look for the CPU name
|
||||
if line.startswith('model name') or line.startswith('Model') or line.startswith('cpu model'):
|
||||
return line.split(':')[1].strip()
|
||||
# Look for the CPU name on ARM architecture (see #3127)
|
||||
if line.startswith('CPU implementer'):
|
||||
cpu_implementer = CPU_IMPLEMENTERS.get(int(line.split(':')[1].strip(), 16), ret)
|
||||
ret = cpu_implementer
|
||||
if line.startswith('CPU part') and cpu_implementer in CPU_PARTS:
|
||||
cpu_part = CPU_PARTS[cpu_implementer].get(int(line.split(':')[1].strip(), 16), 'Unknown')
|
||||
ret = f'{cpu_implementer} {cpu_part}'
|
||||
|
||||
return ret
|
||||
|
||||
def get_cpu(self) -> float:
|
||||
"""Update and/or return the CPU using the psutil library."""
|
||||
# Never update more than 1 time per cached_timer_cpu
|
||||
if self.timer_cpu.finished():
|
||||
self.cpu_percent = psutil.cpu_percent(interval=0.0)
|
||||
# Reset timer for cache
|
||||
self.timer_cpu.reset(duration=self.cached_timer_cpu)
|
||||
# Update the stats
|
||||
self.cpu_percent = self._compute_cpu()
|
||||
return self.cpu_percent
|
||||
|
||||
def __get_percpu(self):
|
||||
@staticmethod
|
||||
def _compute_cpu() -> float:
|
||||
return psutil.cpu_percent(interval=0.0)
|
||||
|
||||
def get_percpu(self) -> list[PerCpuPercentInfo]:
|
||||
"""Update and/or return the per CPU list using the psutil library."""
|
||||
# Never update more than 1 time per cached_timer_cpu
|
||||
if self.timer_percpu.finished():
|
||||
self.percpu_percent = []
|
||||
for cpu_number, cputimes in enumerate(psutil.cpu_times_percent(interval=0.0, percpu=True)):
|
||||
cpu = {
|
||||
'key': self.get_key(),
|
||||
'cpu_number': cpu_number,
|
||||
'total': round(100 - cputimes.idle, 1),
|
||||
'user': cputimes.user,
|
||||
'system': cputimes.system,
|
||||
'idle': cputimes.idle,
|
||||
}
|
||||
# The following stats are for API purposes only
|
||||
if hasattr(cputimes, 'nice'):
|
||||
cpu['nice'] = cputimes.nice
|
||||
if hasattr(cputimes, 'iowait'):
|
||||
cpu['iowait'] = cputimes.iowait
|
||||
if hasattr(cputimes, 'irq'):
|
||||
cpu['irq'] = cputimes.irq
|
||||
if hasattr(cputimes, 'softirq'):
|
||||
cpu['softirq'] = cputimes.softirq
|
||||
if hasattr(cputimes, 'steal'):
|
||||
cpu['steal'] = cputimes.steal
|
||||
if hasattr(cputimes, 'guest'):
|
||||
cpu['guest'] = cputimes.guest
|
||||
if hasattr(cputimes, 'guest_nice'):
|
||||
cpu['guest_nice'] = cputimes.guest_nice
|
||||
# Append new CPU to the list
|
||||
self.percpu_percent.append(cpu)
|
||||
# Reset timer for cache
|
||||
self.timer_percpu.reset(duration=self.cached_timer_cpu)
|
||||
# Reset timer for cache
|
||||
self.timer_percpu.reset(duration=self.cached_timer_cpu)
|
||||
# Update stats
|
||||
self.percpu_percent = self._compute_percpu()
|
||||
return self.percpu_percent
|
||||
|
||||
def _compute_percpu(self) -> list[PerCpuPercentInfo]:
|
||||
psutil_percpu = enumerate(psutil.cpu_times_percent(interval=0.0, percpu=True))
|
||||
return [
|
||||
{
|
||||
'key': self.get_key(),
|
||||
'cpu_number': cpu_number,
|
||||
'total': round(100 - cpu_times.idle, 1),
|
||||
'user': cpu_times.user,
|
||||
'system': cpu_times.system,
|
||||
'idle': cpu_times.idle,
|
||||
'nice': cpu_times.nice if hasattr(cpu_times, 'nice') else None,
|
||||
'iowait': cpu_times.iowait if hasattr(cpu_times, 'iowait') else None,
|
||||
'irq': cpu_times.irq if hasattr(cpu_times, 'irq') else None,
|
||||
'softirq': cpu_times.softirq if hasattr(cpu_times, 'softirq') else None,
|
||||
'steal': cpu_times.steal if hasattr(cpu_times, 'steal') else None,
|
||||
'guest': cpu_times.guest if hasattr(cpu_times, 'guest') else None,
|
||||
'guest_nice': cpu_times.steal if hasattr(cpu_times, 'guest_nice') else None,
|
||||
'dpc': cpu_times.dpc if hasattr(cpu_times, 'dpc') else None,
|
||||
'interrupt': cpu_times.interrupt if hasattr(cpu_times, 'interrupt') else None,
|
||||
}
|
||||
for cpu_number, cpu_times in psutil_percpu
|
||||
]
|
||||
|
||||
|
||||
# CpuPercent instance shared between plugins
|
||||
cpu_percent = CpuPercent()
|
||||
|
|
|
|||
|
|
@ -271,6 +271,7 @@ class GlancesEventsList:
|
|||
event_time, event_index, event_state, event_type, event_value, proc_list, proc_desc, global_message
|
||||
)
|
||||
|
||||
# logger.info(self.events_list)
|
||||
return self.len()
|
||||
|
||||
def _create_event(self, event_time, event_state, event_type, event_value, proc_desc, global_message):
|
||||
|
|
|
|||
|
|
@ -1,18 +1,19 @@
|
|||
#
|
||||
# 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
|
||||
#
|
||||
|
||||
"""
|
||||
I am your father...
|
||||
|
||||
...for all Glances exports IF.
|
||||
"""
|
||||
|
||||
from glances.globals import NoOptionError, NoSectionError, iteritems, iterkeys, json_dumps
|
||||
import re
|
||||
|
||||
from glances.globals import NoOptionError, NoSectionError, json_dumps
|
||||
from glances.logger import logger
|
||||
from glances.timer import Counter
|
||||
|
||||
|
|
@ -20,18 +21,14 @@ from glances.timer import Counter
|
|||
class GlancesExport:
|
||||
"""Main class for Glances export IF."""
|
||||
|
||||
# List of non exportable plugins
|
||||
# @TODO: remove this part and make all plugins exportable (see issue #1556)
|
||||
# @TODO: also make this list configurable by the user (see issue #1443)
|
||||
# List of non exportable internal plugins
|
||||
non_exportable_plugins = [
|
||||
'alert',
|
||||
'amps',
|
||||
'help',
|
||||
'now',
|
||||
'plugin',
|
||||
'psutilversion',
|
||||
'quicklook',
|
||||
'version',
|
||||
"alert",
|
||||
"help",
|
||||
"plugin",
|
||||
"psutilversion",
|
||||
"quicklook",
|
||||
"version",
|
||||
]
|
||||
|
||||
def __init__(self, config=None, args=None):
|
||||
|
|
@ -55,6 +52,13 @@ class GlancesExport:
|
|||
# Save last export list
|
||||
self._last_exported_list = None
|
||||
|
||||
# Fields description
|
||||
self._fields_description = None
|
||||
|
||||
# Load the default common export configuration
|
||||
if self.config is not None:
|
||||
self.load_common_conf()
|
||||
|
||||
def _log_result_decorator(fct):
|
||||
"""Log (DEBUG) the result of the function fct."""
|
||||
|
||||
|
|
@ -73,7 +77,25 @@ class GlancesExport:
|
|||
"""Close the export module."""
|
||||
logger.debug(f"Finalise export interface {self.export_name}")
|
||||
|
||||
def load_conf(self, section, mandatories=['host', 'port'], options=None):
|
||||
def load_common_conf(self):
|
||||
"""Load the common export configuration in the Glances configuration file.
|
||||
|
||||
:returns: Boolean -- True if section is found
|
||||
"""
|
||||
# Read the common [export] section
|
||||
section = "export"
|
||||
|
||||
opt = "exclude_fields"
|
||||
try:
|
||||
setattr(self, opt, self.config.get_list_value(section, opt))
|
||||
except NoOptionError:
|
||||
logger.debug(f"{opt} option not found in the {section} configuration section")
|
||||
|
||||
logger.debug(f"Load common {section} from the Glances configuration file")
|
||||
|
||||
return True
|
||||
|
||||
def load_conf(self, section, mandatories=["host", "port"], options=None):
|
||||
"""Load the export <section> configuration in the Glances configuration file.
|
||||
|
||||
:param section: name of the export section to load
|
||||
|
|
@ -103,10 +125,10 @@ class GlancesExport:
|
|||
try:
|
||||
setattr(self, opt, self.config.get_value(section, opt))
|
||||
except NoOptionError:
|
||||
pass
|
||||
logger.debug(f"{opt} option not found in the {section} configuration section")
|
||||
|
||||
logger.debug(f"Load {section} from the Glances configuration file")
|
||||
logger.debug(f"{section} parameters: {({opt: getattr(self, opt) for opt in mandatories + options})}")
|
||||
logger.debug(f"{section} parameters: { ({opt: getattr(self, opt) for opt in mandatories + options}) }")
|
||||
|
||||
return True
|
||||
|
||||
|
|
@ -114,7 +136,7 @@ class GlancesExport:
|
|||
"""Return the value of the item 'key'."""
|
||||
ret = None
|
||||
try:
|
||||
ret = item[item['key']]
|
||||
ret = item[item["key"]]
|
||||
except KeyError:
|
||||
logger.error(f"No 'key' available in {item}")
|
||||
if isinstance(ret, list):
|
||||
|
|
@ -130,14 +152,81 @@ class GlancesExport:
|
|||
d_tags = {}
|
||||
if tags:
|
||||
try:
|
||||
d_tags = dict([x.split(':') for x in tags.split(',')])
|
||||
d_tags = dict(x.split(":", 1) for x in tags.split(","))
|
||||
except ValueError:
|
||||
# one of the 'key:value' pairs was missing
|
||||
logger.info('Invalid tags passed: %s', tags)
|
||||
logger.info("Invalid tags passed: %s", tags)
|
||||
d_tags = {}
|
||||
|
||||
return d_tags
|
||||
|
||||
def normalize_for_influxdb(self, name, columns, points):
|
||||
"""Normalize data for the InfluxDB's data model.
|
||||
|
||||
:return: a list of measurements.
|
||||
"""
|
||||
FIELD_TO_TAG = ["name", "cmdline", "type"]
|
||||
ret = []
|
||||
|
||||
# Build initial dict by crossing columns and point
|
||||
data_dict = dict(zip(columns, points))
|
||||
|
||||
# issue1871 - Check if a key exist. If a key exist, the value of
|
||||
# the key should be used as a tag to identify the measurement.
|
||||
keys_list = [k.split(".")[0] for k in columns if k.endswith(".key")]
|
||||
if not keys_list:
|
||||
keys_list = [None]
|
||||
|
||||
for measurement in keys_list:
|
||||
# Manage field
|
||||
if measurement is not None:
|
||||
fields = {
|
||||
k.replace(f"{measurement}.", ""): data_dict[k] for k in data_dict if k.startswith(f"{measurement}.")
|
||||
}
|
||||
else:
|
||||
fields = data_dict
|
||||
# Transform to InfluxDB data model
|
||||
# https://docs.influxdata.com/influxdb/v1.8/write_protocols/line_protocol_reference/
|
||||
for k in fields:
|
||||
# Do not export empty (None) value
|
||||
if fields[k] is None:
|
||||
continue
|
||||
# Convert numerical to float
|
||||
try:
|
||||
fields[k] = float(fields[k])
|
||||
except (TypeError, ValueError):
|
||||
# Convert others to string
|
||||
try:
|
||||
fields[k] = str(fields[k])
|
||||
except (TypeError, ValueError):
|
||||
pass
|
||||
# Manage tags
|
||||
tags = self.parse_tags(self.tags)
|
||||
# Add the hostname as a tag
|
||||
tags["hostname"] = self.hostname
|
||||
if "hostname" in fields:
|
||||
fields.pop("hostname")
|
||||
# Others tags...
|
||||
if "key" in fields and fields["key"] in fields:
|
||||
# Create a tag from the key
|
||||
# Tag should be an string (see InfluxDB data model)
|
||||
tags[fields["key"]] = str(fields[fields["key"]])
|
||||
# Remove it from the field list (can not be a field and a tag)
|
||||
fields.pop(fields["key"])
|
||||
# Add name as a tag (example for the process list)
|
||||
for k in FIELD_TO_TAG:
|
||||
if k in fields:
|
||||
tags[k] = str(fields[k])
|
||||
# Remove it from the field list (can not be a field and a tag)
|
||||
fields.pop(k)
|
||||
# Add the measurement to the list
|
||||
ret.append({"measurement": name, "tags": tags, "fields": fields})
|
||||
return ret
|
||||
|
||||
def is_excluded(self, field):
|
||||
"""Return true if the field is excluded."""
|
||||
return any(re.fullmatch(i, field, re.I) for i in (getattr(self, 'exclude_fields') or ()))
|
||||
|
||||
def plugins_to_export(self, stats):
|
||||
"""Return the list of plugins to export.
|
||||
|
||||
|
|
@ -150,12 +239,21 @@ class GlancesExport:
|
|||
"""Return the list of plugins last exported."""
|
||||
return self._last_exported_list
|
||||
|
||||
def init_fields(self, stats):
|
||||
"""Return fields description in order to init stats in a server."""
|
||||
if not self.export_enable:
|
||||
return False
|
||||
|
||||
self._last_exported_list = self.plugins_to_export(stats)
|
||||
self._fields_description = stats.getAllFieldsDescriptionAsDict(plugin_list=self.last_exported_list())
|
||||
return self._fields_description
|
||||
|
||||
def update(self, stats):
|
||||
"""Update stats to a server.
|
||||
|
||||
The method builds two lists: names and values and calls the export method to export the stats.
|
||||
|
||||
Note: this class can be overwritten (for example in CSV and Graph).
|
||||
Note: if needed this class can be overwritten.
|
||||
"""
|
||||
if not self.export_enable:
|
||||
return False
|
||||
|
|
@ -169,10 +267,14 @@ class GlancesExport:
|
|||
for plugin in self.last_exported_list():
|
||||
if isinstance(all_stats[plugin], dict):
|
||||
all_stats[plugin].update(all_limits[plugin])
|
||||
# Remove the <plugin>_disable field
|
||||
all_stats[plugin].pop(f"{plugin}_disable", None)
|
||||
elif isinstance(all_stats[plugin], list):
|
||||
# TypeError: string indices must be integers (Network plugin) #1054
|
||||
for i in all_stats[plugin]:
|
||||
i.update(all_limits[plugin])
|
||||
# Remove the <plugin>_disable field
|
||||
i.pop(f"{plugin}_disable", None)
|
||||
else:
|
||||
continue
|
||||
export_names, export_values = self.build_export(all_stats[plugin])
|
||||
|
|
@ -181,32 +283,38 @@ class GlancesExport:
|
|||
return True
|
||||
|
||||
def build_export(self, stats):
|
||||
"""Build the export lists."""
|
||||
"""Build the export lists.
|
||||
This method builds two lists: names and values.
|
||||
"""
|
||||
|
||||
# Initialize export lists
|
||||
export_names = []
|
||||
export_values = []
|
||||
|
||||
if isinstance(stats, dict):
|
||||
# Stats is a dict
|
||||
# Is there a key ?
|
||||
if 'key' in iterkeys(stats) and stats['key'] in iterkeys(stats):
|
||||
pre_key = '{}.'.format(stats[stats['key']])
|
||||
if "key" in stats and stats["key"] in stats:
|
||||
pre_key = "{}.".format(stats[stats["key"]])
|
||||
else:
|
||||
pre_key = ''
|
||||
pre_key = ""
|
||||
# Walk through the dict
|
||||
for key, value in sorted(iteritems(stats)):
|
||||
for key, value in sorted(stats.items()):
|
||||
if isinstance(value, bool):
|
||||
value = json_dumps(value)
|
||||
value = json_dumps(value).decode()
|
||||
|
||||
if isinstance(value, list):
|
||||
try:
|
||||
value = value[0]
|
||||
except IndexError:
|
||||
value = ''
|
||||
value = " ".join([str(v) for v in value])
|
||||
|
||||
if isinstance(value, dict):
|
||||
item_names, item_values = self.build_export(value)
|
||||
item_names = [pre_key + key.lower() + str(i) for i in item_names]
|
||||
export_names += item_names
|
||||
export_values += item_values
|
||||
else:
|
||||
# We are on a simple value
|
||||
if self.is_excluded(pre_key + key.lower()):
|
||||
continue
|
||||
export_names.append(pre_key + key.lower())
|
||||
export_values.append(value)
|
||||
elif isinstance(stats, list):
|
||||
|
|
|
|||