forked from apiaryio/cloudwatch-to-papertrail
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
143 lines (113 loc) · 3.31 KB
/
index.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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
var zlib = require('zlib');
var winston = require('winston');
var papertrailTransport = require('winston-papertrail').Papertrail;
var dogapi = require('dogapi');
var config = require('./env.json');
const ignoredPatterns = [
/^.*API Key authorized because method '.+' does not require API Key. Request will not contribute to throttle or quota limits$/,
/^.*Usage Plan check succeeded for API Key and API Stage .*$/,
/^.*Verifying Usage Plan for request: [\d\w-]+. API Key: API Stage: .*/,
];
function addLambdaMetrics(data, match) {
var now = dogapi.now();
data.push({
metric: 'aws.lambda.billed',
points: [
[now, match[1]]
]
});
data.push({
metric: 'aws.lambda.maxmemory',
points: [
[now, match[2]]
]
});
};
function addAppMetrics(data, match) {
var now = parseInt((new Date(match[1])).getTime()/1000);
var tags = [];
var points = [];
match[3].split(' ').forEach(function (metric) {
var keyValue = metric.split('=');
if (keyValue[0].indexOf('metric#') == -1) {
return;
}
if (keyValue[0].indexOf('metric#tag#') != -1) {
return tags.push(keyValue[0].replace('metric#tag#', '') + ':' + keyValue[1]);
}
points.push({
metric: [config.appname, config.program, match[2], keyValue[0].replace('metric#', '')].join('.'),
points: [
[now, parseInt(keyValue[1])]
]
});
});
points.forEach(function (item) {
item.tags = tags;
data.push(item);
});
};
dogapi.initialize({
api_key: config.datadog
});
function handleEvent(event, logger, cb) {
var payload = new Buffer(event.awslogs.data, 'base64');
zlib.gunzip(payload, function (err, result) {
if (err) {
return cb(err);
}
var data = JSON.parse(result.toString('utf8'));
var metricRegex = /^(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z)\ -\ info:\ ([a-z-]+):.*?(metric#.*)+$/;
var reportRegex = /^REPORT\ RequestId.*Billed\ Duration:\ ([0-9]+)\ ms.*Used:\ ([0-9]+)\ MB$/;
var metricPoints = [];
var reportPoints = [];
data.logEvents.forEach(function (line) {
if (ignoredPatterns.some(rule => rule.test(line.message))) {
return;
}
logger.info(line.message);
if (config.datadog !== '') {
var metricMatch = line.message.trim().match(metricRegex);
if (metricMatch != null) {
return addAppMetrics(metricPoints, metricMatch);
}
var reportMatch = line.message.trim().match(reportRegex);
if (reportMatch != null) {
return addLambdaMetrics(reportPoints, reportMatch);
}
}
});
if (config.datadog === '') {
logger.close();
return cb();
}
dogapi.metric.send_all(metricPoints, function () {
dogapi.metric.send_all(reportPoints, function () {
logger.close();
cb();
});
});
});
};
function handler(event, context, cb) {
context.callbackWaitsForEmptyEventLoop = config.waitForFlush;
const logger = new winston.Logger({
transports: []
});
logger.add(papertrailTransport, {
host: config.host,
port: config.port,
program: config.program,
hostname: config.appname,
flushOnClose: true,
logFormat: function (level, message) {
return message;
}
});
handleEvent(event, logger, cb);
}
module.exports = {
dogapi,
handleEvent,
handler,
};