@liflig/cdk 3.22.19 → 3.23.1
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/assets/README.md +32 -0
- package/assets/slack-error-log-handler-lambda/.python-version +1 -0
- package/assets/slack-error-log-handler-lambda/__pycache__/index.cpython-314.pyc +0 -0
- package/assets/slack-error-log-handler-lambda/__pycache__/test_handler.cpython-314-pytest-9.0.2.pyc +0 -0
- package/assets/slack-error-log-handler-lambda/index.py +411 -0
- package/assets/slack-error-log-handler-lambda/pyproject.toml +13 -0
- package/assets/slack-error-log-handler-lambda/test_handler.py +229 -0
- package/assets/slack-error-log-handler-lambda/uv.lock +176 -0
- package/lib/alarms/database-alarms.d.ts +31 -18
- package/lib/alarms/database-alarms.js +39 -18
- package/lib/alarms/index.d.ts +2 -0
- package/lib/alarms/index.js +2 -1
- package/lib/alarms/lambda-alarms.d.ts +116 -14
- package/lib/alarms/lambda-alarms.js +158 -29
- package/lib/alarms/log-filter-patterns.d.ts +5 -0
- package/lib/alarms/log-filter-patterns.js +6 -0
- package/lib/alarms/queue-alarms.d.ts +88 -0
- package/lib/alarms/queue-alarms.js +109 -0
- package/lib/alarms/service-alarms.d.ts +75 -8
- package/lib/alarms/service-alarms.js +130 -38
- package/lib/alarms/slack-alarm.d.ts +6 -1
- package/lib/alarms/slack-alarm.js +23 -5
- package/lib/ecs/fargate-service.d.ts +111 -1
- package/lib/ecs/fargate-service.js +46 -2
- package/lib/load-balancer/load-balancer.js +2 -2
- package/lib/rds/database.d.ts +83 -0
- package/lib/rds/database.js +41 -1
- package/package.json +1 -1
|
@@ -1,41 +1,143 @@
|
|
|
1
1
|
import * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
|
|
2
2
|
import type * as lambda from "aws-cdk-lib/aws-lambda";
|
|
3
|
+
import * as logs from "aws-cdk-lib/aws-logs";
|
|
3
4
|
import * as constructs from "constructs";
|
|
4
5
|
export interface LambdaAlarmsProps {
|
|
5
6
|
/**
|
|
6
|
-
* The
|
|
7
|
+
* The CloudWatch alarm action to use for high-severity alarms (ALARM channel).
|
|
7
8
|
*/
|
|
8
|
-
|
|
9
|
+
alarmAction: cloudwatch.IAlarmAction;
|
|
10
|
+
/**
|
|
11
|
+
* The CloudWatch alarm action to use for lower-severity warnings (WARNING channel).
|
|
12
|
+
*/
|
|
13
|
+
warningAction: cloudwatch.IAlarmAction;
|
|
9
14
|
/**
|
|
10
15
|
* The Lambda to add alarms to.
|
|
11
16
|
*/
|
|
12
17
|
lambdaFunction: lambda.IFunction;
|
|
18
|
+
/**
|
|
19
|
+
* Optional Lambda function that will receive forwarded log events.
|
|
20
|
+
* If provided, subscription filters will be created to forward matching logs
|
|
21
|
+
*/
|
|
22
|
+
logHandler?: lambda.IFunction;
|
|
13
23
|
}
|
|
14
24
|
/**
|
|
15
25
|
* Alarms for Lambda functions.
|
|
16
26
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
27
|
+
* Unlike RDS and ECS alarm constructs in this package, `LambdaAlarms` is
|
|
28
|
+
* set up manually by consumers.
|
|
19
29
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
30
|
+
* Defaults:
|
|
31
|
+
* - single invocation (singleError) -> sent to `warningAction` by default
|
|
32
|
+
* - multiple invocation (multipleErrors) -> sent to `alarmAction` by default
|
|
33
|
+
* - error log alarm (ERROR/FATAL JSON logs) -> sent to `warningAction` by default
|
|
34
|
+
* - uncaught Java exception alarm -> sent to `warningAction` by default (disabled by default)
|
|
22
35
|
*/
|
|
23
36
|
export declare class LambdaAlarms extends constructs.Construct {
|
|
24
|
-
private readonly
|
|
37
|
+
private readonly alarmAction;
|
|
38
|
+
private readonly warningAction;
|
|
25
39
|
private readonly lambdaFunction;
|
|
40
|
+
private readonly logHandler?;
|
|
26
41
|
constructor(scope: constructs.Construct, id: string, props: LambdaAlarmsProps);
|
|
27
42
|
/**
|
|
28
|
-
*
|
|
29
|
-
*
|
|
43
|
+
* Creates both the single-invocation warning and the
|
|
44
|
+
* multiple invocations alarm with reasonable defaults.
|
|
45
|
+
*
|
|
46
|
+
* Each created alarm can be overridden via the per-alarm props.
|
|
30
47
|
*/
|
|
31
|
-
addInvocationErrorAlarm(
|
|
48
|
+
addInvocationErrorAlarm(props?: {
|
|
49
|
+
singleError?: {
|
|
50
|
+
appendToAlarmDescription?: string;
|
|
51
|
+
enabled?: boolean;
|
|
52
|
+
action?: cloudwatch.IAlarmAction;
|
|
53
|
+
/**
|
|
54
|
+
* @default true
|
|
55
|
+
*/
|
|
56
|
+
enableOkAlarm?: boolean;
|
|
57
|
+
};
|
|
58
|
+
multipleErrors?: {
|
|
59
|
+
appendToAlarmDescription?: string;
|
|
60
|
+
enabled?: boolean;
|
|
61
|
+
action?: cloudwatch.IAlarmAction;
|
|
62
|
+
/**
|
|
63
|
+
* @default true
|
|
64
|
+
*/
|
|
65
|
+
enableOkAlarm?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* @default 3
|
|
68
|
+
*/
|
|
69
|
+
evaluationPeriods?: number;
|
|
70
|
+
/**
|
|
71
|
+
* @default 1
|
|
72
|
+
*/
|
|
73
|
+
threshold?: number;
|
|
74
|
+
/**
|
|
75
|
+
* @default 60
|
|
76
|
+
*/
|
|
77
|
+
periodSeconds?: number;
|
|
78
|
+
};
|
|
79
|
+
}): void;
|
|
32
80
|
/**
|
|
33
|
-
*
|
|
81
|
+
* Sets up a CloudWatch Alarm that triggers on a single invocation failure.
|
|
34
82
|
*/
|
|
35
|
-
props?: {
|
|
83
|
+
addSingleInvocationAlarm(props?: {
|
|
84
|
+
appendToAlarmDescription?: string;
|
|
85
|
+
enabled?: boolean;
|
|
86
|
+
action?: cloudwatch.IAlarmAction;
|
|
87
|
+
enableOkAlarm?: boolean;
|
|
88
|
+
}): void;
|
|
89
|
+
/**
|
|
90
|
+
* Sets up a CloudWatch Alarm that triggers when there is a short series of
|
|
91
|
+
* invocation failures.
|
|
92
|
+
*/
|
|
93
|
+
addMultipleInvocationAlarms(props?: {
|
|
94
|
+
appendToAlarmDescription?: string;
|
|
95
|
+
enabled?: boolean;
|
|
96
|
+
action?: cloudwatch.IAlarmAction;
|
|
36
97
|
/**
|
|
37
|
-
*
|
|
98
|
+
* @default true
|
|
38
99
|
*/
|
|
39
|
-
|
|
100
|
+
enableOkAlarm?: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* @default 3
|
|
103
|
+
*/
|
|
104
|
+
evaluationPeriods?: number;
|
|
105
|
+
/**
|
|
106
|
+
* @default 1
|
|
107
|
+
*/
|
|
108
|
+
threshold?: number;
|
|
109
|
+
/**
|
|
110
|
+
* @default 60
|
|
111
|
+
*/
|
|
112
|
+
periodSeconds?: number;
|
|
113
|
+
}): void;
|
|
114
|
+
/**
|
|
115
|
+
* Alerts when ERROR is logged from lambda.
|
|
116
|
+
*/
|
|
117
|
+
addErrorAlarm(props: {
|
|
118
|
+
logGroup: logs.ILogGroup;
|
|
119
|
+
alarmDescription?: string;
|
|
120
|
+
/**
|
|
121
|
+
* @default true
|
|
122
|
+
*/
|
|
123
|
+
enableOkAlarm?: boolean;
|
|
124
|
+
/**
|
|
125
|
+
* An action to use for CloudWatch alarm state changes
|
|
126
|
+
* instead of the default warning action
|
|
127
|
+
*/
|
|
128
|
+
action?: cloudwatch.IAlarmAction;
|
|
129
|
+
}): void;
|
|
130
|
+
/**
|
|
131
|
+
* Adds an alarm for uncaught Java exceptions in the Lambda function's logs.
|
|
132
|
+
*/
|
|
133
|
+
addUncaughtJavaExceptionAlarm(props: {
|
|
134
|
+
logGroup: logs.ILogGroup;
|
|
135
|
+
alarmDescription?: string;
|
|
136
|
+
/**
|
|
137
|
+
* @default false
|
|
138
|
+
*/
|
|
139
|
+
enabled?: boolean;
|
|
140
|
+
enableOkAlarm?: boolean;
|
|
141
|
+
action?: cloudwatch.IAlarmAction;
|
|
40
142
|
}): void;
|
|
41
143
|
}
|
|
@@ -1,49 +1,178 @@
|
|
|
1
1
|
import * as cdk from "aws-cdk-lib";
|
|
2
2
|
import * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
|
|
3
|
+
import * as logs from "aws-cdk-lib/aws-logs";
|
|
4
|
+
import * as logsDestinations from "aws-cdk-lib/aws-logs-destinations";
|
|
3
5
|
import * as constructs from "constructs";
|
|
6
|
+
import { jsonErrorFilterPattern } from "./log-filter-patterns";
|
|
4
7
|
/**
|
|
5
8
|
* Alarms for Lambda functions.
|
|
6
9
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
10
|
+
* Unlike RDS and ECS alarm constructs in this package, `LambdaAlarms` is
|
|
11
|
+
* set up manually by consumers.
|
|
9
12
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
13
|
+
* Defaults:
|
|
14
|
+
* - single invocation (singleError) -> sent to `warningAction` by default
|
|
15
|
+
* - multiple invocation (multipleErrors) -> sent to `alarmAction` by default
|
|
16
|
+
* - error log alarm (ERROR/FATAL JSON logs) -> sent to `warningAction` by default
|
|
17
|
+
* - uncaught Java exception alarm -> sent to `warningAction` by default (disabled by default)
|
|
12
18
|
*/
|
|
13
19
|
export class LambdaAlarms extends constructs.Construct {
|
|
14
|
-
|
|
20
|
+
alarmAction;
|
|
21
|
+
warningAction;
|
|
15
22
|
lambdaFunction;
|
|
23
|
+
logHandler;
|
|
16
24
|
constructor(scope, id, props) {
|
|
17
25
|
super(scope, id);
|
|
18
|
-
this.
|
|
26
|
+
this.alarmAction = props.alarmAction;
|
|
27
|
+
this.warningAction = props.warningAction;
|
|
19
28
|
this.lambdaFunction = props.lambdaFunction;
|
|
29
|
+
this.logHandler = props.logHandler;
|
|
20
30
|
}
|
|
21
31
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
32
|
+
* Creates both the single-invocation warning and the
|
|
33
|
+
* multiple invocations alarm with reasonable defaults.
|
|
34
|
+
*
|
|
35
|
+
* Each created alarm can be overridden via the per-alarm props.
|
|
24
36
|
*/
|
|
25
|
-
addInvocationErrorAlarm(
|
|
37
|
+
addInvocationErrorAlarm(props) {
|
|
38
|
+
this.addSingleInvocationAlarm(props?.singleError);
|
|
39
|
+
this.addMultipleInvocationAlarms(props?.multipleErrors);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Sets up a CloudWatch Alarm that triggers on a single invocation failure.
|
|
43
|
+
*/
|
|
44
|
+
addSingleInvocationAlarm(props) {
|
|
45
|
+
if (props?.enabled !== false) {
|
|
46
|
+
// Sent to warnings channel by default
|
|
47
|
+
const action = props?.action ?? this.warningAction;
|
|
48
|
+
const alarm = new cloudwatch.Metric({
|
|
49
|
+
metricName: "Errors",
|
|
50
|
+
namespace: "AWS/Lambda",
|
|
51
|
+
statistic: "Sum",
|
|
52
|
+
period: cdk.Duration.seconds(60),
|
|
53
|
+
dimensionsMap: {
|
|
54
|
+
FunctionName: this.lambdaFunction.functionName,
|
|
55
|
+
},
|
|
56
|
+
}).createAlarm(this, "SingleInvocationAlarm", {
|
|
57
|
+
alarmDescription: `Invocation for '${this.lambdaFunction.functionName}' had a single failure. ${props?.appendToAlarmDescription ?? ""}`,
|
|
58
|
+
comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
|
|
59
|
+
evaluationPeriods: 1,
|
|
60
|
+
threshold: 1,
|
|
61
|
+
treatMissingData: cloudwatch.TreatMissingData.IGNORE,
|
|
62
|
+
});
|
|
63
|
+
alarm.addAlarmAction(action);
|
|
64
|
+
if (props?.enableOkAlarm ?? true)
|
|
65
|
+
alarm.addOkAction(action);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Sets up a CloudWatch Alarm that triggers when there is a short series of
|
|
70
|
+
* invocation failures.
|
|
71
|
+
*/
|
|
72
|
+
addMultipleInvocationAlarms(props) {
|
|
73
|
+
if (props?.enabled !== false) {
|
|
74
|
+
const alarm = new cloudwatch.Metric({
|
|
75
|
+
metricName: "Errors",
|
|
76
|
+
namespace: "AWS/Lambda",
|
|
77
|
+
statistic: "Sum",
|
|
78
|
+
period: cdk.Duration.seconds(props?.periodSeconds ?? 60),
|
|
79
|
+
dimensionsMap: {
|
|
80
|
+
FunctionName: this.lambdaFunction.functionName,
|
|
81
|
+
},
|
|
82
|
+
}).createAlarm(this, "InvocationSeriesAlarm", {
|
|
83
|
+
alarmDescription: `Invocation for '${this.lambdaFunction.functionName}' failed repeatedly. ${props?.appendToAlarmDescription ?? ""}`,
|
|
84
|
+
comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
|
|
85
|
+
evaluationPeriods: props?.evaluationPeriods ?? 3,
|
|
86
|
+
threshold: props?.threshold ?? 1,
|
|
87
|
+
treatMissingData: cloudwatch.TreatMissingData.IGNORE,
|
|
88
|
+
});
|
|
89
|
+
// Sent to alarm channel by default
|
|
90
|
+
const multipleAction = props?.action ?? this.alarmAction;
|
|
91
|
+
alarm.addAlarmAction(multipleAction);
|
|
92
|
+
if (props?.enableOkAlarm ?? true) {
|
|
93
|
+
alarm.addOkAction(multipleAction);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Alerts when ERROR is logged from lambda.
|
|
99
|
+
*/
|
|
100
|
+
addErrorAlarm(props) {
|
|
101
|
+
// If no log handler is configured, create simple "ERROR" metric alarm
|
|
102
|
+
if (!this.logHandler) {
|
|
103
|
+
const errorMetricFilter = props.logGroup.addMetricFilter("ErrorMetricFilter", {
|
|
104
|
+
filterPattern: jsonErrorFilterPattern(),
|
|
105
|
+
metricName: "Errors",
|
|
106
|
+
metricNamespace: `stack/${cdk.Stack.of(this).stackName}/${this.lambdaFunction.functionName}/Errors`,
|
|
107
|
+
});
|
|
108
|
+
const errorAlarm = errorMetricFilter
|
|
109
|
+
.metric()
|
|
110
|
+
.with({
|
|
111
|
+
statistic: "Sum",
|
|
112
|
+
period: cdk.Duration.seconds(60),
|
|
113
|
+
})
|
|
114
|
+
.createAlarm(this, "ErrorLogAlarm", {
|
|
115
|
+
alarmDescription: props.alarmDescription ??
|
|
116
|
+
`${this.lambdaFunction.functionName} logged an error`,
|
|
117
|
+
evaluationPeriods: 1,
|
|
118
|
+
threshold: 1,
|
|
119
|
+
treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING,
|
|
120
|
+
});
|
|
121
|
+
// Sent to warnings channel by default
|
|
122
|
+
const action = props.action ?? this.warningAction;
|
|
123
|
+
errorAlarm.addAlarmAction(action);
|
|
124
|
+
if (props.enableOkAlarm ?? true) {
|
|
125
|
+
errorAlarm.addOkAction(action);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (this.logHandler) {
|
|
129
|
+
props.logGroup.addSubscriptionFilter("liflig-cdk-log-content-to-slack-error-subscription", {
|
|
130
|
+
destination: new logsDestinations.LambdaDestination(this.logHandler),
|
|
131
|
+
filterPattern: jsonErrorFilterPattern(),
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}
|
|
26
135
|
/**
|
|
27
|
-
*
|
|
136
|
+
* Adds an alarm for uncaught Java exceptions in the Lambda function's logs.
|
|
28
137
|
*/
|
|
29
|
-
props) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
138
|
+
addUncaughtJavaExceptionAlarm(props) {
|
|
139
|
+
if (props.enabled) {
|
|
140
|
+
const filterPattern = logs.FilterPattern.allTerms("Exception in thread");
|
|
141
|
+
// If no log handler is configured, create a simple metric alarm.
|
|
142
|
+
if (!this.logHandler) {
|
|
143
|
+
const errorMetricFilter = props.logGroup.addMetricFilter("UncaughtJavaExceptionFilter", {
|
|
144
|
+
filterPattern: filterPattern,
|
|
145
|
+
metricName: "UncaughtJavaException",
|
|
146
|
+
metricNamespace: `stack/${cdk.Stack.of(this).stackName}/${this.lambdaFunction.functionName}/UncaughtJavaException`,
|
|
147
|
+
});
|
|
148
|
+
const errorAlarm = errorMetricFilter
|
|
149
|
+
.metric()
|
|
150
|
+
.with({
|
|
151
|
+
statistic: "Sum",
|
|
152
|
+
period: cdk.Duration.seconds(60),
|
|
153
|
+
})
|
|
154
|
+
.createAlarm(this, "UncaughtJavaExceptionLogAlarm", {
|
|
155
|
+
alarmDescription: props.alarmDescription ??
|
|
156
|
+
`${this.lambdaFunction.functionName} logged an uncaught Java exception`,
|
|
157
|
+
evaluationPeriods: 1,
|
|
158
|
+
threshold: 1,
|
|
159
|
+
treatMissingData: cloudwatch.TreatMissingData.NOT_BREACHING,
|
|
160
|
+
});
|
|
161
|
+
// Default to the warning action
|
|
162
|
+
const actionToUse = props.action ?? this.warningAction;
|
|
163
|
+
errorAlarm.addAlarmAction(actionToUse);
|
|
164
|
+
if (props.enableOkAlarm ?? true) {
|
|
165
|
+
errorAlarm.addOkAction(actionToUse);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// If a log handler is configured, forward matching logs to it.
|
|
169
|
+
if (this.logHandler) {
|
|
170
|
+
props.logGroup.addSubscriptionFilter("liflig-cdk-log-content-to-slack-uncaught-exception-subscription", {
|
|
171
|
+
destination: new logsDestinations.LambdaDestination(this.logHandler),
|
|
172
|
+
filterPattern: filterPattern,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
47
176
|
}
|
|
48
177
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWFsYXJtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbGFybXMvbGFtYmRhLWFsYXJtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQTtBQUNsQyxPQUFPLEtBQUssVUFBVSxNQUFNLDRCQUE0QixDQUFBO0FBRXhELE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBYXhDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxVQUFVLENBQUMsU0FBUztJQUNuQyxNQUFNLENBQXlCO0lBQy9CLGNBQWMsQ0FBa0I7SUFFakQsWUFDRSxLQUEyQixFQUMzQixFQUFVLEVBQ1YsS0FBd0I7UUFFeEIsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUVoQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUE7UUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFBO0lBQzVDLENBQUM7SUFFRDs7O09BR0c7SUFDSCx1QkFBdUI7SUFDckI7O09BRUc7SUFDSCxLQUtDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDO1lBQ2xDLFVBQVUsRUFBRSxRQUFRO1lBQ3BCLFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDaEMsYUFBYSxFQUFFO2dCQUNiLFlBQVksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVk7YUFDL0M7U0FDRixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRTtZQUM1QyxnQkFBZ0IsRUFBRSxtQkFBbUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLGFBQWEsS0FBSyxFQUFFLHdCQUF3QixJQUFJLEVBQUUsRUFBRTtZQUN6SCxrQkFBa0IsRUFDaEIsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGtDQUFrQztZQUNsRSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3BCLFNBQVMsRUFBRSxDQUFDO1lBQ1osZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE1BQU07U0FDckQsQ0FBQyxDQUFBO1FBRUYsS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDakMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDaEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBjbG91ZHdhdGNoIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiXG5pbXBvcnQgdHlwZSAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcblxuZXhwb3J0IGludGVyZmFjZSBMYW1iZGFBbGFybXNQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBhY3Rpb24gdG8gdXNlIGZvciBDbG91ZFdhdGNoIGFsYXJtIHN0YXRlIGNoYW5nZXMuXG4gICAqL1xuICBhY3Rpb246IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uXG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhIHRvIGFkZCBhbGFybXMgdG8uXG4gICAqL1xuICBsYW1iZGFGdW5jdGlvbjogbGFtYmRhLklGdW5jdGlvblxufVxuXG4vKipcbiAqIEFsYXJtcyBmb3IgTGFtYmRhIGZ1bmN0aW9ucy5cbiAqXG4gKiBCeSBpdHNlbGYsIG5vIGFsYXJtcyBhcmUgY3JlYXRlZC4gVXNlIHRoZSBtZXRob2RzIGF2YWlsYWJsZVxuICogdG8gYWRkIGFsYXJtcy5cbiAqXG4gKiBDcmVhdGUgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHtAbGluayBMYW1iZGFBbGFybXN9IHdpdGggZGlmZmVyZW50IGBhY3Rpb25gXG4gKiBpZiB5b3UgbmVlZCBhbiBhbGFybSB0byBkbyBtdWx0aXBsZSB0aGluZ3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFBbGFybXMgZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWN0aW9uOiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICBwcml2YXRlIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uOiBsYW1iZGEuSUZ1bmN0aW9uXG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IExhbWJkYUFsYXJtc1Byb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmFjdGlvbiA9IHByb3BzLmFjdGlvblxuICAgIHRoaXMubGFtYmRhRnVuY3Rpb24gPSBwcm9wcy5sYW1iZGFGdW5jdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdXAgYSBDbG91ZFdhdGNoIEFsYXJtIHRoYXQgdHJpZ2dlcnMgaWYgdGhlIExhbWJkYSBmYWlscyBpbnZvY2F0aW9ucy5cbiAgICogVGhpcyB1c3VhbGx5IGhhcHBlbnMgZnJvbSB1bmNhdWdodCBleGNlcHRpb25zIGluIHRoZSBsYW1iZGEuXG4gICAqL1xuICBhZGRJbnZvY2F0aW9uRXJyb3JBbGFybShcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIGZvciBhbiBhbGFybS5cbiAgICAgKi9cbiAgICBwcm9wcz86IHtcbiAgICAgIC8qKlxuICAgICAgICogQWRkIGV4dHJhIGluZm9ybWF0aW9uIHRvIHRoZSBhbGFybSBkZXNjcmlwdGlvbiwgbGlrZSBSdW5ib29rIFVSTCBvciBzdGVwcyB0byB0cmlhZ2UuXG4gICAgICAgKi9cbiAgICAgIGFwcGVuZFRvQWxhcm1EZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgIH0sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGFsYXJtID0gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgIG1ldHJpY05hbWU6IFwiRXJyb3JzXCIsXG4gICAgICBuYW1lc3BhY2U6IFwiQVdTL0xhbWJkYVwiLFxuICAgICAgc3RhdGlzdGljOiBcIlN1bVwiLFxuICAgICAgcGVyaW9kOiBjZGsuRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIEZ1bmN0aW9uTmFtZTogdGhpcy5sYW1iZGFGdW5jdGlvbi5mdW5jdGlvbk5hbWUsXG4gICAgICB9LFxuICAgIH0pLmNyZWF0ZUFsYXJtKHRoaXMsIFwiRmFpbGVkSW52b2NhdGlvbkFsYXJtXCIsIHtcbiAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBJbnZvY2F0aW9uIGZvciAnJHt0aGlzLmxhbWJkYUZ1bmN0aW9uLmZ1bmN0aW9uTmFtZX0nIGZhaWxlZC4gJHtwcm9wcz8uYXBwZW5kVG9BbGFybURlc2NyaXB0aW9uID8/IFwiXCJ9YCxcbiAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjpcbiAgICAgICAgY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLklHTk9SRSxcbiAgICB9KVxuXG4gICAgYWxhcm0uYWRkQWxhcm1BY3Rpb24odGhpcy5hY3Rpb24pXG4gICAgYWxhcm0uYWRkT2tBY3Rpb24odGhpcy5hY3Rpb24pXG4gIH1cbn1cbiJdfQ==
|
|
178
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWFsYXJtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbGFybXMvbGFtYmRhLWFsYXJtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQTtBQUNsQyxPQUFPLEtBQUssVUFBVSxNQUFNLDRCQUE0QixDQUFBO0FBRXhELE9BQU8sS0FBSyxJQUFJLE1BQU0sc0JBQXNCLENBQUE7QUFDNUMsT0FBTyxLQUFLLGdCQUFnQixNQUFNLG1DQUFtQyxDQUFBO0FBQ3JFLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBc0I5RDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sT0FBTyxZQUFhLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDbkMsV0FBVyxDQUF5QjtJQUNwQyxhQUFhLENBQXlCO0lBQ3RDLGNBQWMsQ0FBa0I7SUFDaEMsVUFBVSxDQUFtQjtJQUU5QyxZQUNFLEtBQTJCLEVBQzNCLEVBQVUsRUFDVixLQUF3QjtRQUV4QixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQTtRQUNwQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUE7UUFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFBO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQTtJQUNwQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCx1QkFBdUIsQ0FBQyxLQStCdkI7UUFDQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBQ2pELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFD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QUNwQixTQUFTLEVBQUUsQ0FBQztvQkFDWixnQkFBZ0IsRUFBRSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsYUFBYTtpQkFDNUQsQ0FBQyxDQUFBO2dCQUVKLGdDQUFnQztnQkFDaEMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFBO2dCQUN0RCxVQUFVLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO2dCQUN0QyxJQUFJLEtBQUssQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ2hDLFVBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBQ3JDLENBQUM7WUFDSCxDQUFDO1lBRUQsK0RBQStEO1lBQy9ELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixLQUFLLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUNsQyxpRUFBaUUsRUFDakU7b0JBQ0UsV0FBVyxFQUFFLElBQUksZ0JBQWdCLENBQUMsaUJBQWlCLENBQ2pELElBQUksQ0FBQyxVQUFVLENBQ2hCO29CQUNELGFBQWEsRUFBRSxhQUFhO2lCQUM3QixDQUNGLENBQUE7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0ICogYXMgY2xvdWR3YXRjaCBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIlxuaW1wb3J0IHR5cGUgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIlxuaW1wb3J0ICogYXMgbG9nc0Rlc3RpbmF0aW9ucyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3MtZGVzdGluYXRpb25zXCJcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0IHsganNvbkVycm9yRmlsdGVyUGF0dGVybiB9IGZyb20gXCIuL2xvZy1maWx0ZXItcGF0dGVybnNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYUFsYXJtc1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBDbG91ZFdhdGNoIGFsYXJtIGFjdGlvbiB0byB1c2UgZm9yIGhpZ2gtc2V2ZXJpdHkgYWxhcm1zIChBTEFSTSBjaGFubmVsKS5cbiAgICovXG4gIGFsYXJtQWN0aW9uOiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAvKipcbiAgICogVGhlIENsb3VkV2F0Y2ggYWxhcm0gYWN0aW9uIHRvIHVzZSBmb3IgbG93ZXItc2V2ZXJpdHkgd2FybmluZ3MgKFdBUk5JTkcgY2hhbm5lbCkuXG4gICAqL1xuICB3YXJuaW5nQWN0aW9uOiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAvKipcbiAgICogVGhlIExhbWJkYSB0byBhZGQgYWxhcm1zIHRvLlxuICAgKi9cbiAgbGFtYmRhRnVuY3Rpb246IGxhbWJkYS5JRnVuY3Rpb25cbiAgLyoqXG4gICAqIE9wdGlvbmFsIExhbWJkYSBmdW5jdGlvbiB0aGF0IHdpbGwgcmVjZWl2ZSBmb3J3YXJkZWQgbG9nIGV2ZW50cy5cbiAgICogSWYgcHJvdmlkZWQsIHN1YnNjcmlwdGlvbiBmaWx0ZXJzIHdpbGwgYmUgY3JlYXRlZCB0byBmb3J3YXJkIG1hdGNoaW5nIGxvZ3NcbiAgICovXG4gIGxvZ0hhbmRsZXI/OiBsYW1iZGEuSUZ1bmN0aW9uXG59XG5cbi8qKlxuICogQWxhcm1zIGZvciBMYW1iZGEgZnVuY3Rpb25zLlxuICpcbiAqIFVubGlrZSBSRFMgYW5kIEVDUyBhbGFybSBjb25zdHJ1Y3RzIGluIHRoaXMgcGFja2FnZSwgYExhbWJkYUFsYXJtc2AgaXNcbiAqIHNldCB1cCBtYW51YWxseSBieSBjb25zdW1lcnMuXG4gKlxuICogRGVmYXVsdHM6XG4gKiAtIHNpbmdsZSBpbnZvY2F0aW9uIChzaW5nbGVFcnJvcikgLT4gc2VudCB0byBgd2FybmluZ0FjdGlvbmAgYnkgZGVmYXVsdFxuICogLSBtdWx0aXBsZSBpbnZvY2F0aW9uIChtdWx0aXBsZUVycm9ycykgLT4gc2VudCB0byBgYWxhcm1BY3Rpb25gIGJ5IGRlZmF1bHRcbiAqIC0gZXJyb3IgbG9nIGFsYXJtIChFUlJPUi9GQVRBTCBKU09OIGxvZ3MpIC0+IHNlbnQgdG8gYHdhcm5pbmdBY3Rpb25gIGJ5IGRlZmF1bHRcbiAqIC0gdW5jYXVnaHQgSmF2YSBleGNlcHRpb24gYWxhcm0gLT4gc2VudCB0byBgd2FybmluZ0FjdGlvbmAgYnkgZGVmYXVsdCAoZGlzYWJsZWQgYnkgZGVmYXVsdClcbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYUFsYXJtcyBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbGFybUFjdGlvbjogY2xvdWR3YXRjaC5JQWxhcm1BY3Rpb25cbiAgcHJpdmF0ZSByZWFkb25seSB3YXJuaW5nQWN0aW9uOiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICBwcml2YXRlIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uOiBsYW1iZGEuSUZ1bmN0aW9uXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nSGFuZGxlcj86IGxhbWJkYS5JRnVuY3Rpb25cblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogY29uc3RydWN0cy5Db25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTGFtYmRhQWxhcm1zUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIHRoaXMuYWxhcm1BY3Rpb24gPSBwcm9wcy5hbGFybUFjdGlvblxuICAgIHRoaXMud2FybmluZ0FjdGlvbiA9IHByb3BzLndhcm5pbmdBY3Rpb25cbiAgICB0aGlzLmxhbWJkYUZ1bmN0aW9uID0gcHJvcHMubGFtYmRhRnVuY3Rpb25cbiAgICB0aGlzLmxvZ0hhbmRsZXIgPSBwcm9wcy5sb2dIYW5kbGVyXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBib3RoIHRoZSBzaW5nbGUtaW52b2NhdGlvbiB3YXJuaW5nIGFuZCB0aGVcbiAgICogbXVsdGlwbGUgaW52b2NhdGlvbnMgYWxhcm0gd2l0aCByZWFzb25hYmxlIGRlZmF1bHRzLlxuICAgKlxuICAgKiBFYWNoIGNyZWF0ZWQgYWxhcm0gY2FuIGJlIG92ZXJyaWRkZW4gdmlhIHRoZSBwZXItYWxhcm0gcHJvcHMuXG4gICAqL1xuICBhZGRJbnZvY2F0aW9uRXJyb3JBbGFybShwcm9wcz86IHtcbiAgICBzaW5nbGVFcnJvcj86IHtcbiAgICAgIGFwcGVuZFRvQWxhcm1EZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICAgIGFjdGlvbj86IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uXG4gICAgICAvKipcbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgZW5hYmxlT2tBbGFybT86IGJvb2xlYW5cbiAgICB9XG4gICAgbXVsdGlwbGVFcnJvcnM/OiB7XG4gICAgICBhcHBlbmRUb0FsYXJtRGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICAgIGVuYWJsZWQ/OiBib29sZWFuXG4gICAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgICAgLyoqXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZU9rQWxhcm0/OiBib29sZWFuXG4gICAgICAvKipcbiAgICAgICAqIEBkZWZhdWx0IDNcbiAgICAgICAqL1xuICAgICAgZXZhbHVhdGlvblBlcmlvZHM/OiBudW1iZXJcbiAgICAgIC8qKlxuICAgICAgICogQGRlZmF1bHQgMVxuICAgICAgICovXG4gICAgICB0aHJlc2hvbGQ/OiBudW1iZXJcbiAgICAgIC8qKlxuICAgICAgICogQGRlZmF1bHQgNjBcbiAgICAgICAqL1xuICAgICAgcGVyaW9kU2Vjb25kcz86IG51bWJlclxuICAgIH1cbiAgfSk6IHZvaWQge1xuICAgIHRoaXMuYWRkU2luZ2xlSW52b2NhdGlvbkFsYXJtKHByb3BzPy5zaW5nbGVFcnJvcilcbiAgICB0aGlzLmFkZE11bHRpcGxlSW52b2NhdGlvbkFsYXJtcyhwcm9wcz8ubXVsdGlwbGVFcnJvcnMpXG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBhIENsb3VkV2F0Y2ggQWxhcm0gdGhhdCB0cmlnZ2VycyBvbiBhIHNpbmdsZSBpbnZvY2F0aW9uIGZhaWx1cmUuXG4gICAqL1xuICBhZGRTaW5nbGVJbnZvY2F0aW9uQWxhcm0ocHJvcHM/OiB7XG4gICAgYXBwZW5kVG9BbGFybURlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgIGVuYWJsZU9rQWxhcm0/OiBib29sZWFuXG4gIH0pOiB2b2lkIHtcbiAgICBpZiAocHJvcHM/LmVuYWJsZWQgIT09IGZhbHNlKSB7XG4gICAgICAvLyBTZW50IHRvIHdhcm5pbmdzIGNoYW5uZWwgYnkgZGVmYXVsdFxuICAgICAgY29uc3QgYWN0aW9uID0gcHJvcHM/LmFjdGlvbiA/PyB0aGlzLndhcm5pbmdBY3Rpb25cblxuICAgICAgY29uc3QgYWxhcm0gPSBuZXcgY2xvdWR3YXRjaC5NZXRyaWMoe1xuICAgICAgICBtZXRyaWNOYW1lOiBcIkVycm9yc1wiLFxuICAgICAgICBuYW1lc3BhY2U6IFwiQVdTL0xhbWJkYVwiLFxuICAgICAgICBzdGF0aXN0aWM6IFwiU3VtXCIsXG4gICAgICAgIHBlcmlvZDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgICAgRnVuY3Rpb25OYW1lOiB0aGlzLmxhbWJkYUZ1bmN0aW9uLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgfSxcbiAgICAgIH0pLmNyZWF0ZUFsYXJtKHRoaXMsIFwiU2luZ2xlSW52b2NhdGlvbkFsYXJtXCIsIHtcbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYEludm9jYXRpb24gZm9yICcke3RoaXMubGFtYmRhRnVuY3Rpb24uZnVuY3Rpb25OYW1lfScgaGFkIGEgc2luZ2xlIGZhaWx1cmUuICR7cHJvcHM/LmFwcGVuZFRvQWxhcm1EZXNjcmlwdGlvbiA/PyBcIlwifWAsXG4gICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjpcbiAgICAgICAgICBjbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5HUkVBVEVSX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xELFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBjbG91ZHdhdGNoLlRyZWF0TWlzc2luZ0RhdGEuSUdOT1JFLFxuICAgICAgfSlcblxuICAgICAgYWxhcm0uYWRkQWxhcm1BY3Rpb24oYWN0aW9uKVxuICAgICAgaWYgKHByb3BzPy5lbmFibGVPa0FsYXJtID8/IHRydWUpIGFsYXJtLmFkZE9rQWN0aW9uKGFjdGlvbilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCBhIENsb3VkV2F0Y2ggQWxhcm0gdGhhdCB0cmlnZ2VycyB3aGVuIHRoZXJlIGlzIGEgc2hvcnQgc2VyaWVzIG9mXG4gICAqIGludm9jYXRpb24gZmFpbHVyZXMuXG4gICAqL1xuICBhZGRNdWx0aXBsZUludm9jYXRpb25BbGFybXMocHJvcHM/OiB7XG4gICAgYXBwZW5kVG9BbGFybURlc2NyaXB0aW9uPzogc3RyaW5nXG4gICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICBhY3Rpb24/OiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAgIC8qKlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICBlbmFibGVPa0FsYXJtPzogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEBkZWZhdWx0IDNcbiAgICAgKi9cbiAgICBldmFsdWF0aW9uUGVyaW9kcz86IG51bWJlclxuICAgIC8qKlxuICAgICAqIEBkZWZhdWx0IDFcbiAgICAgKi9cbiAgICB0aHJlc2hvbGQ/OiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBAZGVmYXVsdCA2MFxuICAgICAqL1xuICAgIHBlcmlvZFNlY29uZHM/OiBudW1iZXJcbiAgfSk6IHZvaWQge1xuICAgIGlmIChwcm9wcz8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGFsYXJtID0gbmV3IGNsb3Vkd2F0Y2guTWV0cmljKHtcbiAgICAgICAgbWV0cmljTmFtZTogXCJFcnJvcnNcIixcbiAgICAgICAgbmFtZXNwYWNlOiBcIkFXUy9MYW1iZGFcIixcbiAgICAgICAgc3RhdGlzdGljOiBcIlN1bVwiLFxuICAgICAgICBwZXJpb2Q6IGNkay5EdXJhdGlvbi5zZWNvbmRzKHByb3BzPy5wZXJpb2RTZWNvbmRzID8/IDYwKSxcbiAgICAgICAgZGltZW5zaW9uc01hcDoge1xuICAgICAgICAgIEZ1bmN0aW9uTmFtZTogdGhpcy5sYW1iZGFGdW5jdGlvbi5mdW5jdGlvbk5hbWUsXG4gICAgICAgIH0sXG4gICAgICB9KS5jcmVhdGVBbGFybSh0aGlzLCBcIkludm9jYXRpb25TZXJpZXNBbGFybVwiLCB7XG4gICAgICAgIGFsYXJtRGVzY3JpcHRpb246IGBJbnZvY2F0aW9uIGZvciAnJHt0aGlzLmxhbWJkYUZ1bmN0aW9uLmZ1bmN0aW9uTmFtZX0nIGZhaWxlZCByZXBlYXRlZGx5LiAke3Byb3BzPy5hcHBlbmRUb0FsYXJtRGVzY3JpcHRpb24gPz8gXCJcIn1gLFxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6XG4gICAgICAgICAgY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRCxcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IHByb3BzPy5ldmFsdWF0aW9uUGVyaW9kcyA/PyAzLFxuICAgICAgICB0aHJlc2hvbGQ6IHByb3BzPy50aHJlc2hvbGQgPz8gMSxcbiAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLklHTk9SRSxcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNlbnQgdG8gYWxhcm0gY2hhbm5lbCBieSBkZWZhdWx0XG4gICAgICBjb25zdCBtdWx0aXBsZUFjdGlvbiA9IHByb3BzPy5hY3Rpb24gPz8gdGhpcy5hbGFybUFjdGlvblxuICAgICAgYWxhcm0uYWRkQWxhcm1BY3Rpb24obXVsdGlwbGVBY3Rpb24pXG4gICAgICBpZiAocHJvcHM/LmVuYWJsZU9rQWxhcm0gPz8gdHJ1ZSkge1xuICAgICAgICBhbGFybS5hZGRPa0FjdGlvbihtdWx0aXBsZUFjdGlvbilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWxlcnRzIHdoZW4gRVJST1IgaXMgbG9nZ2VkIGZyb20gbGFtYmRhLlxuICAgKi9cbiAgYWRkRXJyb3JBbGFybShwcm9wczoge1xuICAgIGxvZ0dyb3VwOiBsb2dzLklMb2dHcm91cFxuICAgIGFsYXJtRGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgZW5hYmxlT2tBbGFybT86IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBbiBhY3Rpb24gdG8gdXNlIGZvciBDbG91ZFdhdGNoIGFsYXJtIHN0YXRlIGNoYW5nZXNcbiAgICAgKiBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHdhcm5pbmcgYWN0aW9uXG4gICAgICovXG4gICAgYWN0aW9uPzogY2xvdWR3YXRjaC5JQWxhcm1BY3Rpb25cbiAgfSk6IHZvaWQge1xuICAgIC8vIElmIG5vIGxvZyBoYW5kbGVyIGlzIGNvbmZpZ3VyZWQsIGNyZWF0ZSBzaW1wbGUgXCJFUlJPUlwiIG1ldHJpYyBhbGFybVxuICAgIGlmICghdGhpcy5sb2dIYW5kbGVyKSB7XG4gICAgICBjb25zdCBlcnJvck1ldHJpY0ZpbHRlciA9IHByb3BzLmxvZ0dyb3VwLmFkZE1ldHJpY0ZpbHRlcihcbiAgICAgICAgXCJFcnJvck1ldHJpY0ZpbHRlclwiLFxuICAgICAgICB7XG4gICAgICAgICAgZmlsdGVyUGF0dGVybjoganNvbkVycm9yRmlsdGVyUGF0dGVybigpLFxuICAgICAgICAgIG1ldHJpY05hbWU6IFwiRXJyb3JzXCIsXG4gICAgICAgICAgbWV0cmljTmFtZXNwYWNlOiBgc3RhY2svJHtjZGsuU3RhY2sub2YodGhpcykuc3RhY2tOYW1lfS8ke3RoaXMubGFtYmRhRnVuY3Rpb24uZnVuY3Rpb25OYW1lfS9FcnJvcnNgLFxuICAgICAgICB9LFxuICAgICAgKVxuXG4gICAgICBjb25zdCBlcnJvckFsYXJtID0gZXJyb3JNZXRyaWNGaWx0ZXJcbiAgICAgICAgLm1ldHJpYygpXG4gICAgICAgIC53aXRoKHtcbiAgICAgICAgICBzdGF0aXN0aWM6IFwiU3VtXCIsXG4gICAgICAgICAgcGVyaW9kOiBjZGsuRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICAgIH0pXG4gICAgICAgIC5jcmVhdGVBbGFybSh0aGlzLCBcIkVycm9yTG9nQWxhcm1cIiwge1xuICAgICAgICAgIGFsYXJtRGVzY3JpcHRpb246XG4gICAgICAgICAgICBwcm9wcy5hbGFybURlc2NyaXB0aW9uID8/XG4gICAgICAgICAgICBgJHt0aGlzLmxhbWJkYUZ1bmN0aW9uLmZ1bmN0aW9uTmFtZX0gbG9nZ2VkIGFuIGVycm9yYCxcbiAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogMSxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICAgIH0pXG5cbiAgICAgIC8vIFNlbnQgdG8gd2FybmluZ3MgY2hhbm5lbCBieSBkZWZhdWx0XG4gICAgICBjb25zdCBhY3Rpb24gPSBwcm9wcy5hY3Rpb24gPz8gdGhpcy53YXJuaW5nQWN0aW9uXG4gICAgICBlcnJvckFsYXJtLmFkZEFsYXJtQWN0aW9uKGFjdGlvbilcbiAgICAgIGlmIChwcm9wcy5lbmFibGVPa0FsYXJtID8/IHRydWUpIHtcbiAgICAgICAgZXJyb3JBbGFybS5hZGRPa0FjdGlvbihhY3Rpb24pXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubG9nSGFuZGxlcikge1xuICAgICAgcHJvcHMubG9nR3JvdXAuYWRkU3Vic2NyaXB0aW9uRmlsdGVyKFxuICAgICAgICBcImxpZmxpZy1jZGstbG9nLWNvbnRlbnQtdG8tc2xhY2stZXJyb3Itc3Vic2NyaXB0aW9uXCIsXG4gICAgICAgIHtcbiAgICAgICAgICBkZXN0aW5hdGlvbjogbmV3IGxvZ3NEZXN0aW5hdGlvbnMuTGFtYmRhRGVzdGluYXRpb24odGhpcy5sb2dIYW5kbGVyKSxcbiAgICAgICAgICBmaWx0ZXJQYXR0ZXJuOiBqc29uRXJyb3JGaWx0ZXJQYXR0ZXJuKCksXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gYWxhcm0gZm9yIHVuY2F1Z2h0IEphdmEgZXhjZXB0aW9ucyBpbiB0aGUgTGFtYmRhIGZ1bmN0aW9uJ3MgbG9ncy5cbiAgICovXG4gIGFkZFVuY2F1Z2h0SmF2YUV4Y2VwdGlvbkFsYXJtKHByb3BzOiB7XG4gICAgbG9nR3JvdXA6IGxvZ3MuSUxvZ0dyb3VwXG4gICAgYWxhcm1EZXNjcmlwdGlvbj86IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICBlbmFibGVPa0FsYXJtPzogYm9vbGVhblxuICAgIGFjdGlvbj86IGNsb3Vkd2F0Y2guSUFsYXJtQWN0aW9uXG4gIH0pOiB2b2lkIHtcbiAgICBpZiAocHJvcHMuZW5hYmxlZCkge1xuICAgICAgY29uc3QgZmlsdGVyUGF0dGVybiA9IGxvZ3MuRmlsdGVyUGF0dGVybi5hbGxUZXJtcyhcIkV4Y2VwdGlvbiBpbiB0aHJlYWRcIilcblxuICAgICAgLy8gSWYgbm8gbG9nIGhhbmRsZXIgaXMgY29uZmlndXJlZCwgY3JlYXRlIGEgc2ltcGxlIG1ldHJpYyBhbGFybS5cbiAgICAgIGlmICghdGhpcy5sb2dIYW5kbGVyKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTWV0cmljRmlsdGVyID0gcHJvcHMubG9nR3JvdXAuYWRkTWV0cmljRmlsdGVyKFxuICAgICAgICAgIFwiVW5jYXVnaHRKYXZhRXhjZXB0aW9uRmlsdGVyXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmlsdGVyUGF0dGVybjogZmlsdGVyUGF0dGVybixcbiAgICAgICAgICAgIG1ldHJpY05hbWU6IFwiVW5jYXVnaHRKYXZhRXhjZXB0aW9uXCIsXG4gICAgICAgICAgICBtZXRyaWNOYW1lc3BhY2U6IGBzdGFjay8ke2Nkay5TdGFjay5vZih0aGlzKS5zdGFja05hbWV9LyR7dGhpcy5sYW1iZGFGdW5jdGlvbi5mdW5jdGlvbk5hbWV9L1VuY2F1Z2h0SmF2YUV4Y2VwdGlvbmAsXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IGVycm9yQWxhcm0gPSBlcnJvck1ldHJpY0ZpbHRlclxuICAgICAgICAgIC5tZXRyaWMoKVxuICAgICAgICAgIC53aXRoKHtcbiAgICAgICAgICAgIHN0YXRpc3RpYzogXCJTdW1cIixcbiAgICAgICAgICAgIHBlcmlvZDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNyZWF0ZUFsYXJtKHRoaXMsIFwiVW5jYXVnaHRKYXZhRXhjZXB0aW9uTG9nQWxhcm1cIiwge1xuICAgICAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgcHJvcHMuYWxhcm1EZXNjcmlwdGlvbiA/P1xuICAgICAgICAgICAgICBgJHt0aGlzLmxhbWJkYUZ1bmN0aW9uLmZ1bmN0aW9uTmFtZX0gbG9nZ2VkIGFuIHVuY2F1Z2h0IEphdmEgZXhjZXB0aW9uYCxcbiAgICAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiAxLFxuICAgICAgICAgICAgdGhyZXNob2xkOiAxLFxuICAgICAgICAgICAgdHJlYXRNaXNzaW5nRGF0YTogY2xvdWR3YXRjaC5UcmVhdE1pc3NpbmdEYXRhLk5PVF9CUkVBQ0hJTkcsXG4gICAgICAgICAgfSlcblxuICAgICAgICAvLyBEZWZhdWx0IHRvIHRoZSB3YXJuaW5nIGFjdGlvblxuICAgICAgICBjb25zdCBhY3Rpb25Ub1VzZSA9IHByb3BzLmFjdGlvbiA/PyB0aGlzLndhcm5pbmdBY3Rpb25cbiAgICAgICAgZXJyb3JBbGFybS5hZGRBbGFybUFjdGlvbihhY3Rpb25Ub1VzZSlcbiAgICAgICAgaWYgKHByb3BzLmVuYWJsZU9rQWxhcm0gPz8gdHJ1ZSkge1xuICAgICAgICAgIGVycm9yQWxhcm0uYWRkT2tBY3Rpb24oYWN0aW9uVG9Vc2UpXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgYSBsb2cgaGFuZGxlciBpcyBjb25maWd1cmVkLCBmb3J3YXJkIG1hdGNoaW5nIGxvZ3MgdG8gaXQuXG4gICAgICBpZiAodGhpcy5sb2dIYW5kbGVyKSB7XG4gICAgICAgIHByb3BzLmxvZ0dyb3VwLmFkZFN1YnNjcmlwdGlvbkZpbHRlcihcbiAgICAgICAgICBcImxpZmxpZy1jZGstbG9nLWNvbnRlbnQtdG8tc2xhY2stdW5jYXVnaHQtZXhjZXB0aW9uLXN1YnNjcmlwdGlvblwiLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBuZXcgbG9nc0Rlc3RpbmF0aW9ucy5MYW1iZGFEZXN0aW5hdGlvbihcbiAgICAgICAgICAgICAgdGhpcy5sb2dIYW5kbGVyLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGZpbHRlclBhdHRlcm46IGZpbHRlclBhdHRlcm4sXG4gICAgICAgICAgfSxcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import * as logs from "aws-cdk-lib/aws-logs";
|
|
2
|
+
/**
|
|
3
|
+
* Common filter pattern used for JSON log-based error detection.
|
|
4
|
+
*/
|
|
5
|
+
export const jsonErrorFilterPattern = () => logs.FilterPattern.any(logs.FilterPattern.stringValue("$.level", "=", "ERROR"), logs.FilterPattern.stringValue("$.level", "=", "FATAL"), logs.FilterPattern.stringValue("$.requestInfo.status.code", "=", "INTERNAL_SERVER_ERROR"));
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLWZpbHRlci1wYXR0ZXJucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbGFybXMvbG9nLWZpbHRlci1wYXR0ZXJucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFBO0FBRTVDOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxFQUFFLENBQ3pDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUNwQixJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUN2RCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FDNUIsMkJBQTJCLEVBQzNCLEdBQUcsRUFDSCx1QkFBdUIsQ0FDeEIsQ0FDRixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIlxuXG4vKipcbiAqIENvbW1vbiBmaWx0ZXIgcGF0dGVybiB1c2VkIGZvciBKU09OIGxvZy1iYXNlZCBlcnJvciBkZXRlY3Rpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBqc29uRXJyb3JGaWx0ZXJQYXR0ZXJuID0gKCkgPT5cbiAgbG9ncy5GaWx0ZXJQYXR0ZXJuLmFueShcbiAgICBsb2dzLkZpbHRlclBhdHRlcm4uc3RyaW5nVmFsdWUoXCIkLmxldmVsXCIsIFwiPVwiLCBcIkVSUk9SXCIpLFxuICAgIGxvZ3MuRmlsdGVyUGF0dGVybi5zdHJpbmdWYWx1ZShcIiQubGV2ZWxcIiwgXCI9XCIsIFwiRkFUQUxcIiksXG4gICAgbG9ncy5GaWx0ZXJQYXR0ZXJuLnN0cmluZ1ZhbHVlKFxuICAgICAgXCIkLnJlcXVlc3RJbmZvLnN0YXR1cy5jb2RlXCIsXG4gICAgICBcIj1cIixcbiAgICAgIFwiSU5URVJOQUxfU0VSVkVSX0VSUk9SXCIsXG4gICAgKSxcbiAgKVxuIl19
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import * as cdk from "aws-cdk-lib";
|
|
2
|
+
import type { IAlarmAction } from "aws-cdk-lib/aws-cloudwatch";
|
|
3
|
+
import * as cloudwatch from "aws-cdk-lib/aws-cloudwatch";
|
|
4
|
+
import * as constructs from "constructs";
|
|
5
|
+
export interface QueueAlarmsProps {
|
|
6
|
+
alarmAction: cloudwatch.IAlarmAction;
|
|
7
|
+
warningAction: cloudwatch.IAlarmAction;
|
|
8
|
+
queueName: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* This construct provides a thin wrapper that creates two alarms for
|
|
12
|
+
* SQS queues.
|
|
13
|
+
*
|
|
14
|
+
* Unlike RDS and ECS alarm constructs in this package, `QueueAlarms` is
|
|
15
|
+
* set up manually by consumers (it doesn't auto-wire to resources).
|
|
16
|
+
*
|
|
17
|
+
* Defaults:
|
|
18
|
+
* - Messages-not-being-processed alarm -> sent to `alarmAction` by default
|
|
19
|
+
* - Approximate-age alarm -> sent to `warningAction` by default
|
|
20
|
+
*/
|
|
21
|
+
export declare class QueueAlarms extends constructs.Construct {
|
|
22
|
+
private readonly alarmAction;
|
|
23
|
+
private readonly warningAction;
|
|
24
|
+
private readonly queueName;
|
|
25
|
+
constructor(scope: constructs.Construct, id: string, props: QueueAlarmsProps);
|
|
26
|
+
/**
|
|
27
|
+
* Sets up a CloudWatch Composite Alarm that triggers if messages are not being deleted
|
|
28
|
+
* from queue, and there are visible messages on the queue.
|
|
29
|
+
*/
|
|
30
|
+
addMessagesNotBeingProcessedAlarm(props?: {
|
|
31
|
+
/**
|
|
32
|
+
* Period for metric evaluation as a CDK Duration
|
|
33
|
+
* @default cdk.Duration.seconds(300)
|
|
34
|
+
*/
|
|
35
|
+
period?: cdk.Duration;
|
|
36
|
+
/**
|
|
37
|
+
* Evaluation periods for MessagesVisible metric
|
|
38
|
+
* @default 2
|
|
39
|
+
*/
|
|
40
|
+
evaluationPeriodsMessagesVisible?: number;
|
|
41
|
+
/**
|
|
42
|
+
* Threshold for MessagesVisible metric (minimum)
|
|
43
|
+
* @default 1
|
|
44
|
+
*/
|
|
45
|
+
thresholdMessagesVisible?: number;
|
|
46
|
+
/**
|
|
47
|
+
* Evaluation periods for NumberOfMessagesDeleted metric
|
|
48
|
+
* @default 4
|
|
49
|
+
*/
|
|
50
|
+
evaluationPeriodsMessagesDeleted?: number;
|
|
51
|
+
/**
|
|
52
|
+
* Threshold for NumberOfMessagesDeleted (sum)
|
|
53
|
+
* @default 0
|
|
54
|
+
*/
|
|
55
|
+
thresholdMessagesDeleted?: number;
|
|
56
|
+
/**
|
|
57
|
+
* @default true
|
|
58
|
+
*/
|
|
59
|
+
enableOkAlarm?: boolean;
|
|
60
|
+
/** Per-alarm override of the action to use instead of the construct alarmAction */
|
|
61
|
+
action?: IAlarmAction;
|
|
62
|
+
}): void;
|
|
63
|
+
/**
|
|
64
|
+
* Alerts when the ApproximateAgeOfOldestMessage metric is high.
|
|
65
|
+
*/
|
|
66
|
+
addApproximateAgeOfOldestMessageAlarm(props?: {
|
|
67
|
+
alarmDescription?: string;
|
|
68
|
+
/**
|
|
69
|
+
* @default cdk.Duration.seconds(900) (15 minutes)
|
|
70
|
+
*/
|
|
71
|
+
period?: cdk.Duration;
|
|
72
|
+
/**
|
|
73
|
+
* @default 2
|
|
74
|
+
*/
|
|
75
|
+
evaluationPeriods?: number;
|
|
76
|
+
/**
|
|
77
|
+
* Threshold in seconds for the age of the oldest message
|
|
78
|
+
* @default 900 seconds (15 minutes)
|
|
79
|
+
*/
|
|
80
|
+
thresholdSeconds?: number;
|
|
81
|
+
/**
|
|
82
|
+
* @default true
|
|
83
|
+
*/
|
|
84
|
+
enableOkAlarm?: boolean;
|
|
85
|
+
/** An action to use for CloudWatch alarm state changes instead of the default warningAction */
|
|
86
|
+
action?: IAlarmAction;
|
|
87
|
+
}): void;
|
|
88
|
+
}
|