UNPKG

lambda-stash

Version:

AWS Lambda script for shipping data from S3 or other cloud data sources to data stores, like Elasticsearch

64 lines (59 loc) 2.13 kB
var _ = require('lodash'); exports.process = function(config) { console.log('formatCloudwatchLogs'); if (!config.data || !config.data.hasOwnProperty('logEvents') || _.isNil(config.data.logEvents.length)) { return Promise.reject('Received unexpected AWS Cloudwatch Logs format:' + JSON.stringify(config.data)); } var items = []; var num = config.data.logEvents.length; var i; var item; var parts; for (i = 0; i < num; i++) { item = config.data.logEvents[i]; parts = item.message.match(/^(\w+)/); if (parts && parts[1] === 'START') { item.logType = 'start'; parts = item.message.match(/^START RequestId: ([a-z0-9-]+) Version: (\S+)/); // eslint-disable-line max-len if (parts && parts.length >= 3) { item.requestId = parts[1]; item.lambdaVersion = parts[2]; delete item.message; } } else if (parts && parts[1] === 'REPORT') { item.logType = 'report'; parts = item.message.match(/^REPORT RequestId: ([a-z0-9-]+)\tDuration: ([0-9.]+) ms\tBilled Duration: ([0-9.]+) ms\tMemory Size: ([0-9.]+) MB\tMax Memory Used: ([0-9.]+)/); // eslint-disable-line max-len if (parts && parts.length >= 6) { item.requestId = parts[1]; item.duration = parts[2]; item.durationBilled = parts[3]; item.memConfigured = parts[4]; item.memUsed = parts[5]; delete item.message; } } else if (parts && parts[1] === 'END') { item.logType = 'end'; parts = item.message.match(/^END RequestId: ([a-z0-9-]+)/); if (parts && parts[1]) { item.requestId = parts[1]; delete item.message; } } else { item.logType = 'message'; parts = item.message.match(/^(.*)\t(.*)\t((.|\n)*)/m); if (parts && parts.length >= 5) { item.requestId = parts[2]; item.message = parts[3]; } } if (config.dateField && config.dateField !== 'timestamp') { item[config.dateField] = new Date(item.timestamp).toISOString(); } items.push(item); } config.data = items; return Promise.resolve(config); };