Skip to content

Commit c40df63

Browse files
authoredNov 7, 2024
feat: add cloudwatch alarms for sqs (#50)
1 parent 16985e7 commit c40df63

24 files changed

+690
-190
lines changed
 

‎src/definition/handler/events/http.schema.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { $enum, $object, $string } from '@skyleague/therefore'
2-
import { apigatewayMonitoringMetric } from '../../monitoring/apigateway.schema.js'
2+
import { apigatewayMonitoringMetric } from '../../monitoring/metrics.schema.js'
33

44
export const httpTrigger = $object({
55
http: $object({

‎src/definition/handler/events/http.type.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
*/
55
/* eslint-disable */
66

7-
import type { ApigatewayMonitoringMetric } from '../../monitoring/apigateway.type.js'
7+
import type { ApigatewayMonitoringMetric } from '../../monitoring/metrics.type.js'
88

99
export interface HttpTrigger {
1010
/**

‎src/definition/handler/events/sqs.schema.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
$union,
1212
$unknown,
1313
} from '@skyleague/therefore'
14+
import { sqsMonitoring } from '../../monitoring/metrics.schema.js'
1415

1516
export const fifoSettings = $object({
1617
enabled: $boolean().optional().describe('Whether to enable FIFO queue support. Default is false.'),
@@ -72,6 +73,7 @@ export const sqsTrigger = $object({
7273
policy: $string().optional().describe('The policy of the queue.'),
7374
kmsDataKeyReusePeriodSeconds: $number().optional().describe('The data key reuse period of the queue.'),
7475
tags: $record($string).optional().describe('The tags to apply to the queue.'),
75-
eventbridge: $ref(eventbridgeSettings).optional(),
76+
eventbridge: eventbridgeSettings.optional(),
77+
monitoring: sqsMonitoring.optional(),
7678
}).describe('Subscribes to an SQS queue.'),
7779
})

‎src/definition/handler/events/sqs.type.ts

+3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
*/
55
/* eslint-disable */
66

7+
import type { SqsMonitoring } from '../../monitoring/metrics.type.js'
8+
79
/**
810
* The dead-letter queue settings to use when messages are not processed.
911
*/
@@ -154,5 +156,6 @@ export interface SqsTrigger {
154156
}
155157
| undefined
156158
eventbridge?: EventbridgeSettings | undefined
159+
monitoring?: SqsMonitoring | undefined
157160
}
158161
}

‎src/definition/monitoring/apigateway.schema.ts

-56
This file was deleted.

‎src/definition/monitoring/apigateway.type.ts

-81
This file was deleted.

‎src/definition/monitoring/metrics.schema.ts

+66-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { $boolean, $number, $object } from '@skyleague/therefore'
1+
import { $boolean, $number, $object, type Node } from '@skyleague/therefore'
22

33
export const anomalyMetric = $object({
44
enabled: $boolean(),
@@ -14,3 +14,68 @@ export const staticMetric = $object({
1414
period: $number(),
1515
evaluationPeriods: $number(),
1616
}).partial()
17+
18+
const toMetric = <T extends Node>(metric: T) =>
19+
$object({
20+
average: metric,
21+
sum: metric,
22+
minimum: metric,
23+
maximum: metric,
24+
sampleCount: metric,
25+
iqm: metric,
26+
27+
p80: metric,
28+
tm80: metric,
29+
tc80: metric,
30+
wm80: metric,
31+
32+
p90: metric,
33+
tm90: metric,
34+
tc90: metric,
35+
wm90: metric,
36+
37+
p95: metric,
38+
tm95: metric,
39+
tc95: metric,
40+
wm95: metric,
41+
42+
p99: metric,
43+
tm99: metric,
44+
tc99: metric,
45+
wm99: metric,
46+
}).partial()
47+
48+
export const defaultMetric = $object({
49+
static: toMetric(staticMetric),
50+
anomaly: toMetric(anomalyMetric),
51+
}).partial()
52+
53+
export const apigatewayMonitoringMetric = $object({
54+
latency: defaultMetric,
55+
integrationLatency: defaultMetric,
56+
'5xx': defaultMetric,
57+
'4xx': defaultMetric,
58+
dataProcessed: defaultMetric,
59+
count: defaultMetric,
60+
}).partial()
61+
62+
export const apigatewayMonitoring = $object({
63+
route: apigatewayMonitoringMetric,
64+
api: apigatewayMonitoringMetric,
65+
}).partial()
66+
67+
export const sqsMonitoringMetric = $object({
68+
numberOfMessagesSent: defaultMetric,
69+
approximateNumberOfMessagesVisible: defaultMetric,
70+
approximateNumberOfMessagesDelayed: defaultMetric,
71+
approximateAgeOfOldestMessage: defaultMetric,
72+
approximateNumberOfMessagesNotVisible: defaultMetric,
73+
numberOfMessagesDeleted: defaultMetric,
74+
numberOfMessagesReceived: defaultMetric,
75+
numberOfEmptyReceives: defaultMetric,
76+
}).partial()
77+
78+
export const sqsMonitoring = $object({
79+
queue: sqsMonitoringMetric,
80+
dlq: sqsMonitoringMetric,
81+
}).partial()

‎src/definition/monitoring/metrics.type.ts

+85
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,91 @@ export interface AnomalyMetric {
1212
metricPeriod?: number | undefined
1313
}
1414

15+
export interface ApigatewayMonitoring {
16+
route?: ApigatewayMonitoringMetric | undefined
17+
api?: ApigatewayMonitoringMetric | undefined
18+
}
19+
20+
export interface ApigatewayMonitoringMetric {
21+
latency?: DefaultMetric | undefined
22+
integrationLatency?: DefaultMetric | undefined
23+
'5xx'?: DefaultMetric | undefined
24+
'4xx'?: DefaultMetric | undefined
25+
dataProcessed?: DefaultMetric | undefined
26+
count?: DefaultMetric | undefined
27+
}
28+
29+
export interface DefaultMetric {
30+
static?:
31+
| {
32+
average?: StaticMetric | undefined
33+
sum?: StaticMetric | undefined
34+
minimum?: StaticMetric | undefined
35+
maximum?: StaticMetric | undefined
36+
sampleCount?: StaticMetric | undefined
37+
iqm?: StaticMetric | undefined
38+
p80?: StaticMetric | undefined
39+
tm80?: StaticMetric | undefined
40+
tc80?: StaticMetric | undefined
41+
wm80?: StaticMetric | undefined
42+
p90?: StaticMetric | undefined
43+
tm90?: StaticMetric | undefined
44+
tc90?: StaticMetric | undefined
45+
wm90?: StaticMetric | undefined
46+
p95?: StaticMetric | undefined
47+
tm95?: StaticMetric | undefined
48+
tc95?: StaticMetric | undefined
49+
wm95?: StaticMetric | undefined
50+
p99?: StaticMetric | undefined
51+
tm99?: StaticMetric | undefined
52+
tc99?: StaticMetric | undefined
53+
wm99?: StaticMetric | undefined
54+
}
55+
| undefined
56+
anomaly?:
57+
| {
58+
average?: AnomalyMetric | undefined
59+
sum?: AnomalyMetric | undefined
60+
minimum?: AnomalyMetric | undefined
61+
maximum?: AnomalyMetric | undefined
62+
sampleCount?: AnomalyMetric | undefined
63+
iqm?: AnomalyMetric | undefined
64+
p80?: AnomalyMetric | undefined
65+
tm80?: AnomalyMetric | undefined
66+
tc80?: AnomalyMetric | undefined
67+
wm80?: AnomalyMetric | undefined
68+
p90?: AnomalyMetric | undefined
69+
tm90?: AnomalyMetric | undefined
70+
tc90?: AnomalyMetric | undefined
71+
wm90?: AnomalyMetric | undefined
72+
p95?: AnomalyMetric | undefined
73+
tm95?: AnomalyMetric | undefined
74+
tc95?: AnomalyMetric | undefined
75+
wm95?: AnomalyMetric | undefined
76+
p99?: AnomalyMetric | undefined
77+
tm99?: AnomalyMetric | undefined
78+
tc99?: AnomalyMetric | undefined
79+
wm99?: AnomalyMetric | undefined
80+
}
81+
| undefined
82+
}
83+
84+
export interface SqsMonitoring {
85+
queue?: SqsMonitoringMetric | undefined
86+
dlq?: SqsMonitoringMetric | undefined
87+
}
88+
89+
export interface SqsMonitoringMetric {
90+
numberOfMessagesSent?: DefaultMetric | undefined
91+
approximateNumberOfMessagesVisible?: DefaultMetric | undefined
92+
approximateNumberOfMessagesDelayed?: DefaultMetric | undefined
93+
approximateAgeOfOldestMessage?: DefaultMetric | undefined
94+
approximateNumberOfMessagesNotVisible?: DefaultMetric | undefined
95+
numberOfMessagesDeleted?: DefaultMetric | undefined
96+
numberOfMessagesReceived?: DefaultMetric | undefined
97+
numberOfEmptyReceives?: DefaultMetric | undefined
98+
}
99+
15100
export interface StaticMetric {
16101
enabled?: boolean | undefined
17102
threshold?: number | undefined
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { $object, type ObjectType } from '@skyleague/therefore'
2+
import { apigatewayMonitoring, sqsMonitoring } from './metrics.schema.js'
3+
4+
export const monitoring: ObjectType = $object({
5+
httpApi: apigatewayMonitoring,
6+
restApi: apigatewayMonitoring,
7+
sqs: sqsMonitoring,
8+
}).partial()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* Generated by @skyleague/therefore@v1.0.0-local
3+
* Do not manually touch this
4+
*/
5+
/* eslint-disable */
6+
7+
import type { ApigatewayMonitoring, SqsMonitoring } from './metrics.type.js'
8+
9+
export interface Monitoring {
10+
httpApi?: ApigatewayMonitoring | undefined
11+
restApi?: ApigatewayMonitoring | undefined
12+
sqs?: SqsMonitoring | undefined
13+
}

0 commit comments

Comments
 (0)