cgroup-charts.c 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "cgroup-internals.h"
  3. void update_cpu_utilization_chart(struct cgroup *cg) {
  4. RRDSET *chart = cg->st_cpu;
  5. if (unlikely(!cg->st_cpu)) {
  6. char *title;
  7. char *context;
  8. int prio;
  9. if (is_cgroup_systemd_service(cg)) {
  10. title = "Systemd Services CPU utilization (100%% = 1 core)";
  11. context = "systemd.service.cpu.utilization";
  12. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD;
  13. } else {
  14. title = k8s_is_kubepod(cg) ? "CPU Usage (100%% = 1000 mCPU)" : "CPU Usage (100%% = 1 core)";
  15. context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu" : "cgroup.cpu";
  16. prio = cgroup_containers_chart_priority;
  17. }
  18. char buff[RRD_ID_LENGTH_MAX + 1];
  19. chart = cg->st_cpu = rrdset_create_localhost(
  20. cgroup_chart_type(buff, cg),
  21. "cpu",
  22. NULL,
  23. "cpu",
  24. context,
  25. title,
  26. "percentage",
  27. PLUGIN_CGROUPS_NAME,
  28. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  29. prio,
  30. cgroup_update_every,
  31. RRDSET_TYPE_STACKED);
  32. rrdset_update_rrdlabels(chart, cg->chart_labels);
  33. if (!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
  34. cg->st_cpu_rd_user = rrddim_add(chart, "user", NULL, 100, system_hz, RRD_ALGORITHM_INCREMENTAL);
  35. cg->st_cpu_rd_system = rrddim_add(chart, "system", NULL, 100, system_hz, RRD_ALGORITHM_INCREMENTAL);
  36. } else {
  37. cg->st_cpu_rd_user = rrddim_add(chart, "user", NULL, 100, 1000000, RRD_ALGORITHM_INCREMENTAL);
  38. cg->st_cpu_rd_system = rrddim_add(chart, "system", NULL, 100, 1000000, RRD_ALGORITHM_INCREMENTAL);
  39. }
  40. }
  41. rrddim_set_by_pointer(chart, cg->st_cpu_rd_user, (collected_number)cg->cpuacct_stat.user);
  42. rrddim_set_by_pointer(chart, cg->st_cpu_rd_system, (collected_number)cg->cpuacct_stat.system);
  43. rrdset_done(chart);
  44. }
  45. void update_cpu_utilization_limit_chart(struct cgroup *cg, NETDATA_DOUBLE cpu_limit) {
  46. if (is_cgroup_systemd_service(cg))
  47. return;
  48. RRDSET *chart = cg->st_cpu_limit;
  49. if (unlikely(!cg->st_cpu_limit)) {
  50. char *title = "CPU Usage within the limits";
  51. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_limit" : "cgroup.cpu_limit";
  52. int prio = cgroup_containers_chart_priority - 1;
  53. char buff[RRD_ID_LENGTH_MAX + 1];
  54. chart = cg->st_cpu_limit = rrdset_create_localhost(
  55. cgroup_chart_type(buff, cg),
  56. "cpu_limit",
  57. NULL,
  58. "cpu",
  59. context,
  60. title,
  61. "percentage",
  62. PLUGIN_CGROUPS_NAME,
  63. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  64. prio,
  65. cgroup_update_every,
  66. RRDSET_TYPE_LINE);
  67. rrdset_update_rrdlabels(chart, cg->chart_labels);
  68. if (!(cg->options & CGROUP_OPTIONS_IS_UNIFIED))
  69. rrddim_add(chart, "used", NULL, 1, system_hz, RRD_ALGORITHM_ABSOLUTE);
  70. else
  71. rrddim_add(chart, "used", NULL, 1, 1000000, RRD_ALGORITHM_ABSOLUTE);
  72. cg->prev_cpu_usage = (NETDATA_DOUBLE)(cg->cpuacct_stat.user + cg->cpuacct_stat.system) * 100;
  73. }
  74. NETDATA_DOUBLE cpu_usage = 0;
  75. cpu_usage = (NETDATA_DOUBLE)(cg->cpuacct_stat.user + cg->cpuacct_stat.system) * 100;
  76. NETDATA_DOUBLE cpu_used = 100 * (cpu_usage - cg->prev_cpu_usage) / (cpu_limit * cgroup_update_every);
  77. rrdset_isnot_obsolete___safe_from_collector_thread(chart);
  78. rrddim_set(chart, "used", (cpu_used > 0) ? (collected_number)cpu_used : 0);
  79. cg->prev_cpu_usage = cpu_usage;
  80. rrdsetvar_custom_chart_variable_set(cg->st_cpu, cg->chart_var_cpu_limit, cpu_limit);
  81. rrdset_done(chart);
  82. }
  83. void update_cpu_throttled_chart(struct cgroup *cg) {
  84. if (is_cgroup_systemd_service(cg))
  85. return;
  86. RRDSET *chart = cg->st_cpu_nr_throttled;
  87. if (unlikely(!cg->st_cpu_nr_throttled)) {
  88. char *title = "CPU Throttled Runnable Periods";
  89. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.throttled" : "cgroup.throttled";
  90. int prio = cgroup_containers_chart_priority + 10;
  91. char buff[RRD_ID_LENGTH_MAX + 1];
  92. chart = cg->st_cpu_nr_throttled = rrdset_create_localhost(
  93. cgroup_chart_type(buff, cg),
  94. "throttled",
  95. NULL,
  96. "cpu",
  97. context,
  98. title,
  99. "percentage",
  100. PLUGIN_CGROUPS_NAME,
  101. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  102. prio,
  103. cgroup_update_every,
  104. RRDSET_TYPE_LINE);
  105. rrdset_update_rrdlabels(chart, cg->chart_labels);
  106. rrddim_add(chart, "throttled", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  107. }
  108. rrddim_set(chart, "throttled", (collected_number)cg->cpuacct_cpu_throttling.nr_throttled_perc);
  109. rrdset_done(chart);
  110. }
  111. void update_cpu_throttled_duration_chart(struct cgroup *cg) {
  112. if (is_cgroup_systemd_service(cg))
  113. return;
  114. RRDSET *chart = cg->st_cpu_throttled_time;
  115. if (unlikely(!cg->st_cpu_throttled_time)) {
  116. char *title = "CPU Throttled Time Duration";
  117. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.throttled_duration" : "cgroup.throttled_duration";
  118. int prio = cgroup_containers_chart_priority + 15;
  119. char buff[RRD_ID_LENGTH_MAX + 1];
  120. chart = cg->st_cpu_throttled_time = rrdset_create_localhost(
  121. cgroup_chart_type(buff, cg),
  122. "throttled_duration",
  123. NULL,
  124. "cpu",
  125. context,
  126. title,
  127. "ms",
  128. PLUGIN_CGROUPS_NAME,
  129. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  130. prio,
  131. cgroup_update_every,
  132. RRDSET_TYPE_LINE);
  133. rrdset_update_rrdlabels(chart, cg->chart_labels);
  134. rrddim_add(chart, "duration", NULL, 1, 1000000, RRD_ALGORITHM_INCREMENTAL);
  135. }
  136. rrddim_set(chart, "duration", (collected_number)cg->cpuacct_cpu_throttling.throttled_time);
  137. rrdset_done(chart);
  138. }
  139. void update_cpu_shares_chart(struct cgroup *cg) {
  140. if (is_cgroup_systemd_service(cg))
  141. return;
  142. RRDSET *chart = cg->st_cpu_shares;
  143. if (unlikely(!cg->st_cpu_shares)) {
  144. char *title = "CPU Time Relative Share";
  145. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_shares" : "cgroup.cpu_shares";
  146. int prio = cgroup_containers_chart_priority + 20;
  147. char buff[RRD_ID_LENGTH_MAX + 1];
  148. chart = cg->st_cpu_shares = rrdset_create_localhost(
  149. cgroup_chart_type(buff, cg),
  150. "cpu_shares",
  151. NULL,
  152. "cpu",
  153. context,
  154. title,
  155. "shares",
  156. PLUGIN_CGROUPS_NAME,
  157. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  158. prio,
  159. cgroup_update_every,
  160. RRDSET_TYPE_LINE);
  161. rrdset_update_rrdlabels(chart, cg->chart_labels);
  162. rrddim_add(chart, "shares", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  163. }
  164. rrddim_set(chart, "shares", (collected_number)cg->cpuacct_cpu_shares.shares);
  165. rrdset_done(chart);
  166. }
  167. void update_cpu_per_core_usage_chart(struct cgroup *cg) {
  168. if (is_cgroup_systemd_service(cg))
  169. return;
  170. char id[RRD_ID_LENGTH_MAX + 1];
  171. unsigned int i;
  172. if (unlikely(!cg->st_cpu_per_core)) {
  173. char *title = k8s_is_kubepod(cg) ? "CPU Usage (100%% = 1000 mCPU) Per Core" : "CPU Usage (100%% = 1 core) Per Core";
  174. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_per_core" : "cgroup.cpu_per_core";
  175. int prio = cgroup_containers_chart_priority + 100;
  176. char buff[RRD_ID_LENGTH_MAX + 1];
  177. cg->st_cpu_per_core = rrdset_create_localhost(
  178. cgroup_chart_type(buff, cg),
  179. "cpu_per_core",
  180. NULL,
  181. "cpu",
  182. context,
  183. title,
  184. "percentage",
  185. PLUGIN_CGROUPS_NAME,
  186. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  187. prio,
  188. cgroup_update_every,
  189. RRDSET_TYPE_STACKED);
  190. rrdset_update_rrdlabels(cg->st_cpu_per_core, cg->chart_labels);
  191. for (i = 0; i < cg->cpuacct_usage.cpus; i++) {
  192. snprintfz(id, RRD_ID_LENGTH_MAX, "cpu%u", i);
  193. rrddim_add(cg->st_cpu_per_core, id, NULL, 100, 1000000000, RRD_ALGORITHM_INCREMENTAL);
  194. }
  195. }
  196. for (i = 0; i < cg->cpuacct_usage.cpus; i++) {
  197. snprintfz(id, RRD_ID_LENGTH_MAX, "cpu%u", i);
  198. rrddim_set(cg->st_cpu_per_core, id, (collected_number)cg->cpuacct_usage.cpu_percpu[i]);
  199. }
  200. rrdset_done(cg->st_cpu_per_core);
  201. }
  202. void update_mem_usage_detailed_chart(struct cgroup *cg) {
  203. RRDSET *chart = cg->st_mem;
  204. if (unlikely(!cg->st_mem)) {
  205. char *title;
  206. char *context;
  207. int prio;
  208. if (is_cgroup_systemd_service(cg)) {
  209. title = "Systemd Services Memory";
  210. context = "systemd.service.memory.ram.usage";
  211. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 15;
  212. } else {
  213. title = "Memory Usage";
  214. context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem" : "cgroup.mem";
  215. prio = cgroup_containers_chart_priority + 220;
  216. }
  217. char buff[RRD_ID_LENGTH_MAX + 1];
  218. chart = cg->st_mem = rrdset_create_localhost(
  219. cgroup_chart_type(buff, cg),
  220. "mem",
  221. NULL,
  222. "mem",
  223. context,
  224. title,
  225. "MiB",
  226. PLUGIN_CGROUPS_NAME,
  227. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  228. prio,
  229. cgroup_update_every,
  230. RRDSET_TYPE_STACKED);
  231. rrdset_update_rrdlabels(chart, cg->chart_labels);
  232. if (!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
  233. rrddim_add(chart, "cache", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  234. rrddim_add(chart, "rss", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  235. if (cg->memory.detailed_has_swap)
  236. rrddim_add(chart, "swap", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  237. rrddim_add(chart, "rss_huge", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  238. rrddim_add(chart, "mapped_file", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  239. } else {
  240. rrddim_add(chart, "anon", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  241. rrddim_add(chart, "kernel_stack", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  242. rrddim_add(chart, "slab", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  243. rrddim_add(chart, "sock", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  244. rrddim_add(chart, "anon_thp", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  245. rrddim_add(chart, "file", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  246. }
  247. }
  248. if (!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
  249. rrddim_set(chart, "cache", (collected_number)cg->memory.total_cache);
  250. collected_number rss = (collected_number)(cg->memory.total_rss - cg->memory.total_rss_huge);
  251. if (rss < 0)
  252. rss = 0;
  253. rrddim_set(chart, "rss", rss);
  254. if (cg->memory.detailed_has_swap)
  255. rrddim_set(chart, "swap", (collected_number)cg->memory.total_swap);
  256. rrddim_set(chart, "rss_huge", (collected_number)cg->memory.total_rss_huge);
  257. rrddim_set(chart, "mapped_file", (collected_number)cg->memory.total_mapped_file);
  258. } else {
  259. rrddim_set(chart, "anon", (collected_number)cg->memory.anon);
  260. rrddim_set(chart, "kernel_stack", (collected_number)cg->memory.kernel_stack);
  261. rrddim_set(chart, "slab", (collected_number)cg->memory.slab);
  262. rrddim_set(chart, "sock", (collected_number)cg->memory.sock);
  263. rrddim_set(chart, "anon_thp", (collected_number)cg->memory.anon_thp);
  264. rrddim_set(chart, "file", (collected_number)cg->memory.total_mapped_file);
  265. }
  266. rrdset_done(chart);
  267. }
  268. void update_mem_writeback_chart(struct cgroup *cg) {
  269. RRDSET *chart = cg->st_writeback;
  270. if (unlikely(!cg->st_writeback)) {
  271. char *title;
  272. char *context;
  273. int prio;
  274. if (is_cgroup_systemd_service(cg)) {
  275. title = "Systemd Services Writeback Memory";
  276. context = "systemd.service.memory.writeback";
  277. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 20;
  278. } else {
  279. title = "Writeback Memory";
  280. context = k8s_is_kubepod(cg) ? "k8s.cgroup.writeback" : "cgroup.writeback";
  281. prio = cgroup_containers_chart_priority + 300;
  282. }
  283. char buff[RRD_ID_LENGTH_MAX + 1];
  284. chart = cg->st_writeback = rrdset_create_localhost(
  285. cgroup_chart_type(buff, cg),
  286. "writeback",
  287. NULL,
  288. "mem",
  289. context,
  290. title,
  291. "MiB",
  292. PLUGIN_CGROUPS_NAME,
  293. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  294. prio,
  295. cgroup_update_every,
  296. RRDSET_TYPE_AREA);
  297. rrdset_update_rrdlabels(chart, cg->chart_labels);
  298. if (cg->memory.detailed_has_dirty)
  299. rrddim_add(chart, "dirty", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  300. rrddim_add(chart, "writeback", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  301. }
  302. if (cg->memory.detailed_has_dirty)
  303. rrddim_set(chart, "dirty", (collected_number)cg->memory.total_dirty);
  304. rrddim_set(chart, "writeback", (collected_number)cg->memory.total_writeback);
  305. rrdset_done(chart);
  306. }
  307. void update_mem_activity_chart(struct cgroup *cg) {
  308. RRDSET *chart = cg->st_mem_activity;
  309. if (unlikely(!cg->st_mem_activity)) {
  310. char *title;
  311. char *context;
  312. int prio;
  313. if (is_cgroup_systemd_service(cg)) {
  314. title = "Systemd Services Memory Paging IO";
  315. context = "systemd.service.memory.paging.io";
  316. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 30;
  317. } else {
  318. title = "Memory Activity";
  319. context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_activity" : "cgroup.mem_activity";
  320. prio = cgroup_containers_chart_priority + 400;
  321. }
  322. char buff[RRD_ID_LENGTH_MAX + 1];
  323. chart = cg->st_mem_activity = rrdset_create_localhost(
  324. cgroup_chart_type(buff, cg),
  325. "mem_activity",
  326. NULL,
  327. "mem",
  328. context,
  329. title,
  330. "MiB/s",
  331. PLUGIN_CGROUPS_NAME,
  332. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  333. prio,
  334. cgroup_update_every,
  335. RRDSET_TYPE_LINE);
  336. rrdset_update_rrdlabels(chart, cg->chart_labels);
  337. // FIXME: systemd just in, out
  338. rrddim_add(chart, "pgpgin", "in", system_page_size, 1024 * 1024, RRD_ALGORITHM_INCREMENTAL);
  339. rrddim_add(chart, "pgpgout", "out", -system_page_size, 1024 * 1024, RRD_ALGORITHM_INCREMENTAL);
  340. }
  341. rrddim_set(chart, "pgpgin", (collected_number)cg->memory.total_pgpgin);
  342. rrddim_set(chart, "pgpgout", (collected_number)cg->memory.total_pgpgout);
  343. rrdset_done(chart);
  344. }
  345. void update_mem_pgfaults_chart(struct cgroup *cg) {
  346. RRDSET *chart = cg->st_pgfaults;
  347. if (unlikely(!cg->st_pgfaults)) {
  348. char *title;
  349. char *context;
  350. int prio;
  351. if (is_cgroup_systemd_service(cg)) {
  352. title = "Systemd Services Memory Page Faults";
  353. context = "systemd.service.memory.paging.faults";
  354. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 25;
  355. } else {
  356. title = "Memory Page Faults";
  357. context = k8s_is_kubepod(cg) ? "k8s.cgroup.pgfaults" : "cgroup.pgfaults";
  358. prio = cgroup_containers_chart_priority + 500;
  359. }
  360. char buff[RRD_ID_LENGTH_MAX + 1];
  361. chart = cg->st_pgfaults = rrdset_create_localhost(
  362. cgroup_chart_type(buff, cg),
  363. "pgfaults",
  364. NULL,
  365. "mem",
  366. context,
  367. title,
  368. "MiB/s",
  369. PLUGIN_CGROUPS_NAME,
  370. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  371. prio,
  372. cgroup_update_every,
  373. RRDSET_TYPE_LINE);
  374. rrdset_update_rrdlabels(chart, cg->chart_labels);
  375. rrddim_add(chart, "pgfault", NULL, system_page_size, 1024 * 1024, RRD_ALGORITHM_INCREMENTAL);
  376. rrddim_add(chart, "pgmajfault", "swap", -system_page_size, 1024 * 1024, RRD_ALGORITHM_INCREMENTAL);
  377. }
  378. rrddim_set(chart, "pgfault", (collected_number)cg->memory.total_pgfault);
  379. rrddim_set(chart, "pgmajfault", (collected_number)cg->memory.total_pgmajfault);
  380. rrdset_done(chart);
  381. }
  382. void update_mem_usage_limit_chart(struct cgroup *cg, unsigned long long memory_limit) {
  383. if (is_cgroup_systemd_service(cg))
  384. return;
  385. RRDSET *chart = cg->st_mem_usage_limit;
  386. if (unlikely(!cg->st_mem_usage_limit)) {
  387. char *title = "Used RAM within the limits";
  388. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_usage_limit" : "cgroup.mem_usage_limit";
  389. int prio = cgroup_containers_chart_priority + 200;
  390. char buff[RRD_ID_LENGTH_MAX + 1];
  391. chart = cg->st_mem_usage_limit = rrdset_create_localhost(
  392. cgroup_chart_type(buff, cg),
  393. "mem_usage_limit",
  394. NULL,
  395. "mem",
  396. context,
  397. title,
  398. "MiB",
  399. PLUGIN_CGROUPS_NAME,
  400. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  401. prio,
  402. cgroup_update_every,
  403. RRDSET_TYPE_STACKED);
  404. rrdset_update_rrdlabels(chart, cg->chart_labels);
  405. rrddim_add(chart, "available", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  406. rrddim_add(chart, "used", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  407. }
  408. rrdset_isnot_obsolete___safe_from_collector_thread(chart);
  409. rrddim_set(chart, "available", (collected_number)(memory_limit - cg->memory.usage_in_bytes));
  410. rrddim_set(chart, "used", (collected_number)cg->memory.usage_in_bytes);
  411. rrdset_done(chart);
  412. }
  413. void update_mem_utilization_chart(struct cgroup *cg, unsigned long long memory_limit) {
  414. if (is_cgroup_systemd_service(cg))
  415. return;
  416. RRDSET *chart = cg->st_mem_utilization;
  417. if (unlikely(!cg->st_mem_utilization)) {
  418. char *title = "Memory Utilization";
  419. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_utilization" : "cgroup.mem_utilization";
  420. int prio = cgroup_containers_chart_priority + 199;
  421. char buff[RRD_ID_LENGTH_MAX + 1];
  422. chart = cg->st_mem_utilization = rrdset_create_localhost(
  423. cgroup_chart_type(buff, cg),
  424. "mem_utilization",
  425. NULL,
  426. "mem",
  427. context,
  428. title,
  429. "percentage",
  430. PLUGIN_CGROUPS_NAME,
  431. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  432. prio,
  433. cgroup_update_every,
  434. RRDSET_TYPE_AREA);
  435. rrdset_update_rrdlabels(chart, cg->chart_labels);
  436. rrddim_add(chart, "utilization", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  437. }
  438. rrdset_isnot_obsolete___safe_from_collector_thread(chart);
  439. collected_number util = (collected_number)(cg->memory.usage_in_bytes * 100 / memory_limit);
  440. rrddim_set(chart, "utilization", util);
  441. rrdset_done(chart);
  442. }
  443. void update_mem_failcnt_chart(struct cgroup *cg) {
  444. RRDSET *chart = cg->st_mem_failcnt;
  445. if (unlikely(!cg->st_mem_failcnt)) {
  446. char *title;
  447. char *context;
  448. int prio;
  449. if (is_cgroup_systemd_service(cg)) {
  450. title = "Systemd Services Memory Limit Failures";
  451. context = "systemd.service.memory.failcnt";
  452. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 10;
  453. } else {
  454. title = "Memory Limit Failures";
  455. context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_failcnt" : "cgroup.mem_failcnt";
  456. prio = cgroup_containers_chart_priority + 250;
  457. }
  458. char buff[RRD_ID_LENGTH_MAX + 1];
  459. chart = cg->st_mem_failcnt = rrdset_create_localhost(
  460. cgroup_chart_type(buff, cg),
  461. "mem_failcnt",
  462. NULL,
  463. "mem",
  464. context,
  465. title,
  466. "count",
  467. PLUGIN_CGROUPS_NAME,
  468. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  469. prio,
  470. cgroup_update_every,
  471. RRDSET_TYPE_LINE);
  472. rrdset_update_rrdlabels(chart, cg->chart_labels);
  473. rrddim_add(chart, "failures", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  474. }
  475. rrddim_set(chart, "failures", (collected_number)cg->memory.failcnt);
  476. rrdset_done(chart);
  477. }
  478. void update_mem_usage_chart(struct cgroup *cg) {
  479. RRDSET *chart = cg->st_mem_usage;
  480. if (unlikely(!cg->st_mem_usage)) {
  481. char *title;
  482. char *context;
  483. int prio;
  484. if (is_cgroup_systemd_service(cg)) {
  485. title = "Systemd Services Used Memory";
  486. context = "systemd.service.memory.usage";
  487. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 5;
  488. } else {
  489. title = "Used Memory";
  490. context = k8s_is_kubepod(cg) ? "k8s.cgroup.mem_usage" : "cgroup.mem_usage";
  491. prio = cgroup_containers_chart_priority + 210;
  492. }
  493. char buff[RRD_ID_LENGTH_MAX + 1];
  494. chart = cg->st_mem_usage = rrdset_create_localhost(
  495. cgroup_chart_type(buff, cg),
  496. "mem_usage",
  497. NULL,
  498. "mem",
  499. context,
  500. title,
  501. "MiB",
  502. PLUGIN_CGROUPS_NAME,
  503. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  504. prio,
  505. cgroup_update_every,
  506. RRDSET_TYPE_STACKED);
  507. rrdset_update_rrdlabels(chart, cg->chart_labels);
  508. cg->st_mem_rd_ram = rrddim_add(chart, "ram", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  509. cg->st_mem_rd_swap = rrddim_add(chart, "swap", NULL, 1, 1024 * 1024, RRD_ALGORITHM_ABSOLUTE);
  510. }
  511. rrddim_set_by_pointer(chart, cg->st_mem_rd_ram, (collected_number)cg->memory.usage_in_bytes);
  512. if (!(cg->options & CGROUP_OPTIONS_IS_UNIFIED)) {
  513. rrddim_set_by_pointer(
  514. chart,
  515. cg->st_mem_rd_swap,
  516. cg->memory.msw_usage_in_bytes > (cg->memory.usage_in_bytes + cg->memory.total_inactive_file) ?
  517. (collected_number)(cg->memory.msw_usage_in_bytes -
  518. (cg->memory.usage_in_bytes + cg->memory.total_inactive_file)) :
  519. 0);
  520. } else {
  521. rrddim_set_by_pointer(chart, cg->st_mem_rd_swap, (collected_number)cg->memory.msw_usage_in_bytes);
  522. }
  523. rrdset_done(chart);
  524. }
  525. void update_io_serviced_bytes_chart(struct cgroup *cg) {
  526. RRDSET *chart = cg->st_io;
  527. if (unlikely(!cg->st_io)) {
  528. char *title;
  529. char *context;
  530. int prio;
  531. if (is_cgroup_systemd_service(cg)) {
  532. title = "Systemd Services Disk Read/Write Bandwidth";
  533. context = "systemd.service.disk.io";
  534. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 35;
  535. } else {
  536. title = "I/O Bandwidth (all disks)";
  537. context = k8s_is_kubepod(cg) ? "k8s.cgroup.io" : "cgroup.io";
  538. prio = cgroup_containers_chart_priority + 1200;
  539. }
  540. char buff[RRD_ID_LENGTH_MAX + 1];
  541. chart = cg->st_io = rrdset_create_localhost(
  542. cgroup_chart_type(buff, cg),
  543. "io",
  544. NULL,
  545. "disk",
  546. context,
  547. title,
  548. "KiB/s",
  549. PLUGIN_CGROUPS_NAME,
  550. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  551. prio,
  552. cgroup_update_every,
  553. RRDSET_TYPE_AREA);
  554. rrdset_update_rrdlabels(chart, cg->chart_labels);
  555. cg->st_io_rd_read = rrddim_add(chart, "read", NULL, 1, 1024, RRD_ALGORITHM_INCREMENTAL);
  556. cg->st_io_rd_written = rrddim_add(cg->st_io, "write", NULL, -1, 1024, RRD_ALGORITHM_INCREMENTAL);
  557. }
  558. rrddim_set_by_pointer(chart, cg->st_io_rd_read, (collected_number)cg->io_service_bytes.Read);
  559. rrddim_set_by_pointer(chart, cg->st_io_rd_written, (collected_number)cg->io_service_bytes.Write);
  560. rrdset_done(chart);
  561. }
  562. void update_io_serviced_ops_chart(struct cgroup *cg) {
  563. RRDSET *chart = cg->st_serviced_ops;
  564. if (unlikely(!cg->st_serviced_ops)) {
  565. char *title;
  566. char *context;
  567. int prio;
  568. if (is_cgroup_systemd_service(cg)) {
  569. title = "Systemd Services Disk Read/Write Operations";
  570. context = "systemd.service.disk.iops";
  571. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 40;
  572. } else {
  573. title = "Serviced I/O Operations (all disks)";
  574. context = k8s_is_kubepod(cg) ? "k8s.cgroup.serviced_ops" : "cgroup.serviced_ops";
  575. prio = cgroup_containers_chart_priority + 1200;
  576. }
  577. char buff[RRD_ID_LENGTH_MAX + 1];
  578. chart = cg->st_serviced_ops = rrdset_create_localhost(
  579. cgroup_chart_type(buff, cg),
  580. "serviced_ops",
  581. NULL,
  582. "disk",
  583. context,
  584. title,
  585. "operations/s",
  586. PLUGIN_CGROUPS_NAME,
  587. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  588. prio,
  589. cgroup_update_every,
  590. RRDSET_TYPE_LINE);
  591. rrdset_update_rrdlabels(chart, cg->chart_labels);
  592. rrddim_add(chart, "read", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  593. rrddim_add(chart, "write", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
  594. }
  595. rrddim_set(chart, "read", (collected_number)cg->io_serviced.Read);
  596. rrddim_set(chart, "write", (collected_number)cg->io_serviced.Write);
  597. rrdset_done(chart);
  598. }
  599. void update_throttle_io_serviced_bytes_chart(struct cgroup *cg) {
  600. RRDSET *chart = cg->st_throttle_io;
  601. if (unlikely(!cg->st_throttle_io)) {
  602. char *title;
  603. char *context;
  604. int prio;
  605. if (is_cgroup_systemd_service(cg)) {
  606. title = "Systemd Services Throttle Disk Read/Write Bandwidth";
  607. context = "systemd.service.disk.throttle.io";
  608. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 45;
  609. } else {
  610. title = "Throttle I/O Bandwidth (all disks)";
  611. context = k8s_is_kubepod(cg) ? "k8s.cgroup.throttle_io" : "cgroup.throttle_io";
  612. prio = cgroup_containers_chart_priority + 1200;
  613. }
  614. char buff[RRD_ID_LENGTH_MAX + 1];
  615. chart = cg->st_throttle_io = rrdset_create_localhost(
  616. cgroup_chart_type(buff, cg),
  617. "throttle_io",
  618. NULL,
  619. "disk",
  620. context,
  621. title,
  622. "KiB/s",
  623. PLUGIN_CGROUPS_NAME,
  624. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  625. prio,
  626. cgroup_update_every,
  627. RRDSET_TYPE_AREA);
  628. rrdset_update_rrdlabels(chart, cg->chart_labels);
  629. cg->st_throttle_io_rd_read = rrddim_add(chart, "read", NULL, 1, 1024, RRD_ALGORITHM_INCREMENTAL);
  630. cg->st_throttle_io_rd_written = rrddim_add(chart, "write", NULL, -1, 1024, RRD_ALGORITHM_INCREMENTAL);
  631. }
  632. rrddim_set_by_pointer(chart, cg->st_throttle_io_rd_read, (collected_number)cg->throttle_io_service_bytes.Read);
  633. rrddim_set_by_pointer(chart, cg->st_throttle_io_rd_written, (collected_number)cg->throttle_io_service_bytes.Write);
  634. rrdset_done(chart);
  635. }
  636. void update_throttle_io_serviced_ops_chart(struct cgroup *cg) {
  637. RRDSET *chart = cg->st_throttle_serviced_ops;
  638. if (unlikely(!cg->st_throttle_serviced_ops)) {
  639. char *title;
  640. char *context;
  641. int prio;
  642. if (is_cgroup_systemd_service(cg)) {
  643. title = "Systemd Services Throttle Disk Read/Write Operations";
  644. context = "systemd.service.disk.throttle.iops";
  645. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 50;
  646. } else {
  647. title = "Throttle Serviced I/O Operations (all disks)";
  648. context = k8s_is_kubepod(cg) ? "k8s.cgroup.throttle_serviced_ops" : "cgroup.throttle_serviced_ops";
  649. prio = cgroup_containers_chart_priority + 1200;
  650. }
  651. char buff[RRD_ID_LENGTH_MAX + 1];
  652. chart = cg->st_throttle_serviced_ops = rrdset_create_localhost(
  653. cgroup_chart_type(buff, cg),
  654. "throttle_serviced_ops",
  655. NULL,
  656. "disk",
  657. context,
  658. title,
  659. "operations/s",
  660. PLUGIN_CGROUPS_NAME,
  661. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  662. prio,
  663. cgroup_update_every,
  664. RRDSET_TYPE_LINE);
  665. rrdset_update_rrdlabels(chart, cg->chart_labels);
  666. rrddim_add(chart, "read", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  667. rrddim_add(chart, "write", NULL, -1, 1, RRD_ALGORITHM_INCREMENTAL);
  668. }
  669. rrddim_set(chart, "read", (collected_number)cg->throttle_io_serviced.Read);
  670. rrddim_set(chart, "write", (collected_number)cg->throttle_io_serviced.Write);
  671. rrdset_done(chart);
  672. }
  673. void update_io_queued_ops_chart(struct cgroup *cg) {
  674. RRDSET *chart = cg->st_queued_ops;
  675. if (unlikely(!cg->st_queued_ops)) {
  676. char *title;
  677. char *context;
  678. int prio;
  679. if (is_cgroup_systemd_service(cg)) {
  680. title = "Systemd Services Queued Disk Read/Write Operations";
  681. context = "systemd.service.disk.queued_iops";
  682. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 55;
  683. } else {
  684. title = "Queued I/O Operations (all disks)";
  685. context = k8s_is_kubepod(cg) ? "k8s.cgroup.queued_ops" : "cgroup.queued_ops";
  686. prio = cgroup_containers_chart_priority + 2000;
  687. }
  688. char buff[RRD_ID_LENGTH_MAX + 1];
  689. chart = cg->st_queued_ops = rrdset_create_localhost(
  690. cgroup_chart_type(buff, cg),
  691. "queued_ops",
  692. NULL,
  693. "disk",
  694. context,
  695. title,
  696. "operations",
  697. PLUGIN_CGROUPS_NAME,
  698. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  699. prio,
  700. cgroup_update_every,
  701. RRDSET_TYPE_LINE);
  702. rrdset_update_rrdlabels(chart, cg->chart_labels);
  703. rrddim_add(chart, "read", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  704. rrddim_add(chart, "write", NULL, -1, 1, RRD_ALGORITHM_ABSOLUTE);
  705. }
  706. rrddim_set(chart, "read", (collected_number)cg->io_queued.Read);
  707. rrddim_set(chart, "write", (collected_number)cg->io_queued.Write);
  708. rrdset_done(chart);
  709. }
  710. void update_io_merged_ops_chart(struct cgroup *cg) {
  711. RRDSET *chart = cg->st_merged_ops;
  712. if (unlikely(!cg->st_merged_ops)) {
  713. char *title;
  714. char *context;
  715. int prio;
  716. if (is_cgroup_systemd_service(cg)) {
  717. title = "Systemd Services Merged Disk Read/Write Operations";
  718. context = "systemd.service.disk.merged_iops";
  719. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 60;
  720. } else {
  721. title = "Merged I/O Operations (all disks)";
  722. context = k8s_is_kubepod(cg) ? "k8s.cgroup.merged_ops" : "cgroup.merged_ops";
  723. prio = cgroup_containers_chart_priority + 2100;
  724. }
  725. char buff[RRD_ID_LENGTH_MAX + 1];
  726. chart = cg->st_merged_ops = rrdset_create_localhost(
  727. cgroup_chart_type(buff, cg),
  728. "merged_ops",
  729. NULL,
  730. "disk",
  731. context,
  732. title,
  733. "operations/s",
  734. PLUGIN_CGROUPS_NAME,
  735. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  736. prio,
  737. cgroup_update_every,
  738. RRDSET_TYPE_LINE);
  739. rrdset_update_rrdlabels(chart, cg->chart_labels);
  740. rrddim_add(chart, "read", NULL, 1, 1024, RRD_ALGORITHM_INCREMENTAL);
  741. rrddim_add(chart, "write", NULL, -1, 1024, RRD_ALGORITHM_INCREMENTAL);
  742. }
  743. rrddim_set(chart, "read", (collected_number)cg->io_merged.Read);
  744. rrddim_set(chart, "write", (collected_number)cg->io_merged.Write);
  745. rrdset_done(chart);
  746. }
  747. void update_cpu_some_pressure_chart(struct cgroup *cg) {
  748. if (is_cgroup_systemd_service(cg))
  749. return;
  750. struct pressure *res = &cg->cpu_pressure;
  751. struct pressure_charts *pcs = &res->some;
  752. RRDSET *chart = pcs->share_time.st;
  753. if (unlikely(!pcs->share_time.st)) {
  754. char *title = "CPU some pressure";
  755. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_some_pressure" : "cgroup.cpu_some_pressure";
  756. int prio = cgroup_containers_chart_priority + 2200;
  757. char buff[RRD_ID_LENGTH_MAX + 1];
  758. chart = pcs->share_time.st = rrdset_create_localhost(
  759. cgroup_chart_type(buff, cg),
  760. "cpu_some_pressure",
  761. NULL,
  762. "cpu",
  763. context,
  764. title,
  765. "percentage",
  766. PLUGIN_CGROUPS_NAME,
  767. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  768. prio,
  769. cgroup_update_every,
  770. RRDSET_TYPE_LINE);
  771. rrdset_update_rrdlabels(chart, cg->chart_labels);
  772. pcs->share_time.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  773. pcs->share_time.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  774. pcs->share_time.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  775. }
  776. rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
  777. rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
  778. rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
  779. rrdset_done(chart);
  780. }
  781. void update_cpu_some_pressure_stall_time_chart(struct cgroup *cg) {
  782. if (is_cgroup_systemd_service(cg))
  783. return;
  784. struct pressure *res = &cg->cpu_pressure;
  785. struct pressure_charts *pcs = &res->some;
  786. RRDSET *chart = pcs->total_time.st;
  787. if (unlikely(!pcs->total_time.st)) {
  788. char *title = "CPU some pressure stall time";
  789. char *context =
  790. k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_some_pressure_stall_time" : "cgroup.cpu_some_pressure_stall_time";
  791. int prio = cgroup_containers_chart_priority + 2220;
  792. char buff[RRD_ID_LENGTH_MAX + 1];
  793. chart = pcs->total_time.st = rrdset_create_localhost(
  794. cgroup_chart_type(buff, cg),
  795. "cpu_some_pressure_stall_time",
  796. NULL,
  797. "cpu",
  798. context,
  799. title,
  800. "ms",
  801. PLUGIN_CGROUPS_NAME,
  802. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  803. prio,
  804. cgroup_update_every,
  805. RRDSET_TYPE_LINE);
  806. rrdset_update_rrdlabels(chart, cg->chart_labels);
  807. pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  808. }
  809. rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
  810. rrdset_done(chart);
  811. }
  812. void update_cpu_full_pressure_chart(struct cgroup *cg) {
  813. if (is_cgroup_systemd_service(cg))
  814. return;
  815. struct pressure *res = &cg->cpu_pressure;
  816. struct pressure_charts *pcs = &res->full;
  817. RRDSET *chart = pcs->share_time.st;
  818. if (unlikely(!pcs->share_time.st)) {
  819. char *title = "CPU full pressure";
  820. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_full_pressure" : "cgroup.cpu_full_pressure";
  821. int prio = cgroup_containers_chart_priority + 2240;
  822. char buff[RRD_ID_LENGTH_MAX + 1];
  823. chart = pcs->share_time.st = rrdset_create_localhost(
  824. cgroup_chart_type(buff, cg),
  825. "cpu_full_pressure",
  826. NULL,
  827. "cpu",
  828. context,
  829. title,
  830. "percentage",
  831. PLUGIN_CGROUPS_NAME,
  832. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  833. prio,
  834. cgroup_update_every,
  835. RRDSET_TYPE_LINE);
  836. rrdset_update_rrdlabels(chart, cg->chart_labels);
  837. pcs->share_time.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  838. pcs->share_time.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  839. pcs->share_time.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  840. }
  841. rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
  842. rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
  843. rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
  844. rrdset_done(chart);
  845. }
  846. void update_cpu_full_pressure_stall_time_chart(struct cgroup *cg) {
  847. if (is_cgroup_systemd_service(cg))
  848. return;
  849. struct pressure *res = &cg->cpu_pressure;
  850. struct pressure_charts *pcs = &res->full;
  851. RRDSET *chart = pcs->total_time.st;
  852. if (unlikely(!pcs->total_time.st)) {
  853. char *title = "CPU full pressure stall time";
  854. char *context =
  855. k8s_is_kubepod(cg) ? "k8s.cgroup.cpu_full_pressure_stall_time" : "cgroup.cpu_full_pressure_stall_time";
  856. int prio = cgroup_containers_chart_priority + 2260;
  857. char buff[RRD_ID_LENGTH_MAX + 1];
  858. chart = pcs->total_time.st = rrdset_create_localhost(
  859. cgroup_chart_type(buff, cg),
  860. "cpu_full_pressure_stall_time",
  861. NULL,
  862. "cpu",
  863. context,
  864. title,
  865. "ms",
  866. PLUGIN_CGROUPS_NAME,
  867. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  868. prio,
  869. cgroup_update_every,
  870. RRDSET_TYPE_LINE);
  871. rrdset_update_rrdlabels(chart, cg->chart_labels);
  872. pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  873. }
  874. rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
  875. rrdset_done(chart);
  876. }
  877. void update_mem_some_pressure_chart(struct cgroup *cg) {
  878. if (is_cgroup_systemd_service(cg))
  879. return;
  880. struct pressure *res = &cg->memory_pressure;
  881. struct pressure_charts *pcs = &res->some;
  882. RRDSET *chart = pcs->share_time.st;
  883. if (unlikely(!pcs->share_time.st)) {
  884. char *title = "Memory some pressure";
  885. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.memory_some_pressure" : "cgroup.memory_some_pressure";
  886. int prio = cgroup_containers_chart_priority + 2300;
  887. char buff[RRD_ID_LENGTH_MAX + 1];
  888. chart = pcs->share_time.st = rrdset_create_localhost(
  889. cgroup_chart_type(buff, cg),
  890. "mem_some_pressure",
  891. NULL,
  892. "mem",
  893. context,
  894. title,
  895. "percentage",
  896. PLUGIN_CGROUPS_NAME,
  897. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  898. prio,
  899. cgroup_update_every,
  900. RRDSET_TYPE_LINE);
  901. rrdset_update_rrdlabels(chart, cg->chart_labels);
  902. pcs->share_time.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  903. pcs->share_time.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  904. pcs->share_time.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  905. }
  906. rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
  907. rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
  908. rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
  909. rrdset_done(chart);
  910. }
  911. void update_mem_some_pressure_stall_time_chart(struct cgroup *cg) {
  912. if (is_cgroup_systemd_service(cg))
  913. return;
  914. struct pressure *res = &cg->memory_pressure;
  915. struct pressure_charts *pcs = &res->some;
  916. RRDSET *chart = pcs->total_time.st;
  917. if (unlikely(!pcs->total_time.st)) {
  918. char *title = "Memory some pressure stall time";
  919. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.memory_some_pressure_stall_time" :
  920. "cgroup.memory_some_pressure_stall_time";
  921. int prio = cgroup_containers_chart_priority + 2320;
  922. char buff[RRD_ID_LENGTH_MAX + 1];
  923. chart = pcs->total_time.st = rrdset_create_localhost(
  924. cgroup_chart_type(buff, cg),
  925. "memory_some_pressure_stall_time",
  926. NULL,
  927. "mem",
  928. context,
  929. title,
  930. "ms",
  931. PLUGIN_CGROUPS_NAME,
  932. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  933. prio,
  934. cgroup_update_every,
  935. RRDSET_TYPE_LINE);
  936. rrdset_update_rrdlabels(chart, cg->chart_labels);
  937. pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  938. }
  939. rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
  940. rrdset_done(chart);
  941. }
  942. void update_mem_full_pressure_chart(struct cgroup *cg) {
  943. if (is_cgroup_systemd_service(cg))
  944. return;
  945. struct pressure *res = &cg->memory_pressure;
  946. struct pressure_charts *pcs = &res->full;
  947. RRDSET *chart = pcs->share_time.st;
  948. if (unlikely(!pcs->share_time.st)) {
  949. char *title = "Memory full pressure";
  950. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.memory_full_pressure" : "cgroup.memory_full_pressure";
  951. int prio = cgroup_containers_chart_priority + 2340;
  952. char buff[RRD_ID_LENGTH_MAX + 1];
  953. chart = pcs->share_time.st = rrdset_create_localhost(
  954. cgroup_chart_type(buff, cg),
  955. "mem_full_pressure",
  956. NULL,
  957. "mem",
  958. context,
  959. title,
  960. "percentage",
  961. PLUGIN_CGROUPS_NAME,
  962. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  963. prio,
  964. cgroup_update_every,
  965. RRDSET_TYPE_LINE);
  966. rrdset_update_rrdlabels(chart, cg->chart_labels);
  967. pcs->share_time.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  968. pcs->share_time.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  969. pcs->share_time.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  970. }
  971. rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
  972. rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
  973. rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
  974. rrdset_done(chart);
  975. }
  976. void update_mem_full_pressure_stall_time_chart(struct cgroup *cg) {
  977. if (is_cgroup_systemd_service(cg))
  978. return;
  979. struct pressure *res = &cg->memory_pressure;
  980. struct pressure_charts *pcs = &res->full;
  981. RRDSET *chart = pcs->total_time.st;
  982. if (unlikely(!pcs->total_time.st)) {
  983. char *title = "Memory full pressure stall time";
  984. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.memory_full_pressure_stall_time" :
  985. "cgroup.memory_full_pressure_stall_time";
  986. int prio = cgroup_containers_chart_priority + 2360;
  987. char buff[RRD_ID_LENGTH_MAX + 1];
  988. chart = pcs->total_time.st = rrdset_create_localhost(
  989. cgroup_chart_type(buff, cg),
  990. "memory_full_pressure_stall_time",
  991. NULL,
  992. "mem",
  993. context,
  994. title,
  995. "ms",
  996. PLUGIN_CGROUPS_NAME,
  997. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  998. prio,
  999. cgroup_update_every,
  1000. RRDSET_TYPE_LINE);
  1001. rrdset_update_rrdlabels(chart, cg->chart_labels);
  1002. pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  1003. }
  1004. rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
  1005. rrdset_done(chart);
  1006. }
  1007. void update_irq_some_pressure_chart(struct cgroup *cg) {
  1008. if (is_cgroup_systemd_service(cg))
  1009. return;
  1010. struct pressure *res = &cg->irq_pressure;
  1011. struct pressure_charts *pcs = &res->some;
  1012. RRDSET *chart = pcs->share_time.st;
  1013. if (unlikely(!pcs->share_time.st)) {
  1014. char *title = "IRQ some pressure";
  1015. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.irq_some_pressure" : "cgroup.irq_some_pressure";
  1016. int prio = cgroup_containers_chart_priority + 2310;
  1017. char buff[RRD_ID_LENGTH_MAX + 1];
  1018. chart = pcs->share_time.st = rrdset_create_localhost(
  1019. cgroup_chart_type(buff, cg),
  1020. "irq_some_pressure",
  1021. NULL,
  1022. "interrupts",
  1023. context,
  1024. title,
  1025. "percentage",
  1026. PLUGIN_CGROUPS_NAME,
  1027. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  1028. prio,
  1029. cgroup_update_every,
  1030. RRDSET_TYPE_LINE);
  1031. rrdset_update_rrdlabels(chart, cg->chart_labels);
  1032. pcs->share_time.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  1033. pcs->share_time.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  1034. pcs->share_time.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  1035. }
  1036. rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
  1037. rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
  1038. rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
  1039. rrdset_done(chart);
  1040. }
  1041. void update_irq_some_pressure_stall_time_chart(struct cgroup *cg) {
  1042. if (is_cgroup_systemd_service(cg))
  1043. return;
  1044. struct pressure *res = &cg->irq_pressure;
  1045. struct pressure_charts *pcs = &res->some;
  1046. RRDSET *chart = pcs->total_time.st;
  1047. if (unlikely(!pcs->total_time.st)) {
  1048. char *title = "IRQ some pressure stall time";
  1049. char *context =
  1050. k8s_is_kubepod(cg) ? "k8s.cgroup.irq_some_pressure_stall_time" : "cgroup.irq_some_pressure_stall_time";
  1051. int prio = cgroup_containers_chart_priority + 2330;
  1052. char buff[RRD_ID_LENGTH_MAX + 1];
  1053. chart = pcs->total_time.st = rrdset_create_localhost(
  1054. cgroup_chart_type(buff, cg),
  1055. "irq_some_pressure_stall_time",
  1056. NULL,
  1057. "interrupts",
  1058. context,
  1059. title,
  1060. "ms",
  1061. PLUGIN_CGROUPS_NAME,
  1062. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  1063. prio,
  1064. cgroup_update_every,
  1065. RRDSET_TYPE_LINE);
  1066. rrdset_update_rrdlabels(chart, cg->chart_labels);
  1067. pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  1068. }
  1069. rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
  1070. rrdset_done(chart);
  1071. }
  1072. void update_irq_full_pressure_chart(struct cgroup *cg) {
  1073. if (is_cgroup_systemd_service(cg))
  1074. return;
  1075. struct pressure *res = &cg->irq_pressure;
  1076. struct pressure_charts *pcs = &res->full;
  1077. RRDSET *chart = pcs->share_time.st;
  1078. if (unlikely(!pcs->share_time.st)) {
  1079. char *title = "IRQ full pressure";
  1080. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.irq_full_pressure" : "cgroup.irq_full_pressure";
  1081. int prio = cgroup_containers_chart_priority + 2350;
  1082. char buff[RRD_ID_LENGTH_MAX + 1];
  1083. chart = pcs->share_time.st = rrdset_create_localhost(
  1084. cgroup_chart_type(buff, cg),
  1085. "irq_full_pressure",
  1086. NULL,
  1087. "interrupts",
  1088. context,
  1089. title,
  1090. "percentage",
  1091. PLUGIN_CGROUPS_NAME,
  1092. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  1093. prio,
  1094. cgroup_update_every,
  1095. RRDSET_TYPE_LINE);
  1096. rrdset_update_rrdlabels(chart, cg->chart_labels);
  1097. pcs->share_time.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  1098. pcs->share_time.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  1099. pcs->share_time.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  1100. }
  1101. rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
  1102. rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
  1103. rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
  1104. rrdset_done(chart);
  1105. }
  1106. void update_irq_full_pressure_stall_time_chart(struct cgroup *cg) {
  1107. if (is_cgroup_systemd_service(cg))
  1108. return;
  1109. struct pressure *res = &cg->irq_pressure;
  1110. struct pressure_charts *pcs = &res->full;
  1111. RRDSET *chart = pcs->total_time.st;
  1112. if (unlikely(!pcs->total_time.st)) {
  1113. char *title = "IRQ full pressure stall time";
  1114. char *context =
  1115. k8s_is_kubepod(cg) ? "k8s.cgroup.irq_full_pressure_stall_time" : "cgroup.irq_full_pressure_stall_time";
  1116. int prio = cgroup_containers_chart_priority + 2370;
  1117. char buff[RRD_ID_LENGTH_MAX + 1];
  1118. chart = pcs->total_time.st = rrdset_create_localhost(
  1119. cgroup_chart_type(buff, cg),
  1120. "irq_full_pressure_stall_time",
  1121. NULL,
  1122. "interrupts",
  1123. context,
  1124. title,
  1125. "ms",
  1126. PLUGIN_CGROUPS_NAME,
  1127. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  1128. prio,
  1129. cgroup_update_every,
  1130. RRDSET_TYPE_LINE);
  1131. rrdset_update_rrdlabels(chart, cg->chart_labels);
  1132. pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  1133. }
  1134. rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
  1135. rrdset_done(chart);
  1136. }
  1137. void update_io_some_pressure_chart(struct cgroup *cg) {
  1138. if (is_cgroup_systemd_service(cg))
  1139. return;
  1140. struct pressure *res = &cg->io_pressure;
  1141. struct pressure_charts *pcs = &res->some;
  1142. RRDSET *chart = pcs->share_time.st;
  1143. if (unlikely(!pcs->share_time.st)) {
  1144. char *title = "I/O some pressure";
  1145. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.io_some_pressure" : "cgroup.io_some_pressure";
  1146. int prio = cgroup_containers_chart_priority + 2400;
  1147. char buff[RRD_ID_LENGTH_MAX + 1];
  1148. chart = pcs->share_time.st = rrdset_create_localhost(
  1149. cgroup_chart_type(buff, cg),
  1150. "io_some_pressure",
  1151. NULL,
  1152. "disk",
  1153. context,
  1154. title,
  1155. "percentage",
  1156. PLUGIN_CGROUPS_NAME,
  1157. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  1158. prio,
  1159. cgroup_update_every,
  1160. RRDSET_TYPE_LINE);
  1161. rrdset_update_rrdlabels(chart, cg->chart_labels);
  1162. pcs->share_time.rd10 = rrddim_add(chart, "some 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  1163. pcs->share_time.rd60 = rrddim_add(chart, "some 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  1164. pcs->share_time.rd300 = rrddim_add(chart, "some 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  1165. }
  1166. rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
  1167. rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
  1168. rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
  1169. rrdset_done(chart);
  1170. }
  1171. void update_io_some_pressure_stall_time_chart(struct cgroup *cg) {
  1172. if (is_cgroup_systemd_service(cg))
  1173. return;
  1174. struct pressure *res = &cg->io_pressure;
  1175. struct pressure_charts *pcs = &res->some;
  1176. RRDSET *chart = pcs->total_time.st;
  1177. if (unlikely(!pcs->total_time.st)) {
  1178. char *title = "I/O some pressure stall time";
  1179. char *context =
  1180. k8s_is_kubepod(cg) ? "k8s.cgroup.io_some_pressure_stall_time" : "cgroup.io_some_pressure_stall_time";
  1181. int prio = cgroup_containers_chart_priority + 2420;
  1182. char buff[RRD_ID_LENGTH_MAX + 1];
  1183. chart = pcs->total_time.st = rrdset_create_localhost(
  1184. cgroup_chart_type(buff, cg),
  1185. "io_some_pressure_stall_time",
  1186. NULL,
  1187. "disk",
  1188. context,
  1189. title,
  1190. "ms",
  1191. PLUGIN_CGROUPS_NAME,
  1192. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  1193. prio,
  1194. cgroup_update_every,
  1195. RRDSET_TYPE_LINE);
  1196. rrdset_update_rrdlabels(chart, cg->chart_labels);
  1197. pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  1198. }
  1199. rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
  1200. rrdset_done(chart);
  1201. }
  1202. void update_io_full_pressure_chart(struct cgroup *cg) {
  1203. if (is_cgroup_systemd_service(cg))
  1204. return;
  1205. struct pressure *res = &cg->io_pressure;
  1206. struct pressure_charts *pcs = &res->full;
  1207. RRDSET *chart = pcs->share_time.st;
  1208. if (unlikely(!pcs->share_time.st)) {
  1209. char *title = "I/O full pressure";
  1210. char *context = k8s_is_kubepod(cg) ? "k8s.cgroup.io_full_pressure" : "cgroup.io_full_pressure";
  1211. int prio = cgroup_containers_chart_priority + 2440;
  1212. char buff[RRD_ID_LENGTH_MAX + 1];
  1213. chart = pcs->share_time.st = rrdset_create_localhost(
  1214. cgroup_chart_type(buff, cg),
  1215. "io_full_pressure",
  1216. NULL,
  1217. "disk",
  1218. context,
  1219. title,
  1220. "percentage",
  1221. PLUGIN_CGROUPS_NAME,
  1222. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  1223. prio,
  1224. cgroup_update_every,
  1225. RRDSET_TYPE_LINE);
  1226. rrdset_update_rrdlabels(chart, cg->chart_labels);
  1227. pcs->share_time.rd10 = rrddim_add(chart, "full 10", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  1228. pcs->share_time.rd60 = rrddim_add(chart, "full 60", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  1229. pcs->share_time.rd300 = rrddim_add(chart, "full 300", NULL, 1, 100, RRD_ALGORITHM_ABSOLUTE);
  1230. }
  1231. rrddim_set_by_pointer(chart, pcs->share_time.rd10, (collected_number)(pcs->share_time.value10 * 100));
  1232. rrddim_set_by_pointer(chart, pcs->share_time.rd60, (collected_number)(pcs->share_time.value60 * 100));
  1233. rrddim_set_by_pointer(chart, pcs->share_time.rd300, (collected_number)(pcs->share_time.value300 * 100));
  1234. rrdset_done(chart);
  1235. }
  1236. void update_io_full_pressure_stall_time_chart(struct cgroup *cg) {
  1237. if (is_cgroup_systemd_service(cg))
  1238. return;
  1239. struct pressure *res = &cg->io_pressure;
  1240. struct pressure_charts *pcs = &res->full;
  1241. RRDSET *chart = pcs->total_time.st;
  1242. if (unlikely(!pcs->total_time.st)) {
  1243. char *title = "I/O full pressure stall time";
  1244. char *context =
  1245. k8s_is_kubepod(cg) ? "k8s.cgroup.io_full_pressure_stall_time" : "cgroup.io_full_pressure_stall_time";
  1246. int prio = cgroup_containers_chart_priority + 2460;
  1247. char buff[RRD_ID_LENGTH_MAX + 1];
  1248. chart = pcs->total_time.st = rrdset_create_localhost(
  1249. cgroup_chart_type(buff, cg),
  1250. "io_full_pressure_stall_time",
  1251. NULL,
  1252. "disk",
  1253. context,
  1254. title,
  1255. "ms",
  1256. PLUGIN_CGROUPS_NAME,
  1257. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  1258. prio,
  1259. cgroup_update_every,
  1260. RRDSET_TYPE_LINE);
  1261. rrdset_update_rrdlabels(chart, cg->chart_labels);
  1262. pcs->total_time.rdtotal = rrddim_add(chart, "time", NULL, 1, 1, RRD_ALGORITHM_INCREMENTAL);
  1263. }
  1264. rrddim_set_by_pointer(chart, pcs->total_time.rdtotal, (collected_number)(pcs->total_time.value_total));
  1265. rrdset_done(chart);
  1266. }
  1267. void update_pids_current_chart(struct cgroup *cg) {
  1268. RRDSET *chart = cg->st_pids;
  1269. if (unlikely(!cg->st_pids)) {
  1270. char *title;
  1271. char *context;
  1272. int prio;
  1273. if (is_cgroup_systemd_service(cg)) {
  1274. title = "Systemd Services Number of Processes";
  1275. context = "systemd.service.pids.current";
  1276. prio = NETDATA_CHART_PRIO_CGROUPS_SYSTEMD + 70;
  1277. } else {
  1278. title = "Number of processes";
  1279. context = k8s_is_kubepod(cg) ? "k8s.cgroup.pids_current" : "cgroup.pids_current";
  1280. prio = cgroup_containers_chart_priority + 2150;
  1281. }
  1282. char buff[RRD_ID_LENGTH_MAX + 1];
  1283. chart = cg->st_pids = rrdset_create_localhost(
  1284. cgroup_chart_type(buff, cg),
  1285. "pids_current",
  1286. NULL,
  1287. "pids",
  1288. context,
  1289. title,
  1290. "pids",
  1291. PLUGIN_CGROUPS_NAME,
  1292. is_cgroup_systemd_service(cg) ? PLUGIN_CGROUPS_MODULE_SYSTEMD_NAME : PLUGIN_CGROUPS_MODULE_CGROUPS_NAME,
  1293. prio,
  1294. cgroup_update_every,
  1295. RRDSET_TYPE_LINE);
  1296. rrdset_update_rrdlabels(chart, cg->chart_labels);
  1297. cg->st_pids_rd_pids_current = rrddim_add(chart, "pids", NULL, 1, 1, RRD_ALGORITHM_ABSOLUTE);
  1298. }
  1299. rrddim_set_by_pointer(chart, cg->st_pids_rd_pids_current, (collected_number)cg->pids.pids_current);
  1300. rrdset_done(chart);
  1301. }