truemark-cdk-lib 0.0.5 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/aws-lambda/lib/helper.d.ts +4 -0
- package/aws-lambda/lib/helper.js +38 -0
- package/aws-lambda/lib/index.d.ts +2 -1
- package/aws-lambda/lib/index.js +3 -2
- package/aws-lambda/lib/python-function.d.ts +43 -0
- package/aws-lambda/lib/python-function.js +143 -0
- package/aws-lambda/lib/{standard-functions.d.ts → standard-function.d.ts} +32 -44
- package/aws-lambda/lib/standard-function.js +3 -0
- package/package.json +9 -4
- package/aws-lambda/lib/standard-functions.js +0 -164
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Duration } from "aws-cdk-lib";
|
|
2
|
+
import { IAlarmAction } from "aws-cdk-lib/aws-cloudwatch";
|
|
3
|
+
import { CustomAlarmThreshold } from "cdk-monitoring-constructs";
|
|
4
|
+
export declare function toAlarmProps(prop: string, warningThreshold?: number | Duration, criticalThreshold?: number | Duration, warningAlarmActions?: IAlarmAction[], criticalAlarmActions?: IAlarmAction[], warningDefaultThreshold?: number | Duration, criticalDefaultThreshold?: number | Duration): Record<string, CustomAlarmThreshold> | undefined;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toAlarmProps = void 0;
|
|
4
|
+
const aws_monitoring_1 = require("../../aws-monitoring");
|
|
5
|
+
function toAlarmProps(prop, warningThreshold, criticalThreshold, warningAlarmActions, criticalAlarmActions, warningDefaultThreshold, criticalDefaultThreshold) {
|
|
6
|
+
let alarmProps = {};
|
|
7
|
+
if (criticalThreshold !== undefined) {
|
|
8
|
+
alarmProps.Critical = {
|
|
9
|
+
[prop]: criticalThreshold,
|
|
10
|
+
actionsEnabled: true,
|
|
11
|
+
actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: criticalAlarmActions })
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
else if (criticalDefaultThreshold !== undefined) {
|
|
15
|
+
alarmProps.Critical = {
|
|
16
|
+
[prop]: criticalDefaultThreshold,
|
|
17
|
+
actionsEnabled: true,
|
|
18
|
+
actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: criticalAlarmActions })
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
if (warningThreshold !== undefined) {
|
|
22
|
+
alarmProps.Warning = {
|
|
23
|
+
[prop]: warningThreshold,
|
|
24
|
+
actionsEnabled: true,
|
|
25
|
+
actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: warningAlarmActions })
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
else if (warningDefaultThreshold !== undefined) {
|
|
29
|
+
alarmProps.Warning = {
|
|
30
|
+
[prop]: warningDefaultThreshold,
|
|
31
|
+
actionsEnabled: true,
|
|
32
|
+
actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: warningAlarmActions })
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
return Object.keys(alarmProps).length > 0 ? alarmProps : undefined;
|
|
36
|
+
}
|
|
37
|
+
exports.toAlarmProps = toAlarmProps;
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHlEQUFrRTtBQUVsRSxTQUFnQixZQUFZLENBQzFCLElBQVksRUFDWixnQkFBb0MsRUFDcEMsaUJBQXFDLEVBQ3JDLG1CQUFvQyxFQUNwQyxvQkFBcUMsRUFDckMsdUJBQTJDLEVBQzNDLHdCQUE0QztJQUU1QyxJQUFJLFVBQVUsR0FBeUMsRUFBRSxDQUFBO0lBQ3pELElBQUksaUJBQWlCLEtBQUssU0FBUyxFQUFFO1FBQ25DLFVBQVUsQ0FBQyxRQUFRLEdBQUc7WUFDcEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUI7WUFDekIsY0FBYyxFQUFFLElBQUk7WUFDcEIsY0FBYyxFQUFFLElBQUksNkNBQTRCLENBQUMsRUFBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUMsQ0FBQztTQUNsRixDQUFBO0tBQ0Y7U0FBTSxJQUFJLHdCQUF3QixLQUFLLFNBQVMsRUFBRTtRQUNqRCxVQUFVLENBQUMsUUFBUSxHQUFHO1lBQ3BCLENBQUMsSUFBSSxDQUFDLEVBQUUsd0JBQXdCO1lBQ2hDLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLGNBQWMsRUFBRSxJQUFJLDZDQUE0QixDQUFDLEVBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFDLENBQUM7U0FDbEYsQ0FBQTtLQUNGO0lBQ0QsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7UUFDbEMsVUFBVSxDQUFDLE9BQU8sR0FBRztZQUNuQixDQUFDLElBQUksQ0FBQyxFQUFFLGdCQUFnQjtZQUN4QixjQUFjLEVBQUUsSUFBSTtZQUNwQixjQUFjLEVBQUUsSUFBSSw2Q0FBNEIsQ0FBQyxFQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBQyxDQUFDO1NBQ2pGLENBQUE7S0FDRjtTQUFNLElBQUksdUJBQXVCLEtBQUssU0FBUyxFQUFFO1FBQ2hELFVBQVUsQ0FBQyxPQUFPLEdBQUc7WUFDbkIsQ0FBQyxJQUFJLENBQUMsRUFBRSx1QkFBdUI7WUFDL0IsY0FBYyxFQUFFLElBQUk7WUFDcEIsY0FBYyxFQUFFLElBQUksNkNBQTRCLENBQUMsRUFBQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUMsQ0FBQztTQUNqRixDQUFBO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7QUFDcEUsQ0FBQztBQXJDRCxvQ0FxQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0R1cmF0aW9ufSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7SUFsYXJtQWN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7Q3VzdG9tQWxhcm1UaHJlc2hvbGR9IGZyb20gXCJjZGstbW9uaXRvcmluZy1jb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1N0YW5kYXJkQWxhcm1BY3Rpb25zU3RyYXRlZ3l9IGZyb20gXCIuLi8uLi9hd3MtbW9uaXRvcmluZ1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9BbGFybVByb3BzKFxuICBwcm9wOiBzdHJpbmcsXG4gIHdhcm5pbmdUaHJlc2hvbGQ/OiBudW1iZXIgfCBEdXJhdGlvbixcbiAgY3JpdGljYWxUaHJlc2hvbGQ/OiBudW1iZXIgfCBEdXJhdGlvbixcbiAgd2FybmluZ0FsYXJtQWN0aW9ucz86IElBbGFybUFjdGlvbltdLFxuICBjcml0aWNhbEFsYXJtQWN0aW9ucz86IElBbGFybUFjdGlvbltdLFxuICB3YXJuaW5nRGVmYXVsdFRocmVzaG9sZD86IG51bWJlciB8IER1cmF0aW9uLFxuICBjcml0aWNhbERlZmF1bHRUaHJlc2hvbGQ/OiBudW1iZXIgfCBEdXJhdGlvblxuKTogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWxhcm1UaHJlc2hvbGQ+IHwgdW5kZWZpbmVkIHtcbiAgbGV0IGFsYXJtUHJvcHM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFsYXJtVGhyZXNob2xkPiA9IHt9XG4gIGlmIChjcml0aWNhbFRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWxhcm1Qcm9wcy5Dcml0aWNhbCA9IHtcbiAgICAgIFtwcm9wXTogY3JpdGljYWxUaHJlc2hvbGQsXG4gICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGFjdGlvbk92ZXJyaWRlOiBuZXcgU3RhbmRhcmRBbGFybUFjdGlvbnNTdHJhdGVneSh7YWN0aW9uczogY3JpdGljYWxBbGFybUFjdGlvbnN9KVxuICAgIH1cbiAgfSBlbHNlIGlmIChjcml0aWNhbERlZmF1bHRUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFsYXJtUHJvcHMuQ3JpdGljYWwgPSB7XG4gICAgICBbcHJvcF06IGNyaXRpY2FsRGVmYXVsdFRocmVzaG9sZCxcbiAgICAgIGFjdGlvbnNFbmFibGVkOiB0cnVlLFxuICAgICAgYWN0aW9uT3ZlcnJpZGU6IG5ldyBTdGFuZGFyZEFsYXJtQWN0aW9uc1N0cmF0ZWd5KHthY3Rpb25zOiBjcml0aWNhbEFsYXJtQWN0aW9uc30pXG4gICAgfVxuICB9XG4gIGlmICh3YXJuaW5nVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbGFybVByb3BzLldhcm5pbmcgPSB7XG4gICAgICBbcHJvcF06IHdhcm5pbmdUaHJlc2hvbGQsXG4gICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGFjdGlvbk92ZXJyaWRlOiBuZXcgU3RhbmRhcmRBbGFybUFjdGlvbnNTdHJhdGVneSh7YWN0aW9uczogd2FybmluZ0FsYXJtQWN0aW9uc30pXG4gICAgfVxuICB9IGVsc2UgaWYgKHdhcm5pbmdEZWZhdWx0VGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbGFybVByb3BzLldhcm5pbmcgPSB7XG4gICAgICBbcHJvcF06IHdhcm5pbmdEZWZhdWx0VGhyZXNob2xkLFxuICAgICAgYWN0aW9uc0VuYWJsZWQ6IHRydWUsXG4gICAgICBhY3Rpb25PdmVycmlkZTogbmV3IFN0YW5kYXJkQWxhcm1BY3Rpb25zU3RyYXRlZ3koe2FjdGlvbnM6IHdhcm5pbmdBbGFybUFjdGlvbnN9KVxuICAgIH1cbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMoYWxhcm1Qcm9wcykubGVuZ3RoID4gMCA/IGFsYXJtUHJvcHMgOiB1bmRlZmluZWRcbn1cbiJdfQ==
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export * from './standard-
|
|
1
|
+
export * from './standard-function';
|
|
2
|
+
export * from './python-function';
|
package/aws-lambda/lib/index.js
CHANGED
|
@@ -10,5 +10,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
10
10
|
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
|
|
11
11
|
};
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
__exportStar(require("./standard-
|
|
14
|
-
|
|
13
|
+
__exportStar(require("./standard-function"), exports);
|
|
14
|
+
__exportStar(require("./python-function"), exports);
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzREFBb0M7QUFDcEMsb0RBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zdGFuZGFyZC1mdW5jdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3B5dGhvbi1mdW5jdGlvbic7XG4iXX0=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { StandardFunctionProps } from "./standard-function";
|
|
2
|
+
import { Alias, Function, Runtime } from "aws-cdk-lib/aws-lambda";
|
|
3
|
+
import { Construct } from "constructs";
|
|
4
|
+
import { MonitoringFacade } from "cdk-monitoring-constructs";
|
|
5
|
+
import { LogAlarm } from "../../aws-cloudwatch";
|
|
6
|
+
import { LambdaDeploymentGroup } from "aws-cdk-lib/aws-codedeploy";
|
|
7
|
+
export interface PythonFunctionProps extends StandardFunctionProps {
|
|
8
|
+
/**
|
|
9
|
+
* The runtime environment for the Lambda function. Must be one of the Python runtimes.
|
|
10
|
+
*
|
|
11
|
+
* @default Runtime.PYTHON_3_9
|
|
12
|
+
*/
|
|
13
|
+
readonly runtime?: Runtime;
|
|
14
|
+
/**
|
|
15
|
+
* Location on the filesystem the Lambda assets are found.
|
|
16
|
+
*
|
|
17
|
+
* Example: path.join(__dirname, '..', 'mylambda')
|
|
18
|
+
*/
|
|
19
|
+
readonly entry: string;
|
|
20
|
+
/**
|
|
21
|
+
* File containing the handler.
|
|
22
|
+
*
|
|
23
|
+
* @default 'index.py'
|
|
24
|
+
*/
|
|
25
|
+
readonly index?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Exported handler function
|
|
28
|
+
*
|
|
29
|
+
* @default 'handler'
|
|
30
|
+
*/
|
|
31
|
+
readonly handler?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class PythonFunction extends Construct {
|
|
34
|
+
static readonly DEFAULT_LOG_METRIC_PATTERN = "\"[ERROR]\"";
|
|
35
|
+
static readonly DEFAULT_LOG_INSIGHTS_PATTERN = "\\[ERROR\\]";
|
|
36
|
+
readonly monitoring: MonitoringFacade;
|
|
37
|
+
readonly function: Function;
|
|
38
|
+
readonly alias: Alias;
|
|
39
|
+
readonly deploymentGroup: LambdaDeploymentGroup;
|
|
40
|
+
readonly criticalLogAlarm: LogAlarm;
|
|
41
|
+
readonly warningLogAlarm: LogAlarm;
|
|
42
|
+
constructor(scope: Construct, id: string, props: PythonFunctionProps);
|
|
43
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PythonFunction = void 0;
|
|
4
|
+
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
5
|
+
const constructs_1 = require("constructs");
|
|
6
|
+
const cdk_monitoring_constructs_1 = require("cdk-monitoring-constructs");
|
|
7
|
+
const aws_cloudwatch_1 = require("../../aws-cloudwatch");
|
|
8
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
9
|
+
const fs = require("fs");
|
|
10
|
+
const path = require("path");
|
|
11
|
+
const logs = require("aws-cdk-lib/aws-logs");
|
|
12
|
+
const aws_cloudwatch_actions_1 = require("aws-cdk-lib/aws-cloudwatch-actions");
|
|
13
|
+
const helper_1 = require("./helper");
|
|
14
|
+
const aws_codedeploy_1 = require("aws-cdk-lib/aws-codedeploy");
|
|
15
|
+
class PythonFunction extends constructs_1.Construct {
|
|
16
|
+
constructor(scope, id, props) {
|
|
17
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3;
|
|
18
|
+
super(scope, id);
|
|
19
|
+
this.monitoring = new cdk_monitoring_constructs_1.MonitoringFacade(this, 'Monitoring', {
|
|
20
|
+
metricFactoryDefaults: {},
|
|
21
|
+
alarmFactoryDefaults: {
|
|
22
|
+
actionsEnabled: true,
|
|
23
|
+
alarmNamePrefix: scope.node.path.replace(/\//g, '-'),
|
|
24
|
+
},
|
|
25
|
+
dashboardFactory: props.dashboardFactory
|
|
26
|
+
});
|
|
27
|
+
let bundling = fs.existsSync(path.join(props.entry, 'requirements.txt')) ? {
|
|
28
|
+
image: (_b = (_a = props.runtime) === null || _a === void 0 ? void 0 : _a.bundlingImage) !== null && _b !== void 0 ? _b : aws_lambda_1.Runtime.PYTHON_3_9.bundlingImage,
|
|
29
|
+
command: [
|
|
30
|
+
'bash', '-c', [
|
|
31
|
+
'pip install --target /asset-output/ -r requirements.txt',
|
|
32
|
+
'cp -ra * /asset-output/'
|
|
33
|
+
].join('&&')
|
|
34
|
+
],
|
|
35
|
+
outputType: aws_cdk_lib_1.BundlingOutput.NOT_ARCHIVED,
|
|
36
|
+
} : undefined;
|
|
37
|
+
this.function = new aws_lambda_1.Function(this, id, {
|
|
38
|
+
runtime: (_c = props.runtime) !== null && _c !== void 0 ? _c : aws_lambda_1.Runtime.PYTHON_3_9,
|
|
39
|
+
tracing: (_d = props.tracing) !== null && _d !== void 0 ? _d : aws_lambda_1.Tracing.PASS_THROUGH,
|
|
40
|
+
logRetention: (_e = props.logRetention) !== null && _e !== void 0 ? _e : logs.RetentionDays.THREE_DAYS,
|
|
41
|
+
architecture: (_f = props.architecture) !== null && _f !== void 0 ? _f : aws_lambda_1.Architecture.ARM_64,
|
|
42
|
+
vpc: props.vpc,
|
|
43
|
+
vpcSubnets: props.vpcSubnets,
|
|
44
|
+
memorySize: (_g = props.memorySize) !== null && _g !== void 0 ? _g : 768,
|
|
45
|
+
timeout: (_h = props.timeout) !== null && _h !== void 0 ? _h : aws_cdk_lib_1.Duration.seconds(30),
|
|
46
|
+
environment: props.environment,
|
|
47
|
+
description: props.description,
|
|
48
|
+
code: aws_lambda_1.Code.fromAsset(props.entry, { bundling }),
|
|
49
|
+
handler: ((_j = props.index) !== null && _j !== void 0 ? _j : 'index.py').replace('.py', '') + '.' + ((_k = props.handler) !== null && _k !== void 0 ? _k : 'handler'),
|
|
50
|
+
});
|
|
51
|
+
if (props.deploymentProps !== undefined) {
|
|
52
|
+
this.alias = new aws_lambda_1.Alias(this, 'Alias', {
|
|
53
|
+
aliasName: props.deploymentProps.aliasName,
|
|
54
|
+
version: this.function.currentVersion
|
|
55
|
+
});
|
|
56
|
+
this.deploymentGroup = new aws_codedeploy_1.LambdaDeploymentGroup(this, 'DeployGroup', {
|
|
57
|
+
alias: this.alias,
|
|
58
|
+
deploymentConfig: props.deploymentProps.config
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const warnProps = props.warningAlarmProps;
|
|
62
|
+
const warnActions = [];
|
|
63
|
+
(_l = warnProps === null || warnProps === void 0 ? void 0 : warnProps.notifyActions) === null || _l === void 0 ? void 0 : _l.forEach((action) => warnActions.push(action));
|
|
64
|
+
(_m = warnProps === null || warnProps === void 0 ? void 0 : warnProps.notifyTopics) === null || _m === void 0 ? void 0 : _m.forEach((topic) => warnActions.push(new aws_cloudwatch_actions_1.SnsAction(topic)));
|
|
65
|
+
const critProps = props.criticalAlarmProps;
|
|
66
|
+
const critActions = [];
|
|
67
|
+
(_o = critProps === null || critProps === void 0 ? void 0 : critProps.notifyActions) === null || _o === void 0 ? void 0 : _o.forEach((action) => critActions.push(action));
|
|
68
|
+
(_p = critProps === null || critProps === void 0 ? void 0 : critProps.notifyTopics) === null || _p === void 0 ? void 0 : _p.forEach((topic) => critActions.push(new aws_cloudwatch_actions_1.SnsAction(topic)));
|
|
69
|
+
this.monitoring.monitorLambdaFunction({
|
|
70
|
+
lambdaFunction: this.function,
|
|
71
|
+
lambdaInsightsEnabled: true,
|
|
72
|
+
addToAlarmDashboard: true,
|
|
73
|
+
addToDetailDashboard: true,
|
|
74
|
+
addToSummaryDashboard: true,
|
|
75
|
+
addLatencyP50Alarm: helper_1.toAlarmProps('maxLatency', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p50Latency, critProps === null || critProps === void 0 ? void 0 : critProps.p50Latency, warnActions, critActions),
|
|
76
|
+
addLatencyP90Alarm: helper_1.toAlarmProps('maxLatency', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p90Latency, critProps === null || critProps === void 0 ? void 0 : critProps.p90Latency, warnActions, critActions),
|
|
77
|
+
addLatencyP99Alarm: helper_1.toAlarmProps('maxLatency', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p99Latency, critProps === null || critProps === void 0 ? void 0 : critProps.p99Latency, warnActions, critActions),
|
|
78
|
+
addFaultCountAlarm: helper_1.toAlarmProps('maxErrorCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxFaults, critProps === null || critProps === void 0 ? void 0 : critProps.maxFaults, warnActions, critActions, undefined, 0),
|
|
79
|
+
addFaultRateAlarm: helper_1.toAlarmProps('maxErrorRate', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgFaults, critProps === null || critProps === void 0 ? void 0 : critProps.avgFaults, warnActions, critActions),
|
|
80
|
+
addLowTpsAlarm: helper_1.toAlarmProps('minTps', warnProps === null || warnProps === void 0 ? void 0 : warnProps.minTps, critProps === null || critProps === void 0 ? void 0 : critProps.minTps, warnActions, critActions),
|
|
81
|
+
addHighTpsAlarm: helper_1.toAlarmProps('maxTps', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxTps, critProps === null || critProps === void 0 ? void 0 : critProps.maxTps, warnActions, critActions),
|
|
82
|
+
addThrottlesCountAlarm: helper_1.toAlarmProps('maxErrorCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxThrottles, critProps === null || critProps === void 0 ? void 0 : critProps.maxThrottles, warnActions, critActions, undefined, 0),
|
|
83
|
+
addThrottlesRateAlarm: helper_1.toAlarmProps('maxErrorRate', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgThrottles, critProps === null || critProps === void 0 ? void 0 : critProps.avgThrottles, warnActions, critActions),
|
|
84
|
+
addConcurrentExecutionsCountAlarm: helper_1.toAlarmProps('maxRunningTasks', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxConcurrentExecutions, critProps === null || critProps === void 0 ? void 0 : critProps.maxConcurrentExecutions, warnActions, critActions),
|
|
85
|
+
addMaxIteratorAgeAlarm: helper_1.toAlarmProps('maxAgeInMillis', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxIteratorAge, critProps === null || critProps === void 0 ? void 0 : critProps.maxIteratorAge, warnActions, critActions),
|
|
86
|
+
addEnhancedMonitoringMaxCpuTotalTimeAlarm: helper_1.toAlarmProps('maxDuration', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxCpuTime, critProps === null || critProps === void 0 ? void 0 : critProps.maxCpuTime, warnActions, critActions),
|
|
87
|
+
addEnhancedMonitoringP90CpuTotalTimeAlarm: helper_1.toAlarmProps('maxDuration', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p90CpuTime, critProps === null || critProps === void 0 ? void 0 : critProps.p90CpuTime, warnActions, critActions),
|
|
88
|
+
addEnhancedMonitoringAvgCpuTotalTimeAlarm: helper_1.toAlarmProps('maxDuration', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgCpuTime, critProps === null || critProps === void 0 ? void 0 : critProps.avgCpuTime, warnActions, critActions),
|
|
89
|
+
addEnhancedMonitoringMaxMemoryUtilizationAlarm: helper_1.toAlarmProps('maxUsagePercent', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxMemory, critProps === null || critProps === void 0 ? void 0 : critProps.maxMemory, warnActions, critActions),
|
|
90
|
+
addEnhancedMonitoringP90MemoryUtilizationAlarm: helper_1.toAlarmProps('maxUsagePercent', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p90Memory, critProps === null || critProps === void 0 ? void 0 : critProps.p90Memory, warnActions, critActions),
|
|
91
|
+
addEnhancedMonitoringAvgMemoryUtilizationAlarm: helper_1.toAlarmProps('maxUsagePercent', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgMemory, critProps === null || critProps === void 0 ? void 0 : critProps.avgMemory, warnActions, critActions),
|
|
92
|
+
});
|
|
93
|
+
// Add log monitoring to dashboard
|
|
94
|
+
let critMaxLogCount = (_r = (_q = props.criticalAlarmProps) === null || _q === void 0 ? void 0 : _q.maxLogCount) !== null && _r !== void 0 ? _r : 1;
|
|
95
|
+
let pattern = '';
|
|
96
|
+
if (critMaxLogCount > 0) {
|
|
97
|
+
pattern = (_t = (_s = props.criticalAlarmProps) === null || _s === void 0 ? void 0 : _s.dashboardLogPattern) !== null && _t !== void 0 ? _t : PythonFunction.DEFAULT_LOG_INSIGHTS_PATTERN;
|
|
98
|
+
}
|
|
99
|
+
if (((_u = props.warningAlarmProps) === null || _u === void 0 ? void 0 : _u.maxLogCount) !== undefined && pattern !== props.warningAlarmProps.dashboardLogPattern) {
|
|
100
|
+
pattern += (pattern !== '' ? '|' : '') + props.warningAlarmProps.dashboardLogPattern;
|
|
101
|
+
}
|
|
102
|
+
if (pattern !== '') {
|
|
103
|
+
this.monitoring.monitorLog({
|
|
104
|
+
logGroupName: this.function.logGroup.logGroupName,
|
|
105
|
+
pattern,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
// Add critical log alarm
|
|
109
|
+
if (critMaxLogCount > 0) {
|
|
110
|
+
this.criticalLogAlarm = new aws_cloudwatch_1.LogAlarm(this, 'LogsCritical', {
|
|
111
|
+
logGroup: this.function.logGroup,
|
|
112
|
+
pattern: (_w = (_v = props.criticalAlarmProps) === null || _v === void 0 ? void 0 : _v.metricLogPattern) !== null && _w !== void 0 ? _w : PythonFunction.DEFAULT_LOG_METRIC_PATTERN,
|
|
113
|
+
threshold: critMaxLogCount,
|
|
114
|
+
evaluationPeriods: 3
|
|
115
|
+
});
|
|
116
|
+
if (((_x = props.criticalAlarmProps) === null || _x === void 0 ? void 0 : _x.notifyActions) !== undefined) {
|
|
117
|
+
this.criticalLogAlarm.addAlarmActions(props.criticalAlarmProps.notifyActions);
|
|
118
|
+
}
|
|
119
|
+
if (((_y = props.criticalAlarmProps) === null || _y === void 0 ? void 0 : _y.notifyTopics) !== undefined) {
|
|
120
|
+
this.criticalLogAlarm.addAlarmTopics(props.criticalAlarmProps.notifyTopics);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Add warning log alarm
|
|
124
|
+
if (((_z = props.warningAlarmProps) === null || _z === void 0 ? void 0 : _z.maxLogCount) !== undefined && props.warningAlarmProps.maxLogCount > 0) {
|
|
125
|
+
this.warningLogAlarm = new aws_cloudwatch_1.LogAlarm(this, 'LogsWarning', {
|
|
126
|
+
logGroup: this.function.logGroup,
|
|
127
|
+
pattern: (_1 = (_0 = props.warningAlarmProps) === null || _0 === void 0 ? void 0 : _0.metricLogPattern) !== null && _1 !== void 0 ? _1 : PythonFunction.DEFAULT_LOG_METRIC_PATTERN,
|
|
128
|
+
threshold: props.warningAlarmProps.maxLogCount,
|
|
129
|
+
evaluationPeriods: 3
|
|
130
|
+
});
|
|
131
|
+
if (((_2 = props.warningAlarmProps) === null || _2 === void 0 ? void 0 : _2.notifyActions) !== undefined) {
|
|
132
|
+
this.warningLogAlarm.addAlarmActions(props.warningAlarmProps.notifyActions);
|
|
133
|
+
}
|
|
134
|
+
if (((_3 = props.warningAlarmProps) === null || _3 === void 0 ? void 0 : _3.notifyTopics) !== undefined) {
|
|
135
|
+
this.warningLogAlarm.addAlarmTopics(props.warningAlarmProps.notifyTopics);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.PythonFunction = PythonFunction;
|
|
141
|
+
PythonFunction.DEFAULT_LOG_METRIC_PATTERN = '"[ERROR]"';
|
|
142
|
+
PythonFunction.DEFAULT_LOG_INSIGHTS_PATTERN = '\\\[ERROR\\\]';
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHl0aG9uLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHVEQUE2RjtBQUM3RiwyQ0FBcUM7QUFDckMseUVBT21DO0FBQ25DLHlEQUE4QztBQUM5Qyw2Q0FBc0U7QUFDdEUseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw2Q0FBNkM7QUFFN0MsK0VBQTZEO0FBQzdELHFDQUFzQztBQUN0QywrREFBaUU7QUFpQ2pFLE1BQWEsY0FBZSxTQUFRLHNCQUFTO0lBVzNDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7O1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLDRDQUFnQixDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDekQscUJBQXFCLEVBQUUsRUFBRTtZQUN6QixvQkFBb0IsRUFBRTtnQkFDcEIsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLGVBQWUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQzthQUNyRDtZQUNELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7U0FDekMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxRQUFRLEdBQWdDLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEcsS0FBSyxjQUFFLEtBQUssQ0FBQyxPQUFPLDBDQUFFLGFBQWEsbUNBQUUsb0JBQU8sQ0FBQyxVQUFVLENBQUMsYUFBYTtZQUNyRSxPQUFPLEVBQUU7Z0JBQ1AsTUFBTSxFQUFFLElBQUksRUFBRTtvQkFDWix5REFBeUQ7b0JBQ3pELHlCQUF5QjtpQkFDMUIsQ0FBQyxJQUFJLENB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WUFBWSxDQUFDLENBQUM7YUFDM0U7U0FDRjtJQUNILENBQUM7O0FBOUlILHdDQStJQztBQTdJaUIseUNBQTBCLEdBQUcsV0FBVyxDQUFDO0FBQ3pDLDJDQUE0QixHQUFHLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U3RhbmRhcmRGdW5jdGlvblByb3BzfSBmcm9tIFwiLi9zdGFuZGFyZC1mdW5jdGlvblwiO1xuaW1wb3J0IHtBbGlhcywgQXJjaGl0ZWN0dXJlLCBDb2RlLCBGdW5jdGlvbiwgUnVudGltZSwgVHJhY2luZ30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgRHVyYXRpb25UaHJlc2hvbGQsXG4gIEVycm9yQ291bnRUaHJlc2hvbGQsXG4gIEVycm9yUmF0ZVRocmVzaG9sZCwgSGlnaFRwc1RocmVzaG9sZCxcbiAgTGF0ZW5jeVRocmVzaG9sZCxcbiAgTG93VHBzVGhyZXNob2xkLCBNYXhBZ2VUaHJlc2hvbGQsXG4gIE1vbml0b3JpbmdGYWNhZGUsIFJ1bm5pbmdUYXNrQ291bnRUaHJlc2hvbGQsIFVzYWdlVGhyZXNob2xkXG59IGZyb20gXCJjZGstbW9uaXRvcmluZy1jb25zdHJ1Y3RzXCI7XG5pbXBvcnQge0xvZ0FsYXJtfSBmcm9tIFwiLi4vLi4vYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7QnVuZGxpbmdPcHRpb25zLCBCdW5kbGluZ091dHB1dCwgRHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xuaW1wb3J0IHtJQWxhcm1BY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0IHtTbnNBY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaC1hY3Rpb25zXCI7XG5pbXBvcnQge3RvQWxhcm1Qcm9wc30gZnJvbSBcIi4vaGVscGVyXCI7XG5pbXBvcnQge0xhbWJkYURlcGxveW1lbnRHcm91cH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2RlZGVwbG95XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHl0aG9uRnVuY3Rpb25Qcm9wcyBleHRlbmRzIFN0YW5kYXJkRnVuY3Rpb25Qcm9wcyB7XG5cbiAgLyoqXG4gICAqIFRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uLiBNdXN0IGJlIG9uZSBvZiB0aGUgUHl0aG9uIHJ1bnRpbWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSdW50aW1lLlBZVEhPTl8zXzlcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU/OiBSdW50aW1lO1xuXG4gIC8qKlxuICAgKiBMb2NhdGlvbiBvbiB0aGUgZmlsZXN5c3RlbSB0aGUgTGFtYmRhIGFzc2V0cyBhcmUgZm91bmQuXG4gICAqXG4gICAqIEV4YW1wbGU6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdteWxhbWJkYScpXG4gICAqL1xuICByZWFkb25seSBlbnRyeTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEZpbGUgY29udGFpbmluZyB0aGUgaGFuZGxlci5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2luZGV4LnB5J1xuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXg/OiBzdHJpbmdcblxuICAvKipcbiAgICogRXhwb3J0ZWQgaGFuZGxlciBmdW5jdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAnaGFuZGxlcidcbiAgICovXG4gIHJlYWRvbmx5IGhhbmRsZXI/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFB5dGhvbkZ1bmN0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcblxuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9MT0dfTUVUUklDX1BBVFRFUk4gPSAnXCJbRVJST1JdXCInO1xuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9MT0dfSU5TSUdIVFNfUEFUVEVSTiA9ICdcXFxcXFxbRVJST1JcXFxcXFxdJztcbiAgcmVhZG9ubHkgZGVjbGFyZSBtb25pdG9yaW5nOiBNb25pdG9yaW5nRmFjYWRlXG4gIHJlYWRvbmx5IGRlY2xhcmUgZnVuY3Rpb246IEZ1bmN0aW9uO1xuICByZWFkb25seSBkZWNsYXJlIGFsaWFzOiBBbGlhcztcbiAgcmVhZG9ubHkgZGVjbGFyZSBkZXBsb3ltZW50R3JvdXA6IExhbWJkYURlcGxveW1lbnRHcm91cDtcbiAgcmVhZG9ubHkgZGVjbGFyZSBjcml0aWNhbExvZ0FsYXJtOiBMb2dBbGFybTtcbiAgcmVhZG9ubHkgZGVjbGFyZSB3YXJuaW5nTG9nQWxhcm06IExvZ0FsYXJtO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQeXRob25GdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMubW9uaXRvcmluZyA9IG5ldyBNb25pdG9yaW5nRmFjYWRlKHRoaXMsICdNb25pdG9yaW5nJywge1xuICAgICAgbWV0cmljRmFjdG9yeURlZmF1bHRzOiB7fSxcbiAgICAgIGFsYXJtRmFjdG9yeURlZmF1bHRzOiB7XG4gICAgICAgIGFjdGlvbnNFbmFibGVkOiB0cnVlLFxuICAgICAgICBhbGFybU5hbWVQcmVmaXg6IHNjb3BlLm5vZGUucGF0aC5yZXBsYWNlKC9cXC8vZywgJy0nKSxcbiAgICAgIH0sXG4gICAgICBkYXNoYm9hcmRGYWN0b3J5OiBwcm9wcy5kYXNoYm9hcmRGYWN0b3J5XG4gICAgfSk7XG5cbiAgICBsZXQgYnVuZGxpbmc6IEJ1bmRsaW5nT3B0aW9ucyB8IHVuZGVmaW5lZCA9IGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKHByb3BzLmVudHJ5LCAncmVxdWlyZW1lbnRzLnR4dCcpKSA/IHtcbiAgICAgIGltYWdlOiBwcm9wcy5ydW50aW1lPy5idW5kbGluZ0ltYWdlPz9SdW50aW1lLlBZVEhPTl8zXzkuYnVuZGxpbmdJbWFnZSxcbiAgICAgIGNvbW1hbmQ6IFtcbiAgICAgICAgJ2Jhc2gnLCAnLWMnLCBbXG4gICAgICAgICAgJ3BpcCBpbnN0YWxsIC0tdGFyZ2V0IC9hc3NldC1vdXRwdXQvIC1yIHJlcXVpcmVtZW50cy50eHQnLFxuICAgICAgICAgICdjcCAtcmEgKiAvYXNzZXQtb3V0cHV0LydcbiAgICAgICAgXS5qb2luKCcmJicpXG4gICAgICBdLFxuICAgICAgb3V0cHV0VHlwZTogQnVuZGxpbmdPdXRwdXQuTk9UX0FSQ0hJVkVELFxuICAgIH0gOiB1bmRlZmluZWRcblxuICAgIHRoaXMuZnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24odGhpcywgaWQsIHtcbiAgICAgIHJ1bnRpbWU6IHByb3BzLnJ1bnRpbWU/P1J1bnRpbWUuUFlUSE9OXzNfOSxcbiAgICAgIHRyYWNpbmc6IHByb3BzLnRyYWNpbmc/P1RyYWNpbmcuUEFTU19USFJPVUdILFxuICAgICAgbG9nUmV0ZW50aW9uOiBwcm9wcy5sb2dSZXRlbnRpb24/P2xvZ3MuUmV0ZW50aW9uRGF5cy5USFJFRV9EQVlTLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBwcm9wcy5hcmNoaXRlY3R1cmU/P0FyY2hpdGVjdHVyZS5BUk1fNjQsXG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIHZwY1N1Ym5ldHM6IHByb3BzLnZwY1N1Ym5ldHMsXG4gICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplPz83NjgsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0Pz9EdXJhdGlvbi5zZWNvbmRzKDMwKSxcbiAgICAgIGVudmlyb25tZW50OiBwcm9wcy5lbnZpcm9ubWVudCxcbiAgICAgIGRlc2NyaXB0aW9uOiBwcm9wcy5kZXNjcmlwdGlvbixcbiAgICAgIGNvZGU6IENvZGUuZnJvbUFzc2V0KHByb3BzLmVudHJ5LCB7YnVuZGxpbmd9KSxcbiAgICAgIGhhbmRsZXI6IChwcm9wcy5pbmRleD8/J2luZGV4LnB5JykucmVwbGFjZSgnLnB5JywgJycpICsgJy4nICsgKHByb3BzLmhhbmRsZXI/PydoYW5kbGVyJyksXG4gICAgfSk7XG5cbiAgICBpZiAocHJvcHMuZGVwbG95bWVudFByb3BzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuYWxpYXMgPSBuZXcgQWxpYXModGhpcywgJ0FsaWFzJywge1xuICAgICAgICBhbGlhc05hbWU6IHByb3BzLmRlcGxveW1lbnRQcm9wcy5hbGlhc05hbWUsXG4gICAgICAgIHZlcnNpb246IHRoaXMuZnVuY3Rpb24uY3VycmVudFZlcnNpb25cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmRlcGxveW1lbnRHcm91cCA9IG5ldyBMYW1iZGFEZXBsb3ltZW50R3JvdXAodGhpcywgJ0RlcGxveUdyb3VwJywge1xuICAgICAgICBhbGlhczogdGhpcy5hbGlhcyxcbiAgICAgICAgZGVwbG95bWVudENvbmZpZzogcHJvcHMuZGVwbG95bWVudFByb3BzLmNvbmZpZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2FyblByb3BzID0gcHJvcHMud2FybmluZ0FsYXJtUHJvcHM7XG4gICAgY29uc3Qgd2FybkFjdGlvbnM6IElBbGFybUFjdGlvbltdID0gW107XG4gICAgd2FyblByb3BzPy5ub3RpZnlBY3Rpb25zPy5mb3JFYWNoKChhY3Rpb24pID0+IHdhcm5BY3Rpb25zLnB1c2goYWN0aW9uKSk7XG4gICAgd2FyblByb3BzPy5ub3RpZnlUb3BpY3M/LmZvckVhY2goKHRvcGljKSA9PiB3YXJuQWN0aW9ucy5wdXNoKG5ldyBTbnNBY3Rpb24odG9waWMpKSk7XG4gICAgY29uc3QgY3JpdFByb3BzID0gcHJvcHMuY3JpdGljYWxBbGFybVByb3BzO1xuICAgIGNvbnN0IGNyaXRBY3Rpb25zOiBJQWxhcm1BY3Rpb25bXSA9IFtdO1xuICAgIGNyaXRQcm9wcz8ubm90aWZ5QWN0aW9ucz8uZm9yRWFjaCgoYWN0aW9uKSA9PiBjcml0QWN0aW9ucy5wdXNoKGFjdGlvbikpO1xuICAgIGNyaXRQcm9wcz8ubm90aWZ5VG9waWNzPy5mb3JFYWNoKCh0b3BpYykgPT4gY3JpdEFjdGlvbnMucHVzaChuZXcgU25zQWN0aW9uKHRvcGljKSkpO1xuXG4gICAgdGhpcy5tb25pdG9yaW5nLm1vbml0b3JMYW1iZGFGdW5jdGlvbih7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5mdW5jdGlvbixcbiAgICAgIGxhbWJkYUluc2lnaHRzRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGFkZFRvQWxhcm1EYXNoYm9hcmQ6IHRydWUsXG4gICAgICBhZGRUb0RldGFpbERhc2hib2FyZDogdHJ1ZSxcbiAgICAgIGFkZFRvU3VtbWFyeURhc2hib2FyZDogdHJ1ZSxcbiAgICAgIGFkZExhdGVuY3lQNTBBbGFybTogdG9BbGFybVByb3BzKCdtYXhMYXRlbmN5Jywgd2FyblByb3BzPy5wNTBMYXRlbmN5LCBjcml0UHJvcHM/LnA1MExhdGVuY3ksIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTGF0ZW5jeVRocmVzaG9sZD4sXG4gICAgICBhZGRMYXRlbmN5UDkwQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4TGF0ZW5jeScsIHdhcm5Qcm9wcz8ucDkwTGF0ZW5jeSwgY3JpdFByb3BzPy5wOTBMYXRlbmN5LCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+LFxuICAgICAgYWRkTGF0ZW5jeVA5OUFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heExhdGVuY3knLCB3YXJuUHJvcHM/LnA5OUxhdGVuY3ksIGNyaXRQcm9wcz8ucDk5TGF0ZW5jeSwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPixcbiAgICAgIGFkZEZhdWx0Q291bnRBbGFybTogdG9BbGFybVByb3BzKCdtYXhFcnJvckNvdW50Jywgd2FyblByb3BzPy5tYXhGYXVsdHMsIGNyaXRQcm9wcz8ubWF4RmF1bHRzLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMsIHVuZGVmaW5lZCwgMCkgYXMgUmVjb3JkPHN0cmluZywgRXJyb3JDb3VudFRocmVzaG9sZD4sXG4gICAgICBhZGRGYXVsdFJhdGVBbGFybTogdG9BbGFybVByb3BzKCdtYXhFcnJvclJhdGUnLCB3YXJuUHJvcHM/LmF2Z0ZhdWx0cywgY3JpdFByb3BzPy5hdmdGYXVsdHMsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgRXJyb3JSYXRlVGhyZXNob2xkPixcbiAgICAgIGFkZExvd1Rwc0FsYXJtOiB0b0FsYXJtUHJvcHMoJ21pblRwcycsIHdhcm5Qcm9wcz8ubWluVHBzLCBjcml0UHJvcHM/Lm1pblRwcywgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBMb3dUcHNUaHJlc2hvbGQ+LFxuICAgICAgYWRkSGlnaFRwc0FsYXJtOiB0b0FsYXJtUHJvcHMoJ21heFRwcycsIHdhcm5Qcm9wcz8ubWF4VHBzLCBjcml0UHJvcHM/Lm1heFRwcywgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBIaWdoVHBzVGhyZXNob2xkPixcbiAgICAgIGFkZFRocm90dGxlc0NvdW50QWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4RXJyb3JDb3VudCcsIHdhcm5Qcm9wcz8ubWF4VGhyb3R0bGVzLCBjcml0UHJvcHM/Lm1heFRocm90dGxlcywgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zLCB1bmRlZmluZWQsIDApIGFzIFJlY29yZDxzdHJpbmcsIEVycm9yQ291bnRUaHJlc2hvbGQ+LFxuICAgICAgYWRkVGhyb3R0bGVzUmF0ZUFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heEVycm9yUmF0ZScsIHdhcm5Qcm9wcz8uYXZnVGhyb3R0bGVzLCBjcml0UHJvcHM/LmF2Z1Rocm90dGxlcywgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBFcnJvclJhdGVUaHJlc2hvbGQ+LFxuICAgICAgYWRkQ29uY3VycmVudEV4ZWN1dGlvbnNDb3VudEFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heFJ1bm5pbmdUYXNrcycsIHdhcm5Qcm9wcz8ubWF4Q29uY3VycmVudEV4ZWN1dGlvbnMsIGNyaXRQcm9wcz8ubWF4Q29uY3VycmVudEV4ZWN1dGlvbnMsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgUnVubmluZ1Rhc2tDb3VudFRocmVzaG9sZD4sXG4gICAgICBhZGRNYXhJdGVyYXRvckFnZUFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heEFnZUluTWlsbGlzJywgd2FyblByb3BzPy5tYXhJdGVyYXRvckFnZSwgY3JpdFByb3BzPy5tYXhJdGVyYXRvckFnZSwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBNYXhBZ2VUaHJlc2hvbGQ+LFxuICAgICAgYWRkRW5oYW5jZWRNb25pdG9yaW5nTWF4Q3B1VG90YWxUaW1lQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4RHVyYXRpb24nLCB3YXJuUHJvcHM/Lm1heENwdVRpbWUsIGNyaXRQcm9wcz8ubWF4Q3B1VGltZSwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBEdXJhdGlvblRocmVzaG9sZD4sXG4gICAgICBhZGRFbmhhbmNlZE1vbml0b3JpbmdQOTBDcHVUb3RhbFRpbWVBbGFybTogdG9BbGFybVByb3BzKCdtYXhEdXJhdGlvbicsIHdhcm5Qcm9wcz8ucDkwQ3B1VGltZSwgY3JpdFByb3BzPy5wOTBDcHVUaW1lLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIER1cmF0aW9uVGhyZXNob2xkPixcbiAgICAgIGFkZEVuaGFuY2VkTW9uaXRvcmluZ0F2Z0NwdVRvdGFsVGltZUFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heER1cmF0aW9uJywgd2FyblByb3BzPy5hdmdDcHVUaW1lLCBjcml0UHJvcHM/LmF2Z0NwdVRpbWUsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgIFJlY29yZDxzdHJpbmcsIER1cmF0aW9uVGhyZXNob2xkPixcbiAgICAgIGFkZEVuaGFuY2VkTW9uaXRvcmluZ01heE1lbW9yeVV0aWxpemF0aW9uQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4VXNhZ2VQZXJjZW50Jywgd2FyblByb3BzPy5tYXhNZW1vcnksIGNyaXRQcm9wcz8ubWF4TWVtb3J5LCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzICBSZWNvcmQ8c3RyaW5nLCBVc2FnZVRocmVzaG9sZD4sXG4gICAgICBhZGRFbmhhbmNlZE1vbml0b3JpbmdQOTBNZW1vcnlVdGlsaXphdGlvbkFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heFVzYWdlUGVyY2VudCcsIHdhcm5Qcm9wcz8ucDkwTWVtb3J5LCBjcml0UHJvcHM/LnA5ME1lbW9yeSwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBVc2FnZVRocmVzaG9sZD4sXG4gICAgICBhZGRFbmhhbmNlZE1vbml0b3JpbmdBdmdNZW1vcnlVdGlsaXphdGlvbkFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heFVzYWdlUGVyY2VudCcsIHdhcm5Qcm9wcz8uYXZnTWVtb3J5LCBjcml0UHJvcHM/LmF2Z01lbW9yeSwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBVc2FnZVRocmVzaG9sZD4sXG4gICAgfSk7XG5cbiAgICAvLyBBZGQgbG9nIG1vbml0b3JpbmcgdG8gZGFzaGJvYXJkXG4gICAgbGV0IGNyaXRNYXhMb2dDb3VudCA9IHByb3BzLmNyaXRpY2FsQWxhcm1Qcm9wcz8ubWF4TG9nQ291bnQ/PzFcbiAgICBsZXQgcGF0dGVybiA9ICcnO1xuICAgIGlmIChjcml0TWF4TG9nQ291bnQgPiAwKSB7XG4gICAgICBwYXR0ZXJuID0gcHJvcHMuY3JpdGljYWxBbGFybVByb3BzPy5kYXNoYm9hcmRMb2dQYXR0ZXJuPz9QeXRob25GdW5jdGlvbi5ERUZBVUxUX0xPR19JTlNJR0hUU19QQVRURVJOXG4gICAgfVxuICAgIGlmIChwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcz8ubWF4TG9nQ291bnQgIT09IHVuZGVmaW5lZCAmJiBwYXR0ZXJuICE9PSBwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcy5kYXNoYm9hcmRMb2dQYXR0ZXJuKSB7XG4gICAgICBwYXR0ZXJuICs9IChwYXR0ZXJuICE9PSAnJyA/ICd8JyA6ICcnKSArIHByb3BzLndhcm5pbmdBbGFybVByb3BzLmRhc2hib2FyZExvZ1BhdHRlcm5cbiAgICB9XG4gICAgaWYgKHBhdHRlcm4gIT09ICcnKSB7XG4gICAgICB0aGlzLm1vbml0b3JpbmcubW9uaXRvckxvZyh7XG4gICAgICAgIGxvZ0dyb3VwTmFtZTogdGhpcy5mdW5jdGlvbi5sb2dHcm91cC5sb2dHcm91cE5hbWUsXG4gICAgICAgIHBhdHRlcm4sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBZGQgY3JpdGljYWwgbG9nIGFsYXJtXG4gICAgaWYgKGNyaXRNYXhMb2dDb3VudCA+IDApIHtcbiAgICAgIHRoaXMuY3JpdGljYWxMb2dBbGFybSA9IG5ldyBMb2dBbGFybSh0aGlzLCAnTG9nc0NyaXRpY2FsJywge1xuICAgICAgICBsb2dHcm91cDogdGhpcy5mdW5jdGlvbi5sb2dHcm91cCxcbiAgICAgICAgcGF0dGVybjogcHJvcHMuY3JpdGljYWxBbGFybVByb3BzPy5tZXRyaWNMb2dQYXR0ZXJuPz9QeXRob25GdW5jdGlvbi5ERUZBVUxUX0xPR19NRVRSSUNfUEFUVEVSTixcbiAgICAgICAgdGhyZXNob2xkOiBjcml0TWF4TG9nQ291bnQsXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAzXG4gICAgICB9KTtcbiAgICAgIGlmIChwcm9wcy5jcml0aWNhbEFsYXJtUHJvcHM/Lm5vdGlmeUFjdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNyaXRpY2FsTG9nQWxhcm0uYWRkQWxhcm1BY3Rpb25zKHByb3BzLmNyaXRpY2FsQWxhcm1Qcm9wcy5ub3RpZnlBY3Rpb25zKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy5jcml0aWNhbEFsYXJtUHJvcHM/Lm5vdGlmeVRvcGljcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY3JpdGljYWxMb2dBbGFybS5hZGRBbGFybVRvcGljcyhwcm9wcy5jcml0aWNhbEFsYXJtUHJvcHMubm90aWZ5VG9waWNzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgd2FybmluZyBsb2cgYWxhcm1cbiAgICBpZiAocHJvcHMud2FybmluZ0FsYXJtUHJvcHM/Lm1heExvZ0NvdW50ICE9PSB1bmRlZmluZWQgJiYgcHJvcHMud2FybmluZ0FsYXJtUHJvcHMubWF4TG9nQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLndhcm5pbmdMb2dBbGFybSA9IG5ldyBMb2dBbGFybSh0aGlzLCAnTG9nc1dhcm5pbmcnLCB7XG4gICAgICAgIGxvZ0dyb3VwOiB0aGlzLmZ1bmN0aW9uLmxvZ0dyb3VwLFxuICAgICAgICBwYXR0ZXJuOiBwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcz8ubWV0cmljTG9nUGF0dGVybj8/UHl0aG9uRnVuY3Rpb24uREVGQVVMVF9MT0dfTUVUUklDX1BBVFRFUk4sXG4gICAgICAgIHRocmVzaG9sZDogcHJvcHMud2FybmluZ0FsYXJtUHJvcHMubWF4TG9nQ291bnQsXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAzXG4gICAgICB9KTtcbiAgICAgIGlmIChwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcz8ubm90aWZ5QWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMud2FybmluZ0xvZ0FsYXJtLmFkZEFsYXJtQWN0aW9ucyhwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcy5ub3RpZnlBY3Rpb25zKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcz8ubm90aWZ5VG9waWNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy53YXJuaW5nTG9nQWxhcm0uYWRkQWxhcm1Ub3BpY3MocHJvcHMud2FybmluZ0FsYXJtUHJvcHMubm90aWZ5VG9waWNzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
1
|
+
import { Duration } from "aws-cdk-lib";
|
|
2
|
+
import { ITopic } from "aws-cdk-lib/aws-sns";
|
|
3
|
+
import { IAlarmAction } from "aws-cdk-lib/aws-cloudwatch";
|
|
4
|
+
import { Architecture, Tracing } from "aws-cdk-lib/aws-lambda";
|
|
5
|
+
import * as logs from "aws-cdk-lib/aws-logs";
|
|
6
|
+
import * as ec2 from "aws-cdk-lib/aws-ec2";
|
|
7
|
+
import { IDashboardFactory } from "cdk-monitoring-constructs";
|
|
8
|
+
import { ILambdaDeploymentConfig } from "aws-cdk-lib/aws-codedeploy/lib/lambda/deployment-config";
|
|
9
|
+
/**
|
|
10
|
+
* CloudWatch alarm properties for lambda functions.
|
|
11
|
+
*/
|
|
10
12
|
export interface StandardFunctionAlarmProps {
|
|
11
13
|
/**
|
|
12
14
|
* Maximum 50th percentile latency
|
|
@@ -84,11 +86,11 @@ export interface StandardFunctionAlarmProps {
|
|
|
84
86
|
/**
|
|
85
87
|
* Topics to send alarm notifications
|
|
86
88
|
*/
|
|
87
|
-
readonly notifyTopics?: [
|
|
89
|
+
readonly notifyTopics?: ITopic[];
|
|
88
90
|
/**
|
|
89
91
|
* Actions to send alarm notifications
|
|
90
92
|
*/
|
|
91
|
-
readonly notifyActions?: [
|
|
93
|
+
readonly notifyActions?: IAlarmAction[];
|
|
92
94
|
/**
|
|
93
95
|
* Log pattern to match for metrics.
|
|
94
96
|
*
|
|
@@ -108,6 +110,22 @@ export interface StandardFunctionAlarmProps {
|
|
|
108
110
|
*/
|
|
109
111
|
readonly maxLogCount?: number;
|
|
110
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* Properties for lambda function deployments.
|
|
115
|
+
*/
|
|
116
|
+
export interface StandardFunctionDeploymentProps {
|
|
117
|
+
/**
|
|
118
|
+
* Deployment configuration to use.
|
|
119
|
+
*/
|
|
120
|
+
readonly config: ILambdaDeploymentConfig;
|
|
121
|
+
/**
|
|
122
|
+
* Name of the alias to use for deployment.
|
|
123
|
+
*/
|
|
124
|
+
readonly aliasName: string;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Properties for lambda functions.
|
|
128
|
+
*/
|
|
111
129
|
export interface StandardFunctionProps {
|
|
112
130
|
/**
|
|
113
131
|
* Enable AWS X-Ray Tracing.
|
|
@@ -179,39 +197,9 @@ export interface StandardFunctionProps {
|
|
|
179
197
|
* If no properties are provided, a set of default alarms are created.
|
|
180
198
|
*/
|
|
181
199
|
readonly warningAlarmProps?: StandardFunctionAlarmProps;
|
|
182
|
-
}
|
|
183
|
-
export interface PythonFunctionProps extends StandardFunctionProps {
|
|
184
200
|
/**
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
* @default Runtime.PYTHON_3_9
|
|
201
|
+
* Deployment properties. If no properties are provided a LambdaDeploymentGroup
|
|
202
|
+
* is not created.
|
|
188
203
|
*/
|
|
189
|
-
readonly
|
|
190
|
-
/**
|
|
191
|
-
* Location on the filesystem the Lambda assets are found.
|
|
192
|
-
*
|
|
193
|
-
* Example: path.join(__dirname, '..', 'mylambda')
|
|
194
|
-
*/
|
|
195
|
-
readonly entry: string;
|
|
196
|
-
/**
|
|
197
|
-
* File containing the handler.
|
|
198
|
-
*
|
|
199
|
-
* @default 'index.py'
|
|
200
|
-
*/
|
|
201
|
-
readonly index?: string;
|
|
202
|
-
/**
|
|
203
|
-
* Exported handler function
|
|
204
|
-
*
|
|
205
|
-
* @default 'handler'
|
|
206
|
-
*/
|
|
207
|
-
readonly handler?: string;
|
|
208
|
-
}
|
|
209
|
-
export declare class PythonFunction extends Construct {
|
|
210
|
-
static readonly DEFAULT_LOG_METRIC_PATTERN = "\"[ERROR]\"";
|
|
211
|
-
static readonly DEFAULT_LOG_INSIGHTS_PATTERN = "\\[ERROR\\]";
|
|
212
|
-
readonly monitoring: MonitoringFacade;
|
|
213
|
-
readonly function: Function;
|
|
214
|
-
readonly criticalLogAlarm: LogAlarm;
|
|
215
|
-
readonly warningLogAlarm: LogAlarm;
|
|
216
|
-
constructor(scope: Construct, id: string, props: PythonFunctionProps);
|
|
204
|
+
readonly deploymentProps?: StandardFunctionDeploymentProps;
|
|
217
205
|
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmQtZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdGFuZGFyZC1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEdXJhdGlvbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge0lUb3BpY30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zbnNcIjtcbmltcG9ydCB7SUFsYXJtQWN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7QXJjaGl0ZWN0dXJlLCBSdW50aW1lLCBUcmFjaW5nfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHtJRGFzaGJvYXJkRmFjdG9yeX0gZnJvbSBcImNkay1tb25pdG9yaW5nLWNvbnN0cnVjdHNcIjtcbmltcG9ydCB7SUxhbWJkYURlcGxveW1lbnRDb25maWcsIExhbWJkYURlcGxveW1lbnRDb25maWd9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29kZWRlcGxveS9saWIvbGFtYmRhL2RlcGxveW1lbnQtY29uZmlnXCI7XG5cbi8qKlxuICogQ2xvdWRXYXRjaCBhbGFybSBwcm9wZXJ0aWVzIGZvciBsYW1iZGEgZnVuY3Rpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYXJkRnVuY3Rpb25BbGFybVByb3BzIHtcblxuICAvKipcbiAgICogTWF4aW11bSA1MHRoIHBlcmNlbnRpbGUgbGF0ZW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgcDUwTGF0ZW5jeT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIDkwdGggcGVyY2VudGlsZSBsYXRlbmN5XG4gICAqL1xuICByZWFkb25seSBwOTBMYXRlbmN5PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE1heGltdW0gOTl0aCBwZXJjZW50aWxlIGxhdGVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHA5OUxhdGVuY3k/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgZmF1bHRzXG4gICAqXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHJlYWRvbmx5IG1heEZhdWx0cz86IG51bWJlcjtcblxuICAvKipcbiAgICogQXZlcmFnZSBudW1iZXIgb2YgZmF1bHRzXG4gICAqL1xuICByZWFkb25seSBhdmdGYXVsdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1pbmltdW0gdHJhbnNhY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBtaW5UcHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdHJhbnNhY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBtYXhUcHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIHRocm90dGxlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICByZWFkb25seSBtYXhUaHJvdHRsZXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEF2ZXJhZ2UgbnVtYmVyIG9mIHRocm90dGxlc1xuICAgKi9cbiAgcmVhZG9ubHkgYXZnVGhyb3R0bGVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGNvbmN1cnJlbnQgZXhlY3V0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFtb3VudCBvZiB0aW1lIGRhdGEgd2FpdHMgYmVmb3JlIGJlaW5nIHByb2Nlc3NlZCBieSB0aGUgZnVuY3Rpb24uXG4gICAqIFNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3ByZW1pdW1zdXBwb3J0L2tub3dsZWRnZS1jZW50ZXIvbGFtYmRhLWl0ZXJhdG9yLWFnZS9cbiAgICovXG4gIHJlYWRvbmx5IG1heEl0ZXJhdG9yQWdlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGFtb3VudCBvZiBDUFUgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q3B1VGltZT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiA5MHRoIHBlcmNlbnRpbGUgQ1BVIHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IHA5MENwdVRpbWU/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQXZlcmFnZSBDUFUgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgYXZnQ3B1VGltZT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGFtb3VudCBvZiBtZW1vcnlcbiAgICovXG4gIHJlYWRvbmx5IG1heE1lbW9yeT86IG51bWJlcjtcblxuICAvKipcbiAgICogOTB0aCBwZXJjZW50aWxlIG1lbW9yeVxuICAgKi9cbiAgcmVhZG9ubHkgcDkwTWVtb3J5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdmVyYWdlIG1lbW9yeVxuICAgKi9cbiAgcmVhZG9ubHkgYXZnTWVtb3J5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUb3BpY3MgdG8gc2VuZCBhbGFybSBub3RpZmljYXRpb25zXG4gICAqL1xuICByZWFkb25seSBub3RpZnlUb3BpY3M/OiBJVG9waWNbXTtcblxuICAvKipcbiAgICogQWN0aW9ucyB0byBzZW5kIGFsYXJtIG5vdGlmaWNhdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IG5vdGlmeUFjdGlvbnM/OiBJQWxhcm1BY3Rpb25bXTtcblxuICAvKipcbiAgICogTG9nIHBhdHRlcm4gdG8gbWF0Y2ggZm9yIG1ldHJpY3MuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdcXFxcXFxbRVJST1JcXFxcXFxdJ1xuICAgKi9cbiAgcmVhZG9ubHkgbWV0cmljTG9nUGF0dGVybj86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBMb2cgcGF0dGVybiB0byBtYXRjaCBmb3IgdGhlIGRhc2hib2FyZFxuICAgKlxuICAgKiBAZGVmYXVsdCAnXCJbRVJST1JdXCInXG4gICAqL1xuICByZWFkb25seSBkYXNoYm9hcmRMb2dQYXR0ZXJuPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGxvZyBldmVudHMgbWF0Y2hpbmcgdGhlIHBhdHRlcm4uXG4gICAqXG4gICAqIEBkZWZhdWx0IDAgZm9yIENyaXRpY2FsIEFsYXJtXG4gICAqL1xuICByZWFkb25seSBtYXhMb2dDb3VudD86IG51bWJlclxufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGxhbWJkYSBmdW5jdGlvbiBkZXBsb3ltZW50cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFyZEZ1bmN0aW9uRGVwbG95bWVudFByb3BzIHtcblxuICAvKipcbiAgICogRGVwbG95bWVudCBjb25maWd1cmF0aW9uIHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZpZzogSUxhbWJkYURlcGxveW1lbnRDb25maWcsXG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIGFsaWFzIHRvIHVzZSBmb3IgZGVwbG95bWVudC5cbiAgICovXG4gIHJlYWRvbmx5IGFsaWFzTmFtZTogc3RyaW5nXG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgbGFtYmRhIGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFyZEZ1bmN0aW9uUHJvcHMge1xuXG4gIC8qKlxuICAgKiBFbmFibGUgQVdTIFgtUmF5IFRyYWNpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IFRyYWNpbmcuUEFTU19USFJPVUdIXG4gICAqL1xuICByZWFkb25seSB0cmFjaW5nPzogVHJhY2luZztcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkYXlzIHRvIHJldGFpbiBsb2dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsb2dzLlJldGVudGlvbkRheXMuVEhSRUVfREFZU1xuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmV0ZW50aW9uPzogbG9ncy5SZXRlbnRpb25EYXlzO1xuXG4gIC8qKlxuICAgKiBUaGUgc3lzdGVtIGFyY2hpdGVjdHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXJjaGl0ZWN0dXJlLkFSTV82NFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBWUEMgbmV0d29yayB0byBwbGFjZSB0aGUgbGFtYmRhIG5ldHdvcmsgaW50ZXJmYWNlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vdCBwbGFjZWQgaW4gYSBWUENcbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IGVjMi5JVnBjO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBwbGFjZSB0aGUgbGFtYmRhIGluc2lkZSB0aGUgVlBDLiBPbmx5IHVzZWQgaWYgJ3ZwYycgaXMgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVlBDIGRlZmF1bHQgc3RyYXRlZ3kgaXMgdXNlZCBpZiBub3Qgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB2cGNTdWJuZXRzPzogZWMyLlN1Ym5ldFNlbGVjdGlvbjtcblxuICAvKipcbiAgICogQW1vdW50IG9mIG1lbW9yeSBpbiBNQiBhbmQgcHJvcG9ydGlvbmFsbHkgQ1BVIHBvd2VyIHRvIGFsbG9jYXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCA3NjhcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGV4ZWN1dGlvbiB0aW1lIChpbiBzZWNvbmRzKSBhZnRlciB3aGljaCB0aGUgTGFtYmRhIHRlcm1pbmF0ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoMzApXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBtYWtlIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50Pzoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgfTtcblxuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRGFzaGJvYXJkRmFjdG9yeSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIENsb3VkV2F0Y2ggZGFzaGJvYXJkcy5cbiAgICpcbiAgICogSWYgbm90IGRlZmluZWQsIGRhc2hib2FyZHMgYXJlIG5vdCBnZW5lcmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBkYXNoYm9hcmRGYWN0b3J5PzogSURhc2hib2FyZEZhY3Rvcnk7XG5cbiAgLyoqXG4gICAqIEFsYXJtIHRocmVzaG9sZHMgZm9yIGNyaXRpY2FsIGFsYXJtcy5cbiAgICpcbiAgICogSWYgbm8gcHJvcGVydGllcyBhcmUgcHJvdmlkZWQsIGEgc2V0IG9mIGRlZmF1bHQgYWxhcm1zIGFyZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY3JpdGljYWxBbGFybVByb3BzPzogU3RhbmRhcmRGdW5jdGlvbkFsYXJtUHJvcHM7XG5cbiAgLyoqXG4gICAqIEFsYXJtIHRocmVzaG9sZCBmb3Igd2FybmluZyBhbGFybXMuXG4gICAqXG4gICAqIElmIG5vIHByb3BlcnRpZXMgYXJlIHByb3ZpZGVkLCBhIHNldCBvZiBkZWZhdWx0IGFsYXJtcyBhcmUgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHdhcm5pbmdBbGFybVByb3BzPzogU3RhbmRhcmRGdW5jdGlvbkFsYXJtUHJvcHM7XG5cbiAgLyoqXG4gICAqIERlcGxveW1lbnQgcHJvcGVydGllcy4gSWYgbm8gcHJvcGVydGllcyBhcmUgcHJvdmlkZWQgYSBMYW1iZGFEZXBsb3ltZW50R3JvdXBcbiAgICogaXMgbm90IGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50UHJvcHM/OiBTdGFuZGFyZEZ1bmN0aW9uRGVwbG95bWVudFByb3BzXG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "truemark-cdk-lib",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"types": "index.d.ts",
|
|
6
6
|
"scripts": {
|
|
@@ -11,14 +11,14 @@
|
|
|
11
11
|
"devDependencies": {
|
|
12
12
|
"@types/jest": "^27.4.1",
|
|
13
13
|
"@types/node": "10.17.27",
|
|
14
|
-
"aws-cdk-lib": "2.
|
|
14
|
+
"aws-cdk-lib": "2.18.0",
|
|
15
15
|
"constructs": "10.0.5",
|
|
16
16
|
"jest": "^27.5.1",
|
|
17
17
|
"ts-jest": "^27.1.4",
|
|
18
18
|
"typescript": "~3.9.7"
|
|
19
19
|
},
|
|
20
20
|
"peerDependencies": {
|
|
21
|
-
"aws-cdk-lib": "2.
|
|
21
|
+
"aws-cdk-lib": "^2.18.0",
|
|
22
22
|
"constructs": "^10.0.5"
|
|
23
23
|
},
|
|
24
24
|
"exports": {
|
|
@@ -34,7 +34,12 @@
|
|
|
34
34
|
"access": "public"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
+
"@aws-cdk/aws-apigatewayv2-alpha": "^2.18.0-alpha.0",
|
|
38
|
+
"@aws-cdk/aws-apigatewayv2-integrations-alpha": "^2.18.0-alpha.0",
|
|
39
|
+
"@aws-cdk/aws-appsync-alpha": "^2.18.0-alpha.0",
|
|
40
|
+
"@aws-cdk/aws-redshift-alpha": "^2.18.0-alpha.0",
|
|
41
|
+
"@aws-cdk/aws-synthetics-alpha": "^2.18.0-alpha.0",
|
|
37
42
|
"cdk-monitoring-constructs": "^1.6.4"
|
|
38
43
|
},
|
|
39
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "29ed48566a1e6ba9f4193e4612b39b1e87ddc41e"
|
|
40
45
|
}
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PythonFunction = void 0;
|
|
4
|
-
const fs = require("fs");
|
|
5
|
-
const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
|
|
6
|
-
const constructs_1 = require("constructs");
|
|
7
|
-
const logs = require("aws-cdk-lib/aws-logs");
|
|
8
|
-
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
9
|
-
const cdk_monitoring_constructs_1 = require("cdk-monitoring-constructs");
|
|
10
|
-
const aws_cloudwatch_1 = require("../../aws-cloudwatch");
|
|
11
|
-
const aws_monitoring_1 = require("../../aws-monitoring");
|
|
12
|
-
const aws_cloudwatch_actions_1 = require("aws-cdk-lib/aws-cloudwatch-actions");
|
|
13
|
-
const path = require("path");
|
|
14
|
-
function toAlarmProps(prop, warningThreshold, criticalThreshold, warningAlarmActions, criticalAlarmActions, warningDefaultThreshold, criticalDefaultThreshold) {
|
|
15
|
-
let alarmProps = {};
|
|
16
|
-
if (criticalThreshold !== undefined) {
|
|
17
|
-
alarmProps.Critical = {
|
|
18
|
-
[prop]: criticalThreshold,
|
|
19
|
-
actionsEnabled: true,
|
|
20
|
-
actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: criticalAlarmActions })
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
else if (criticalDefaultThreshold !== undefined) {
|
|
24
|
-
alarmProps.Critical = {
|
|
25
|
-
[prop]: criticalDefaultThreshold,
|
|
26
|
-
actionsEnabled: true,
|
|
27
|
-
actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: criticalAlarmActions })
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
if (warningThreshold !== undefined) {
|
|
31
|
-
alarmProps.Warning = {
|
|
32
|
-
[prop]: warningThreshold,
|
|
33
|
-
actionsEnabled: true,
|
|
34
|
-
actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: warningAlarmActions })
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
else if (warningDefaultThreshold !== undefined) {
|
|
38
|
-
alarmProps.Warning = {
|
|
39
|
-
[prop]: warningDefaultThreshold,
|
|
40
|
-
actionsEnabled: true,
|
|
41
|
-
actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: warningAlarmActions })
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
return Object.keys(alarmProps).length > 0 ? alarmProps : undefined;
|
|
45
|
-
}
|
|
46
|
-
class PythonFunction extends constructs_1.Construct {
|
|
47
|
-
constructor(scope, id, props) {
|
|
48
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3;
|
|
49
|
-
super(scope, id);
|
|
50
|
-
this.monitoring = new cdk_monitoring_constructs_1.MonitoringFacade(this, 'Monitoring', {
|
|
51
|
-
metricFactoryDefaults: {},
|
|
52
|
-
alarmFactoryDefaults: {
|
|
53
|
-
actionsEnabled: true,
|
|
54
|
-
alarmNamePrefix: scope.node.path.replace(/\//g, '-'),
|
|
55
|
-
},
|
|
56
|
-
dashboardFactory: props.dashboardFactory
|
|
57
|
-
});
|
|
58
|
-
let bundling = fs.existsSync(path.join(props.entry, 'requirements.txt')) ? {
|
|
59
|
-
image: (_b = (_a = props.runtime) === null || _a === void 0 ? void 0 : _a.bundlingImage) !== null && _b !== void 0 ? _b : aws_lambda_1.Runtime.PYTHON_3_9.bundlingImage,
|
|
60
|
-
command: [
|
|
61
|
-
'bash', '-c', [
|
|
62
|
-
'pip install --target /asset-output/ -r requirements.txt',
|
|
63
|
-
'cp -ra * /asset-output/'
|
|
64
|
-
].join('&&')
|
|
65
|
-
],
|
|
66
|
-
outputType: aws_cdk_lib_1.BundlingOutput.NOT_ARCHIVED,
|
|
67
|
-
} : undefined;
|
|
68
|
-
this.function = new aws_lambda_1.Function(this, id, {
|
|
69
|
-
runtime: (_c = props.runtime) !== null && _c !== void 0 ? _c : aws_lambda_1.Runtime.PYTHON_3_9,
|
|
70
|
-
tracing: (_d = props.tracing) !== null && _d !== void 0 ? _d : aws_lambda_1.Tracing.PASS_THROUGH,
|
|
71
|
-
logRetention: (_e = props.logRetention) !== null && _e !== void 0 ? _e : logs.RetentionDays.THREE_DAYS,
|
|
72
|
-
architecture: (_f = props.architecture) !== null && _f !== void 0 ? _f : aws_lambda_1.Architecture.ARM_64,
|
|
73
|
-
vpc: props.vpc,
|
|
74
|
-
vpcSubnets: props.vpcSubnets,
|
|
75
|
-
memorySize: (_g = props.memorySize) !== null && _g !== void 0 ? _g : 768,
|
|
76
|
-
timeout: (_h = props.timeout) !== null && _h !== void 0 ? _h : aws_cdk_lib_1.Duration.seconds(30),
|
|
77
|
-
environment: props.environment,
|
|
78
|
-
description: props.description,
|
|
79
|
-
code: aws_lambda_1.Code.fromAsset(props.entry, { bundling }),
|
|
80
|
-
handler: ((_j = props.index) !== null && _j !== void 0 ? _j : 'index.py').replace('.py', '') + '.' + ((_k = props.handler) !== null && _k !== void 0 ? _k : 'handler')
|
|
81
|
-
});
|
|
82
|
-
const warnProps = props.warningAlarmProps;
|
|
83
|
-
const warnActions = [];
|
|
84
|
-
(_l = warnProps === null || warnProps === void 0 ? void 0 : warnProps.notifyActions) === null || _l === void 0 ? void 0 : _l.forEach((action) => warnActions.push(action));
|
|
85
|
-
(_m = warnProps === null || warnProps === void 0 ? void 0 : warnProps.notifyTopics) === null || _m === void 0 ? void 0 : _m.forEach((topic) => warnActions.push(new aws_cloudwatch_actions_1.SnsAction(topic)));
|
|
86
|
-
const critProps = props.criticalAlarmProps;
|
|
87
|
-
const critActions = [];
|
|
88
|
-
(_o = critProps === null || critProps === void 0 ? void 0 : critProps.notifyActions) === null || _o === void 0 ? void 0 : _o.forEach((action) => critActions.push(action));
|
|
89
|
-
(_p = critProps === null || critProps === void 0 ? void 0 : critProps.notifyTopics) === null || _p === void 0 ? void 0 : _p.forEach((topic) => critActions.push(new aws_cloudwatch_actions_1.SnsAction(topic)));
|
|
90
|
-
this.monitoring.monitorLambdaFunction({
|
|
91
|
-
lambdaFunction: this.function,
|
|
92
|
-
lambdaInsightsEnabled: true,
|
|
93
|
-
addToAlarmDashboard: true,
|
|
94
|
-
addToDetailDashboard: true,
|
|
95
|
-
addToSummaryDashboard: true,
|
|
96
|
-
addLatencyP50Alarm: toAlarmProps('maxLatency', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p50Latency, critProps === null || critProps === void 0 ? void 0 : critProps.p50Latency, warnActions, critActions),
|
|
97
|
-
addLatencyP90Alarm: toAlarmProps('maxLatency', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p90Latency, critProps === null || critProps === void 0 ? void 0 : critProps.p90Latency, warnActions, critActions),
|
|
98
|
-
addLatencyP99Alarm: toAlarmProps('maxLatency', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p99Latency, critProps === null || critProps === void 0 ? void 0 : critProps.p99Latency, warnActions, critActions),
|
|
99
|
-
addFaultCountAlarm: toAlarmProps('maxErrorCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxFaults, critProps === null || critProps === void 0 ? void 0 : critProps.maxFaults, warnActions, critActions, undefined, 0),
|
|
100
|
-
addFaultRateAlarm: toAlarmProps('maxErrorRate', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgFaults, critProps === null || critProps === void 0 ? void 0 : critProps.avgFaults, warnActions, critActions),
|
|
101
|
-
addLowTpsAlarm: toAlarmProps('minTps', warnProps === null || warnProps === void 0 ? void 0 : warnProps.minTps, critProps === null || critProps === void 0 ? void 0 : critProps.minTps, warnActions, critActions),
|
|
102
|
-
addHighTpsAlarm: toAlarmProps('maxTps', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxTps, critProps === null || critProps === void 0 ? void 0 : critProps.maxTps, warnActions, critActions),
|
|
103
|
-
addThrottlesCountAlarm: toAlarmProps('maxErrorCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxThrottles, critProps === null || critProps === void 0 ? void 0 : critProps.maxThrottles, warnActions, critActions, undefined, 0),
|
|
104
|
-
addThrottlesRateAlarm: toAlarmProps('maxErrorRate', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgThrottles, critProps === null || critProps === void 0 ? void 0 : critProps.avgThrottles, warnActions, critActions),
|
|
105
|
-
addConcurrentExecutionsCountAlarm: toAlarmProps('maxRunningTasks', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxConcurrentExecutions, critProps === null || critProps === void 0 ? void 0 : critProps.maxConcurrentExecutions, warnActions, critActions),
|
|
106
|
-
addMaxIteratorAgeAlarm: toAlarmProps('maxAgeInMillis', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxIteratorAge, critProps === null || critProps === void 0 ? void 0 : critProps.maxIteratorAge, warnActions, critActions),
|
|
107
|
-
addEnhancedMonitoringMaxCpuTotalTimeAlarm: toAlarmProps('maxDuration', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxCpuTime, critProps === null || critProps === void 0 ? void 0 : critProps.maxCpuTime, warnActions, critActions),
|
|
108
|
-
addEnhancedMonitoringP90CpuTotalTimeAlarm: toAlarmProps('maxDuration', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p90CpuTime, critProps === null || critProps === void 0 ? void 0 : critProps.p90CpuTime, warnActions, critActions),
|
|
109
|
-
addEnhancedMonitoringAvgCpuTotalTimeAlarm: toAlarmProps('maxDuration', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgCpuTime, critProps === null || critProps === void 0 ? void 0 : critProps.avgCpuTime, warnActions, critActions),
|
|
110
|
-
addEnhancedMonitoringMaxMemoryUtilizationAlarm: toAlarmProps('maxUsagePercent', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxMemory, critProps === null || critProps === void 0 ? void 0 : critProps.maxMemory, warnActions, critActions),
|
|
111
|
-
addEnhancedMonitoringP90MemoryUtilizationAlarm: toAlarmProps('maxUsagePercent', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p90Memory, critProps === null || critProps === void 0 ? void 0 : critProps.p90Memory, warnActions, critActions),
|
|
112
|
-
addEnhancedMonitoringAvgMemoryUtilizationAlarm: toAlarmProps('maxUsagePercent', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgMemory, critProps === null || critProps === void 0 ? void 0 : critProps.avgMemory, warnActions, critActions),
|
|
113
|
-
});
|
|
114
|
-
// Add log monitoring to dashboard
|
|
115
|
-
let critMaxLogCount = (_r = (_q = props.criticalAlarmProps) === null || _q === void 0 ? void 0 : _q.maxLogCount) !== null && _r !== void 0 ? _r : 1;
|
|
116
|
-
let pattern = '';
|
|
117
|
-
if (critMaxLogCount > 0) {
|
|
118
|
-
pattern = (_t = (_s = props.criticalAlarmProps) === null || _s === void 0 ? void 0 : _s.dashboardLogPattern) !== null && _t !== void 0 ? _t : PythonFunction.DEFAULT_LOG_INSIGHTS_PATTERN;
|
|
119
|
-
}
|
|
120
|
-
if (((_u = props.warningAlarmProps) === null || _u === void 0 ? void 0 : _u.maxLogCount) !== undefined && pattern !== props.warningAlarmProps.dashboardLogPattern) {
|
|
121
|
-
pattern += (pattern !== '' ? '|' : '') + props.warningAlarmProps.dashboardLogPattern;
|
|
122
|
-
}
|
|
123
|
-
if (pattern !== '') {
|
|
124
|
-
this.monitoring.monitorLog({
|
|
125
|
-
logGroupName: this.function.logGroup.logGroupName,
|
|
126
|
-
pattern,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
// Add critical log alarm
|
|
130
|
-
if (critMaxLogCount > 0) {
|
|
131
|
-
this.criticalLogAlarm = new aws_cloudwatch_1.LogAlarm(this, 'LogsCritical', {
|
|
132
|
-
logGroup: this.function.logGroup,
|
|
133
|
-
pattern: (_w = (_v = props.criticalAlarmProps) === null || _v === void 0 ? void 0 : _v.metricLogPattern) !== null && _w !== void 0 ? _w : PythonFunction.DEFAULT_LOG_METRIC_PATTERN,
|
|
134
|
-
threshold: critMaxLogCount,
|
|
135
|
-
evaluationPeriods: 3
|
|
136
|
-
});
|
|
137
|
-
if (((_x = props.criticalAlarmProps) === null || _x === void 0 ? void 0 : _x.notifyActions) !== undefined) {
|
|
138
|
-
this.criticalLogAlarm.addAlarmActions(props.criticalAlarmProps.notifyActions);
|
|
139
|
-
}
|
|
140
|
-
if (((_y = props.criticalAlarmProps) === null || _y === void 0 ? void 0 : _y.notifyTopics) !== undefined) {
|
|
141
|
-
this.criticalLogAlarm.addAlarmTopics(props.criticalAlarmProps.notifyTopics);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
// Add warning log alarm
|
|
145
|
-
if (((_z = props.warningAlarmProps) === null || _z === void 0 ? void 0 : _z.maxLogCount) !== undefined && props.warningAlarmProps.maxLogCount > 0) {
|
|
146
|
-
this.warningLogAlarm = new aws_cloudwatch_1.LogAlarm(this, 'LogsWarning', {
|
|
147
|
-
logGroup: this.function.logGroup,
|
|
148
|
-
pattern: (_1 = (_0 = props.warningAlarmProps) === null || _0 === void 0 ? void 0 : _0.metricLogPattern) !== null && _1 !== void 0 ? _1 : PythonFunction.DEFAULT_LOG_METRIC_PATTERN,
|
|
149
|
-
threshold: props.warningAlarmProps.maxLogCount,
|
|
150
|
-
evaluationPeriods: 3
|
|
151
|
-
});
|
|
152
|
-
if (((_2 = props.warningAlarmProps) === null || _2 === void 0 ? void 0 : _2.notifyActions) !== undefined) {
|
|
153
|
-
this.warningLogAlarm.addAlarmActions(props.warningAlarmProps.notifyActions);
|
|
154
|
-
}
|
|
155
|
-
if (((_3 = props.warningAlarmProps) === null || _3 === void 0 ? void 0 : _3.notifyTopics) !== undefined) {
|
|
156
|
-
this.warningLogAlarm.addAlarmTopics(props.warningAlarmProps.notifyTopics);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
exports.PythonFunction = PythonFunction;
|
|
162
|
-
PythonFunction.DEFAULT_LOG_METRIC_PATTERN = '"[ERROR]"';
|
|
163
|
-
PythonFunction.DEFAULT_LOG_INSIGHTS_PATTERN = '\\\[ERROR\\\]';
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmQtZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RhbmRhcmQtZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlCQUF5QjtBQUN6Qix1REFBc0Y7QUFDdEYsMkNBQXFDO0FBQ3JDLDZDQUE2QztBQUU3Qyw2Q0FBc0U7QUFDdEUseUVBYW1DO0FBR25DLHlEQUE4QztBQUM5Qyx5REFBa0U7QUFDbEUsK0VBQTZEO0FBQzdELDZCQUE2QjtBQWtQN0IsU0FBUyxZQUFZLENBQ25CLElBQVksRUFDWixnQkFBb0MsRUFDcEMsaUJBQXFDLEVBQ3JDLG1CQUFvQyxFQUNwQyxvQkFBcUMsRUFDckMsdUJBQTJDLEVBQzNDLHdCQUE0QztJQUU1QyxJQUFJLFVBQVUsR0FBeUMsRUFBRSxDQUFBO0lBQ3pELElBQUksaUJBQWlCLEtBQUssU0FBUyxFQUFFO1FBQ25DLFVBQVUsQ0FBQyxRQUFRLEdBQUc7WUFDcEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUI7WUFDekIsY0FBYyxFQUFFLElBQUk7WUFDcEIsY0FBYyxFQUFFLElBQUksNkNBQTRCLENBQUMsRUFBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUMsQ0FBQztTQUNsRixDQUFBO0tBQ0Y7U0FBTSxJQUFJLHdCQUF3QixLQUFLLFNBQVMsRUFBRTtRQUNqRCxVQUFVLENBQUMsUUFBUSxHQUFHO1lBQ3BCLENBQUMsSUFBSSxDQUFDLEVBQUUsd0JBQXdCO1lBQ2hDLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLGNBQWMsRUFBRSxJQUFJLDZDQUE0QixDQUFDLEVBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFDLENBQUM7U0FDbEYsQ0FBQTtLQUNGO0lBQ0QsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7UUFDbEMsVUFBVSxDQUFDLE9BQU8sR0FBRztZQUNuQixDQUFDLElBQUksQ0FBQyxFQUFFLGdCQUFnQjtZQUN4QixjQUFjLEVBQUUsSUFBSTtZQUNwQixjQUFjLEVB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QzthQUM3RTtTQUNGO1FBRUQsd0JBQXdCO1FBQ3hCLElBQUksT0FBQSxLQUFLLENBQUMsaUJBQWlCLDBDQUFFLFdBQVcsTUFBSyxTQUFTLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUU7WUFDakcsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHlCQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtnQkFDdkQsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUTtnQkFDaEMsT0FBTyxjQUFFLEtBQUssQ0FBQyxpQkFBaUIsMENBQUUsZ0JBQWdCLG1DQUFFLGNBQWMsQ0FBQywwQkFBMEI7Z0JBQzdGLFNBQVMsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsV0FBVztnQkFDOUMsaUJBQWlCLEVBQUUsQ0FBQzthQUNyQixDQUFDLENBQUM7WUFDSCxJQUFJLE9BQUEsS0FBSyxDQUFDLGlCQUFpQiwwQ0FBRSxhQUFhLE1BQUssU0FBUyxFQUFFO2dCQUN4RCxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDN0U7WUFDRCxJQUFJLE9BQUEsS0FBSyxDQUFDLGlCQUFpQiwwQ0FBRSxZQUFZLE1BQUssU0FBUyxFQUFFO2dCQUN2RCxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDM0U7U0FDRjtJQUNILENBQUM7O0FBaElILHdDQWlJQztBQS9IaUIseUNBQTBCLEdBQUcsV0FBVyxDQUFDO0FBQ3pDLDJDQUE0QixHQUFHLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7QXJjaGl0ZWN0dXJlLCBDb2RlLCBGdW5jdGlvbiwgUnVudGltZSwgVHJhY2luZ30gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQge0NvbnN0cnVjdH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7QnVuZGxpbmdPcHRpb25zLCBCdW5kbGluZ091dHB1dCwgRHVyYXRpb259IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7XG4gIEN1c3RvbUFsYXJtVGhyZXNob2xkLFxuICBEdXJhdGlvblRocmVzaG9sZCxcbiAgRXJyb3JDb3VudFRocmVzaG9sZCxcbiAgRXJyb3JSYXRlVGhyZXNob2xkLFxuICBIaWdoVHBzVGhyZXNob2xkLFxuICBJRGFzaGJvYXJkRmFjdG9yeSxcbiAgTGF0ZW5jeVRocmVzaG9sZCxcbiAgTG93VHBzVGhyZXNob2xkLFxuICBNYXhBZ2VUaHJlc2hvbGQsXG4gIE1vbml0b3JpbmdGYWNhZGUsXG4gIFJ1bm5pbmdUYXNrQ291bnRUaHJlc2hvbGQsXG4gIFVzYWdlVGhyZXNob2xkLFxufSBmcm9tICdjZGstbW9uaXRvcmluZy1jb25zdHJ1Y3RzJztcbmltcG9ydCB7SVRvcGljfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCB7SUFsYXJtQWN0aW9ufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQge0xvZ0FsYXJtfSBmcm9tICcuLi8uLi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQge1N0YW5kYXJkQWxhcm1BY3Rpb25zU3RyYXRlZ3l9IGZyb20gJy4uLy4uL2F3cy1tb25pdG9yaW5nJztcbmltcG9ydCB7U25zQWN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gtYWN0aW9uc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYXJkRnVuY3Rpb25BbGFybVByb3BzIHtcblxuICAvKipcbiAgICogTWF4aW11bSA1MHRoIHBlcmNlbnRpbGUgbGF0ZW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgcDUwTGF0ZW5jeT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIDkwdGggcGVyY2VudGlsZSBsYXRlbmN5XG4gICAqL1xuICByZWFkb25seSBwOTBMYXRlbmN5PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE1heGltdW0gOTl0aCBwZXJjZW50aWxlIGxhdGVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHA5OUxhdGVuY3k/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgZmF1bHRzXG4gICAqXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHJlYWRvbmx5IG1heEZhdWx0cz86IG51bWJlcjtcblxuICAvKipcbiAgICogQXZlcmFnZSBudW1iZXIgb2YgZmF1bHRzXG4gICAqL1xuICByZWFkb25seSBhdmdGYXVsdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1pbmltdW0gdHJhbnNhY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBtaW5UcHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdHJhbnNhY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBtYXhUcHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIHRocm90dGxlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICByZWFkb25seSBtYXhUaHJvdHRsZXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEF2ZXJhZ2UgbnVtYmVyIG9mIHRocm90dGxlc1xuICAgKi9cbiAgcmVhZG9ubHkgYXZnVGhyb3R0bGVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGNvbmN1cnJlbnQgZXhlY3V0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFtb3VudCBvZiB0aW1lIGRhdGEgd2FpdHMgYmVmb3JlIGJlaW5nIHByb2Nlc3NlZCBieSB0aGUgZnVuY3Rpb24uXG4gICAqIFNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3ByZW1pdW1zdXBwb3J0L2tub3dsZWRnZS1jZW50ZXIvbGFtYmRhLWl0ZXJhdG9yLWFnZS9cbiAgICovXG4gIHJlYWRvbmx5IG1heEl0ZXJhdG9yQWdlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGFtb3VudCBvZiBDUFUgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q3B1VGltZT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiA5MHRoIHBlcmNlbnRpbGUgQ1BVIHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IHA5MENwdVRpbWU/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQXZlcmFnZSBDUFUgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgYXZnQ3B1VGltZT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGFtb3VudCBvZiBtZW1vcnlcbiAgICovXG4gIHJlYWRvbmx5IG1heE1lbW9yeT86IG51bWJlcjtcblxuICAvKipcbiAgICogOTB0aCBwZXJjZW50aWxlIG1lbW9yeVxuICAgKi9cbiAgcmVhZG9ubHkgcDkwTWVtb3J5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdmVyYWdlIG1lbW9yeVxuICAgKi9cbiAgcmVhZG9ubHkgYXZnTWVtb3J5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUb3BpY3MgdG8gc2VuZCBhbGFybSBub3RpZmljYXRpb25zXG4gICAqL1xuICByZWFkb25seSBub3RpZnlUb3BpY3M/OiBbSVRvcGljXTtcblxuICAvKipcbiAgICogQWN0aW9ucyB0byBzZW5kIGFsYXJtIG5vdGlmaWNhdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IG5vdGlmeUFjdGlvbnM/OiBbSUFsYXJtQWN0aW9uXTtcblxuICAvKipcbiAgICogTG9nIHBhdHRlcm4gdG8gbWF0Y2ggZm9yIG1ldHJpY3MuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdcXFxcXFxbRVJST1JcXFxcXFxdJ1xuICAgKi9cbiAgcmVhZG9ubHkgbWV0cmljTG9nUGF0dGVybj86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBMb2cgcGF0dGVybiB0byBtYXRjaCBmb3IgdGhlIGRhc2hib2FyZFxuICAgKlxuICAgKiBAZGVmYXVsdCAnXCJbRVJST1JdXCInXG4gICAqL1xuICByZWFkb25seSBkYXNoYm9hcmRMb2dQYXR0ZXJuPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGxvZyBldmVudHMgbWF0Y2hpbmcgdGhlIHBhdHRlcm4uXG4gICAqXG4gICAqIEBkZWZhdWx0IDAgZm9yIENyaXRpY2FsIEFsYXJtXG4gICAqL1xuICByZWFkb25seSBtYXhMb2dDb3VudD86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYXJkRnVuY3Rpb25Qcm9wcyB7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBBV1MgWC1SYXkgVHJhY2luZy5cbiAgICpcbiAgICogQGRlZmF1bHQgVHJhY2luZy5QQVNTX1RIUk9VR0hcbiAgICovXG4gIHJlYWRvbmx5IHRyYWNpbmc/OiBUcmFjaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgdG8gcmV0YWluIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxvZ3MuUmV0ZW50aW9uRGF5cy5USFJFRV9EQVlTXG4gICAqL1xuICByZWFkb25seSBsb2dSZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIFRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcmNoaXRlY3R1cmUuQVJNXzY0XG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIFZQQyBuZXR3b3JrIHRvIHBsYWNlIHRoZSBsYW1iZGEgbmV0d29yayBpbnRlcmZhY2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm90IHBsYWNlZCBpbiBhIFZQQ1xuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHBsYWNlIHRoZSBsYW1iZGEgaW5zaWRlIHRoZSBWUEMuIE9ubHkgdXNlZCBpZiAndnBjJyBpcyBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBWUEMgZGVmYXVsdCBzdHJhdGVneSBpcyB1c2VkIGlmIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBBbW91bnQgb2YgbWVtb3J5IGluIE1CIGFuZCBwcm9wb3J0aW9uYWxseSBDUFUgcG93ZXIgdG8gYWxsb2NhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IDc2OFxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogRnVuY3Rpb24gZXhlY3V0aW9uIHRpbWUgKGluIHNlY29uZHMpIGFmdGVyIHdoaWNoIHRoZSBMYW1iZGEgdGVybWluYXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygzMClcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIG1ha2UgYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBEYXNoYm9hcmRGYWN0b3J5IHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgQ2xvdWRXYXRjaCBkYXNoYm9hcmRzLlxuICAgKlxuICAgKiBJZiBub3QgZGVmaW5lZCwgZGFzaGJvYXJkcyBhcmUgbm90IGdlbmVyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRhc2hib2FyZEZhY3Rvcnk/OiBJRGFzaGJvYXJkRmFjdG9yeTtcblxuICAvKipcbiAgICogQWxhcm0gdGhyZXNob2xkcyBmb3IgY3JpdGljYWwgYWxhcm1zLlxuICAgKlxuICAgKiBJZiBubyBwcm9wZXJ0aWVzIGFyZSBwcm92aWRlZCwgYSBzZXQgb2YgZGVmYXVsdCBhbGFybXMgYXJlIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBjcml0aWNhbEFsYXJtUHJvcHM/OiBTdGFuZGFyZEZ1bmN0aW9uQWxhcm1Qcm9wcztcblxuICAvKipcbiAgICogQWxhcm0gdGhyZXNob2xkIGZvciB3YXJuaW5nIGFsYXJtcy5cbiAgICpcbiAgICogSWYgbm8gcHJvcGVydGllcyBhcmUgcHJvdmlkZWQsIGEgc2V0IG9mIGRlZmF1bHQgYWxhcm1zIGFyZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgd2FybmluZ0FsYXJtUHJvcHM/OiBTdGFuZGFyZEZ1bmN0aW9uQWxhcm1Qcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQeXRob25GdW5jdGlvblByb3BzIGV4dGVuZHMgU3RhbmRhcmRGdW5jdGlvblByb3BzIHtcblxuICAvKipcbiAgICogVGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24uIE11c3QgYmUgb25lIG9mIHRoZSBQeXRob24gcnVudGltZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJ1bnRpbWUuUFlUSE9OXzNfOVxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZT86IFJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIExvY2F0aW9uIG9uIHRoZSBmaWxlc3lzdGVtIHRoZSBMYW1iZGEgYXNzZXRzIGFyZSBmb3VuZC5cbiAgICpcbiAgICogRXhhbXBsZTogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ215bGFtYmRhJylcbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5OiBzdHJpbmdcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIHRoZSBoYW5kbGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnaW5kZXgucHknXG4gICAqL1xuICByZWFkb25seSBpbmRleD86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBFeHBvcnRlZCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdoYW5kbGVyJ1xuICAgKi9cbiAgcmVhZG9ubHkgaGFuZGxlcj86IHN0cmluZ1xufVxuXG5mdW5jdGlvbiB0b0FsYXJtUHJvcHMoXG4gIHByb3A6IHN0cmluZyxcbiAgd2FybmluZ1RocmVzaG9sZD86IG51bWJlciB8IER1cmF0aW9uLFxuICBjcml0aWNhbFRocmVzaG9sZD86IG51bWJlciB8IER1cmF0aW9uLFxuICB3YXJuaW5nQWxhcm1BY3Rpb25zPzogSUFsYXJtQWN0aW9uW10sXG4gIGNyaXRpY2FsQWxhcm1BY3Rpb25zPzogSUFsYXJtQWN0aW9uW10sXG4gIHdhcm5pbmdEZWZhdWx0VGhyZXNob2xkPzogbnVtYmVyIHwgRHVyYXRpb24sXG4gIGNyaXRpY2FsRGVmYXVsdFRocmVzaG9sZD86IG51bWJlciB8IER1cmF0aW9uXG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BbGFybVRocmVzaG9sZD4gfCB1bmRlZmluZWQge1xuICBsZXQgYWxhcm1Qcm9wczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWxhcm1UaHJlc2hvbGQ+ID0ge31cbiAgaWYgKGNyaXRpY2FsVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbGFybVByb3BzLkNyaXRpY2FsID0ge1xuICAgICAgW3Byb3BdOiBjcml0aWNhbFRocmVzaG9sZCxcbiAgICAgIGFjdGlvbnNFbmFibGVkOiB0cnVlLFxuICAgICAgYWN0aW9uT3ZlcnJpZGU6IG5ldyBTdGFuZGFyZEFsYXJtQWN0aW9uc1N0cmF0ZWd5KHthY3Rpb25zOiBjcml0aWNhbEFsYXJtQWN0aW9uc30pXG4gICAgfVxuICB9IGVsc2UgaWYgKGNyaXRpY2FsRGVmYXVsdFRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWxhcm1Qcm9wcy5Dcml0aWNhbCA9IHtcbiAgICAgIFtwcm9wXTogY3JpdGljYWxEZWZhdWx0VGhyZXNob2xkLFxuICAgICAgYWN0aW9uc0VuYWJsZWQ6IHRydWUsXG4gICAgICBhY3Rpb25PdmVycmlkZTogbmV3IFN0YW5kYXJkQWxhcm1BY3Rpb25zU3RyYXRlZ3koe2FjdGlvbnM6IGNyaXRpY2FsQWxhcm1BY3Rpb25zfSlcbiAgICB9XG4gIH1cbiAgaWYgKHdhcm5pbmdUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFsYXJtUHJvcHMuV2FybmluZyA9IHtcbiAgICAgIFtwcm9wXTogd2FybmluZ1RocmVzaG9sZCxcbiAgICAgIGFjdGlvbnNFbmFibGVkOiB0cnVlLFxuICAgICAgYWN0aW9uT3ZlcnJpZGU6IG5ldyBTdGFuZGFyZEFsYXJtQWN0aW9uc1N0cmF0ZWd5KHthY3Rpb25zOiB3YXJuaW5nQWxhcm1BY3Rpb25zfSlcbiAgICB9XG4gIH0gZWxzZSBpZiAod2FybmluZ0RlZmF1bHRUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFsYXJtUHJvcHMuV2FybmluZyA9IHtcbiAgICAgIFtwcm9wXTogd2FybmluZ0RlZmF1bHRUaHJlc2hvbGQsXG4gICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGFjdGlvbk92ZXJyaWRlOiBuZXcgU3RhbmRhcmRBbGFybUFjdGlvbnNTdHJhdGVneSh7YWN0aW9uczogd2FybmluZ0FsYXJtQWN0aW9uc30pXG4gICAgfVxuICB9XG4gIHJldHVybiBPYmplY3Qua2V5cyhhbGFybVByb3BzKS5sZW5ndGggPiAwID8gYWxhcm1Qcm9wcyA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY2xhc3MgUHl0aG9uRnVuY3Rpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuXG4gIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0xPR19NRVRSSUNfUEFUVEVSTiA9ICdcIltFUlJPUl1cIic7XG4gIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0xPR19JTlNJR0hUU19QQVRURVJOID0gJ1xcXFxcXFtFUlJPUlxcXFxcXF0nO1xuICByZWFkb25seSBkZWNsYXJlIG1vbml0b3Jpbmc6IE1vbml0b3JpbmdGYWNhZGVcbiAgcmVhZG9ubHkgZGVjbGFyZSBmdW5jdGlvbjogRnVuY3Rpb247XG4gIHJlYWRvbmx5IGRlY2xhcmUgY3JpdGljYWxMb2dBbGFybTogTG9nQWxhcm07XG4gIHJlYWRvbmx5IGRlY2xhcmUgd2FybmluZ0xvZ0FsYXJtOiBMb2dBbGFybTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUHl0aG9uRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLm1vbml0b3JpbmcgPSBuZXcgTW9uaXRvcmluZ0ZhY2FkZSh0aGlzLCAnTW9uaXRvcmluZycsIHtcbiAgICAgIG1ldHJpY0ZhY3RvcnlEZWZhdWx0czoge30sXG4gICAgICBhbGFybUZhY3RvcnlEZWZhdWx0czoge1xuICAgICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgYWxhcm1OYW1lUHJlZml4OiBzY29wZS5ub2RlLnBhdGgucmVwbGFjZSgvXFwvL2csICctJyksXG4gICAgICB9LFxuICAgICAgZGFzaGJvYXJkRmFjdG9yeTogcHJvcHMuZGFzaGJvYXJkRmFjdG9yeVxuICAgIH0pO1xuXG4gICAgbGV0IGJ1bmRsaW5nOiBCdW5kbGluZ09wdGlvbnMgfCB1bmRlZmluZWQgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9wcy5lbnRyeSwgJ3JlcXVpcmVtZW50cy50eHQnKSkgPyB7XG4gICAgICBpbWFnZTogcHJvcHMucnVudGltZT8uYnVuZGxpbmdJbWFnZT8/UnVudGltZS5QWVRIT05fM185LmJ1bmRsaW5nSW1hZ2UsXG4gICAgICBjb21tYW5kOiBbXG4gICAgICAgICdiYXNoJywgJy1jJywgW1xuICAgICAgICAgICdwaXAgaW5zdGFsbCAtLXRhcmdldCAvYXNzZXQtb3V0cHV0LyAtciByZXF1aXJlbWVudHMudHh0JyxcbiAgICAgICAgICAnY3AgLXJhICogL2Fzc2V0LW91dHB1dC8nXG4gICAgICAgIF0uam9pbignJiYnKVxuICAgICAgXSxcbiAgICAgIG91dHB1dFR5cGU6IEJ1bmRsaW5nT3V0cHV0Lk5PVF9BUkNISVZFRCxcbiAgICB9IDogdW5kZWZpbmVkXG5cbiAgICB0aGlzLmZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsIGlkLCB7XG4gICAgICBydW50aW1lOiBwcm9wcy5ydW50aW1lPz9SdW50aW1lLlBZVEhPTl8zXzksXG4gICAgICB0cmFjaW5nOiBwcm9wcy50cmFjaW5nPz9UcmFjaW5nLlBBU1NfVEhST1VHSCxcbiAgICAgIGxvZ1JldGVudGlvbjogcHJvcHMubG9nUmV0ZW50aW9uPz9sb2dzLlJldGVudGlvbkRheXMuVEhSRUVfREFZUyxcbiAgICAgIGFyY2hpdGVjdHVyZTogcHJvcHMuYXJjaGl0ZWN0dXJlPz9BcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiBwcm9wcy52cGNTdWJuZXRzLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZT8/NzY4LFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dD8/RHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgICBlbnZpcm9ubWVudDogcHJvcHMuZW52aXJvbm1lbnQsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwcm9wcy5lbnRyeSwge2J1bmRsaW5nfSksXG4gICAgICBoYW5kbGVyOiAocHJvcHMuaW5kZXg/PydpbmRleC5weScpLnJlcGxhY2UoJy5weScsICcnKSArICcuJyArIChwcm9wcy5oYW5kbGVyPz8naGFuZGxlcicpXG4gICAgfSk7XG5cbiAgICBjb25zdCB3YXJuUHJvcHMgPSBwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcztcbiAgICBjb25zdCB3YXJuQWN0aW9uczogSUFsYXJtQWN0aW9uW10gPSBbXTtcbiAgICB3YXJuUHJvcHM/Lm5vdGlmeUFjdGlvbnM/LmZvckVhY2goKGFjdGlvbikgPT4gd2FybkFjdGlvbnMucHVzaChhY3Rpb24pKTtcbiAgICB3YXJuUHJvcHM/Lm5vdGlmeVRvcGljcz8uZm9yRWFjaCgodG9waWMpID0+IHdhcm5BY3Rpb25zLnB1c2gobmV3IFNuc0FjdGlvbih0b3BpYykpKTtcbiAgICBjb25zdCBjcml0UHJvcHMgPSBwcm9wcy5jcml0aWNhbEFsYXJtUHJvcHM7XG4gICAgY29uc3QgY3JpdEFjdGlvbnM6IElBbGFybUFjdGlvbltdID0gW107XG4gICAgY3JpdFByb3BzPy5ub3RpZnlBY3Rpb25zPy5mb3JFYWNoKChhY3Rpb24pID0+IGNyaXRBY3Rpb25zLnB1c2goYWN0aW9uKSk7XG4gICAgY3JpdFByb3BzPy5ub3RpZnlUb3BpY3M/LmZvckVhY2goKHRvcGljKSA9PiBjcml0QWN0aW9ucy5wdXNoKG5ldyBTbnNBY3Rpb24odG9waWMpKSk7XG5cbiAgICB0aGlzLm1vbml0b3JpbmcubW9uaXRvckxhbWJkYUZ1bmN0aW9uKHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmZ1bmN0aW9uLFxuICAgICAgbGFtYmRhSW5zaWdodHNFbmFibGVkOiB0cnVlLFxuICAgICAgYWRkVG9BbGFybURhc2hib2FyZDogdHJ1ZSxcbiAgICAgIGFkZFRvRGV0YWlsRGFzaGJvYXJkOiB0cnVlLFxuICAgICAgYWRkVG9TdW1tYXJ5RGFzaGJvYXJkOiB0cnVlLFxuICAgICAgYWRkTGF0ZW5jeVA1MEFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heExhdGVuY3knLCB3YXJuUHJvcHM/LnA1MExhdGVuY3ksIGNyaXRQcm9wcz8ucDUwTGF0ZW5jeSwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPixcbiAgICAgIGFkZExhdGVuY3lQOTBBbGFybTogdG9BbGFybVByb3BzKCdtYXhMYXRlbmN5Jywgd2FyblByb3BzPy5wOTBMYXRlbmN5LCBjcml0UHJvcHM/LnA5MExhdGVuY3ksIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTGF0ZW5jeVRocmVzaG9sZD4sXG4gICAgICBhZGRMYXRlbmN5UDk5QWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4TGF0ZW5jeScsIHdhcm5Qcm9wcz8ucDk5TGF0ZW5jeSwgY3JpdFByb3BzPy5wOTlMYXRlbmN5LCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+LFxuICAgICAgYWRkRmF1bHRDb3VudEFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heEVycm9yQ291bnQnLCB3YXJuUHJvcHM/Lm1heEZhdWx0cywgY3JpdFByb3BzPy5tYXhGYXVsdHMsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucywgdW5kZWZpbmVkLCAwKSBhcyBSZWNvcmQ8c3RyaW5nLCBFcnJvckNvdW50VGhyZXNob2xkPixcbiAgICAgIGFkZEZhdWx0UmF0ZUFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heEVycm9yUmF0ZScsIHdhcm5Qcm9wcz8uYXZnRmF1bHRzLCBjcml0UHJvcHM/LmF2Z0ZhdWx0cywgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBFcnJvclJhdGVUaHJlc2hvbGQ+LFxuICAgICAgYWRkTG93VHBzQWxhcm06IHRvQWxhcm1Qcm9wcygnbWluVHBzJywgd2FyblByb3BzPy5taW5UcHMsIGNyaXRQcm9wcz8ubWluVHBzLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIExvd1Rwc1RocmVzaG9sZD4sXG4gICAgICBhZGRIaWdoVHBzQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4VHBzJywgd2FyblByb3BzPy5tYXhUcHMsIGNyaXRQcm9wcz8ubWF4VHBzLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIEhpZ2hUcHNUaHJlc2hvbGQ+LFxuICAgICAgYWRkVGhyb3R0bGVzQ291bnRBbGFybTogdG9BbGFybVByb3BzKCdtYXhFcnJvckNvdW50Jywgd2FyblByb3BzPy5tYXhUaHJvdHRsZXMsIGNyaXRQcm9wcz8ubWF4VGhyb3R0bGVzLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMsIHVuZGVmaW5lZCwgMCkgYXMgUmVjb3JkPHN0cmluZywgRXJyb3JDb3VudFRocmVzaG9sZD4sXG4gICAgICBhZGRUaHJvdHRsZXNSYXRlQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4RXJyb3JSYXRlJywgd2FyblByb3BzPy5hdmdUaHJvdHRsZXMsIGNyaXRQcm9wcz8uYXZnVGhyb3R0bGVzLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIEVycm9yUmF0ZVRocmVzaG9sZD4sXG4gICAgICBhZGRDb25jdXJyZW50RXhlY3V0aW9uc0NvdW50QWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4UnVubmluZ1Rhc2tzJywgd2FyblByb3BzPy5tYXhDb25jdXJyZW50RXhlY3V0aW9ucywgY3JpdFByb3BzPy5tYXhDb25jdXJyZW50RXhlY3V0aW9ucywgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBSdW5uaW5nVGFza0NvdW50VGhyZXNob2xkPixcbiAgICAgIGFkZE1heEl0ZXJhdG9yQWdlQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4QWdlSW5NaWxsaXMnLCB3YXJuUHJvcHM/Lm1heEl0ZXJhdG9yQWdlLCBjcml0UHJvcHM/Lm1heEl0ZXJhdG9yQWdlLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIE1heEFnZVRocmVzaG9sZD4sXG4gICAgICBhZGRFbmhhbmNlZE1vbml0b3JpbmdNYXhDcHVUb3RhbFRpbWVBbGFybTogdG9BbGFybVByb3BzKCdtYXhEdXJhdGlvbicsIHdhcm5Qcm9wcz8ubWF4Q3B1VGltZSwgY3JpdFByb3BzPy5tYXhDcHVUaW1lLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIER1cmF0aW9uVGhyZXNob2xkPixcbiAgICAgIGFkZEVuaGFuY2VkTW9uaXRvcmluZ1A5MENwdVRvdGFsVGltZUFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heER1cmF0aW9uJywgd2FyblByb3BzPy5wOTBDcHVUaW1lLCBjcml0UHJvcHM/LnA5MENwdVRpbWUsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgRHVyYXRpb25UaHJlc2hvbGQ+LFxuICAgICAgYWRkRW5oYW5jZWRNb25pdG9yaW5nQXZnQ3B1VG90YWxUaW1lQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4RHVyYXRpb24nLCB3YXJuUHJvcHM/LmF2Z0NwdVRpbWUsIGNyaXRQcm9wcz8uYXZnQ3B1VGltZSwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyAgUmVjb3JkPHN0cmluZywgRHVyYXRpb25UaHJlc2hvbGQ+LFxuICAgICAgYWRkRW5oYW5jZWRNb25pdG9yaW5nTWF4TWVtb3J5VXRpbGl6YXRpb25BbGFybTogdG9BbGFybVByb3BzKCdtYXhVc2FnZVBlcmNlbnQnLCB3YXJuUHJvcHM/Lm1heE1lbW9yeSwgY3JpdFByb3BzPy5tYXhNZW1vcnksIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgIFJlY29yZDxzdHJpbmcsIFVzYWdlVGhyZXNob2xkPixcbiAgICAgIGFkZEVuaGFuY2VkTW9uaXRvcmluZ1A5ME1lbW9yeVV0aWxpemF0aW9uQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4VXNhZ2VQZXJjZW50Jywgd2FyblByb3BzPy5wOTBNZW1vcnksIGNyaXRQcm9wcz8ucDkwTWVtb3J5LCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIFVzYWdlVGhyZXNob2xkPixcbiAgICAgIGFkZEVuaGFuY2VkTW9uaXRvcmluZ0F2Z01lbW9yeVV0aWxpemF0aW9uQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4VXNhZ2VQZXJjZW50Jywgd2FyblByb3BzPy5hdmdNZW1vcnksIGNyaXRQcm9wcz8uYXZnTWVtb3J5LCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIFVzYWdlVGhyZXNob2xkPixcbiAgICB9KTtcblxuICAgIC8vIEFkZCBsb2cgbW9uaXRvcmluZyB0byBkYXNoYm9hcmRcbiAgICBsZXQgY3JpdE1heExvZ0NvdW50ID0gcHJvcHMuY3JpdGljYWxBbGFybVByb3BzPy5tYXhMb2dDb3VudD8/MVxuICAgIGxldCBwYXR0ZXJuID0gJyc7XG4gICAgaWYgKGNyaXRNYXhMb2dDb3VudCA+IDApIHtcbiAgICAgIHBhdHRlcm4gPSBwcm9wcy5jcml0aWNhbEFsYXJtUHJvcHM/LmRhc2hib2FyZExvZ1BhdHRlcm4/P1B5dGhvbkZ1bmN0aW9uLkRFRkFVTFRfTE9HX0lOU0lHSFRTX1BBVFRFUk5cbiAgICB9XG4gICAgaWYgKHByb3BzLndhcm5pbmdBbGFybVByb3BzPy5tYXhMb2dDb3VudCAhPT0gdW5kZWZpbmVkICYmIHBhdHRlcm4gIT09IHByb3BzLndhcm5pbmdBbGFybVByb3BzLmRhc2hib2FyZExvZ1BhdHRlcm4pIHtcbiAgICAgIHBhdHRlcm4gKz0gKHBhdHRlcm4gIT09ICcnID8gJ3wnIDogJycpICsgcHJvcHMud2FybmluZ0FsYXJtUHJvcHMuZGFzaGJvYXJkTG9nUGF0dGVyblxuICAgIH1cbiAgICBpZiAocGF0dGVybiAhPT0gJycpIHtcbiAgICAgIHRoaXMubW9uaXRvcmluZy5tb25pdG9yTG9nKHtcbiAgICAgICAgbG9nR3JvdXBOYW1lOiB0aGlzLmZ1bmN0aW9uLmxvZ0dyb3VwLmxvZ0dyb3VwTmFtZSxcbiAgICAgICAgcGF0dGVybixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBjcml0aWNhbCBsb2cgYWxhcm1cbiAgICBpZiAoY3JpdE1heExvZ0NvdW50ID4gMCkge1xuICAgICAgdGhpcy5jcml0aWNhbExvZ0FsYXJtID0gbmV3IExvZ0FsYXJtKHRoaXMsICdMb2dzQ3JpdGljYWwnLCB7XG4gICAgICAgIGxvZ0dyb3VwOiB0aGlzLmZ1bmN0aW9uLmxvZ0dyb3VwLFxuICAgICAgICBwYXR0ZXJuOiBwcm9wcy5jcml0aWNhbEFsYXJtUHJvcHM/Lm1ldHJpY0xvZ1BhdHRlcm4/P1B5dGhvbkZ1bmN0aW9uLkRFRkFVTFRfTE9HX01FVFJJQ19QQVRURVJOLFxuICAgICAgICB0aHJlc2hvbGQ6IGNyaXRNYXhMb2dDb3VudCxcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDNcbiAgICAgIH0pO1xuICAgICAgaWYgKHByb3BzLmNyaXRpY2FsQWxhcm1Qcm9wcz8ubm90aWZ5QWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY3JpdGljYWxMb2dBbGFybS5hZGRBbGFybUFjdGlvbnMocHJvcHMuY3JpdGljYWxBbGFybVByb3BzLm5vdGlmeUFjdGlvbnMpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmNyaXRpY2FsQWxhcm1Qcm9wcz8ubm90aWZ5VG9waWNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jcml0aWNhbExvZ0FsYXJtLmFkZEFsYXJtVG9waWNzKHByb3BzLmNyaXRpY2FsQWxhcm1Qcm9wcy5ub3RpZnlUb3BpY3MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCB3YXJuaW5nIGxvZyBhbGFybVxuICAgIGlmIChwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcz8ubWF4TG9nQ291bnQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcy5tYXhMb2dDb3VudCA+IDApIHtcbiAgICAgIHRoaXMud2FybmluZ0xvZ0FsYXJtID0gbmV3IExvZ0FsYXJtKHRoaXMsICdMb2dzV2FybmluZycsIHtcbiAgICAgICAgbG9nR3JvdXA6IHRoaXMuZnVuY3Rpb24ubG9nR3JvdXAsXG4gICAgICAgIHBhdHRlcm46IHByb3BzLndhcm5pbmdBbGFybVByb3BzPy5tZXRyaWNMb2dQYXR0ZXJuPz9QeXRob25GdW5jdGlvbi5ERUZBVUxUX0xPR19NRVRSSUNfUEFUVEVSTixcbiAgICAgICAgdGhyZXNob2xkOiBwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcy5tYXhMb2dDb3VudCxcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDNcbiAgICAgIH0pO1xuICAgICAgaWYgKHByb3BzLndhcm5pbmdBbGFybVByb3BzPy5ub3RpZnlBY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy53YXJuaW5nTG9nQWxhcm0uYWRkQWxhcm1BY3Rpb25zKHByb3BzLndhcm5pbmdBbGFybVByb3BzLm5vdGlmeUFjdGlvbnMpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLndhcm5pbmdBbGFybVByb3BzPy5ub3RpZnlUb3BpY3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLndhcm5pbmdMb2dBbGFybS5hZGRBbGFybVRvcGljcyhwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcy5ub3RpZnlUb3BpY3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|