UNPKG

@csermet/multiprovider

Version:

cloud-graph provider plugin for AWS used to fetch AWS cloud data.

146 lines (145 loc) 5.84 kB
"use strict"; 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')); });