@csermet/multiprovider
Version:
cloud-graph provider plugin for AWS used to fetch AWS cloud data.
146 lines (145 loc) • 5.84 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const sdk_1 = __importDefault(require("@cloudgraph/sdk"));
const groupBy_1 = __importDefault(require("lodash/groupBy"));
const isEmpty_1 = __importDefault(require("lodash/isEmpty"));
const cloudwatchlogs_1 = __importDefault(require("aws-sdk/clients/cloudwatchlogs"));
const logger_1 = __importDefault(require("../../properties/logger"));
const utils_1 = require("../../utils");
const errorLog_1 = __importDefault(require("../../utils/errorLog"));
const lt = { ...logger_1.default };
const { logger } = sdk_1.default;
const serviceName = 'Cloudwatch Logs';
const errorLog = new errorLog_1.default(serviceName);
const endpoint = utils_1.initTestEndpoint(serviceName);
const listLogGroupsForRegion = async ({ region, cloudwatchLogsInstance, resolveRegion, }) => new Promise(resolve => {
let logGroupsData = [];
const logGroupsList = [];
let args = {};
const listAllLogGroups = (token) => {
if (token) {
args = { ...args, nextToken: token };
}
try {
cloudwatchLogsInstance.describeLogGroups(args, (err, data) => {
if (err) {
errorLog.generateAwsErrorLog({
functionName: 'cloudwatch:describeLogGroups',
err,
});
}
/**
* No log group for this region
*/
if (isEmpty_1.default(data)) {
return resolveRegion();
}
const { nextToken, logGroups } = data || {};
logGroupsList.push(...logGroups);
if (nextToken) {
logger.debug(lt.foundMoreCloudwatchLogGroups(logGroups.length));
listAllLogGroups(nextToken);
}
logGroupsData = logGroupsList.map(logGroup => ({
...logGroup,
region,
}));
if (!nextToken) {
resolve(logGroupsData);
}
});
}
catch (error) {
resolve([]);
}
};
listAllLogGroups();
});
const listLogGroupMetricFilters = async ({ cloudwatchLogsInstance, logGroupName, }) => new Promise(resolve => {
const metricFiltersList = [];
let args = {};
const listAllLogMetricFilters = (token) => {
args = { ...args, logGroupName };
if (token) {
args = { ...args, nextToken: token };
}
try {
cloudwatchLogsInstance.describeMetricFilters(args, (err, data) => {
const { nextToken, metricFilters } = data || {};
if (err) {
errorLog.generateAwsErrorLog({
functionName: 'cloudwatch:describeMetricFilters',
err,
});
}
/**
* No metric filter for this region
*/
if (isEmpty_1.default(data)) {
return resolve([]);
}
metricFiltersList.push(...metricFilters);
if (nextToken) {
logger.debug(lt.foundMoreCloudwatchMetricFilters(metricFilters.length));
listAllLogMetricFilters(nextToken);
}
resolve(metricFiltersList);
});
}
catch (error) {
resolve([]);
}
};
listAllLogMetricFilters();
});
exports.default = async ({ regions, config, }) => new Promise(async (resolve) => {
const cloudwatchLogsResult = [];
// get all log groups for all regions
const regionPromises = regions.split(',').map(region => {
const cloudwatchLogsInstance = new cloudwatchlogs_1.default({
...config,
region,
endpoint,
});
return new Promise(async (resolveRegion) => {
let cloudwatchLogsData = await listLogGroupsForRegion({
region,
cloudwatchLogsInstance,
resolveRegion,
});
if (!isEmpty_1.default(cloudwatchLogsData)) {
const logGroupNames = cloudwatchLogsData.map(logGroup => logGroup.logGroupName);
if (!isEmpty_1.default(logGroupNames)) {
// Get Log Group Metric Filters
const logGroupMetricFilters = await Promise.all(logGroupNames.map(logGroupName => listLogGroupMetricFilters({
cloudwatchLogsInstance,
logGroupName,
})));
if (!isEmpty_1.default(logGroupMetricFilters)) {
cloudwatchLogsData = cloudwatchLogsData.map(logGroup => {
const metricFilters = logGroupMetricFilters.find((filters) => filters.find(mf => mf.logGroupName === logGroup.logGroupName));
return {
...logGroup,
MetricFilters: metricFilters || [],
};
});
}
}
for (const cloudwatchLog of cloudwatchLogsData) {
cloudwatchLogsResult.push({
...cloudwatchLog,
region,
});
}
}
resolveRegion();
});
});
logger.debug(lt.gettingCloudwatchLogGroups);
await Promise.all(regionPromises);
errorLog.reset();
resolve(groupBy_1.default(cloudwatchLogsResult, 'region'));
});