@liflig/cdk 3.22.19 → 3.23.0

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.
@@ -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 default action to use for CloudWatch alarm state changes.
7
+ * The CloudWatch alarm action to use for high-severity alarms (ALARM channel).
7
8
  */
8
- action: cloudwatch.IAlarmAction;
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
- * By itself, no alarms are created. Use the methods available
18
- * to add alarms.
27
+ * Unlike RDS and ECS alarm constructs in this package, `LambdaAlarms` is
28
+ * set up manually by consumers.
19
29
  *
20
- * Create multiple instances of {@link LambdaAlarms} with different `action`
21
- * if you need an alarm to do multiple things.
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 action;
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
- * Sets up a CloudWatch Alarm that triggers if the Lambda fails invocations.
29
- * This usually happens from uncaught exceptions in the lambda.
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
- * Configuration for an alarm.
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
- * Add extra information to the alarm description, like Runbook URL or steps to triage.
98
+ * @default true
38
99
  */
39
- appendToAlarmDescription?: string;
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
- * By itself, no alarms are created. Use the methods available
8
- * to add alarms.
10
+ * Unlike RDS and ECS alarm constructs in this package, `LambdaAlarms` is
11
+ * set up manually by consumers.
9
12
  *
10
- * Create multiple instances of {@link LambdaAlarms} with different `action`
11
- * if you need an alarm to do multiple things.
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
- action;
20
+ alarmAction;
21
+ warningAction;
15
22
  lambdaFunction;
23
+ logHandler;
16
24
  constructor(scope, id, props) {
17
25
  super(scope, id);
18
- this.action = props.action;
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
- * Sets up a CloudWatch Alarm that triggers if the Lambda fails invocations.
23
- * This usually happens from uncaught exceptions in the lambda.
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
- * Configuration for an alarm.
136
+ * Adds an alarm for uncaught Java exceptions in the Lambda function's logs.
28
137
  */
29
- props) {
30
- const alarm = new cloudwatch.Metric({
31
- metricName: "Errors",
32
- namespace: "AWS/Lambda",
33
- statistic: "Sum",
34
- period: cdk.Duration.seconds(60),
35
- dimensionsMap: {
36
- FunctionName: this.lambdaFunction.functionName,
37
- },
38
- }).createAlarm(this, "FailedInvocationAlarm", {
39
- alarmDescription: `Invocation for '${this.lambdaFunction.functionName}' failed. ${props?.appendToAlarmDescription ?? ""}`,
40
- comparisonOperator: cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD,
41
- evaluationPeriods: 1,
42
- threshold: 1,
43
- treatMissingData: cloudwatch.TreatMissingData.IGNORE,
44
- });
45
- alarm.addAlarmAction(this.action);
46
- alarm.addOkAction(this.action);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWFsYXJtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbGFybXMvbGFtYmRhLWFsYXJtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQTtBQUNsQyxPQUFPLEtBQUssVUFBVSxNQUFNLDRCQUE0QixDQUFBO0FBRXhELE9BQU8sS0FBSyxJQUFJLE1BQU0sc0JBQXNCLENBQUE7QUFDNUMsT0FBTyxLQUFLLGdCQUFnQixNQUFNLG1DQUFtQyxDQUFBO0FBQ3JFLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBc0I5RDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sT0FBTyxZQUFhLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDbkMsV0FBVyxDQUF5QjtJQUNwQyxhQUFhLENBQXlCO0lBQ3RDLGNBQWMsQ0FBa0I7SUFDaEMsVUFBVSxDQUFtQjtJQUU5QyxZQUNFLEtBQTJCLEVBQzNCLEVBQVUsRUFDVixLQUF3QjtRQUV4QixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQTtRQUNwQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUE7UUFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsY0FBYyxDQUFBO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQTtJQUNwQyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCx1QkFBdUIsQ0FBQyxLQStCdkI7UUFDQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1FBQ2pELElBQUksQ0FBQywyQkFBMkIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUE7SUFDekQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsd0JBQXdCLENBQUMsS0FLeEI7UUFDQyxJQUFJLEtBQUssRUFBRSxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDN0Isc0NBQXNDO1lBQ3RDLE1BQU0sTUFBTSxHQUFHLEtBQUssRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQTtZQUVsRCxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUM7Z0JBQ2xDLFVBQVUsRUFBRSxRQUFRO2dCQUNwQixTQUFTLEVBQUUsWUFBWTtnQkFDdkIsU0FBUyxFQUFFLEtBQUs7Z0JBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLGFBQWEsRUFBRTtvQkFDYixZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZO2lCQUMvQzthQUNGLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFO2dCQUM1QyxnQkFBZ0IsRUFBRSxtQkFBbUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLDJCQUEyQixLQUFLLEVBQUUsd0JBQXdCLElBQUksRUFBRSxFQUFFO2dCQUN2SSxrQkFBa0IsRUFDaEIsVUFBVSxDQUFDLGtCQUFrQixDQUFDLGtDQUFrQztnQkFDbEUsaUJBQWlCLEVBQUUsQ0FBQztnQkFDcEIsU0FBUyxFQUFFLENBQUM7Z0JBQ1osZ0JBQWdCLEVBQUUsVUFBVSxDQUFDLGdCQUFnQixDQUFDLE1BQU07YUFDckQsQ0FBQyxDQUFBO1lBRUYsS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUM1QixJQUFJLEtBQUssRUFBRSxhQUFhLElBQUksSUFBSTtnQkFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzdELENBQUM7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsMkJBQTJCLENBQUMsS0FvQjNCO1FBQ0MsSUFBSSxLQUFLLEVBQUUsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQztnQkFDbEMsVUFBVSxFQUFFLFFBQVE7Z0JBQ3BCLFNBQVMsRUFBRSxZQUFZO2dCQUN2QixTQUFTLEVBQUUsS0FBSztnQkFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxhQUFhLElBQUksRUFBRSxDQUFDO2dCQUN4RCxhQUFhLEVBQUU7b0JBQ2IsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWTtpQkFDL0M7YUFDRixDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSx1QkFBdUIsRUFBRTtnQkFDNUMsZ0JBQWdCLEVBQUUsbUJBQW1CLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSx3QkFBd0IsS0FBSyxFQUFFLHdCQUF3QixJQUFJLEVBQUUsRUFBRTtnQkFDcEksa0JBQWtCLEVBQ2hCLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxrQ0FBa0M7Z0JBQ2xFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxpQkFBaUIsSUFBSSxDQUFDO2dCQUNoRCxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsSUFBSSxDQUFDO2dCQUNoQyxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsTUFBTTthQUNyRCxDQUFDLENBQUE7WUFFRixtQ0FBbUM7WUFDbkMsTUFBTSxjQUFjLEdBQUcsS0FBSyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFBO1lBQ3hELEtBQUssQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDcEMsSUFBSSxLQUFLLEVBQUUsYUFBYSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNqQyxLQUFLLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFBO1lBQ25DLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsYUFBYSxDQUFDLEtBWWI7UUFDQyxzRUFBc0U7UUFDdEUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUN0RCxtQkFBbUIsRUFDbkI7Z0JBQ0UsYUFBYSxFQUFFLHNCQUFzQixFQUFFO2dCQUN2QyxVQUFVLEVBQUUsUUFBUTtnQkFDcEIsZUFBZSxFQUFFLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxTQUFTO2FBQ3BHLENBQ0YsQ0FBQTtZQUVELE1BQU0sVUFBVSxHQUFHLGlCQUFpQjtpQkFDakMsTUFBTSxFQUFFO2lCQUNSLElBQUksQ0FBQztnQkFDSixTQUFTLEVBQUUsS0FBSztnQkFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQzthQUNqQyxDQUFDO2lCQUNELFdBQVcsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO2dCQUNsQyxnQkFBZ0IsRUFDZCxLQUFLLENBQUMsZ0JBQWdCO29CQUN0QixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxrQkFBa0I7Z0JBQ3ZELGlCQUFpQixFQUFFLENBQUM7Z0JBQ3BCLFNBQVMsRUFBRSxDQUFDO2dCQUNaLGdCQUFnQixFQUFFLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhO2FBQzVELENBQUMsQ0FBQTtZQUVKLHNDQUFzQztZQUN0QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUE7WUFDakQsVUFBVSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNqQyxJQUFJLEtBQUssQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ2hDLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDaEMsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQixLQUFLLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUNsQyxvREFBb0QsRUFDcEQ7Z0JBQ0UsV0FBVyxFQUFFLElBQUksZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDcEUsYUFBYSxFQUFFLHNCQUFzQixFQUFFO2FBQ3hDLENBQ0YsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCw2QkFBNkIsQ0FBQyxLQVM3QjtRQUNDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUE7WUFFeEUsaUVBQWlFO1lBQ2pFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3JCLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQ3RELDZCQUE2QixFQUM3QjtvQkFDRSxhQUFhLEVBQUUsYUFBYTtvQkFDNUIsVUFBVSxFQUFFLHVCQUF1QjtvQkFDbkMsZUFBZSxFQUFFLFNBQVMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSx3QkFBd0I7aUJBQ25ILENBQ0YsQ0FBQTtnQkFFRCxNQUFNLFVBQVUsR0FBRyxpQkFBaUI7cUJBQ2pDLE1BQU0sRUFBRTtxQkFDUixJQUFJLENBQUM7b0JBQ0osU0FBUyxFQUFFLEtBQUs7b0JBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7aUJBQ2pDLENBQUM7cUJBQ0QsV0FBVyxDQUFDLElBQUksRUFBRSwrQkFBK0IsRUFBRTtvQkFDbEQsZ0JBQWdCLEVBQ2QsS0FBSyxDQUFDLGdCQUFnQjt3QkFDdEIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksb0NBQW9DO29CQUN6RSxpQkFBaUIsRUFBRSxDQUFDO29CQUNwQixTQUFTLEVBQUUsQ0FBQztvQkFDWixnQkFBZ0IsRUFBRSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsYUFBYTtpQkFDNUQsQ0FBQyxDQUFBO2dCQUVKLGdDQUFnQztnQkFDaEMsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFBO2dCQUN0RCxVQUFVLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFBO2dCQUN0QyxJQUFJLEtBQUssQ0FBQyxhQUFhLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ2hDLFVBQVUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUE7Z0JBQ3JDLENBQUM7WUFDSCxDQUFDO1lBRUQsK0RBQStEO1lBQy9ELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixLQUFLLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUNsQyxpRUFBaUUsRUFDakU7b0JBQ0UsV0FBVyxFQUFFLElBQUksZ0JBQWdCLENBQUMsaUJBQWlCLENBQ2pELElBQUksQ0FBQyxVQUFVLENBQ2hCO29CQUNELGFBQWEsRUFBRSxhQUFhO2lCQUM3QixDQUNGLENBQUE7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIlxuaW1wb3J0ICogYXMgY2xvdWR3YXRjaCBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIlxuaW1wb3J0IHR5cGUgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIlxuaW1wb3J0ICogYXMgbG9nc0Rlc3RpbmF0aW9ucyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3MtZGVzdGluYXRpb25zXCJcbmltcG9ydCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0IHsganNvbkVycm9yRmlsdGVyUGF0dGVybiB9IGZyb20gXCIuL2xvZy1maWx0ZXItcGF0dGVybnNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYUFsYXJtc1Byb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBDbG91ZFdhdGNoIGFsYXJtIGFjdGlvbiB0byB1c2UgZm9yIGhpZ2gtc2V2ZXJpdHkgYWxhcm1zIChBTEFSTSBjaGFubmVsKS5cbiAgICovXG4gIGFsYXJtQWN0aW9uOiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAvKipcbiAgICogVGhlIENsb3VkV2F0Y2ggYWxhcm0gYWN0aW9uIHRvIHVzZSBmb3IgbG93ZXItc2V2ZXJpdHkgd2FybmluZ3MgKFdBUk5JTkcgY2hhbm5lbCkuXG4gICAqL1xuICB3YXJuaW5nQWN0aW9uOiBjbG91ZHdhdGNoLklBbGFybUFjdGlvblxuICAvKipcbiAgICogVGhlIExhbWJkYSB0byBhZGQgYWxhcm1zIHRvLlxuICAgKi9cbiAgbGFtYmRhRnVuY3Rpb246IGxhbWJkYS5JRnVuY3Rpb25cbiAgLyoqXG4gICAqIE9wdGlvbmFsIExhbWJkYSBmdW5jdGlvbiB0aGF0IHdpbGwgcmVjZWl2ZSBmb3J3YXJkZWQgbG9nIGV2ZW50cy5cbiAgICogSWYgcHJvdmlkZWQsIHN1YnNjcmlwdGlvbiBmaWx0ZXJzIHdpbGwgYmUgY3JlYXRlZCB0byBmb3J3YXJkIG1hdGNoaW5nIGxvZ3NcbiAgICovXG4gIGxvZ0hhbmRsZXI/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,5 @@
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 declare const jsonErrorFilterPattern: () => logs.JsonPattern;
@@ -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
+ }