1 /*
2  * Copyright (C) 2021 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 #ifndef _CHARTS_H_
22 #define _CHARTS_H_
23 
24 #include <stdio.h>
25 #include <inttypes.h>
26 
27 #define CHARTS_MODE_ADD 0
28 #define CHARTS_MODE_MAX 1
29 
30 #define CHARTS_SCALE_MICRO 0
31 #define CHARTS_SCALE_MILI 1
32 #define CHARTS_SCALE_NONE 2
33 #define CHARTS_SCALE_KILO 3
34 #define CHARTS_SCALE_MEGA 4
35 #define CHARTS_SCALE_GIGA 5
36 
37 #define CHARTS_OP_CONST 1000
38 #define CHARTS_OP_ADD 1001
39 #define CHARTS_OP_SUB 1002
40 #define CHARTS_OP_MIN 1003
41 #define CHARTS_OP_MAX 1004
42 #define CHARTS_OP_MUL 1005
43 #define CHARTS_OP_DIV 1006
44 #define CHARTS_OP_NEG 1007
45 
46 #define CHARTS_OP_END 1999
47 #define CHARTS_DEFS_END 2000
48 
49 #define CHARTS_CONST(x) CHARTS_OP_CONST, x
50 #define CHARTS_ADD(x,y) x, y, CHARTS_OP_ADD
51 #define CHARTS_SUB(x,y) x, y, CHARTS_OP_SUB
52 #define CHARTS_MIN(x,y) x, y, CHARTS_OP_MIN
53 #define CHARTS_MAX(x,y) x, y, CHARTS_OP_MAX
54 #define CHARTS_MUL(x,y) x, y, CHARTS_OP_MUL
55 #define CHARTS_DIV(x,y) x, y, CHARTS_OP_DIV
56 #define CHARTS_NEG(x) x, CHARTS_OP_NEG
57 #define CHARTS_CALCDEF(x) x, CHARTS_OP_END
58 
59 #define CHARTS_NONE 0
60 #define CHARTS_DIRECT_START 1
61 #define CHARTS_DIRECT(x) ((x)+CHARTS_DIRECT_START)
62 #define CHARTS_CALC_START 1000
63 #define CHARTS_CALC(x) ((x)+CHARTS_CALC_START)
64 
65 #if defined(UINT64_C)
66 #  define CHARTS_NODATA UINT64_C(0xFFFFFFFFFFFFFFFF)
67 #elif defined(UINT64_MAX)
68 #  define CHARTS_NODATA UINT64_MAX
69 #else
70 #  define CHARTS_NODATA 0xFFFFFFFFFFFFFFFFULL
71 #endif
72 
73 typedef struct _statdef {
74 	char *name;
75 	uint32_t statid;
76 	uint8_t mode;
77 	uint8_t percent;
78 	uint8_t scale;
79 	uint16_t multiplier;
80 	uint16_t divisor;
81 } statdef;
82 
83 typedef struct _estatdef {
84 	char *name;
85 	uint32_t statid;
86 	uint32_t c1src;
87 	uint32_t c2src;
88 	uint32_t c3src;
89 	uint8_t mode;
90 	uint8_t percent;
91 	uint8_t scale;
92 	uint16_t multiplier;
93 	uint16_t divisor;
94 } estatdef;
95 
96 #if 0
97 // definition examples:
98 
99 // simple data charts (source data counters, represented by one color simple charts):
100 
101 /* name , join mode , percent , scale , multiplier , divisor */
102 #define STATDEFS { \
103 	{"cpu_time_counter"                 ,CHARTS_MODE_ADD,1,CHARTS_SCALE_MICRO, 100,60}, \
104 	{"network_data_in_bits_per_second"  ,CHARTS_MODE_ADD,0,CHARTS_SCALE_MILI ,8000,60}, \
105 	{"count_per_second"                 ,CHARTS_MODE_ADD,0,CHARTS_SCALE_MILI ,1000,60}, \
106 	{"count_per_minute"                 ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
107 	{"micro_time_per_second"            ,CHARTS_MODE_ADD,0,CHARTS_SCALE_MICRO,   1,60}, \
108 	{NULL                               ,0              ,0,0                 ,   0, 0}  \
109 };
110 
111 #define CALCDEFS { \
112 	CHARTS_CALCDEF(CHARTS_ADD(CHARTS_TOADD1,CHARTS_TOADD2)), \
113 	CHARTS_CALCDEF(CHARTS_ADD(CHARTS_TOADD1,CHARTS_ADD(CHARTS_TOADD2,CHARTS_TOADD3))), \
114 	CHARTS_CALCDEF(CHARTS_DIV(CHARTS_TODIVIDE,CHARTS_DIVISOR)), \
115 	CHARTS_CALCDEF(CHARTS_ADD(CHARTS_TOADD,CHARTS_MUL(CHARTS_CONST(300),CHARTS_TOADDMULTIPLIED))), \
116 	CHARTS_DEFS_END \
117 };
118 
119 // enhanced data charts (up to 3 counters on one chart represented by three colors)
120 // c1_def - light
121 // c2_def - medium
122 // c3_def - dark
123 // source data for given color can be defined as simple chart or calculation from above definitions
124 
125 /* c1_def , c2_def , c3_def , join mode , percent , scale , multiplier , divisor */
126 #define ESTATDEFS { \
127 	{CHARTS_DIRECT(CHARTS_UCPU)        ,CHARTS_DIRECT(CHARTS_SCPU)        ,CHARTS_NONE                       ,CHARTS_MODE_ADD,1,CHARTS_SCALE_MICRO, 100,60}, \
128 	{CHARTS_CALC(0)                    ,CHARTS_DIRECT(CHARTS_SOMETHING)   ,CHARTS_CALC(1)                    ,CHARTS_MODE_ADD,0,CHARTS_SCALE_NONE ,   1, 1}, \
129 	{CHARTS_NONE                       ,CHARTS_CALC(1)                    ,CHARTS_NONE                       ,CHARTS_MODE_ADD,0,CHARTS_SCALE_MILI ,1000,60}, \
130 	{CHARTS_NONE                       ,CHARTS_NONE                       ,CHARTS_NONE                       ,0              ,0,0                 ,   0, 0}  \
131 };
132 
133 #endif
134 
135 uint64_t charts_get (uint32_t chartnumber,uint32_t count);
136 
137 uint32_t charts_monotonic_data (uint8_t *buff);
138 uint32_t charts_getmaxleng(void);
139 void charts_getdata(double *data,uint32_t *timestamp,uint32_t *rsec,uint32_t number);
140 uint32_t charts_makedata(uint8_t *buff,uint32_t number,uint32_t maxentries);
141 uint32_t charts_make_png(uint32_t chartid,uint32_t chartwidth,uint32_t chartheight);
142 void charts_get_png(uint8_t *buff);
143 
144 void charts_add (uint64_t *data,uint32_t datats);
145 void charts_store (void);
146 int charts_init (const uint32_t *calcs,const statdef *stats,const estatdef *estats,const char *filename,uint8_t mode);
147 void charts_term (void);
148 
149 #endif
150