adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
var fs = require('fs');
var moment = require('moment');
var helper = require('../lib/helper');
var _ = require('lodash');
var alarm = require('./alarm');
/*
* parameters:
* dirname: string
* rotation: interger (ms)
* maxsize: interger (byte)
* interval: interger (ms)
* data: array (array of object)
* alarm: object (alarm object)
*/
function stat(dirname, opts, alarmData) {
|
885ab5d1
Apichat.Tum
add filename
|
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
opts = opts || {};
alarmData = alarmData || {};
this.dirname = dirname;
this.rotation = opts.rotation || 15 * 60 * 1000;
this.maxsize = opts.maxsize || 20000;
this.currentsize = 0;
this.timestamp = 0;
this.foldername = 'stat/';
this.intervalId = undefined;
this.interval = opts.interval || 60 * 1000;
this.data = transformKeys(opts.data);
this.rules = opts.data;
this.alarm = new alarm(dirname, alarmData);
helper.mkdirIfNotExist(`${this.dirname}/${this.foldername}`);
};
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
32
33
34
|
function transformKeys(data) {
keys = _.map(data, function(obj) {
|
885ab5d1
Apichat.Tum
add filename
|
35
36
37
38
39
40
41
42
|
var fakey = {};
fakey[obj.key] = 0;
return fakey;
});
return _.reduce(keys, function(new_obj, obj) {
return _.merge(new_obj, obj);
}, {});
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
43
44
45
46
47
48
49
50
51
|
};
/*
* parameters:
* data: obj
* rules: [obj]
*/
function alarmDataOutOfThreshold(data, rules) {
_alarm = [];
|
885ab5d1
Apichat.Tum
add filename
|
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
_.forEach(data, function(v, k) {
rule = _.find(rules, ['key', k]);
var alarmObj = {};
if(v < rule.threshold_inv) {
_alarm.push({key: k,
count: v,
threshold_inv: rule.threshold_inv,
message: `${k} count is below inverted threshold`});
}
if(v > rule.threshold) {
_alarm.push({key: k,
count: v,
threshold:
rule.threshold,
message: `${k} count is above threshold`});
}
});
return _alarm
};
/*
* parameters:
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
74
75
76
77
78
79
|
* data: any
*/
stat.prototype.appendStat = function(data) {
data = this.formatData(data);
this.currentsize = this.currentsize + helper.getLengthOfContent(data);
fs.appendFile(this.getDir(), data, function(err) {});
|
885ab5d1
Apichat.Tum
add filename
|
80
81
82
83
|
};
/*
* parameters:
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
84
85
86
87
88
89
|
* none
*/
stat.prototype.start = function() {
var self = this;
this.intervalId = setInterval(function(){
var alarmData = alarmDataOutOfThreshold(self.data, self.rules);
|
885ab5d1
Apichat.Tum
add filename
|
90
91
92
93
94
95
96
97
98
99
|
if(!_.isEmpty(alarmData)) {
self.alarm.appendAlarm(alarmData);
}
self.appendStat(self.data);
self.reset();
}, self.interval);
};
/*
* parameters:
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
100
101
102
103
104
105
|
* none
*/
stat.prototype.stop = function() {
clearInterval(this.intervalId);
};
|
885ab5d1
Apichat.Tum
add filename
|
106
107
|
/*
* parameters:
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
108
109
110
111
112
113
|
* data: string
*/
stat.prototype.increment = function(data) {
if(_.has(this.data, data)) {
this.data[data]++;
}
|
885ab5d1
Apichat.Tum
add filename
|
114
115
116
117
|
//else this.data[data] = 1;
};
/*
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
118
119
120
121
122
123
|
* parameters:
* none
*/
stat.prototype.reset = function() {
var self = this;
_.forEach(this.data, function(v, k) {
|
885ab5d1
Apichat.Tum
add filename
|
124
125
126
127
128
|
self.data[k] = 0;
});
};
/*
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
129
130
131
132
133
134
|
* parameters:
* none
*/
stat.prototype.getDir = function() {
var time = moment(Math.floor((+moment()) / this.rotation) * this.rotation);
this.resetCurrentSize(time.unix());
|
885ab5d1
Apichat.Tum
add filename
|
135
136
137
138
139
140
|
time = time.format('YYYY-MM-DDTHH-mm-ss');
var count = this.getCount();
return `${this.dirname}${this.foldername}${time}_${count}.txt`;
};
/*
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
141
142
143
144
145
146
|
* parameters:
* time_unix: string
*/
stat.prototype.resetCurrentSize = function(time_unix) {
if(time_unix > this.timestamp) {
this.currentsize = 0
|
885ab5d1
Apichat.Tum
add filename
|
147
148
149
150
151
|
this.timestamp = time_unix;
}
};
/*
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
152
153
154
155
156
157
|
* parameters:
* none
*/
stat.prototype.getCount = function() {
var count = Math.floor((this.currentsize / this.maxsize) + 1);
return ((count * 1e-5).toFixed(5)).split('.')[1];
|
885ab5d1
Apichat.Tum
add filename
|
158
159
160
|
};
/*
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
161
162
163
164
165
166
|
* parameters:
* data: any
*/
stat.prototype.formatData = function(data) {
var date = moment().toISOString().trim();
var timestamp = moment().unix();
|
885ab5d1
Apichat.Tum
add filename
|
167
168
169
170
171
|
data = this._formatObject(data).trim();
return `${date} ${timestamp} ${data}\r\n`;
};
/*
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
172
173
174
175
176
177
|
* parameters:
* data: any
*/
stat.prototype._formatObject = function(data) {
return JSON.stringify(data);
};
|
885ab5d1
Apichat.Tum
add filename
|
178
179
|
module.exports = stat;
|
adfda8e1
Arsisakarn Srilatanart
initial commit fr...
|
|
|
885ab5d1
Apichat.Tum
add filename
|
|
|