@composurecdk/cloudwatch 0.7.0 → 0.8.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/README.md +60 -1
- package/dist/commonjs/alarm-config.d.ts.map +1 -0
- package/dist/commonjs/alarm-config.js +3 -0
- package/dist/{alarm-config.js.map → commonjs/alarm-config.js.map} +1 -1
- package/dist/{alarm-definition-builder.d.ts → commonjs/alarm-definition-builder.d.ts} +6 -6
- package/dist/commonjs/alarm-definition-builder.d.ts.map +1 -0
- package/dist/commonjs/alarm-definition-builder.js +103 -0
- package/dist/commonjs/alarm-definition-builder.js.map +1 -0
- package/dist/commonjs/alarm-definition.d.ts +31 -0
- package/dist/commonjs/alarm-definition.d.ts.map +1 -0
- package/dist/commonjs/alarm-definition.js +3 -0
- package/dist/{alarm-definition.js.map → commonjs/alarm-definition.js.map} +1 -1
- package/dist/commonjs/alarm-name.d.ts.map +1 -0
- package/dist/commonjs/alarm-name.js +52 -0
- package/dist/commonjs/alarm-name.js.map +1 -0
- package/dist/commonjs/create-alarms.d.ts.map +1 -0
- package/dist/commonjs/create-alarms.js +41 -0
- package/dist/commonjs/create-alarms.js.map +1 -0
- package/dist/commonjs/default-alarm-name.d.ts.map +1 -0
- package/dist/commonjs/default-alarm-name.js +20 -0
- package/dist/commonjs/default-alarm-name.js.map +1 -0
- package/dist/{index.d.ts → commonjs/index.d.ts} +1 -1
- package/dist/commonjs/index.d.ts.map +1 -0
- package/dist/commonjs/index.js +18 -0
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/package.json +3 -0
- package/dist/{policies → commonjs/policies}/alarm-actions-policy.d.ts +19 -11
- package/dist/commonjs/policies/alarm-actions-policy.d.ts.map +1 -0
- package/dist/commonjs/policies/alarm-actions-policy.js +139 -0
- package/dist/commonjs/policies/alarm-actions-policy.js.map +1 -0
- package/dist/commonjs/policies/alarm-name-policy.d.ts.map +1 -0
- package/dist/commonjs/policies/alarm-name-policy.js +99 -0
- package/dist/commonjs/policies/alarm-name-policy.js.map +1 -0
- package/dist/{policies → commonjs/policies}/policy-matcher.d.ts +15 -1
- package/dist/commonjs/policies/policy-matcher.d.ts.map +1 -0
- package/dist/commonjs/policies/policy-matcher.js +41 -0
- package/dist/commonjs/policies/policy-matcher.js.map +1 -0
- package/dist/commonjs/resolve-alarm-config.d.ts.map +1 -0
- package/dist/commonjs/resolve-alarm-config.js +18 -0
- package/dist/commonjs/resolve-alarm-config.js.map +1 -0
- package/dist/esm/alarm-config.d.ts +31 -0
- package/dist/esm/alarm-config.d.ts.map +1 -0
- package/dist/esm/alarm-config.js.map +1 -0
- package/dist/esm/alarm-definition-builder.d.ts +40 -0
- package/dist/esm/alarm-definition-builder.d.ts.map +1 -0
- package/dist/{alarm-definition-builder.js → esm/alarm-definition-builder.js} +3 -3
- package/dist/esm/alarm-definition-builder.js.map +1 -0
- package/dist/esm/alarm-definition.d.ts +31 -0
- package/dist/esm/alarm-definition.d.ts.map +1 -0
- package/dist/esm/alarm-definition.js.map +1 -0
- package/dist/esm/alarm-name.d.ts +32 -0
- package/dist/esm/alarm-name.d.ts.map +1 -0
- package/dist/esm/alarm-name.js.map +1 -0
- package/dist/esm/create-alarms.d.ts +19 -0
- package/dist/esm/create-alarms.d.ts.map +1 -0
- package/dist/esm/create-alarms.js.map +1 -0
- package/dist/esm/default-alarm-name.d.ts +14 -0
- package/dist/esm/default-alarm-name.d.ts.map +1 -0
- package/dist/esm/default-alarm-name.js.map +1 -0
- package/dist/esm/index.d.ts +11 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/policies/alarm-actions-policy.d.ts +62 -0
- package/dist/esm/policies/alarm-actions-policy.d.ts.map +1 -0
- package/dist/{policies → esm/policies}/alarm-actions-policy.js +21 -14
- package/dist/esm/policies/alarm-actions-policy.js.map +1 -0
- package/dist/esm/policies/alarm-name-policy.d.ts +77 -0
- package/dist/esm/policies/alarm-name-policy.d.ts.map +1 -0
- package/dist/{policies → esm/policies}/alarm-name-policy.js +3 -4
- package/dist/esm/policies/alarm-name-policy.js.map +1 -0
- package/dist/esm/policies/policy-matcher.d.ts +45 -0
- package/dist/esm/policies/policy-matcher.d.ts.map +1 -0
- package/dist/esm/policies/policy-matcher.js +35 -0
- package/dist/esm/policies/policy-matcher.js.map +1 -0
- package/dist/esm/resolve-alarm-config.d.ts +25 -0
- package/dist/esm/resolve-alarm-config.d.ts.map +1 -0
- package/dist/esm/resolve-alarm-config.js.map +1 -0
- package/package.json +33 -15
- package/dist/alarm-config.d.ts.map +0 -1
- package/dist/alarm-definition-builder.d.ts.map +0 -1
- package/dist/alarm-definition-builder.js.map +0 -1
- package/dist/alarm-definition.d.ts +0 -21
- package/dist/alarm-definition.d.ts.map +0 -1
- package/dist/alarm-name.d.ts.map +0 -1
- package/dist/alarm-name.js.map +0 -1
- package/dist/create-alarms.d.ts.map +0 -1
- package/dist/create-alarms.js.map +0 -1
- package/dist/default-alarm-name.d.ts.map +0 -1
- package/dist/default-alarm-name.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/policies/alarm-actions-policy.d.ts.map +0 -1
- package/dist/policies/alarm-actions-policy.js.map +0 -1
- package/dist/policies/alarm-name-policy.d.ts.map +0 -1
- package/dist/policies/alarm-name-policy.js.map +0 -1
- package/dist/policies/policy-matcher.d.ts.map +0 -1
- package/dist/policies/policy-matcher.js +0 -16
- package/dist/policies/policy-matcher.js.map +0 -1
- package/dist/resolve-alarm-config.d.ts.map +0 -1
- package/dist/resolve-alarm-config.js.map +0 -1
- /package/dist/{alarm-config.d.ts → commonjs/alarm-config.d.ts} +0 -0
- /package/dist/{alarm-name.d.ts → commonjs/alarm-name.d.ts} +0 -0
- /package/dist/{create-alarms.d.ts → commonjs/create-alarms.d.ts} +0 -0
- /package/dist/{default-alarm-name.d.ts → commonjs/default-alarm-name.d.ts} +0 -0
- /package/dist/{policies → commonjs/policies}/alarm-name-policy.d.ts +0 -0
- /package/dist/{resolve-alarm-config.d.ts → commonjs/resolve-alarm-config.d.ts} +0 -0
- /package/dist/{alarm-config.js → esm/alarm-config.js} +0 -0
- /package/dist/{alarm-definition.js → esm/alarm-definition.js} +0 -0
- /package/dist/{alarm-name.js → esm/alarm-name.js} +0 -0
- /package/dist/{create-alarms.js → esm/create-alarms.js} +0 -0
- /package/dist/{default-alarm-name.js → esm/default-alarm-name.js} +0 -0
- /package/dist/{index.js → esm/index.js} +0 -0
- /package/dist/{resolve-alarm-config.js → esm/resolve-alarm-config.js} +0 -0
package/README.md
CHANGED
|
@@ -46,6 +46,40 @@ The `description` method also accepts a factory for contextual descriptions:
|
|
|
46
46
|
builder.description((def) => `Alert when invocations >= ${def.threshold} per minute`);
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
+
### Rate and ratio alarms
|
|
50
|
+
|
|
51
|
+
The metric factory may return either a `Metric` or a `MathExpression` (the
|
|
52
|
+
exported `AlarmMetric` union), so rate/ratio alarms share the same definition
|
|
53
|
+
shape:
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
import { MathExpression } from "aws-cdk-lib/aws-cloudwatch";
|
|
57
|
+
|
|
58
|
+
new AlarmDefinitionBuilder<LambdaFunction>("errorRate")
|
|
59
|
+
// Guard the denominator: a divide-by-zero data point is dropped, which would
|
|
60
|
+
// otherwise push the alarm into INSUFFICIENT_DATA when there are no invocations.
|
|
61
|
+
.metric(
|
|
62
|
+
(fn) =>
|
|
63
|
+
new MathExpression({
|
|
64
|
+
expression: "IF(invocations > 0, errors / invocations, 0)",
|
|
65
|
+
usingMetrics: {
|
|
66
|
+
errors: fn.metricErrors(),
|
|
67
|
+
invocations: fn.metricInvocations(),
|
|
68
|
+
},
|
|
69
|
+
// Set the period on the expression — it overrides the period of every
|
|
70
|
+
// metric in usingMetrics (default 5 minutes otherwise).
|
|
71
|
+
period: Duration.minutes(1),
|
|
72
|
+
}),
|
|
73
|
+
)
|
|
74
|
+
.threshold(0.05)
|
|
75
|
+
.greaterThanOrEqual()
|
|
76
|
+
.treatMissingData(TreatMissingData.NOT_BREACHING);
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Only single-time-series expressions can be alarmed: a `MathExpression` whose
|
|
80
|
+
expression uses `SEARCH(...)` (or otherwise returns multiple series) is rejected
|
|
81
|
+
by CloudWatch at deploy time.
|
|
82
|
+
|
|
49
83
|
## createAlarms
|
|
50
84
|
|
|
51
85
|
Factory function that creates CDK [Alarm](https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_cloudwatch.Alarm.html) constructs from fully-resolved `AlarmDefinition`s. Returns a `Record<string, Alarm>` keyed by each definition's key.
|
|
@@ -123,6 +157,8 @@ alarmActionsPolicy(app, {
|
|
|
123
157
|
});
|
|
124
158
|
```
|
|
125
159
|
|
|
160
|
+
The policy is implemented as a CDK [Aspect](https://docs.aws.amazon.com/cdk/v2/guide/aspects.html) — it has no dependency on `@composurecdk/core` and works in any CDK app. Because aspects fire during synth, the policy can be registered before or after the alarms it targets, and there is **no need to wrap the call in `afterBuild`** — calling `alarmActionsPolicy(app, …)` at app scope outside any `compose()` chain is the recommended shape. The only constraint is that any `IAlarmAction` instances in the config (e.g. `new SnsAction(topic)`) must reference constructs that already exist when the policy is called.
|
|
161
|
+
|
|
126
162
|
Per-alarm routing is expressed as rules. Matchers can be a substring (tested against both the alarm's `id` and `path`), a `RegExp` (tested against `path`), or a predicate receiving the full match context. Rules append actions on top of `defaults`; set `replaceDefaults: true` on a rule to suppress defaults for its matched alarms.
|
|
127
163
|
|
|
128
164
|
```ts
|
|
@@ -137,7 +173,30 @@ alarmActionsPolicy(app, {
|
|
|
137
173
|
|
|
138
174
|
All three action states are supported: `alarmActions`, `okActions`, and `insufficientDataActions`.
|
|
139
175
|
|
|
140
|
-
|
|
176
|
+
### Per-scope routing: different topics for different stacks
|
|
177
|
+
|
|
178
|
+
Rules route by _alarm identity_ (id, path, predicate). When you instead need to route by _scope_ — e.g. one SNS topic for everything in `us-east-1` and another for the primary region — call `alarmActionsPolicy` multiple times, once per target scope. If the topics are themselves built by the composed system, this is the case where wrapping in [`afterBuild`](../core/README.md) is load-bearing: the closure captures the build `results` so each call can reference its topic.
|
|
179
|
+
|
|
180
|
+
```ts
|
|
181
|
+
compose(
|
|
182
|
+
{ usEast1Alerts: createTopicBuilder(), siteAlerts: createTopicBuilder() },
|
|
183
|
+
{
|
|
184
|
+
/* … */
|
|
185
|
+
},
|
|
186
|
+
)
|
|
187
|
+
.withStacks({ usEast1Alerts: usEast1AlertsStack, siteAlerts: siteStack })
|
|
188
|
+
.afterBuild((_scope, _id, results) => {
|
|
189
|
+
alarmActionsPolicy(usEast1AlertsStack, {
|
|
190
|
+
defaults: { alarmActions: [new SnsAction(results.usEast1Alerts.topic)] },
|
|
191
|
+
});
|
|
192
|
+
alarmActionsPolicy(siteStack, {
|
|
193
|
+
defaults: { alarmActions: [new SnsAction(results.siteAlerts.topic)] },
|
|
194
|
+
});
|
|
195
|
+
})
|
|
196
|
+
.build(app, "MySystem");
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
If a _single_ topic covers the whole app, prefer the top-level form above — `afterBuild` adds nothing in that case.
|
|
141
200
|
|
|
142
201
|
### Limitation: L2 alarms only
|
|
143
202
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-config.d.ts","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"alarm-config.js","sourceRoot":"","sources":["../../src/alarm-config.ts"],"names":[],"mappings":""}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { AlarmDefinition } from "./alarm-definition.js";
|
|
1
|
+
import { TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
|
|
2
|
+
import type { AlarmDefinition, AlarmMetric } from "./alarm-definition.js";
|
|
3
3
|
import type { AlarmName } from "./alarm-name.js";
|
|
4
4
|
/**
|
|
5
5
|
* Fluent builder for constructing deferred {@link AlarmDefinition}s.
|
|
6
6
|
*
|
|
7
|
-
* Stores a metric factory `(construct: T) =>
|
|
8
|
-
* Call {@link resolve} during build to
|
|
9
|
-
* complete {@link AlarmDefinition}.
|
|
7
|
+
* Stores a metric factory `(construct: T) => AlarmMetric` at configuration time
|
|
8
|
+
* (a `Metric` or a `MathExpression`). Call {@link resolve} during build to
|
|
9
|
+
* invoke the factory and produce a complete {@link AlarmDefinition}.
|
|
10
10
|
*
|
|
11
11
|
* @typeParam TConstruct - The construct type the metric factory receives.
|
|
12
12
|
*/
|
|
13
13
|
export declare class AlarmDefinitionBuilder<TConstruct> {
|
|
14
14
|
#private;
|
|
15
15
|
constructor(key: string);
|
|
16
|
-
metric(factory: (construct: TConstruct) =>
|
|
16
|
+
metric(factory: (construct: TConstruct) => AlarmMetric): this;
|
|
17
17
|
/**
|
|
18
18
|
* Sets an explicit CloudWatch alarm name. When unset, {@link createAlarms}
|
|
19
19
|
* derives a default from the stack name, builder id, and alarm key. Use
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-definition-builder.d.ts","sourceRoot":"","sources":["../../src/alarm-definition-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;;GAQG;AACH,qBAAa,sBAAsB,CAAC,UAAU;;gBAWhC,GAAG,EAAE,MAAM;IAIvB,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,WAAW,GAAG,IAAI;IAK7D;;;;OAIG;IACH,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAKhC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK9B,WAAW,IAAI,IAAI;IAKnB,kBAAkB,IAAI,IAAI;IAK1B,QAAQ,IAAI,IAAI;IAKhB,eAAe,IAAI,IAAI;IAKvB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKlC,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAKlC,gBAAgB,CAAC,SAAS,EAAE,gBAAgB,GAAG,IAAI;IAKnD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,UAAU,EAAE,eAAe,KAAK,MAAM,CAAC,GAAG,IAAI;IAK3E;;;;;OAKG;IACH,OAAO,CAAC,SAAS,EAAE,UAAU,GAAG,eAAe;CAwBhD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AlarmDefinitionBuilder = void 0;
|
|
4
|
+
const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
|
|
5
|
+
/**
|
|
6
|
+
* Fluent builder for constructing deferred {@link AlarmDefinition}s.
|
|
7
|
+
*
|
|
8
|
+
* Stores a metric factory `(construct: T) => AlarmMetric` at configuration time
|
|
9
|
+
* (a `Metric` or a `MathExpression`). Call {@link resolve} during build to
|
|
10
|
+
* invoke the factory and produce a complete {@link AlarmDefinition}.
|
|
11
|
+
*
|
|
12
|
+
* @typeParam TConstruct - The construct type the metric factory receives.
|
|
13
|
+
*/
|
|
14
|
+
class AlarmDefinitionBuilder {
|
|
15
|
+
#key;
|
|
16
|
+
#alarmName;
|
|
17
|
+
#metricFactory;
|
|
18
|
+
#threshold = 0;
|
|
19
|
+
#comparisonOperator = aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD;
|
|
20
|
+
#evaluationPeriods = 1;
|
|
21
|
+
#datapointsToAlarm = 1;
|
|
22
|
+
#treatMissingData = aws_cloudwatch_1.TreatMissingData.NOT_BREACHING;
|
|
23
|
+
#description = "";
|
|
24
|
+
constructor(key) {
|
|
25
|
+
this.#key = key;
|
|
26
|
+
}
|
|
27
|
+
metric(factory) {
|
|
28
|
+
this.#metricFactory = factory;
|
|
29
|
+
return this;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Sets an explicit CloudWatch alarm name. When unset, {@link createAlarms}
|
|
33
|
+
* derives a default from the stack name, builder id, and alarm key. Use
|
|
34
|
+
* the {@link alarmName} helper to construct branded values.
|
|
35
|
+
*/
|
|
36
|
+
alarmName(name) {
|
|
37
|
+
this.#alarmName = name;
|
|
38
|
+
return this;
|
|
39
|
+
}
|
|
40
|
+
threshold(value) {
|
|
41
|
+
this.#threshold = value;
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
greaterThan() {
|
|
45
|
+
this.#comparisonOperator = aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD;
|
|
46
|
+
return this;
|
|
47
|
+
}
|
|
48
|
+
greaterThanOrEqual() {
|
|
49
|
+
this.#comparisonOperator = aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD;
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
lessThan() {
|
|
53
|
+
this.#comparisonOperator = aws_cloudwatch_1.ComparisonOperator.LESS_THAN_THRESHOLD;
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
lessThanOrEqual() {
|
|
57
|
+
this.#comparisonOperator = aws_cloudwatch_1.ComparisonOperator.LESS_THAN_OR_EQUAL_TO_THRESHOLD;
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
evaluationPeriods(n) {
|
|
61
|
+
this.#evaluationPeriods = n;
|
|
62
|
+
return this;
|
|
63
|
+
}
|
|
64
|
+
datapointsToAlarm(n) {
|
|
65
|
+
this.#datapointsToAlarm = n;
|
|
66
|
+
return this;
|
|
67
|
+
}
|
|
68
|
+
treatMissingData(treatment) {
|
|
69
|
+
this.#treatMissingData = treatment;
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
description(text) {
|
|
73
|
+
this.#description = text;
|
|
74
|
+
return this;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Resolves the deferred metric factory against a construct and
|
|
78
|
+
* returns a complete {@link AlarmDefinition}.
|
|
79
|
+
*
|
|
80
|
+
* @throws If {@link metric} was not called before resolve.
|
|
81
|
+
*/
|
|
82
|
+
resolve(construct) {
|
|
83
|
+
if (!this.#metricFactory) {
|
|
84
|
+
throw new Error(`AlarmDefinitionBuilder "${this.#key}": metric() must be called before resolve()`);
|
|
85
|
+
}
|
|
86
|
+
const definition = {
|
|
87
|
+
key: this.#key,
|
|
88
|
+
alarmName: this.#alarmName,
|
|
89
|
+
metric: this.#metricFactory(construct),
|
|
90
|
+
threshold: this.#threshold,
|
|
91
|
+
comparisonOperator: this.#comparisonOperator,
|
|
92
|
+
evaluationPeriods: this.#evaluationPeriods,
|
|
93
|
+
datapointsToAlarm: this.#datapointsToAlarm,
|
|
94
|
+
treatMissingData: this.#treatMissingData,
|
|
95
|
+
description: "",
|
|
96
|
+
};
|
|
97
|
+
definition.description =
|
|
98
|
+
typeof this.#description === "function" ? this.#description(definition) : this.#description;
|
|
99
|
+
return definition;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.AlarmDefinitionBuilder = AlarmDefinitionBuilder;
|
|
103
|
+
//# sourceMappingURL=alarm-definition-builder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-definition-builder.js","sourceRoot":"","sources":["../../src/alarm-definition-builder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ComparisonOperator, MathExpression, Metric, TreatMissingData } from "aws-cdk-lib/aws-cloudwatch";
|
|
2
|
+
import type { AlarmName } from "./alarm-name.js";
|
|
3
|
+
/**
|
|
4
|
+
* A metric an alarm can be created from: either a single {@link Metric} or a
|
|
5
|
+
* {@link MathExpression} (e.g. a rate/ratio like `errors / invocations`).
|
|
6
|
+
*
|
|
7
|
+
* Both classes carry `createAlarm(...)` — it is declared on the concrete
|
|
8
|
+
* classes, not on `IMetric` — so this union is exactly what {@link createAlarms}
|
|
9
|
+
* needs to call. When using a `MathExpression`, set its `period` explicitly:
|
|
10
|
+
* the expression overrides the period of every metric in `usingMetrics`.
|
|
11
|
+
*/
|
|
12
|
+
export type AlarmMetric = Metric | MathExpression;
|
|
13
|
+
/**
|
|
14
|
+
* A fully-resolved alarm descriptor. All fields are required —
|
|
15
|
+
* this is the canonical form consumed by {@link createAlarms}.
|
|
16
|
+
*
|
|
17
|
+
* `alarmName` is the only optional field: when omitted, {@link createAlarms}
|
|
18
|
+
* derives a default via `defaultAlarmName(scope, id, key)`.
|
|
19
|
+
*/
|
|
20
|
+
export interface AlarmDefinition {
|
|
21
|
+
key: string;
|
|
22
|
+
alarmName?: AlarmName;
|
|
23
|
+
metric: AlarmMetric;
|
|
24
|
+
threshold: number;
|
|
25
|
+
comparisonOperator: ComparisonOperator;
|
|
26
|
+
evaluationPeriods: number;
|
|
27
|
+
datapointsToAlarm: number;
|
|
28
|
+
treatMissingData: TreatMissingData;
|
|
29
|
+
description: string;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=alarm-definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-definition.d.ts","sourceRoot":"","sources":["../../src/alarm-definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,cAAc,EACd,MAAM,EACN,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,cAAc,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alarm-definition.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"alarm-definition.js","sourceRoot":"","sources":["../../src/alarm-definition.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-name.d.ts","sourceRoot":"","sources":["../../src/alarm-name.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,MAAM,CAAC;AAE5C;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,CAAC,cAAc,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAKrE;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAclD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAE,GAAG,SAAM,GAAG,SAAS,CAG/E;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ3C"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.alarmName = alarmName;
|
|
4
|
+
exports.joinAlarmName = joinAlarmName;
|
|
5
|
+
exports.kebab = kebab;
|
|
6
|
+
const VALID_CHARS = /^[A-Za-z0-9\-_./#:()+ =@]+$/;
|
|
7
|
+
const MAX_LEN = 255;
|
|
8
|
+
/**
|
|
9
|
+
* Validates and brands a string as an {@link AlarmName}. The string is used
|
|
10
|
+
* verbatim — no sanitisation — so what the caller writes is exactly what
|
|
11
|
+
* appears in CloudWatch.
|
|
12
|
+
*
|
|
13
|
+
* @throws If the input is empty, exceeds 255 chars, or contains characters
|
|
14
|
+
* outside CloudWatch's allowed set: `[A-Za-z0-9-_./#:()+ =@]`.
|
|
15
|
+
*/
|
|
16
|
+
function alarmName(input) {
|
|
17
|
+
const trimmed = input.trim();
|
|
18
|
+
if (trimmed.length === 0) {
|
|
19
|
+
throw new Error("alarm name cannot be empty");
|
|
20
|
+
}
|
|
21
|
+
if (trimmed.length > MAX_LEN) {
|
|
22
|
+
throw new Error(`alarm name exceeds ${String(MAX_LEN)} chars: "${trimmed}"`);
|
|
23
|
+
}
|
|
24
|
+
if (!VALID_CHARS.test(trimmed)) {
|
|
25
|
+
throw new Error(`alarm name contains invalid characters (allowed: A-Z a-z 0-9 - _ . / # : ( ) + = @ space): "${trimmed}"`);
|
|
26
|
+
}
|
|
27
|
+
return trimmed;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Builds an {@link AlarmName} by kebab-casing each segment and joining with
|
|
31
|
+
* `sep`. Empty segments after kebab-casing are dropped, so callers can pass
|
|
32
|
+
* e.g. `Stack.of(scope).stackName` without worrying about token-resolution
|
|
33
|
+
* artefacts.
|
|
34
|
+
*/
|
|
35
|
+
function joinAlarmName(segments, sep = "/") {
|
|
36
|
+
const parts = segments.map(kebab).filter((s) => s.length > 0);
|
|
37
|
+
return alarmName(parts.join(sep));
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Lower-cases and hyphenates a string: splits camelCase / PascalCase /
|
|
41
|
+
* snake_case / dotted boundaries into hyphen-separated lowercase words.
|
|
42
|
+
*/
|
|
43
|
+
function kebab(input) {
|
|
44
|
+
return input
|
|
45
|
+
.replace(/([a-z0-9])([A-Z])/g, "$1-$2")
|
|
46
|
+
.replace(/([A-Z]+)([A-Z][a-z])/g, "$1-$2")
|
|
47
|
+
.replace(/[_\s.]+/g, "-")
|
|
48
|
+
.replace(/-+/g, "-")
|
|
49
|
+
.replace(/^-|-$/g, "")
|
|
50
|
+
.toLowerCase();
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=alarm-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-name.js","sourceRoot":"","sources":["../../src/alarm-name.ts"],"names":[],"mappings":";;AAoBA,8BAcC;AAQD,sCAGC;AAMD,sBAQC;AAlDD,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAClD,MAAM,OAAO,GAAG,GAAG,CAAC;AAEpB;;;;;;;GAOG;AACH,SAAgB,SAAS,CAAC,KAAa;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,OAAO,CAAC,YAAY,OAAO,GAAG,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,+FAA+F,OAAO,GAAG,CAC1G,CAAC;IACJ,CAAC;IACD,OAAO,OAAoB,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,QAA2B,EAAE,GAAG,GAAG,GAAG;IAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9D,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC;AAED;;;GAGG;AACH,SAAgB,KAAK,CAAC,KAAa;IACjC,OAAO,KAAK;SACT,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,OAAO,CAAC,uBAAuB,EAAE,OAAO,CAAC;SACzC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;SACxB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,WAAW,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-alarms.d.ts","sourceRoot":"","sources":["../../src/create-alarms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAO7D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,WAAW,EAAE,eAAe,EAAE,GAC7B,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAsBvB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAlarms = createAlarms;
|
|
4
|
+
const default_alarm_name_js_1 = require("./default-alarm-name.js");
|
|
5
|
+
function capitalize(s) {
|
|
6
|
+
return s[0].toUpperCase() + s.slice(1);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Creates CDK {@link Alarm} constructs from fully-resolved {@link AlarmDefinition}s.
|
|
10
|
+
*
|
|
11
|
+
* Validates that all definition keys are unique before creating alarms. Each
|
|
12
|
+
* alarm's `AlarmName` is taken verbatim from `def.alarmName` when supplied;
|
|
13
|
+
* otherwise it is derived from the scope, `id`, and `def.key` via
|
|
14
|
+
* {@link defaultAlarmName}.
|
|
15
|
+
*
|
|
16
|
+
* @param scope - CDK construct scope.
|
|
17
|
+
* @param id - Base identifier; each alarm's construct id is `${id}${Capitalize(key)}Alarm`.
|
|
18
|
+
* @param definitions - Fully-resolved alarm definitions.
|
|
19
|
+
* @returns A record mapping each definition's key to its created Alarm.
|
|
20
|
+
* @throws If duplicate keys are found in the definitions.
|
|
21
|
+
*/
|
|
22
|
+
function createAlarms(scope, id, definitions) {
|
|
23
|
+
const alarms = {};
|
|
24
|
+
for (const def of definitions) {
|
|
25
|
+
if (def.key in alarms) {
|
|
26
|
+
throw new Error(`Duplicate alarm key "${def.key}". Custom alarms cannot use the same key as a recommended alarm. ` +
|
|
27
|
+
`Disable the recommended alarm first, or use a different key.`);
|
|
28
|
+
}
|
|
29
|
+
alarms[def.key] = def.metric.createAlarm(scope, `${id}${capitalize(def.key)}Alarm`, {
|
|
30
|
+
alarmName: def.alarmName ?? (0, default_alarm_name_js_1.defaultAlarmName)(scope, id, def.key),
|
|
31
|
+
threshold: def.threshold,
|
|
32
|
+
evaluationPeriods: def.evaluationPeriods,
|
|
33
|
+
datapointsToAlarm: def.datapointsToAlarm,
|
|
34
|
+
treatMissingData: def.treatMissingData,
|
|
35
|
+
comparisonOperator: def.comparisonOperator,
|
|
36
|
+
alarmDescription: def.description,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return alarms;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=create-alarms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-alarms.js","sourceRoot":"","sources":["../../src/create-alarms.ts"],"names":[],"mappings":";;AAuBA,oCA0BC;AA9CD,mEAA2D;AAE3D,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAgB,YAAY,CAC1B,KAAiB,EACjB,EAAU,EACV,WAA8B;IAE9B,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;QAC9B,IAAI,GAAG,CAAC,GAAG,IAAI,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,wBAAwB,GAAG,CAAC,GAAG,mEAAmE;gBAChG,8DAA8D,CACjE,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE;YAClF,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,IAAA,wCAAgB,EAAC,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC;YAChE,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;YAC1C,gBAAgB,EAAE,GAAG,CAAC,WAAW;SAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-alarm-name.d.ts","sourceRoot":"","sources":["../../src/default-alarm-name.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,iBAAiB,CAAC;AAEhE;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAGtF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.defaultAlarmName = defaultAlarmName;
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const alarm_name_js_1 = require("./alarm-name.js");
|
|
6
|
+
/**
|
|
7
|
+
* Builds a human-readable, stack-scoped {@link AlarmName} from the alarm's
|
|
8
|
+
* scope, base id, and key.
|
|
9
|
+
*
|
|
10
|
+
* Format: `${stackName}/${kebab(id)}/${kebab(key)}`. Slashes are valid in
|
|
11
|
+
* CloudWatch alarm names and render hierarchy clearly in the console.
|
|
12
|
+
*
|
|
13
|
+
* Used by {@link createAlarms} as the fallback whenever an explicit
|
|
14
|
+
* `alarmName` is not supplied on the {@link AlarmDefinition}.
|
|
15
|
+
*/
|
|
16
|
+
function defaultAlarmName(scope, id, key) {
|
|
17
|
+
const stackName = aws_cdk_lib_1.Stack.of(scope).stackName;
|
|
18
|
+
return (0, alarm_name_js_1.joinAlarmName)([stackName, id, key]);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=default-alarm-name.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"default-alarm-name.js","sourceRoot":"","sources":["../../src/default-alarm-name.ts"],"names":[],"mappings":";;AAcA,4CAGC;AAjBD,6CAAoC;AAEpC,mDAAgE;AAEhE;;;;;;;;;GASG;AACH,SAAgB,gBAAgB,CAAC,KAAiB,EAAE,EAAU,EAAE,GAAW;IACzE,MAAM,SAAS,GAAG,mBAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC;IAC5C,OAAO,IAAA,6BAAa,EAAC,CAAC,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export type { AlarmConfig, AlarmConfigDefaults } from "./alarm-config.js";
|
|
2
|
-
export type { AlarmDefinition } from "./alarm-definition.js";
|
|
2
|
+
export type { AlarmDefinition, AlarmMetric } from "./alarm-definition.js";
|
|
3
3
|
export { AlarmDefinitionBuilder } from "./alarm-definition-builder.js";
|
|
4
4
|
export { type AlarmName, alarmName } from "./alarm-name.js";
|
|
5
5
|
export { defaultAlarmName } from "./default-alarm-name.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,KAAK,SAAS,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,YAAY,EACV,wBAAwB,EACxB,iBAAiB,EACjB,YAAY,GACb,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,yBAAyB,GAC/B,MAAM,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.alarmNamePolicy = exports.alarmActionsPolicy = exports.resolveAlarmConfig = exports.createAlarms = exports.defaultAlarmName = exports.alarmName = exports.AlarmDefinitionBuilder = void 0;
|
|
4
|
+
var alarm_definition_builder_js_1 = require("./alarm-definition-builder.js");
|
|
5
|
+
Object.defineProperty(exports, "AlarmDefinitionBuilder", { enumerable: true, get: function () { return alarm_definition_builder_js_1.AlarmDefinitionBuilder; } });
|
|
6
|
+
var alarm_name_js_1 = require("./alarm-name.js");
|
|
7
|
+
Object.defineProperty(exports, "alarmName", { enumerable: true, get: function () { return alarm_name_js_1.alarmName; } });
|
|
8
|
+
var default_alarm_name_js_1 = require("./default-alarm-name.js");
|
|
9
|
+
Object.defineProperty(exports, "defaultAlarmName", { enumerable: true, get: function () { return default_alarm_name_js_1.defaultAlarmName; } });
|
|
10
|
+
var create_alarms_js_1 = require("./create-alarms.js");
|
|
11
|
+
Object.defineProperty(exports, "createAlarms", { enumerable: true, get: function () { return create_alarms_js_1.createAlarms; } });
|
|
12
|
+
var resolve_alarm_config_js_1 = require("./resolve-alarm-config.js");
|
|
13
|
+
Object.defineProperty(exports, "resolveAlarmConfig", { enumerable: true, get: function () { return resolve_alarm_config_js_1.resolveAlarmConfig; } });
|
|
14
|
+
var alarm_actions_policy_js_1 = require("./policies/alarm-actions-policy.js");
|
|
15
|
+
Object.defineProperty(exports, "alarmActionsPolicy", { enumerable: true, get: function () { return alarm_actions_policy_js_1.alarmActionsPolicy; } });
|
|
16
|
+
var alarm_name_policy_js_1 = require("./policies/alarm-name-policy.js");
|
|
17
|
+
Object.defineProperty(exports, "alarmNamePolicy", { enumerable: true, get: function () { return alarm_name_policy_js_1.alarmNamePolicy; } });
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAEA,6EAAuE;AAA9D,qIAAA,sBAAsB,OAAA;AAC/B,iDAA4D;AAAnC,0GAAA,SAAS,OAAA;AAClC,iEAA2D;AAAlD,yHAAA,gBAAgB,OAAA;AACzB,uDAAkD;AAAzC,gHAAA,YAAY,OAAA;AACrB,qEAAyF;AAAhF,6HAAA,kBAAkB,OAAA;AAC3B,8EAAwE;AAA/D,6HAAA,kBAAkB,OAAA;AAM3B,wEAKyC;AAJvC,uHAAA,eAAe,OAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { IAlarmAction } from "aws-cdk-lib/aws-cloudwatch";
|
|
2
2
|
import { type IConstruct } from "constructs";
|
|
3
3
|
import { type AlarmRuleScope } from "./policy-matcher.js";
|
|
4
4
|
export type { AlarmMatchContext, AlarmMatcher } from "./policy-matcher.js";
|
|
@@ -23,17 +23,25 @@ export interface AlarmActionsPolicyConfig {
|
|
|
23
23
|
skipIfAlreadyConfigured?: boolean;
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
26
|
+
* Registers a CDK {@link https://docs.aws.amazon.com/cdk/v2/guide/aspects.html | Aspect}
|
|
27
|
+
* on `scope` that attaches CloudWatch alarm actions to every `Alarm` and
|
|
28
|
+
* `CompositeAlarm` (L2) construct in the subtree at synth time. Call once
|
|
29
|
+
* with any scope — an `App`, a `Stack`, or the scope passed to `.build()`
|
|
30
|
+
* for a composed system; alarms added after the call still pick up the
|
|
31
|
+
* policy, so call ordering is irrelevant as
|
|
32
|
+
* long as it happens before `app.synth()`. In particular, there is no need
|
|
33
|
+
* to wrap this call in `afterBuild` — the Aspect runs after the construct
|
|
34
|
+
* tree is finalised, not at call time. The only temporal constraint is that
|
|
35
|
+
* any `IAlarmAction` instances in `config` (e.g. `new SnsAction(topic)`)
|
|
36
|
+
* must reference constructs that already exist when the policy is called.
|
|
28
37
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* L2 wrapper) are detected but silently skipped.
|
|
38
|
+
* Detection uses the version-portable `isCfnAlarm` / `isCfnCompositeAlarm`
|
|
39
|
+
* guards (`CfnResource.isCfnResource` + `cfnResourceType`, so they work below
|
|
40
|
+
* aws-cdk-lib 2.231.0) on the L1 resource; the L2 parent is found via
|
|
41
|
+
* duck-typing on `addAlarmAction`. Actions are attached through
|
|
42
|
+
* the L2 so that `IAlarmAction.bind()` runs and permissions are wired
|
|
43
|
+
* correctly. Bare `CfnAlarm` nodes (created without an L2 wrapper) are
|
|
44
|
+
* detected but silently skipped.
|
|
37
45
|
*
|
|
38
46
|
* `defaults` apply to every matched alarm; `rules` append additional actions.
|
|
39
47
|
* A rule matches if any of its `match` entries matches. Set
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alarm-actions-policy.d.ts","sourceRoot":"","sources":["../../../src/policies/alarm-actions-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAuC,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACpG,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAEL,KAAK,cAAc,EAIpB,MAAM,qBAAqB,CAAC;AAE7B,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAE3E,4EAA4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;IAC9B,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,uBAAuB,CAAC,EAAE,YAAY,EAAE,CAAC;CAC1C;AAED,uFAAuF;AACvF,MAAM,WAAW,eAAgB,SAAQ,cAAc,EAAE,cAAc;IACrE,iEAAiE;IACjE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,oDAAoD;AACpD,MAAM,WAAW,wBAAwB;IACvC,kGAAkG;IAClG,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,mFAAmF;IACnF,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;IAC1B,8DAA8D;IAC9D,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AA4DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,wBAAwB,GAAG,IAAI,CAkD5F"}
|