From be29f069d602db49770c75d5b90ea8b8d7e899d3 Mon Sep 17 00:00:00 2001 From: nicolargo Date: Sun, 21 Sep 2025 10:03:33 +0200 Subject: [PATCH] First release ok, need to add some tests --- Makefile | 3 + docs/_static/screenshot-fetch.png | Bin 0 -> 83319 bytes docs/api/python.rst | 589 +++++++++----- docs/api/restful.rst | 941 ++++++++++++---------- docs/fetch.rst | 60 ++ docs/index.rst | 12 +- docs/man/glances.1 | 2 +- docs/quickstart.rst | 40 +- glances/api.py | 47 +- glances/outputs/glances_stdout_api_doc.py | 112 +++ glances/outputs/glances_stdout_fetch.py | 87 ++ glances/stats.py | 1 + 12 files changed, 1228 insertions(+), 666 deletions(-) create mode 100644 docs/_static/screenshot-fetch.png create mode 100644 docs/fetch.rst create mode 100644 glances/outputs/glances_stdout_fetch.py diff --git a/Makefile b/Makefile index ba11120a..932974fa 100644 --- a/Makefile +++ b/Makefile @@ -318,6 +318,9 @@ run-min-local-conf: ## Start minimal Glances in console mode with the system con run-like-htop: ## Start Glances with the same features than Htop $(venv_min)/python -m glances --disable-plugin network,ports,wifi,connections,diskio,fs,irq,folders,raid,smart,sensors,vms,containers,ip,amps --disable-left-sidebar +run-fetch: ## Start Glances in fetch mode + $(PYTHON) -m glances --fetch + $(DOCKER_RUNTIMES): run-docker-%: $(DOCKER_RUN) $(DOCKER_OPTS) $(DOCKER_SOCKS) -it glances:local-$* diff --git a/docs/_static/screenshot-fetch.png b/docs/_static/screenshot-fetch.png new file mode 100644 index 0000000000000000000000000000000000000000..84932ff6c170e17acb007766ea082490f0fe3601 GIT binary patch literal 83319 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 z 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 IV)_C91Ehut6951J literal 0 HcmV?d00001 diff --git a/docs/api/python.rst b/docs/api/python.rst index cd1e277d..99074d4d 100644 --- a/docs/api/python.rst +++ b/docs/api/python.rst @@ -22,21 +22,25 @@ use the following code: >>> gl = api.GlancesAPI() >>> gl.cpu {'cpucore': 16, - 'ctx_switches': 130724170, + 'ctx_switches': 305832907, 'guest': 0.0, - 'idle': 86.9, - 'interrupts': 107406067, - 'iowait': 0.2, + 'idle': 91.8, + 'interrupts': 248220322, + 'iowait': 0.4, 'irq': 0.0, 'nice': 0.0, - 'soft_interrupts': 45147193, + 'soft_interrupts': 100550229, 'steal': 0.0, 'syscalls': 0, - 'system': 6.0, - 'total': 10.6, - 'user': 6.9} + 'system': 4.6, + 'total': 5.6, + 'user': 3.2} >>> gl.cpu["total"] - 10.6 + 5.6 + >>> gl.mem["used"] + 10240561152 + >>> gl.auto_unit(gl.mem["used"]) + 9.54G If the stats return a list of items (like network interfaces or processes), you can access them by their name: @@ -47,19 +51,19 @@ access them by their name: ['wlp0s20f3'] >>> gl.network["wlp0s20f3"] {'alias': None, - 'bytes_all': 44734, - 'bytes_all_gauge': 1934094759, - 'bytes_all_rate_per_sec': 426648.0, - 'bytes_recv': 2244, - 'bytes_recv_gauge': 1781571064, - 'bytes_recv_rate_per_sec': 21402.0, - 'bytes_sent': 42490, - 'bytes_sent_gauge': 152523695, - 'bytes_sent_rate_per_sec': 405246.0, + 'bytes_all': 0, + 'bytes_all_gauge': 3100588600, + 'bytes_all_rate_per_sec': 0.0, + 'bytes_recv': 0, + 'bytes_recv_gauge': 2247529593, + 'bytes_recv_rate_per_sec': 0.0, + 'bytes_sent': 0, + 'bytes_sent_gauge': 853059007, + 'bytes_sent_rate_per_sec': 0.0, 'interface_name': 'wlp0s20f3', 'key': 'interface_name', 'speed': 0, - 'time_since_update': 0.10484981536865234} + 'time_since_update': 0.18211889266967773} Init Glances Python API ----------------------- @@ -91,7 +95,19 @@ Alert stats: >>> type(gl.alert) >>> gl.alert - [] + [{'avg': 91.4376177192857, + 'begin': 1758441568, + 'count': 2, + 'desc': '', + 'end': -1, + 'global_msg': 'High swap (paging) usage', + 'max': 91.4376177192857, + 'min': 91.4376177192857, + 'sort': 'memory_percent', + 'state': 'CRITICAL', + 'sum': 182.8752354385714, + 'top': ['code', 'code', 'code'], + 'type': 'MEMSWAP'}] Alert fields description: @@ -166,14 +182,14 @@ Diskio stats: >>> gl.diskio["nvme0n1"] {'disk_name': 'nvme0n1', 'key': 'disk_name', - 'read_bytes': 10276049408, - 'read_count': 347806, + 'read_bytes': 18528616960, + 'read_count': 959426, 'read_latency': 0, - 'read_time': 67145, - 'write_bytes': 16687789056, - 'write_count': 784025, + 'read_time': 284132, + 'write_bytes': 26236740608, + 'write_count': 2366204, 'write_latency': 0, - 'write_time': 1157773} + 'write_time': 2119741} Diskio fields description: @@ -256,11 +272,11 @@ Processcount stats: >>> type(gl.processcount) >>> gl.processcount - {'pid_max': 0, 'running': 2, 'sleeping': 417, 'thread': 2146, 'total': 550} + {'pid_max': 0, 'running': 1, 'sleeping': 431, 'thread': 2464, 'total': 569} >>> gl.processcount.keys() ['total', 'running', 'sleeping', 'thread', 'pid_max'] >>> gl.processcount["total"] - 550 + 569 Processcount fields description: @@ -333,7 +349,7 @@ Percpu stats: 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 24.0, + 'idle': 56.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -342,8 +358,8 @@ Percpu stats: 'softirq': 0.0, 'steal': 0.0, 'system': 9.0, - 'total': 76.0, - 'user': 0.0} + 'total': 44.0, + 'user': 1.0} Percpu fields description: @@ -391,10 +407,10 @@ System stats: >>> gl.system {'hostname': 'nicolargo-xps15', - 'hr_name': 'Ubuntu 24.04 64bit / Linux 6.14.0-24-generic', + 'hr_name': 'Ubuntu 24.04 64bit / Linux 6.14.0-27-generic', 'linux_distro': 'Ubuntu 24.04', 'os_name': 'Linux', - 'os_version': '6.14.0-24-generic', + 'os_version': '6.14.0-27-generic', 'platform': '64bit'} >>> gl.system.keys() ['os_name', 'hostname', 'platform', 'os_version', 'linux_distro', 'hr_name'] @@ -433,18 +449,18 @@ Network stats: >>> gl.network["wlp0s20f3"] {'alias': None, 'bytes_all': 0, - 'bytes_all_gauge': 1934094759, + 'bytes_all_gauge': 3100588600, 'bytes_all_rate_per_sec': 0.0, 'bytes_recv': 0, - 'bytes_recv_gauge': 1781571064, + 'bytes_recv_gauge': 2247529593, 'bytes_recv_rate_per_sec': 0.0, 'bytes_sent': 0, - 'bytes_sent_gauge': 152523695, + 'bytes_sent_gauge': 853059007, 'bytes_sent_rate_per_sec': 0.0, 'interface_name': 'wlp0s20f3', 'key': 'interface_name', 'speed': 0, - 'time_since_update': 0.0017256736755371094} + 'time_since_update': 0.0034186840057373047} Network fields description: @@ -485,23 +501,23 @@ Cpu stats: >>> gl.cpu {'cpucore': 16, - 'ctx_switches': 130724170, + 'ctx_switches': 305832907, 'guest': 0.0, - 'idle': 86.9, - 'interrupts': 107406067, - 'iowait': 0.2, + 'idle': 91.8, + 'interrupts': 248220322, + 'iowait': 0.4, 'irq': 0.0, 'nice': 0.0, - 'soft_interrupts': 45147193, + 'soft_interrupts': 100550229, 'steal': 0.0, 'syscalls': 0, - 'system': 6.0, - 'total': 10.6, - 'user': 6.9} + 'system': 4.6, + 'total': 5.6, + 'user': 3.2} >>> gl.cpu.keys() ['total', 'user', 'nice', 'system', 'idle', 'iowait', 'irq', 'steal', 'guest', 'ctx_switches', 'interrupts', 'soft_interrupts', 'syscalls', 'cpucore'] >>> gl.cpu["total"] - 10.6 + 5.6 Cpu fields description: @@ -573,7 +589,7 @@ Amps stats: 'refresh': 3.0, 'regex': True, 'result': None, - 'timer': 0.16528964042663574} + 'timer': 0.30202817916870117} Amps fields description: @@ -604,69 +620,178 @@ Processlist stats: >>> gl.processlist Return a dict of dict with key= >>> gl.processlist.keys() - [259901, 259888, 25440, 128, 5325, 26358, 7064, 7329, 8157, 25356, 70768, 8145, 9147, 219843, 8147, 6769, 144938, 7366, 26173, 2856, 25244, 25450, 25567, 26736, 79046, 5966, 198381, 7338, 25566, 198494, 25390, 25451, 25796, 25526, 5580, 6269, 5469, 25582, 26414, 27424, 3680, 25536, 25806, 6310, 256800, 6281, 257516, 258649, 259729, 25325, 224253, 257355, 7967, 5775, 26008, 2871, 26021, 11269, 26023, 5914, 7315, 25247, 2498, 25246, 5719, 7310, 8592, 26166, 5822, 5617, 5938, 5476, 5985, 732, 6219, 2859, 7410, 5497, 5041, 6304, 5507, 5456, 5484, 3671, 5550, 2601, 5282, 5494, 5040, 2511, 5180, 5036, 2483, 1, 2521, 5961, 5726, 2513, 5014, 2919, 2491, 3654, 2347, 5488, 5478, 5527, 5597, 3683, 2700, 4959, 3656, 2839, 5509, 2602, 5043, 6147, 2819, 9457, 5546, 74467, 8741, 199883, 3655, 9442, 5877, 3726, 199844, 5738, 2504, 5541, 5764, 5490, 787, 2706, 5268, 5592, 2479, 2350, 5755, 2487, 2507, 2345, 5102, 5054, 5837, 5324, 2500, 5437, 5625, 5616, 5250, 5107, 5279, 5519, 5781, 5747, 33191, 5718, 5479, 2502, 9461, 5164, 2478, 5525, 5464, 2495, 5037, 26174, 25951, 198939, 223780, 242663, 5254, 24027, 5339, 25791, 7152, 2477, 5020, 25265, 3813, 6351, 9464, 2501, 259884, 3693, 3710, 3073, 5114, 242813, 251520, 259900, 259887, 2849, 2597, 2852, 3074, 3759, 2, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 59, 60, 61, 62, 63, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 109, 110, 111, 113, 114, 115, 116, 117, 118, 121, 122, 123, 124, 125, 126, 127, 132, 134, 135, 136, 137, 138, 139, 141, 142, 143, 144, 145, 146, 147, 149, 150, 151, 152, 153, 161, 177, 188, 189, 216, 218, 252, 268, 269, 270, 271, 272, 273, 274, 275, 277, 279, 350, 351, 354, 355, 356, 357, 359, 437, 438, 601, 606, 607, 608, 616, 674, 675, 802, 989, 996, 997, 1011, 1030, 1031, 1032, 1033, 1034, 1035, 1036, 1037, 1040, 1041, 1042, 1043, 1044, 1047, 1048, 1049, 1223, 1235, 1236, 1237, 1238, 1239, 1240, 1298, 1307, 1392, 1403, 1822, 1823, 1824, 1825, 1826, 1827, 1828, 1829, 1830, 1831, 1832, 1833, 1834, 1835, 1864, 1865, 1866, 1867, 1869, 1870, 1871, 1872, 1873, 1904, 1905, 1906, 1907, 1908, 1909, 1910, 1911, 1912, 1913, 1914, 1915, 1916, 1917, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1968, 1969, 1970, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1998, 1999, 2001, 2002, 2743, 2744, 2745, 3662, 4095, 9454, 129572, 177956, 182121, 198839, 198840, 224561, 230881, 231507, 236052, 236462, 236488, 241828, 242442, 242742, 242863, 244766, 246147, 246935, 246968, 247091, 247880, 248326, 248846, 250360, 250486, 251821, 252072, 252075, 252078, 252080, 252307, 252612, 252647, 252789, 254514, 254728, 254882, 254945, 255025, 255105, 255260, 255582, 255902, 255931, 256947, 257249, 257271, 257663, 257750, 258274, 258370, 258416, 258444, 258588, 258860] - >>> gl.processlist["259901"] - {'cmdline': ['/home/nicolargo/dev/glances/venv/bin/python', - '-m', - 'rstcheck._cli', - '/home/nicolargo/dev/glances/docs/api/python.rst'], - 'cpu_percent': 103.7, - 'cpu_times': {'children_system': 0.0, - 'children_user': 0.0, + [110899, 112061, 22460, 6683, 6059, 7262, 7250, 8474, 448774, 390113, 7258, 5046, 96461, 391029, 6409, 111133, 390871, 390155, 22312, 409614, 21168, 199912, 233089, 18180, 409705, 112323, 221853, 234880, 275603, 344651, 22523, 111268, 111261, 20799, 19815, 21230, 22429, 504380, 504332, 504441, 24044, 507910, 500290, 448971, 22524, 111385, 111384, 111382, 3478, 6003, 240741, 6419, 240742, 22410, 2516, 111284, 724, 111848, 5626, 111192, 22786, 5474, 7068, 12361, 5623, 136828, 111283, 2879, 6388, 5652, 5173, 112290, 5414, 111386, 240756, 6478, 240771, 1, 2511, 111267, 5158, 2616, 4721, 6376, 5284, 2619, 6015, 8698, 111341, 5166, 8639, 5291, 4747, 4744, 5208, 6037, 2539, 5684, 6039, 2719, 4698, 5606, 5343, 5521, 5187, 5580, 2499, 5207, 8086, 448339, 5190, 2828, 4988, 5204, 5235, 3472, 5224, 5201, 4758, 2921, 5447, 5213, 3531, 2534, 5297, 3459, 2376, 5485, 5191, 5421, 5461, 4975, 14662, 5031, 22315, 2846, 24073, 5445, 5170, 5925, 322017, 5228, 4809, 2506, 5547, 2519, 5477, 2498, 5189, 5139, 760, 5221, 5337, 14670, 2523, 107652, 4871, 5218, 4813, 2722, 5231, 2377, 2537, 4985, 2503, 5366, 5429, 22912, 4740, 3617, 5044, 2514, 3483, 4746, 507906, 2497, 3075, 2375, 2665, 476625, 3496, 3358, 4741, 507909, 3359, 67282, 4958, 2521, 2542, 3488, 5851, 2869, 2550, 4960, 4886, 22329, 3363, 4728, 6044, 22314, 111134, 6151, 22835, 2615, 330048, 2854, 2858, 111149, 4820, 3076, 2, 3, 4, 5, 6, 7, 8, 10, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 29, 30, 31, 32, 33, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 59, 60, 61, 62, 63, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81, 83, 84, 85, 86, 87, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 101, 102, 103, 104, 105, 107, 108, 109, 110, 111, 113, 114, 115, 116, 117, 118, 121, 122, 123, 124, 125, 126, 127, 129, 132, 134, 135, 136, 137, 138, 139, 141, 142, 143, 144, 145, 146, 148, 151, 152, 154, 155, 156, 163, 174, 185, 186, 214, 215, 237, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 347, 349, 354, 355, 356, 357, 361, 439, 440, 602, 607, 608, 609, 615, 666, 667, 787, 970, 991, 992, 995, 996, 997, 998, 999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1137, 1164, 1274, 1331, 1334, 1335, 1336, 1337, 1398, 1399, 1481, 1488, 1833, 1834, 1835, 1836, 1837, 1838, 1839, 1840, 1841, 1842, 1843, 1844, 1845, 1846, 1876, 1877, 1879, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 1918, 1919, 1920, 1921, 1922, 1923, 1924, 1925, 1926, 1927, 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, 1940, 1941, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1984, 1985, 1986, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2014, 3421, 3422, 3423, 3424, 3793, 233310, 358608, 446510, 448136, 448145, 455365, 455369, 463479, 464074, 464755, 468944, 471022, 471300, 475029, 475987, 476570, 482523, 484291, 484677, 487183, 487213, 487370, 489052, 489373, 490299, 493432, 494056, 494125, 494166, 494638, 495000, 495262, 495276, 495668, 496527, 497602, 497698, 498555, 498684, 500372, 500667, 500805, 501010, 501024, 501025, 501026, 501027, 501217, 501270, 501479, 502852, 505729, 506364, 506417, 506802, 506803, 507295, 507348, 507380, 507500, 507789, 507933] + >>> gl.processlist["110899"] + {'cmdline': ['/proc/self/exe', + '--type=utility', + '--utility-sub-type=node.mojom.NodeService', + '--lang=en-US', + '--service-sandbox-type=none', + '--no-sandbox', + '--dns-result-order=ipv4first', + '--experimental-network-inspection', + '--inspect-port=0', + '--crashpad-handler-pid=22329', + '--enable-crash-reporter=864d4bb7-dd20-4851-830f-29e81dd93517,no_channel', + '--user-data-dir=/home/nicolargo/.config/Code', + '--standard-schemes=vscode-webview,vscode-file', + '--secure-schemes=vscode-webview,vscode-file', + '--cors-schemes=vscode-webview,vscode-file', + '--fetch-schemes=vscode-webview,vscode-file', + '--service-worker-schemes=vscode-webview', + '--code-cache-schemes=vscode-webview,vscode-file', + '--shared-files=v8_context_snapshot_data:100', + '--field-trial-handle=3,i,18224849850816561636,15185484266821424269,262144', + '--enable-features=DocumentPolicyIncludeJSCallStacksInCrashReports,EarlyEstablishGpuChannel,EstablishGpuChannelAsync', + '--disable-features=CalculateNativeWinOcclusion,FontationsLinuxSystemFonts,ScreenAIOCREnabled,SpareRendererForSitePerProcess', + '--variations-seed-version'], + 'cpu_percent': 1.9, + 'cpu_times': {'children_system': 1117.77, + 'children_user': 1369.92, 'iowait': 0.0, - 'system': 0.05, - 'user': 0.43}, + 'system': 1272.29, + 'user': 4766.5}, 'gids': {'effective': 1000, 'real': 1000, 'saved': 1000}, - 'io_counters': [0, - 4096, + 'io_counters': [2014217216, + 1436655616, + 2014217216, + 1436655616, + 1, + 111648768, + 688128, + 111648768, + 688128, + 1, + 209947648, + 413696, + 209947648, + 413696, + 1, + 27337728, + 4206592, + 27337728, + 4206592, + 1, + 3401198592, + 1180692480, + 3401198592, + 1180692480, + 1, + 93603840, 0, + 93603840, 0, 1, - 0, - 20480, - 0, - 20480, + 27540480, + 1413120, + 27540480, + 1413120, 1, - 64045056, - 70017024, - 64045056, - 70017024, + 346797056, + 2969100288, + 346797056, + 2969100288, 1, - 0, + 7426048, 8192, - 0, + 7426048, 8192, 1, - 2465792, + 32229376, 0, - 2465792, + 32229376, 0, 1, - 741376, + 75408384, 0, - 741376, + 75408384, 0, 1, - 3235840, + 1559552, 0, - 3235840, + 1559552, + 0, + 1, + 3833856, + 0, + 3833856, + 0, + 1, + 23600128, + 23175168, + 23600128, + 23175168, + 1, + 6934528, + 0, + 6934528, + 0, + 1, + 6627328, + 0, + 6627328, + 0, + 1, + 1983488, + 0, + 1983488, + 0, + 1, + 14069760, + 0, + 14069760, + 0, + 1, + 1885184, + 0, + 1885184, + 0, + 1, + 2438144, + 0, + 2438144, + 0, + 1, + 10924032, + 0, + 10924032, + 0, + 1, + 159744, + 8192, + 159744, + 8192, + 1, + 2541568, + 2846720, + 2541568, + 2846720, + 1, + 12880896, + 905216, + 12880896, + 905216, + 1, + 1271808, + 0, + 1271808, 0, 1], 'key': 'pid', - 'memory_info': {'data': 63213568, + 'memory_info': {'data': 4763049984, 'dirty': 0, 'lib': 0, - 'rss': 78741504, - 'shared': 16969728, - 'text': 3026944, - 'vms': 91906048}, - 'memory_percent': 0.47946211653194054, - 'name': 'python', + 'rss': 2159456256, + 'shared': 79568896, + 'text': 148705280, + 'vms': 1526338510848}, + 'memory_percent': 13.149072251547079, + 'name': 'code', 'nice': 0, - 'num_threads': 1, - 'pid': 259901, - 'status': 'R', - 'time_since_update': 0.29739928245544434, + 'num_threads': 58, + 'pid': 110899, + 'status': 'S', + 'time_since_update': 0.5535836219787598, 'username': 'nicolargo'} Processlist fields description: @@ -751,13 +876,13 @@ Load stats: >>> gl.load {'cpucore': 16, - 'min1': 1.3310546875, - 'min15': 0.34033203125, - 'min5': 0.6142578125} + 'min1': 0.97705078125, + 'min15': 1.5791015625, + 'min5': 1.697265625} >>> gl.load.keys() ['min1', 'min5', 'min15', 'cpucore'] >>> gl.load["min1"] - 1.3310546875 + 0.97705078125 Load fields description: @@ -796,7 +921,7 @@ Sensors stats: 'label': 'Ambient', 'type': 'temperature_core', 'unit': 'C', - 'value': 40, + 'value': 39, 'warning': 0} Sensors fields description: @@ -834,7 +959,7 @@ Uptime stats: >>> type(gl.uptime) >>> gl.uptime - '2 days, 0:13:08' + '8 days, 0:38:58' Uptime limits: @@ -853,11 +978,11 @@ Now stats: >>> type(gl.now) >>> gl.now - {'custom': '2025-08-17 18:33:57 CEST', 'iso': '2025-08-17T18:33:57+02:00'} + {'custom': '2025-09-21 09:59:29 CEST', 'iso': '2025-09-21T09:59:29+02:00'} >>> gl.now.keys() ['iso', 'custom'] >>> gl.now["iso"] - '2025-08-17T18:33:57+02:00' + '2025-09-21T09:59:29+02:00' Now fields description: @@ -886,14 +1011,14 @@ Fs stats: ['/', '/zsfpool'] >>> gl.fs["/"] {'device_name': '/dev/mapper/ubuntu--vg-ubuntu--lv', - 'free': 720872308736, + 'free': 716746481664, 'fs_type': 'ext4', 'key': 'mnt_point', 'mnt_point': '/', 'options': 'rw,relatime', - 'percent': 24.3, + 'percent': 24.8, 'size': 1003736440832, - 'used': 231801626624} + 'used': 235927453696} Fs fields description: @@ -933,8 +1058,8 @@ Wifi stats: ['wlp0s20f3'] >>> gl.wifi["wlp0s20f3"] {'key': 'ssid', - 'quality_level': -74.0, - 'quality_link': 36.0, + 'quality_level': -62.0, + 'quality_link': 48.0, 'ssid': 'wlp0s20f3'} Wifi limits: @@ -958,7 +1083,7 @@ Ip stats: >>> type(gl.ip) >>> gl.ip - {'address': '192.168.0.28', + {'address': '192.168.1.26', 'mask': '255.255.255.0', 'mask_cidr': 24, 'public_address': '', @@ -966,7 +1091,7 @@ Ip stats: >>> gl.ip.keys() ['address', 'mask', 'mask_cidr', 'public_address', 'public_info_human'] >>> gl.ip["address"] - '192.168.0.28' + '192.168.1.26' Ip fields description: @@ -990,25 +1115,6 @@ Ip limits: 'ip_public_refresh_interval': 300.0, 'ip_public_template': ['{continent_name}/{country_name}/{city_name}']} -Glances help ------------- - -Help stats: - -.. code-block:: python - - >>> type(gl.help) - - >>> gl.help - None - -Help limits: - -.. code-block:: python - - >>> gl.help.limits - {'history_size': 1200.0} - Glances version --------------- @@ -1019,7 +1125,7 @@ Version stats: >>> type(gl.version) >>> gl.version - '4.4.0_dev1' + '4.4.0_dev4' Version limits: @@ -1085,20 +1191,20 @@ Mem stats: >>> type(gl.mem) >>> gl.mem - {'active': 4825649152, - 'available': 5969608704, - 'buffers': 329052160, - 'cached': 4741099520, - 'free': 5969608704, - 'inactive': 8804777984, - 'percent': 63.7, - 'shared': 921595904, - 'total': 16422883328, - 'used': 10453274624} + {'active': 7853846528, + 'available': 6182318080, + 'buffers': 272400384, + 'cached': 5119221760, + 'free': 6182318080, + 'inactive': 6526087168, + 'percent': 62.4, + 'shared': 736985088, + 'total': 16422879232, + 'used': 10240561152} >>> gl.mem.keys() ['total', 'available', 'percent', 'used', 'free', 'active', 'inactive', 'buffers', 'cached', 'shared'] >>> gl.mem["total"] - 16422883328 + 16422879232 Mem fields description: @@ -1164,19 +1270,19 @@ Quicklook stats: >>> type(gl.quicklook) >>> gl.quicklook - {'cpu': 10.6, + {'cpu': 5.6, 'cpu_hz': 4475000000.0, - 'cpu_hz_current': 1438531937.5000002, + 'cpu_hz_current': 916671999.9999999, 'cpu_log_core': 16, 'cpu_name': '13th Gen Intel(R) Core(TM) i7-13620H', 'cpu_phys_core': 10, - 'load': 2.1, - 'mem': 63.7, + 'load': 9.9, + 'mem': 62.4, 'percpu': [{'cpu_number': 0, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 24.0, + 'idle': 56.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1185,13 +1291,13 @@ Quicklook stats: 'softirq': 0.0, 'steal': 0.0, 'system': 9.0, - 'total': 76.0, - 'user': 0.0}, + 'total': 44.0, + 'user': 1.0}, {'cpu_number': 1, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 32.0, + 'idle': 66.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1200,13 +1306,13 @@ Quicklook stats: 'softirq': 0.0, 'steal': 0.0, 'system': 0.0, - 'total': 68.0, + 'total': 34.0, 'user': 0.0}, {'cpu_number': 2, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 32.0, + 'idle': 63.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1214,14 +1320,14 @@ Quicklook stats: 'nice': 0.0, 'softirq': 0.0, 'steal': 0.0, - 'system': 0.0, - 'total': 68.0, - 'user': 0.0}, + 'system': 1.0, + 'total': 37.0, + 'user': 1.0}, {'cpu_number': 3, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 32.0, + 'idle': 67.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1230,28 +1336,28 @@ Quicklook stats: 'softirq': 0.0, 'steal': 0.0, 'system': 0.0, - 'total': 68.0, + 'total': 33.0, 'user': 0.0}, {'cpu_number': 4, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 20.0, + 'idle': 45.0, 'interrupt': None, - 'iowait': 0.0, + 'iowait': 2.0, 'irq': 0.0, 'key': 'cpu_number', 'nice': 0.0, 'softirq': 0.0, 'steal': 0.0, - 'system': 8.0, - 'total': 80.0, - 'user': 2.0}, + 'system': 11.0, + 'total': 55.0, + 'user': 8.0}, {'cpu_number': 5, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 25.0, + 'idle': 49.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1259,29 +1365,29 @@ Quicklook stats: 'nice': 0.0, 'softirq': 0.0, 'steal': 0.0, - 'system': 2.0, - 'total': 75.0, - 'user': 5.0}, + 'system': 11.0, + 'total': 51.0, + 'user': 4.0}, {'cpu_number': 6, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 15.0, + 'idle': 60.0, 'interrupt': None, - 'iowait': 1.0, + 'iowait': 0.0, 'irq': 0.0, 'key': 'cpu_number', 'nice': 0.0, 'softirq': 0.0, 'steal': 0.0, - 'system': 3.0, - 'total': 85.0, - 'user': 10.0}, + 'system': 1.0, + 'total': 40.0, + 'user': 4.0}, {'cpu_number': 7, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 22.0, + 'idle': 66.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1289,14 +1395,14 @@ Quicklook stats: 'nice': 0.0, 'softirq': 0.0, 'steal': 0.0, - 'system': 1.0, - 'total': 78.0, - 'user': 9.0}, + 'system': 0.0, + 'total': 34.0, + 'user': 1.0}, {'cpu_number': 8, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 31.0, + 'idle': 65.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1304,14 +1410,14 @@ Quicklook stats: 'nice': 0.0, 'softirq': 0.0, 'steal': 0.0, - 'system': 1.0, - 'total': 69.0, + 'system': 0.0, + 'total': 35.0, 'user': 1.0}, {'cpu_number': 9, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 32.0, + 'idle': 66.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1320,13 +1426,13 @@ Quicklook stats: 'softirq': 0.0, 'steal': 0.0, 'system': 0.0, - 'total': 68.0, + 'total': 34.0, 'user': 0.0}, {'cpu_number': 10, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 31.0, + 'idle': 64.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1334,14 +1440,14 @@ Quicklook stats: 'nice': 0.0, 'softirq': 0.0, 'steal': 0.0, - 'system': 0.0, - 'total': 69.0, - 'user': 0.0}, + 'system': 1.0, + 'total': 36.0, + 'user': 1.0}, {'cpu_number': 11, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 32.0, + 'idle': 66.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1350,13 +1456,13 @@ Quicklook stats: 'softirq': 0.0, 'steal': 0.0, 'system': 0.0, - 'total': 68.0, + 'total': 34.0, 'user': 0.0}, {'cpu_number': 12, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 32.0, + 'idle': 65.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1365,13 +1471,13 @@ Quicklook stats: 'softirq': 0.0, 'steal': 0.0, 'system': 0.0, - 'total': 68.0, + 'total': 35.0, 'user': 1.0}, {'cpu_number': 13, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 31.0, + 'idle': 66.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1379,14 +1485,14 @@ Quicklook stats: 'nice': 0.0, 'softirq': 0.0, 'steal': 0.0, - 'system': 0.0, - 'total': 69.0, + 'system': 1.0, + 'total': 34.0, 'user': 0.0}, {'cpu_number': 14, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 29.0, + 'idle': 66.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1394,14 +1500,14 @@ Quicklook stats: 'nice': 0.0, 'softirq': 0.0, 'steal': 0.0, - 'system': 2.0, - 'total': 71.0, - 'user': 1.0}, + 'system': 1.0, + 'total': 34.0, + 'user': 0.0}, {'cpu_number': 15, 'dpc': None, 'guest': 0.0, 'guest_nice': 0.0, - 'idle': 32.0, + 'idle': 65.0, 'interrupt': None, 'iowait': 0.0, 'irq': 0.0, @@ -1410,9 +1516,9 @@ Quicklook stats: 'softirq': 0.0, 'steal': 0.0, 'system': 0.0, - 'total': 68.0, - 'user': 0.0}], - 'swap': 3.9} + 'total': 35.0, + 'user': 1.0}], + 'swap': 91.4} >>> gl.quicklook.keys() ['cpu_name', 'cpu_hz_current', 'cpu_hz', 'cpu', 'percpu', 'mem', 'swap', 'cpu_log_core', 'cpu_phys_core', 'load'] >>> gl.quicklook["cpu_name"] @@ -1462,13 +1568,13 @@ Memswap stats: >>> type(gl.memswap) >>> gl.memswap - {'free': 4128976896, - 'percent': 3.9, - 'sin': 1683456, - 'sout': 158633984, - 'time_since_update': 0.28161168098449707, + {'free': 367751168, + 'percent': 91.4, + 'sin': 1177866240, + 'sout': 5795123200, + 'time_since_update': 0.5103552341461182, 'total': 4294963200, - 'used': 165986304} + 'used': 3927212032} >>> gl.memswap.keys() ['total', 'used', 'free', 'percent', 'sin', 'sout', 'time_since_update'] >>> gl.memswap["total"] @@ -1495,3 +1601,94 @@ Memswap limits: 'memswap_disable': ['False'], 'memswap_warning': 70.0} +Use auto_unit to display a human-readable string with the unit +-------------------------------------------------------------- + +Use auto_unit() function to generate a human-readable string with the unit: + +.. code-block:: python + + >>> gl.mem["used"] + 10240561152 + + >>> gl.auto_unit(gl.mem["used"]) + 9.54G + + +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. + + +Use to display stat as a bar +---------------------------- + +Use bar() function to generate a bar: + +.. code-block:: python + + >>> gl.bar(gl.mem["percent"]) + ■■■■■■■■■■■□□□□□□□ + + +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. + + +Use to display top process list +------------------------------- + +Use top_process() function to generate a list of top processes sorted by CPU or MEM usage: + +.. code-block:: python + + >>> gl.top_process() + [{'pid': 5046, 'cpu_percent': 19.0, 'memory_percent': 1.6104035124649207, 'cpu_times': {'user': 2416.46, 'system': 1318.57, 'children_user': 16.92, 'children_system': 6.47, 'iowait': 0.0}, 'gids': {'real': 1000, 'effective': 1000, 'saved': 1000}, 'io_counters': [300045312, 1191936, 300045312, 1191936, 1], 'name': 'gnome-shell', 'memory_info': {'rss': 264474624, 'vms': 5903314944, 'shared': 87982080, 'text': 8192, 'lib': 0, 'data': 529833984, 'dirty': 0}, 'status': 'S', 'nice': 0, 'num_threads': 40, 'key': 'pid', 'time_since_update': 0.5535836219787598, 'cmdline': ['/usr/bin/gnome-shell'], 'username': 'nicolargo'}, {'pid': 129, 'cpu_percent': 7.4, 'memory_percent': 0.0, 'cpu_times': {'user': 0.0, 'system': 65.91, 'children_user': 0.0, 'children_system': 0.0, 'iowait': 0.0}, 'gids': {'real': 0, 'effective': 0, 'saved': 0}, 'io_counters': [0, 0, 0, 0, 0], 'name': 'irq/9-acpi', 'memory_info': {'rss': 0, 'vms': 0, 'shared': 0, 'text': 0, 'lib': 0, 'data': 0, 'dirty': 0}, 'status': 'S', 'nice': 0, 'num_threads': 1, 'key': 'pid', 'time_since_update': 0.5535836219787598, 'cmdline': [], 'username': 'root'}, {'pid': 199912, 'cpu_percent': 3.8, 'memory_percent': 0.826713209553729, 'cpu_times': {'user': 104.04, 'system': 28.85, 'children_user': 0.06, 'children_system': 0.21, 'iowait': 0.0}, 'gids': {'real': 1000, 'effective': 1000, 'saved': 1000}, 'io_counters': [183361536, 24653824, 183361536, 24649728, 1], 'name': 'dropbox', 'memory_info': {'rss': 135770112, 'vms': 7175544832, 'shared': 49795072, 'text': 4096, 'lib': 0, 'data': 923680768, 'dirty': 0}, 'status': 'S', 'nice': 0, 'num_threads': 90, 'key': 'pid', 'time_since_update': 0.5535836219787598, 'cmdline': ['/home/nicolargo/.dropbox-dist/dropbox-lnx.x86_64-232.4.5988/dropbox'], 'username': 'nicolargo'}] + + +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. + + diff --git a/docs/api/restful.rst b/docs/api/restful.rst index fe8a8b34..75ec7379 100644 --- a/docs/api/restful.rst +++ b/docs/api/restful.rst @@ -160,7 +160,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.38616180419921875}, + "timer": 0.5016987323760986}, {"count": 0, "countmax": 20.0, "countmin": None, @@ -169,7 +169,7 @@ Get plugin stats:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.3861122131347656}] + "timer": 0.5015974044799805}] Fields descriptions: @@ -197,7 +197,7 @@ Get a specific item when field matches the given value:: "refresh": 3.0, "regex": True, "result": None, - "timer": 0.38616180419921875}]} + "timer": 0.5016987323760986}]} GET cloud --------- @@ -286,19 +286,19 @@ Get plugin stats:: # curl http://localhost:61208/api/4/cpu {"cpucore": 16, - "ctx_switches": 130739860, + "ctx_switches": 305848485, "guest": 0.0, - "idle": 93.8, - "interrupts": 107418321, - "iowait": 0.1, + "idle": 93.2, + "interrupts": 248231354, + "iowait": 0.2, "irq": 0.0, "nice": 0.0, - "soft_interrupts": 45154500, + "soft_interrupts": 100557273, "steal": 0.0, "syscalls": 0, - "system": 2.6, - "total": 5.7, - "user": 3.5} + "system": 2.8, + "total": 6.3, + "user": 3.7} Fields descriptions: @@ -331,7 +331,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/cpu/total - {"total": 5.7} + {"total": 6.3} GET diskio ---------- @@ -341,20 +341,20 @@ Get plugin stats:: # curl http://localhost:61208/api/4/diskio [{"disk_name": "nvme0n1", "key": "disk_name", - "read_bytes": 10276049408, - "read_count": 347806, + "read_bytes": 18529010176, + "read_count": 959481, "read_latency": 0, - "read_time": 67145, - "write_bytes": 16688047104, - "write_count": 784042, + "read_time": 284217, + "write_bytes": 26236916736, + "write_count": 2366213, "write_latency": 0, - "write_time": 1157821}, + "write_time": 2119813}, {"disk_name": "nvme0n1p1", "key": "disk_name", - "read_bytes": 21578752, - "read_count": 1789, + "read_bytes": 9021440, + "read_count": 2080, "read_latency": 0, - "read_time": 2436, + "read_time": 6215, "write_bytes": 5120, "write_count": 3, "write_latency": 0, @@ -400,14 +400,14 @@ Get a specific item when field matches the given value:: # curl http://localhost:61208/api/4/diskio/disk_name/value/nvme0n1 {"nvme0n1": [{"disk_name": "nvme0n1", "key": "disk_name", - "read_bytes": 10276049408, - "read_count": 347806, + "read_bytes": 18529010176, + "read_count": 959481, "read_latency": 0, - "read_time": 67145, - "write_bytes": 16688047104, - "write_count": 784042, + "read_time": 284217, + "write_bytes": 26236916736, + "write_count": 2366213, "write_latency": 0, - "write_time": 1157821}]} + "write_time": 2119813}]} GET folders ----------- @@ -434,14 +434,14 @@ Get plugin stats:: # curl http://localhost:61208/api/4/fs [{"device_name": "/dev/mapper/ubuntu--vg-ubuntu--lv", - "free": 720872333312, + "free": 716746493952, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", "options": "rw,relatime", - "percent": 24.3, + "percent": 24.8, "size": 1003736440832, - "used": 231801602048}, + "used": 235927441408}, {"device_name": "zsfpool", "free": 41680896, "fs_type": "zfs", @@ -472,14 +472,14 @@ Get a specific item when field matches the given value:: # curl http://localhost:61208/api/4/fs/mnt_point/value// {"/": [{"device_name": "/dev/mapper/ubuntu--vg-ubuntu--lv", - "free": 720872333312, + "free": 716746493952, "fs_type": "ext4", "key": "mnt_point", "mnt_point": "/", "options": "rw,relatime", - "percent": 24.3, + "percent": 24.8, "size": 1003736440832, - "used": 231801602048}]} + "used": 235927441408}]} GET gpu ------- @@ -512,7 +512,7 @@ GET ip Get plugin stats:: # curl http://localhost:61208/api/4/ip - {"address": "192.168.0.28", + {"address": "192.168.1.26", "mask": "255.255.255.0", "mask_cidr": 24, "public_address": "", @@ -530,7 +530,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/ip/address - {"address": "192.168.0.28"} + {"address": "192.168.1.26"} GET irq ------- @@ -552,9 +552,9 @@ Get plugin stats:: # curl http://localhost:61208/api/4/load {"cpucore": 16, - "min1": 1.30419921875, - "min15": 0.34423828125, - "min5": 0.62109375} + "min1": 0.97900390625, + "min15": 1.57568359375, + "min5": 1.685546875} Fields descriptions: @@ -566,7 +566,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/load/min1 - {"min1": 1.30419921875} + {"min1": 0.97900390625} GET mem ------- @@ -574,16 +574,16 @@ GET mem Get plugin stats:: # curl http://localhost:61208/api/4/mem - {"active": 4815032320, - "available": 5957959680, - "buffers": 329080832, - "cached": 4728070144, - "free": 5957959680, - "inactive": 8804777984, - "percent": 63.7, - "shared": 908591104, - "total": 16422883328, - "used": 10464923648} + {"active": 7844958208, + "available": 6212390912, + "buffers": 272408576, + "cached": 5124861952, + "free": 6212390912, + "inactive": 6526513152, + "percent": 62.2, + "shared": 742211584, + "total": 16422879232, + "used": 10210488320} Fields descriptions: @@ -602,7 +602,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/mem/total - {"total": 16422883328} + {"total": 16422879232} GET memswap ----------- @@ -610,13 +610,13 @@ GET memswap Get plugin stats:: # curl http://localhost:61208/api/4/memswap - {"free": 4128976896, - "percent": 3.9, - "sin": 1683456, - "sout": 158633984, + {"free": 367816704, + "percent": 91.4, + "sin": 1177907200, + "sout": 5795123200, "time_since_update": 1, "total": 4294963200, - "used": 165986304} + "used": 3927146496} Fields descriptions: @@ -641,18 +641,18 @@ Get plugin stats:: # curl http://localhost:61208/api/4/network [{"alias": None, "bytes_all": 0, - "bytes_all_gauge": 1934214880, + "bytes_all_gauge": 3100599416, "bytes_all_rate_per_sec": 0, "bytes_recv": 0, - "bytes_recv_gauge": 1781578581, + "bytes_recv_gauge": 2247533379, "bytes_recv_rate_per_sec": 0, "bytes_sent": 0, - "bytes_sent_gauge": 152636299, + "bytes_sent_gauge": 853066037, "bytes_sent_rate_per_sec": 0, "interface_name": "wlp0s20f3", "key": "interface_name", "speed": 0, - "time_since_update": 0.3874051570892334}] + "time_since_update": 0.5043454170227051}] Fields descriptions: @@ -681,18 +681,18 @@ Get a specific item when field matches the given value:: # curl http://localhost:61208/api/4/network/interface_name/value/wlp0s20f3 {"wlp0s20f3": [{"alias": None, "bytes_all": 0, - "bytes_all_gauge": 1934214880, + "bytes_all_gauge": 3100599416, "bytes_all_rate_per_sec": 0, "bytes_recv": 0, - "bytes_recv_gauge": 1781578581, + "bytes_recv_gauge": 2247533379, "bytes_recv_rate_per_sec": 0, "bytes_sent": 0, - "bytes_sent_gauge": 152636299, + "bytes_sent_gauge": 853066037, "bytes_sent_rate_per_sec": 0, "interface_name": "wlp0s20f3", "key": "interface_name", "speed": 0, - "time_since_update": 0.3874051570892334}]} + "time_since_update": 0.5043454170227051}]} GET now ------- @@ -700,7 +700,7 @@ GET now Get plugin stats:: # curl http://localhost:61208/api/4/now - {"custom": "2025-08-17 18:34:01 CEST", "iso": "2025-08-17T18:34:01+02:00"} + {"custom": "2025-09-21 09:59:33 CEST", "iso": "2025-09-21T09:59:33+02:00"} Fields descriptions: @@ -710,7 +710,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/now/iso - {"iso": "2025-08-17T18:34:01+02:00"} + {"iso": "2025-09-21T09:59:33+02:00"} GET percpu ---------- @@ -722,7 +722,7 @@ Get plugin stats:: "dpc": None, "guest": 0.0, "guest_nice": 0.0, - "idle": 29.0, + "idle": 38.0, "interrupt": None, "iowait": 0.0, "irq": 0.0, @@ -730,14 +730,14 @@ Get plugin stats:: "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 8.0, - "total": 71.0, + "system": 10.0, + "total": 62.0, "user": 0.0}, {"cpu_number": 1, "dpc": None, "guest": 0.0, "guest_nice": 0.0, - "idle": 37.0, + "idle": 48.0, "interrupt": None, "iowait": 0.0, "irq": 0.0, @@ -746,7 +746,7 @@ Get plugin stats:: "softirq": 0.0, "steal": 0.0, "system": 0.0, - "total": 63.0, + "total": 52.0, "user": 0.0}] Fields descriptions: @@ -796,7 +796,7 @@ GET processcount Get plugin stats:: # curl http://localhost:61208/api/4/processcount - {"pid_max": 0, "running": 1, "sleeping": 416, "thread": 2142, "total": 548} + {"pid_max": 0, "running": 1, "sleeping": 431, "thread": 2461, "total": 569} Fields descriptions: @@ -809,7 +809,7 @@ Fields descriptions: Get a specific field:: # curl http://localhost:61208/api/4/processcount/total - {"total": 548} + {"total": 569} GET processlist --------------- @@ -826,7 +826,7 @@ Get plugin stats:: "--dns-result-order=ipv4first", "--experimental-network-inspection", "--inspect-port=0", - "--crashpad-handler-pid=25265", + "--crashpad-handler-pid=22329", "--enable-crash-reporter=864d4bb7-dd20-4851-830f-29e81dd93517,no_channel", "--user-data-dir=/home/nicolargo/.config/Code", "--standard-schemes=vscode-webview,vscode-file", @@ -836,159 +836,184 @@ Get plugin stats:: "--service-worker-schemes=vscode-webview", "--code-cache-schemes=vscode-webview,vscode-file", "--shared-files=v8_context_snapshot_data:100", - "--field-trial-handle=3,i,16122866233278758028,4270086143973757781,262144", + "--field-trial-handle=3,i,18224849850816561636,15185484266821424269,262144", "--enable-features=DocumentPolicyIncludeJSCallStacksInCrashReports,EarlyEstablishGpuChannel,EstablishGpuChannelAsync", - "--disable-features=CalculateNativeWinOcclusion,SpareRendererForSitePerProcess", + "--disable-features=CalculateNativeWinOcclusion,FontationsLinuxSystemFonts,ScreenAIOCREnabled,SpareRendererForSitePerProcess", "--variations-seed-version"], "cpu_percent": 0.0, - "cpu_times": {"children_system": 562.61, - "children_user": 268.22, + "cpu_times": {"children_system": 1117.86, + "children_user": 1369.94, "iowait": 0.0, - "system": 436.43, - "user": 836.35}, + "system": 1272.38, + "user": 4766.65}, "gids": {"effective": 1000, "real": 1000, "saved": 1000}, - "io_counters": [494580736, - 178188288, + "io_counters": [2014217216, + 1436655616, 0, 0, 0, - 65304576, - 258048, + 111648768, + 688128, 0, 0, 0, - 24671232, - 290816, + 209947648, + 413696, 0, 0, 0, - 89942016, - 81530880, + 27337728, + 4206592, 0, 0, 0, - 29804544, - 535326720, + 3401198592, + 1180692480, 0, 0, 0, - 4115456, + 93640704, + 0, + 0, + 0, + 0, + 27540480, + 1413120, + 0, + 0, + 0, + 346797056, + 2969100288, + 0, + 0, + 0, + 7426048, 8192, 0, 0, 0, - 9629696, + 32229376, 0, 0, 0, 0, - 1135616, - 1343488, + 75408384, 0, 0, 0, - 512000, + 0, + 1559552, + 0, + 0, + 0, + 0, + 3833856, + 0, + 0, + 0, + 0, + 23600128, + 23175168, + 0, + 0, + 0, + 6934528, + 0, + 0, + 0, + 0, + 6627328, + 0, + 0, + 0, + 0, + 1983488, + 0, + 0, + 0, + 0, + 14069760, + 0, + 0, + 0, + 0, + 1885184, + 0, + 0, + 0, + 0, + 2438144, + 0, + 0, + 0, + 0, + 10924032, + 0, + 0, + 0, + 0, + 159744, 8192, 0, 0, 0, - 18398208, + 2541568, + 2846720, 0, 0, 0, - 0, - 2622464, + 12880896, + 905216, 0, 0, 0, - 0, - 1540096, - 0, - 0, - 0, - 0, - 6172672, - 0, - 0, - 0, - 0, - 61969408, - 4403200, - 0, - 0, - 0, - 4764672, - 0, - 0, - 0, - 0, - 50266112, - 0, - 0, - 0, - 0, - 119808, - 0, - 0, - 0, - 0, - 3931136, - 6467584, - 0, - 0, - 0, - 1062912, - 0, - 0, - 0, - 0, - 736256, + 1271808, 0, 0, 0, 0], "key": "pid", - "memory_info": {"data": 3345526784, + "memory_info": {"data": 4761477120, "dirty": 0, "lib": 0, - "rss": 1838231552, - "shared": 129142784, - "text": 142934016, - "vms": 1527944450048}, - "memory_percent": 11.193110949439243, + "rss": 2158960640, + "shared": 79568896, + "text": 148705280, + "vms": 1526338510848}, + "memory_percent": 13.14605441287824, "name": "code", "nice": 0, - "num_threads": 59, - "pid": 25440, + "num_threads": 58, + "pid": 110899, "status": "S", "time_since_update": 1, "username": "nicolargo"}, - {"cmdline": ["/snap/code/200/usr/share/code/code", + {"cmdline": ["/snap/code/206/usr/share/code/code", "/home/nicolargo/.vscode/extensions/ms-python.vscode-pylance-2025.7.1/dist/server.bundle.js", - "--cancellationReceive=file:51fe8ad8d84431df07d31833616f2d526a94ce30ae", + "--cancellationReceive=file:486c2b5a05c7dc8f3e93fc6de9c4b6e28e614494b2", "--node-ipc", - "--clientProcessId=25440"], + "--clientProcessId=110899"], "cpu_percent": 0.0, - "cpu_times": {"children_system": 0.23, - "children_user": 0.68, + "cpu_times": {"children_system": 0.52, + "children_user": 2.02, "iowait": 0.0, - "system": 10.89, - "user": 154.48}, + "system": 53.93, + "user": 1116.32}, "gids": {"effective": 1000, "real": 1000, "saved": 1000}, - "io_counters": [65304576, 258048, 0, 0, 0], + "io_counters": [111648768, 688128, 0, 0, 0], "key": "pid", - "memory_info": {"data": 1983393792, + "memory_info": {"data": 2290892800, "dirty": 0, "lib": 0, - "rss": 1147838464, - "shared": 72675328, - "text": 142934016, - "vms": 1501484171264}, - "memory_percent": 6.989262732220756, + "rss": 1164738560, + "shared": 32759808, + "text": 148705280, + "vms": 1501606547456}, + "memory_percent": 7.092170279925735, "name": "code", "nice": 0, "num_threads": 16, - "pid": 26358, + "pid": 112061, "status": "S", "time_since_update": 1, "username": "nicolargo"}] @@ -1015,167 +1040,197 @@ GET programlist Get plugin stats:: # curl http://localhost:61208/api/4/programlist - [{"childrens": [25440, - 26358, - 25356, - 25244, - 25450, - 25567, - 26736, - 79046, - 25566, - 25451, - 25390, - 25796, - 25526, - 25582, - 26414, - 25536, - 25806, - 25325, - 25247, - 25246], + [{"childrens": [110899, + 112061, + 22460, + 111133, + 22312, + 112323, + 344651, + 22523, + 111268, + 22429, + 22524, + 240741, + 240742, + 22410, + 111284, + 111848, + 111192, + 22786, + 136828, + 111283, + 112290, + 111267, + 111341, + 22315, + 22314], "cmdline": ["code"], "cpu_percent": 0, - "cpu_times": {"children_system": 563.6199999999999, - "children_user": 272.48, - "system": 633.14, - "user": 2203.879999999999}, - "io_counters": [494580736, - 178188288, + "cpu_times": {"children_system": 1685.32, + "children_user": 3833.36, + "system": 2501.81, + "user": 17066.89}, + "io_counters": [2014217216, + 1436655616, 0, 0, 0, - 65304576, - 258048, + 111648768, + 688128, 0, 0, 0, - 24671232, - 290816, + 209947648, + 413696, 0, 0, 0, - 89942016, - 81530880, + 27337728, + 4206592, 0, 0, 0, - 29804544, - 535326720, + 3401198592, + 1180692480, 0, 0, 0, - 4115456, + 93640704, + 0, + 0, + 0, + 0, + 27540480, + 1413120, + 0, + 0, + 0, + 346797056, + 2969100288, + 0, + 0, + 0, + 7426048, 8192, 0, 0, 0, - 9629696, + 32229376, 0, 0, 0, 0, - 1135616, - 1343488, + 75408384, 0, 0, 0, - 512000, + 0, + 1559552, + 0, + 0, + 0, + 0, + 3833856, + 0, + 0, + 0, + 0, + 23600128, + 23175168, + 0, + 0, + 0, + 6934528, + 0, + 0, + 0, + 0, + 6627328, + 0, + 0, + 0, + 0, + 1983488, + 0, + 0, + 0, + 0, + 14069760, + 0, + 0, + 0, + 0, + 1885184, + 0, + 0, + 0, + 0, + 2438144, + 0, + 0, + 0, + 0, + 10924032, + 0, + 0, + 0, + 0, + 159744, 8192, 0, 0, 0, - 18398208, + 2541568, + 2846720, 0, 0, 0, - 0, - 2622464, + 12880896, + 905216, 0, 0, 0, - 0, - 1540096, - 0, - 0, - 0, - 0, - 6172672, - 0, - 0, - 0, - 0, - 61969408, - 4403200, - 0, - 0, - 0, - 4764672, - 0, - 0, - 0, - 0, - 50266112, - 0, - 0, - 0, - 0, - 119808, - 0, - 0, - 0, - 0, - 3931136, - 6467584, - 0, - 0, - 0, - 1062912, - 0, - 0, - 0, - 0, - 736256, + 1271808, 0, 0, 0, 0], - "memory_info": {"data": 16867876864, - "rss": 5683699712, - "shared": 1639972864, - "text": 2858680320, - "vms": 24104181116928}, - "memory_percent": 34.60841557773014, + "memory_info": {"data": 23349264384, + "rss": 5558693888, + "shared": 809234432, + "text": 3717632000, + "vms": 31613675048960}, + "memory_percent": 33.847255462786805, "name": "code", "nice": 0, - "nprocs": 20, - "num_threads": 321, + "nprocs": 25, + "num_threads": 368, "pid": "_", "status": "S", "time_since_update": 1, "username": "nicolargo"}, - {"childrens": [7064], - "cmdline": ["firefox"], + {"childrens": [6683], + "cmdline": ["WebExtensions"], "cpu_percent": 0, - "cpu_times": {"children_system": 0.65, - "children_user": 0.14, + "cpu_times": {"children_system": 0.0, + "children_user": 0.0, "iowait": 0.0, - "system": 827.03, - "user": 2890.05}, - "io_counters": [1250412544, 5730615296, 0, 0, 0], - "memory_info": {"data": 1132986368, + "system": 96.4, + "user": 599.66}, + "io_counters": [40433664, 0, 0, 0, 0], + "memory_info": {"data": 920674304, "dirty": 0, "lib": 0, - "rss": 916598784, - "shared": 349892608, + "rss": 649555968, + "shared": 67686400, "text": 823296, - "vms": 30495432704}, - "memory_percent": 5.581229347451162, - "name": "firefox", + "vms": 25131753472}, + "memory_percent": 3.9551893357063688, + "name": "WebExtensions", "nice": 0, "nprocs": 1, - "num_threads": 156, + "num_threads": 28, "pid": "_", "status": "S", "time_since_update": 1, @@ -1211,19 +1266,19 @@ GET quicklook Get plugin stats:: # curl http://localhost:61208/api/4/quicklook - {"cpu": 5.7, + {"cpu": 6.3, "cpu_hz": 4475000000.0, - "cpu_hz_current": 965964124.9999998, + "cpu_hz_current": 775303750.0, "cpu_log_core": 16, "cpu_name": "13th Gen Intel(R) Core(TM) i7-13620H", "cpu_phys_core": 10, - "load": 2.2, - "mem": 63.7, + "load": 9.8, + "mem": 62.2, "percpu": [{"cpu_number": 0, "dpc": None, "guest": 0.0, "guest_nice": 0.0, - "idle": 29.0, + "idle": 38.0, "interrupt": None, "iowait": 0.0, "irq": 0.0, @@ -1231,14 +1286,14 @@ Get plugin stats:: "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 8.0, - "total": 71.0, + "system": 10.0, + "total": 62.0, "user": 0.0}, {"cpu_number": 1, "dpc": None, "guest": 0.0, "guest_nice": 0.0, - "idle": 37.0, + "idle": 48.0, "interrupt": None, "iowait": 0.0, "irq": 0.0, @@ -1247,13 +1302,13 @@ Get plugin stats:: "softirq": 0.0, "steal": 0.0, "system": 0.0, - "total": 63.0, + "total": 52.0, "user": 0.0}, {"cpu_number": 2, "dpc": None, "guest": 0.0, "guest_nice": 0.0, - "idle": 38.0, + "idle": 48.0, "interrupt": None, "iowait": 0.0, "irq": 0.0, @@ -1262,13 +1317,13 @@ Get plugin stats:: "softirq": 0.0, "steal": 0.0, "system": 0.0, - "total": 62.0, + "total": 52.0, "user": 0.0}, {"cpu_number": 3, "dpc": None, "guest": 0.0, "guest_nice": 0.0, - "idle": 38.0, + "idle": 49.0, "interrupt": None, "iowait": 0.0, "irq": 0.0, @@ -1277,28 +1332,28 @@ Get plugin stats:: "softirq": 0.0, "steal": 0.0, "system": 0.0, - "total": 62.0, + "total": 51.0, "user": 0.0}, {"cpu_number": 4, "dpc": None, "guest": 0.0, "guest_nice": 0.0, - "idle": 30.0, + "idle": 29.0, "interrupt": None, - "iowait": 1.0, + "iowait": 2.0, "irq": 0.0, "key": "cpu_number", "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 4.0, - "total": 70.0, - "user": 1.0}, + "system": 13.0, + "total": 71.0, + "user": 2.0}, {"cpu_number": 5, "dpc": None, "guest": 0.0, "guest_nice": 0.0, - "idle": 26.0, + "idle": 44.0, "interrupt": None, "iowait": 0.0, "irq": 0.0, @@ -1306,89 +1361,14 @@ Get plugin stats:: "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 4.0, - "total": 74.0, - "user": 7.0}, + "system": 3.0, + "total": 56.0, + "user": 1.0}, {"cpu_number": 6, "dpc": None, "guest": 0.0, "guest_nice": 0.0, - "idle": 30.0, - "interrupt": None, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 4.0, - "total": 70.0, - "user": 2.0}, - {"cpu_number": 7, - "dpc": None, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 37.0, - "interrupt": None, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 0.0, - "total": 63.0, - "user": 0.0}, - {"cpu_number": 8, - "dpc": None, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 37.0, - "interrupt": None, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 0.0, - "total": 63.0, - "user": 0.0}, - {"cpu_number": 9, - "dpc": None, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 37.0, - "interrupt": None, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 0.0, - "total": 63.0, - "user": 0.0}, - {"cpu_number": 10, - "dpc": None, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 38.0, - "interrupt": None, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 0.0, - "total": 62.0, - "user": 1.0}, - {"cpu_number": 11, - "dpc": None, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 38.0, + "idle": 48.0, "interrupt": None, "iowait": 0.0, "irq": 0.0, @@ -1397,54 +1377,9 @@ Get plugin stats:: "softirq": 0.0, "steal": 0.0, "system": 1.0, - "total": 62.0, - "user": 0.0}, - {"cpu_number": 12, - "dpc": None, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 38.0, - "interrupt": None, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 0.0, - "total": 62.0, + "total": 52.0, "user": 1.0}, - {"cpu_number": 13, - "dpc": None, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 38.0, - "interrupt": None, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 0.0, - "total": 62.0, - "user": 0.0}, - {"cpu_number": 14, - "dpc": None, - "guest": 0.0, - "guest_nice": 0.0, - "idle": 37.0, - "interrupt": None, - "iowait": 0.0, - "irq": 0.0, - "key": "cpu_number", - "nice": 0.0, - "softirq": 0.0, - "steal": 0.0, - "system": 0.0, - "total": 63.0, - "user": 0.0}, - {"cpu_number": 15, + {"cpu_number": 7, "dpc": None, "guest": 0.0, "guest_nice": 0.0, @@ -1456,10 +1391,130 @@ Get plugin stats:: "nice": 0.0, "softirq": 0.0, "steal": 0.0, - "system": 0.0, + "system": 4.0, "total": 64.0, - "user": 1.0}], - "swap": 3.9} + "user": 9.0}, + {"cpu_number": 8, + "dpc": None, + "guest": 0.0, + "guest_nice": 0.0, + "idle": 48.0, + "interrupt": None, + "iowait": 0.0, + "irq": 0.0, + "key": "cpu_number", + "nice": 0.0, + "softirq": 0.0, + "steal": 0.0, + "system": 0.0, + "total": 52.0, + "user": 0.0}, + {"cpu_number": 9, + "dpc": None, + "guest": 0.0, + "guest_nice": 0.0, + "idle": 49.0, + "interrupt": None, + "iowait": 0.0, + "irq": 0.0, + "key": "cpu_number", + "nice": 0.0, + "softirq": 0.0, + "steal": 0.0, + "system": 0.0, + "total": 51.0, + "user": 0.0}, + {"cpu_number": 10, + "dpc": None, + "guest": 0.0, + "guest_nice": 0.0, + "idle": 48.0, + "interrupt": None, + "iowait": 0.0, + "irq": 0.0, + "key": "cpu_number", + "nice": 0.0, + "softirq": 0.0, + "steal": 0.0, + "system": 0.0, + "total": 52.0, + "user": 0.0}, + {"cpu_number": 11, + "dpc": None, + "guest": 0.0, + "guest_nice": 0.0, + "idle": 49.0, + "interrupt": None, + "iowait": 0.0, + "irq": 0.0, + "key": "cpu_number", + "nice": 0.0, + "softirq": 0.0, + "steal": 0.0, + "system": 0.0, + "total": 51.0, + "user": 0.0}, + {"cpu_number": 12, + "dpc": None, + "guest": 0.0, + "guest_nice": 0.0, + "idle": 48.0, + "interrupt": None, + "iowait": 0.0, + "irq": 0.0, + "key": "cpu_number", + "nice": 0.0, + "softirq": 0.0, + "steal": 0.0, + "system": 1.0, + "total": 52.0, + "user": 1.0}, + {"cpu_number": 13, + "dpc": None, + "guest": 0.0, + "guest_nice": 0.0, + "idle": 48.0, + "interrupt": None, + "iowait": 0.0, + "irq": 0.0, + "key": "cpu_number", + "nice": 0.0, + "softirq": 0.0, + "steal": 0.0, + "system": 1.0, + "total": 52.0, + "user": 1.0}, + {"cpu_number": 14, + "dpc": None, + "guest": 0.0, + "guest_nice": 0.0, + "idle": 49.0, + "interrupt": None, + "iowait": 0.0, + "irq": 0.0, + "key": "cpu_number", + "nice": 0.0, + "softirq": 0.0, + "steal": 0.0, + "system": 1.0, + "total": 51.0, + "user": 0.0}, + {"cpu_number": 15, + "dpc": None, + "guest": 0.0, + "guest_nice": 0.0, + "idle": 48.0, + "interrupt": None, + "iowait": 0.0, + "irq": 0.0, + "key": "cpu_number", + "nice": 0.0, + "softirq": 0.0, + "steal": 0.0, + "system": 0.0, + "total": 52.0, + "user": 0.0}], + "swap": 91.4} Fields descriptions: @@ -1497,14 +1552,14 @@ Get plugin stats:: "label": "Ambient", "type": "temperature_core", "unit": "C", - "value": 40, + "value": 38, "warning": 0}, {"critical": None, "key": "label", "label": "Ambient 3", "type": "temperature_core", "unit": "C", - "value": 34, + "value": 33, "warning": 0}] Fields descriptions: @@ -1568,7 +1623,7 @@ Get a specific item when field matches the given value:: "label": "Ambient", "type": "temperature_core", "unit": "C", - "value": 40, + "value": 38, "warning": 0}]} GET smart @@ -1586,10 +1641,10 @@ Get plugin stats:: # curl http://localhost:61208/api/4/system {"hostname": "nicolargo-xps15", - "hr_name": "Ubuntu 24.04 64bit / Linux 6.14.0-24-generic", + "hr_name": "Ubuntu 24.04 64bit / Linux 6.14.0-27-generic", "linux_distro": "Ubuntu 24.04", "os_name": "Linux", - "os_version": "6.14.0-24-generic", + "os_version": "6.14.0-27-generic", "platform": "64bit"} Fields descriptions: @@ -1612,7 +1667,7 @@ GET uptime Get plugin stats:: # curl http://localhost:61208/api/4/uptime - "2 days, 0:13:12" + "8 days, 0:39:02" GET version ----------- @@ -1620,7 +1675,7 @@ GET version Get plugin stats:: # curl http://localhost:61208/api/4/version - "4.4.0_dev1" + "4.4.0_dev4" GET vms ------- @@ -1657,8 +1712,8 @@ Get plugin stats:: # curl http://localhost:61208/api/4/wifi [{"key": "ssid", - "quality_level": -74.0, - "quality_link": 36.0, + "quality_level": -60.0, + "quality_link": 50.0, "ssid": "wlp0s20f3"}] Get a specific field:: @@ -1670,8 +1725,8 @@ Get a specific item when field matches the given value:: # curl http://localhost:61208/api/4/wifi/ssid/value/wlp0s20f3 {"wlp0s20f3": [{"key": "ssid", - "quality_level": -74.0, - "quality_link": 36.0, + "quality_level": -60.0, + "quality_link": 50.0, "ssid": "wlp0s20f3"}]} GET all stats @@ -1735,34 +1790,34 @@ GET stats history History of a plugin:: # curl http://localhost:61208/api/4/cpu/history - {"system": [["2025-08-17T16:34:02.948905+00:00", 2.6], - ["2025-08-17T16:34:04.008942+00:00", 0.7], - ["2025-08-17T16:34:05.030720+00:00", 0.7]], - "user": [["2025-08-17T16:34:02.948903+00:00", 3.5], - ["2025-08-17T16:34:04.008940+00:00", 0.7], - ["2025-08-17T16:34:05.030719+00:00", 0.7]]} + {"system": [["2025-09-21T07:59:35.021130+00:00", 2.8], + ["2025-09-21T07:59:36.122241+00:00", 1.0], + ["2025-09-21T07:59:37.152781+00:00", 1.0]], + "user": [["2025-09-21T07:59:35.021127+00:00", 3.7], + ["2025-09-21T07:59:36.122238+00:00", 0.9], + ["2025-09-21T07:59:37.152778+00:00", 0.9]]} Limit history to last 2 values:: # curl http://localhost:61208/api/4/cpu/history/2 - {"system": [["2025-08-17T16:34:04.008942+00:00", 0.7], - ["2025-08-17T16:34:05.030720+00:00", 0.7]], - "user": [["2025-08-17T16:34:04.008940+00:00", 0.7], - ["2025-08-17T16:34:05.030719+00:00", 0.7]]} + {"system": [["2025-09-21T07:59:36.122241+00:00", 1.0], + ["2025-09-21T07:59:37.152781+00:00", 1.0]], + "user": [["2025-09-21T07:59:36.122238+00:00", 0.9], + ["2025-09-21T07:59:37.152778+00:00", 0.9]]} History for a specific field:: # curl http://localhost:61208/api/4/cpu/system/history - {"system": [["2025-08-17T16:34:01.765065+00:00", 2.6], - ["2025-08-17T16:34:02.948905+00:00", 2.6], - ["2025-08-17T16:34:04.008942+00:00", 0.7], - ["2025-08-17T16:34:05.030720+00:00", 0.7]]} + {"system": [["2025-09-21T07:59:33.802374+00:00", 2.8], + ["2025-09-21T07:59:35.021130+00:00", 2.8], + ["2025-09-21T07:59:36.122241+00:00", 1.0], + ["2025-09-21T07:59:37.152781+00:00", 1.0]]} Limit history for a specific field to last 2 values:: # curl http://localhost:61208/api/4/cpu/system/history - {"system": [["2025-08-17T16:34:04.008942+00:00", 0.7], - ["2025-08-17T16:34:05.030720+00:00", 0.7]]} + {"system": [["2025-09-21T07:59:36.122241+00:00", 1.0], + ["2025-09-21T07:59:37.152781+00:00", 1.0]]} GET limits (used for thresholds) -------------------------------- diff --git a/docs/fetch.rst b/docs/fetch.rst new file mode 100644 index 00000000..91071280 --- /dev/null +++ b/docs/fetch.rst @@ -0,0 +1,60 @@ +.. _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 `` option. + +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`). + +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 %}\ + ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ diff --git a/docs/index.rst b/docs/index.rst index caf01f9c..f716f838 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -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`. -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` or in any other application through +the :ref:`RESTful API`. Table of Contents ================= @@ -35,3 +34,6 @@ Table of Contents docker faq support + +.. _psutil: https://github.com/giampaolo/psutil + diff --git a/docs/man/glances.1 b/docs/man/glances.1 index 46c7dae2..060c8399 100644 --- a/docs/man/glances.1 +++ b/docs/man/glances.1 @@ -28,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" "Aug 17, 2025" "4.4.0_dev1" "Glances" +.TH "GLANCES" "1" "Sep 21, 2025" "4.4.0_dev4" "Glances" .SH NAME glances \- An eye on your system .SH SYNOPSIS diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 69bad988..afd999e4 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -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 --------------- @@ -140,22 +141,6 @@ Open the URL (/browser) and click on the server to display stats. Use ``--disable-autodiscover`` to disable the auto-discovery mode. -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 - - SNMP ^^^^ @@ -212,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 @@ -238,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 `` option. + +Have a look to the :ref:`fetch documentation page` to learn how to create your own template. diff --git a/glances/api.py b/glances/api.py index 8687140c..fcc6bea5 100644 --- a/glances/api.py +++ b/glances/api.py @@ -53,11 +53,35 @@ class GlancesAPI: return self._stats.getPluginsList() def auto_unit(self, number, low_precision=False, min_symbol='K', none_symbol='-'): - """Return a nice human-readable string out of number.""" + """ + 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=''): - """Return a bar (progress bar like) representation of the given value.""" + """ + 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 ) @@ -65,7 +89,24 @@ class GlancesAPI: return b.get() def top_process(self, limit=3, sorted_by='cpu_percent', sorted_by_secondary='memory_percent'): - """Return the top process list sorted by the given sort_key.""" + """ + 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 'glances' not in p['cmdline']] diff --git a/glances/outputs/glances_stdout_api_doc.py b/glances/outputs/glances_stdout_api_doc.py index 73214698..07e3ce7c 100644 --- a/glances/outputs/glances_stdout_api_doc.py +++ b/glances/outputs/glances_stdout_api_doc.py @@ -48,6 +48,10 @@ def print_tldr(gl): printtab(f'{pformat(gl.cpu.stats)}') printtab('>>> gl.cpu["total"]') printtab(f'{gl.cpu["total"]}') + printtab('>>> gl.mem["used"]') + printtab(f'{gl.mem["used"]}') + printtab('>>> gl.auto_unit(gl.mem["used"])') + printtab(f'{gl.auto_unit(gl.mem["used"])}') print('') print('If the stats return a list of items (like network interfaces or processes), you can') print('access them by their name:') @@ -143,6 +147,109 @@ def print_plugins(gl): print_plugin(gl, plugin) +def print_auto_unit(gl): + sub_title = 'Use auto_unit to display a human-readable string with the unit' + print(sub_title) + print('-' * len(sub_title)) + print('') + print('Use auto_unit() function to generate a human-readable string with the unit:') + print('') + print('.. code-block:: python') + print('') + printtab('>>> gl.mem["used"]') + printtab(f'{gl.mem["used"]}') + print('') + printtab('>>> gl.auto_unit(gl.mem["used"])') + printtab(f'{gl.auto_unit(gl.mem["used"])}') + print('') + print(""" +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. + +""") + + +def print_bar(gl): + sub_title = 'Use to display stat as a bar' + print(sub_title) + print('-' * len(sub_title)) + print('') + print('Use bar() function to generate a bar:') + print('') + print('.. code-block:: python') + print('') + printtab('>>> gl.bar(gl.mem["percent"])') + printtab(f'{gl.bar(gl.mem["percent"])}') + print('') + print(""" +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. + +""") + + +def print_top_process(gl): + sub_title = 'Use to display top process list' + print(sub_title) + print('-' * len(sub_title)) + print('') + print('Use top_process() function to generate a list of top processes sorted by CPU or MEM usage:') + print('') + print('.. code-block:: python') + print('') + printtab('>>> gl.top_process()') + printtab(f'{gl.top_process()}') + print('') + print(""" +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. + +""") + + class GlancesStdoutApiDoc: """This class manages the fields description display.""" @@ -170,5 +277,10 @@ class GlancesStdoutApiDoc: # Loop over plugins print_plugins(self.gl) + # Others helpers + print_auto_unit(self.gl) + print_bar(self.gl) + print_top_process(self.gl) + # Return True to exit directly (no refresh) return True diff --git a/glances/outputs/glances_stdout_fetch.py b/glances/outputs/glances_stdout_fetch.py new file mode 100644 index 00000000..34356d68 --- /dev/null +++ b/glances/outputs/glances_stdout_fetch.py @@ -0,0 +1,87 @@ +# +# This file is part of Glances. +# +# SPDX-FileCopyrightText: 2025 Nicolas Hennion +# +# SPDX-License-Identifier: LGPL-3.0-only +# + +"""Fetch mode interface class.""" + +import jinja2 + +from glances import api +from glances.logger import logger + +DEFAULT_FETCH_TEMPLATE = """ + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +✨ {{ 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 %}\ +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +""" + + +class GlancesStdoutFetch: + """This class manages the Stdout JSON display.""" + + def __init__(self, config=None, args=None): + # Init + self.config = config + self.args = args + self.gl = api.GlancesAPI(self.config, self.args) + + def end(self): + pass + + def update(self, stats, duration=3, cs_status=None, return_to_browser=False): + """Display fetch from the template file to stdout.""" + if self.args.fetch_template == "": + fetch_template = DEFAULT_FETCH_TEMPLATE + else: + logger.info("Using fetch template file: " + self.args.fetch_template) + # Load the template from the file given in the self.args.fetch_template argument + with open(self.args.fetch_template) as f: + fetch_template = f.read() + + # Create a Jinja2 environment + jinja_env = jinja2.Environment(loader=jinja2.BaseLoader()) + template = jinja_env.from_string(fetch_template) + output = template.render(gl=self.gl) + print(output) + + # Return True to exit directly (no refresh) + return True diff --git a/glances/stats.py b/glances/stats.py index adbd3d85..72c6ae52 100644 --- a/glances/stats.py +++ b/glances/stats.py @@ -419,3 +419,4 @@ please rename it to "{plugin_path.capitalize()}Plugin"' # Close plugins for p in self._plugins: self._plugins[p].exit() + self._plugins[p].exit()