Skip to content

Commit b51d290

Browse files
add my first EMF metrics to upsert letter lambda
1 parent 8e845cf commit b51d290

File tree

3 files changed

+67
-36
lines changed

3 files changed

+67
-36
lines changed

lambdas/upsert-letter/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"@nhsdigital/nhs-notify-event-schemas-letter-rendering-v1": "npm:@nhsdigital/nhs-notify-event-schemas-letter-rendering@^1.1.5",
88
"@nhsdigital/nhs-notify-event-schemas-supplier-api": "^1.0.8",
99
"@types/aws-lambda": "^8.10.148",
10+
"aws-embedded-metrics": "^4.2.1",
1011
"aws-lambda": "^1.0.7",
1112
"esbuild": "^0.27.2",
1213
"pino": "^9.7.0",

lambdas/upsert-letter/src/handler/upsert-handler.ts

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
LetterRequestPreparedEventV2,
2020
} from "@nhsdigital/nhs-notify-event-schemas-letter-rendering";
2121
import z from "zod";
22+
import { metricScope, Unit } from "aws-embedded-metrics";
2223
import { Deps } from "../config/deps";
2324

2425
type SupplierSpec = { supplierId: string; specId: string };
@@ -153,33 +154,50 @@ async function runUpsert(
153154
}
154155

155156
export default function createUpsertLetterHandler(deps: Deps): SQSHandler {
156-
return async (event: SQSEvent) => {
157-
const batchItemFailures: SQSBatchItemFailure[] = [];
158-
159-
const tasks = event.Records.map(async (record) => {
160-
try {
161-
const message: string = parseSNSNotification(record);
162-
163-
const snsEvent = JSON.parse(message);
164-
165-
const letterEvent: unknown = removeEventBridgeWrapper(snsEvent);
166-
167-
const type = getType(letterEvent);
168-
169-
const operation = getOperationFromType(type);
170-
171-
await runUpsert(operation, letterEvent, deps);
172-
} catch (error) {
173-
deps.logger.error(
174-
{ err: error, message: record.body },
175-
`Error processing upsert of record ${record.messageId}`,
176-
);
177-
batchItemFailures.push({ itemIdentifier: record.messageId });
178-
}
179-
});
180-
181-
await Promise.all(tasks);
182-
183-
return { batchItemFailures };
184-
};
157+
return metricScope(async (metrics) => {
158+
return async (event: SQSEvent) => {
159+
const batchItemFailures: SQSBatchItemFailure[] = [];
160+
161+
const tasks = event.Records.map(async (record) => {
162+
try {
163+
const message: string = parseSNSNotification(record);
164+
165+
const snsEvent = JSON.parse(message);
166+
167+
const letterEvent: unknown = removeEventBridgeWrapper(snsEvent);
168+
169+
const type = getType(letterEvent);
170+
171+
const operation = getOperationFromType(type);
172+
173+
await runUpsert(operation, letterEvent, deps);
174+
metrics.putDimensions({
175+
FunctionName: "upsertLambda",
176+
// eslint-disable-next-line sonarjs/pseudo-random
177+
OddOrEven: `${Math.floor(Math.random() * 10) % 2}`,
178+
OperationType: operation.name,
179+
});
180+
metrics.setProperty("operation", operation.name);
181+
metrics.putMetric("MessagesProcessed", 1, Unit.Count);
182+
} catch (error) {
183+
deps.logger.error(
184+
{ err: error, message: record.body },
185+
`Error processing upsert of record ${record.messageId}`,
186+
);
187+
metrics.putDimensions({
188+
FunctionName: "upsertLambda",
189+
// eslint-disable-next-line sonarjs/pseudo-random
190+
OddOrEven: `${Math.floor(Math.random() * 10) % 2}`,
191+
});
192+
metrics.setProperty("operation", operation.name);
193+
metrics.putMetric("MessageFailed", 1, Unit.Count);
194+
batchItemFailures.push({ itemIdentifier: record.messageId });
195+
}
196+
});
197+
198+
await Promise.all(tasks);
199+
200+
return { batchItemFailures };
201+
};
202+
});
185203
}

package-lock.json

Lines changed: 19 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)