Skip to content

Commit 6198984

Browse files
emit metrics per supplier and with correct count
1 parent 0233eb8 commit 6198984

2 files changed

Lines changed: 39 additions & 26 deletions

File tree

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

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

2525
type SupplierSpec = { supplierId: string; specId: string };
@@ -153,58 +153,70 @@ async function runUpsert(
153153
throw new Error("No matching schema for received message");
154154
}
155155

156+
async function emitMetrics(
157+
metrics: MetricsLogger,
158+
successMetrics: Map<string, number>,
159+
failMetrics: Map<string, number>,
160+
) {
161+
metrics.setNamespace(process.env.AWS_LAMBDA_FUNCTION_NAME || `upsertLetter`);
162+
// emit success metrics
163+
for (const [supplier, count] of Object.entries(successMetrics)) {
164+
metrics.putDimensions({
165+
Supplier: supplier,
166+
});
167+
metrics.putMetric("MessagesProcessed", count, Unit.Count);
168+
}
169+
// emit failure metrics
170+
for (const [supplier, count] of Object.entries(failMetrics)) {
171+
metrics.putDimensions({
172+
Supplier: supplier,
173+
});
174+
metrics.putMetric("MessageFailed", count, Unit.Count);
175+
}
176+
}
177+
156178
export default function createUpsertLetterHandler(deps: Deps): SQSHandler {
157179
return metricScope((metrics) => {
158180
return async (event: SQSEvent) => {
159-
console.log(
160-
"the environment variables:",
161-
JSON.stringify(process.env, null, 2),
162-
);
163-
console.log("The SQSEvent:", event);
164181
const batchItemFailures: SQSBatchItemFailure[] = [];
165-
metrics.setNamespace(
166-
process.env.AWS_LAMBDA_FUNCTION_NAME || "upsertletter",
167-
);
182+
const perSupplierSuccess: Map<string, number> = new Map<string, number>();
183+
const perSupplierFailure: Map<string, number> = new Map<string, number>();
168184

169185
const tasks = event.Records.map(async (record) => {
186+
let supplier = "unknown";
170187
try {
171188
const message: string = parseSNSNotification(record);
172-
console.log("the message:", message);
173-
174189
const snsEvent = JSON.parse(message);
175-
console.log("the snsEvent:", snsEvent);
176-
190+
supplier = snsEvent.data.supplierId || "unknown";
177191
const letterEvent: unknown = removeEventBridgeWrapper(snsEvent);
178-
179192
const type = getType(letterEvent);
180193

181194
const operation = getOperationFromType(type);
182-
console.log("letterEvent:", letterEvent);
183-
console.log("operation:", operation);
184195
metrics.putDimensions({
185-
// eslint-disable-next-line sonarjs/pseudo-random
186-
OddOrEven: `${Math.floor(Math.random() * 10) % 2}`,
196+
supplier: snsEvent.data.supplierId || "unknown",
187197
});
188198

189199
await runUpsert(operation, letterEvent, deps);
190-
metrics.setProperty("operation", operation.name);
191200

192-
metrics.putMetric("MessagesProcessed", 1, Unit.Count);
201+
perSupplierSuccess.set(
202+
supplier,
203+
(perSupplierSuccess.get(supplier) || 0) + 1,
204+
);
193205
} catch (error) {
194206
deps.logger.error(
195207
{ err: error, message: record.body },
196208
`Error processing upsert of record ${record.messageId}`,
197209
);
198-
metrics.putDimensions({
199-
// eslint-disable-next-line sonarjs/pseudo-random
200-
OddOrEven: `${Math.floor(Math.random() * 10) % 2}`,
201-
});
202-
metrics.putMetric("MessageFailed", 1, Unit.Count);
210+
perSupplierFailure.set(
211+
supplier,
212+
(perSupplierFailure.get(supplier) || 0) + 1,
213+
);
203214
batchItemFailures.push({ itemIdentifier: record.messageId });
204215
}
205216
});
206217

207218
await Promise.all(tasks);
219+
await emitMetrics(metrics, perSupplierSuccess, perSupplierFailure);
208220

209221
return { batchItemFailures };
210222
};

tests/resources/prepared-letter.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@
44
"clientId": "testClientId",
55
"createdAt": "2025-08-28T08:45:00.000Z",
66
"domainId": "letter1",
7-
"letterVariantId": "lv1",
7+
"letterVariantId": "notify-standard",
88
"pageCount": 2,
99
"requestId": "0o5Fs0EELR0fUjHjbCnEtdUwQe3",
1010
"requestItemId": "0o5Fs0EELR0fUjHjbCnEtdUwQe4",
1111
"requestItemPlanId": "0o5Fs0EELR0fUjHjbCnEtdUwQe5",
1212
"sha256Hash": "3a7bd3e2360a3d29eea436fcfb7e44c735d117c8f2f1d2d1e4f6e8f7e6e8f7e6",
1313
"status": "PREPARED",
14+
"supplierId": "testSupplierId",
1415
"templateId": "template_123",
1516
"url": "s3://nhs-820178564574-eu-west-2-pr280-supapi-test-letters/letter1.png"
1617
},

0 commit comments

Comments
 (0)