1 /*
2  * Copyright (C) 2016 Jakub Kruszona-Zawadzki, Core Technology Sp. z o.o.
3  *
4  * This file is part of MooseFS.
5  *
6  * MooseFS is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, version 2 (only).
9  *
10  * MooseFS is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with MooseFS; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA
18  * or visit http://www.gnu.org/licenses/gpl-2.0.html
19  */
20 
21 #ifdef HAVE_CONFIG_H
22 #include "config.h"
23 #endif
24 
25 #include <time.h>
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <string.h>
29 #include <unistd.h>
30 #include <fcntl.h>
31 #include <syslog.h>
32 #include <errno.h>
33 
34 
35 #include "charts.h"
36 #include "main.h"
37 
38 #include "chunks.h"
39 #include "filesystem.h"
40 #include "matoclserv.h"
41 #include "memusage.h"
42 #include "cpuusage.h"
43 
44 #define CHARTS_FILENAME "stats.mfs"
45 
46 #define CHARTS_UCPU 0
47 #define CHARTS_SCPU 1
48 #define CHARTS_DELCHUNK 2
49 #define CHARTS_REPLCHUNK 3
50 #define CHARTS_STATFS 4
51 #define CHARTS_GETATTR 5
52 #define CHARTS_SETATTR 6
53 #define CHARTS_LOOKUP 7
54 #define CHARTS_MKDIR 8
55 #define CHARTS_RMDIR 9
56 #define CHARTS_SYMLINK 10
57 #define CHARTS_READLINK 11
58 #define CHARTS_MKNOD 12
59 #define CHARTS_UNLINK 13
60 #define CHARTS_RENAME 14
61 #define CHARTS_LINK 15
62 #define CHARTS_READDIR 16
63 #define CHARTS_OPEN 17
64 #define CHARTS_READ 18
65 #define CHARTS_WRITE 19
66 #define CHARTS_MEMORY_RSS 20
67 #define CHARTS_PACKETSRCVD 21
68 #define CHARTS_PACKETSSENT 22
69 #define CHARTS_BYTESRCVD 23
70 #define CHARTS_BYTESSENT 24
71 #define CHARTS_MEMORY_VIRT 25
72 
73 #define CHARTS 26
74 
75 /* name , join mode , percent , scale , multiplier , divisor */
76 #define STATDEFS { \
77 	{"ucpu"         ,CHARTS_MODE_ADD,1,CHARTS_SCALE_MICRO, 100,60}, \
78 	{"scpu"         ,CHARTS_MODE_ADD,1,CHARTS_SCALE_MICRO, 100,60}, \
79 	{"delete"       ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
80 	{"replicate"    ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
81 	{"statfs"       ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
82 	{"getattr"      ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
83 	{"setattr"      ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
84 	{"lookup"       ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
85 	{"mkdir"        ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
86 	{"rmdir"        ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
87 	{"symlink"      ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
88 	{"readlink"     ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
89 	{"mknod"        ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
90 	{"unlink"       ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
91 	{"rename"       ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
92 	{"link"         ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
93 	{"readdir"      ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
94 	{"open"         ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
95 	{"read"         ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
96 	{"write"        ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
97 	{"memoryrss"    ,CHARTS_MODE_MAX,0,CHARTS_SCALE_NONE ,   1, 1}, \
98 	{"prcvd"        ,CHARTS_MODE_ADD,0,CHARTS_SCALE_MILI ,1000,60}, \
99 	{"psent"        ,CHARTS_MODE_ADD,0,CHARTS_SCALE_MILI ,1000,60}, \
100 	{"brcvd"        ,CHARTS_MODE_ADD,0,CHARTS_SCALE_MILI ,8000,60}, \
101 	{"bsent"        ,CHARTS_MODE_ADD,0,CHARTS_SCALE_MILI ,8000,60}, \
102 	{"memoryvirt"   ,CHARTS_MODE_MAX,0,CHARTS_SCALE_NONE ,   1, 1}, \
103 	{NULL           ,0              ,0,0                 ,   0, 0}  \
104 };
105 
106 #define CALCDEFS { \
107 	CHARTS_CALCDEF(CHARTS_MAX(CHARTS_CONST(0),CHARTS_SUB(CHARTS_MEMORY_VIRT,CHARTS_MEMORY_RSS))), \
108 	CHARTS_DEFS_END \
109 };
110 
111 /* c1_def , c2_def , c3_def , join mode , percent , scale , multiplier , divisor */
112 #define ESTATDEFS { \
113 	{CHARTS_DIRECT(CHARTS_UCPU)        ,CHARTS_DIRECT(CHARTS_SCPU)            ,CHARTS_NONE                       ,CHARTS_MODE_ADD,1,CHARTS_SCALE_MICRO, 100,60}, \
114 	{CHARTS_CALC(0)                    ,CHARTS_DIRECT(CHARTS_MEMORY_RSS)      ,CHARTS_NONE                       ,CHARTS_MODE_MAX,0,CHARTS_SCALE_NONE ,   1, 1}, \
115 	{CHARTS_NONE                       ,CHARTS_NONE                           ,CHARTS_NONE                       ,0              ,0,0                 ,   0, 0}  \
116 };
117 
118 static const uint32_t calcdefs[]=CALCDEFS
119 static const statdef statdefs[]=STATDEFS
120 static const estatdef estatdefs[]=ESTATDEFS
121 
122 static uint64_t rss,virt;
123 static uint64_t scpu,ucpu;
124 
chartsdata_resusage(uint64_t * mem,uint64_t * syscpu,uint64_t * usrcpu)125 void chartsdata_resusage(uint64_t *mem,uint64_t *syscpu,uint64_t *usrcpu) {
126 	*mem = rss;
127 	*syscpu = scpu;
128 	*usrcpu = ucpu;
129 }
130 
chartsdata_refresh(void)131 void chartsdata_refresh(void) {
132 	uint64_t data[CHARTS];
133 	uint32_t fsdata[16];
134 	uint32_t i,del,repl; //,bin,bout,opr,opw,dbr,dbw,dopr,dopw,repl;
135 
136 	for (i=0 ; i<CHARTS ; i++) {
137 		data[i]=CHARTS_NODATA;
138 	}
139 
140 	cpu_used(&scpu,&ucpu);
141 	if (scpu>0 || ucpu>0) {
142 		data[CHARTS_UCPU] = (ucpu*6)/100;
143 		data[CHARTS_SCPU] = (scpu*6)/100;
144 	}
145 
146 	if (mem_used(&rss,&virt)) {
147 		data[CHARTS_MEMORY_RSS] = rss;
148 		data[CHARTS_MEMORY_VIRT] = virt;
149 	}
150 
151 	chunk_stats(&del,&repl);
152 	data[CHARTS_DELCHUNK]=del;
153 	data[CHARTS_REPLCHUNK]=repl;
154 	fs_stats(fsdata);
155 	for (i=0 ; i<16 ; i++) {
156 		data[CHARTS_STATFS+i]=fsdata[i];
157 	}
158 	matoclserv_stats(data+CHARTS_PACKETSRCVD);
159 
160 	charts_add(data,main_time()-60);
161 }
162 
chartsdata_term(void)163 void chartsdata_term(void) {
164 	chartsdata_refresh();
165 	charts_store();
166 	charts_term();
167 }
168 
chartsdata_store(void)169 void chartsdata_store(void) {
170 	charts_store();
171 }
172 
chartsdata_init(void)173 int chartsdata_init (void) {
174 	cpu_init();
175 	scpu = ucpu = 0;
176 	mem_used(&rss,&virt);
177 
178 	main_time_register(60,0,chartsdata_refresh);
179 	main_time_register(3600,0,chartsdata_store);
180 	main_destruct_register(chartsdata_term);
181 	return charts_init(calcdefs,statdefs,estatdefs,CHARTS_FILENAME);
182 }
183