Software /
code /
prosody-modules
Comparison
mod_measure_process/mod_measure_process.lua @ 4554:025cf93acfe9
mod_measure_process: Provide metrics about the process itself
author | Jonas Schäfer <jonas@wielicki.name> |
---|---|
date | Wed, 28 Apr 2021 08:21:54 +0200 |
child | 4877:adc6241e5d16 |
comparison
equal
deleted
inserted
replaced
4553:7e5c8186f121 | 4554:025cf93acfe9 |
---|---|
1 module:set_global() | |
2 | |
3 local get_cpu_time = os.clock | |
4 | |
5 local custom_metric = require "core.statsmanager".metric | |
6 local cpu_time = custom_metric( | |
7 "counter", "process_cpu", "seconds", | |
8 "CPU time used by Prosody as reported by clock(3)." | |
9 ):with_labels() | |
10 | |
11 local lfs = require "lfs" | |
12 | |
13 module:hook("stats-update", function () | |
14 cpu_time:set(get_cpu_time()) | |
15 end); | |
16 | |
17 if lfs.attributes("/proc/self/statm", "mode") == "file" then | |
18 local pagesize = module:get_option_number("memory_pagesize", 4096); -- getconf PAGESIZE | |
19 | |
20 local vsz = custom_metric( | |
21 "gauge", "process_virtual_memory", "bytes", | |
22 "Virtual memory size in bytes." | |
23 ):with_labels() | |
24 local rss = custom_metric( | |
25 "gauge", "process_resident_memory", "bytes", | |
26 "Resident memory size in bytes." | |
27 ):with_labels() | |
28 | |
29 module:hook("stats-update", function () | |
30 local statm, err = io.open("/proc/self/statm"); | |
31 if not statm then | |
32 module:log("error", tostring(err)); | |
33 return; | |
34 end | |
35 -- virtual memory (caches, opened librarys, everything) | |
36 vsz:set(statm:read("*n") * pagesize); | |
37 -- resident set size (actually used memory) | |
38 rss:set(statm:read("*n") * pagesize); | |
39 statm:close(); | |
40 end); | |
41 end | |
42 | |
43 if lfs.attributes("/proc/self/fd", "mode") == "directory" then | |
44 local open_fds = custom_metric( | |
45 "gauge", "process_open_fds", "", | |
46 "Number of open file descriptors." | |
47 ):with_labels() | |
48 | |
49 local has_posix, posix = pcall(require, "util.pposix") | |
50 local max_fds | |
51 if has_posix then | |
52 max_fds = custom_metric( | |
53 "gauge", "process_max_fds", "", | |
54 "Maximum number of open file descriptors" | |
55 ):with_labels() | |
56 else | |
57 module:log("warn", "not reporting maximum number of file descriptors because mod_posix is not available") | |
58 end | |
59 | |
60 module:hook("stats-update", function () | |
61 local count = 0 | |
62 for _ in lfs.dir("/proc/self/fd") do | |
63 count = count + 1 | |
64 end | |
65 open_fds:set(count) | |
66 | |
67 if has_posix then | |
68 local ok, soft, hard = posix.getrlimit("NOFILE") | |
69 if ok then | |
70 max_fds:set(hard) | |
71 end | |
72 end | |
73 end); | |
74 end |