-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathseneca-metrics.js
102 lines (84 loc) · 1.75 KB
/
seneca-metrics.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
'use strict'
var RStats = require('rolling-stats')
var _ = require('lodash')
var opts = {
plugin: 'vidi-seneca-metrics',
group: '',
tag: '',
pid: process.pid,
role: 'metrics',
size: 9999,
interval: 1000
}
module.exports = function (options) {
var seneca = this
var extend = seneca.util.deepextend
opts = extend(opts, options)
opts.stats = RStats.NamedStats(opts.size, opts.interval)
var pin = opts.pin || opts.pins || null
var pins = Array.isArray(pin) ? pin : [pin]
pins.forEach(pin => {
seneca.sub(pin, msg => {
opts.stats.point(1, msg.meta$.sub)
})
})
seneca.add({role: opts.role, hook: 'map'}, map)
seneca.add({role: opts.role, hook: 'emit'}, emit)
return {
name: opts.plugin
}
}
function emit (msg, done) {
var stats = opts.stats.calculate()
var payload = []
var pins = []
_.forOwn(stats, (stat, key) => {
pins.push({
pattern: key,
rate: stat.count
})
})
if (_.isEmpty(pins)) {
return done(null, [])
}
done(null, [{
source: 'seneca-metrics',
payload: {
group: opts.group,
tag: opts.tag,
pid: opts.pid,
pins: pins
}
}])
}
function map (msg, done) {
this.prior(msg, (err, reply) => {})
done(null, [])
var metrics = []
var payload = msg.payload
if (!payload || !payload.pins) {
return
}
_.each(payload.pins, pin => {
metrics.push({
name: 'seneca.message.flow_rate',
values: {
rate: pin.rate
},
tags: {
pattern: pin.pattern,
group: payload.group,
tag: payload.tag,
id: payload.pid
}
})
})
_.each(metrics, metric => {
this.act({
role: opts.role,
hook: 'sink',
name: metric.name,
metric: metric
})
})
}