@@ -19,6 +19,7 @@ import {
1919 LetterRequestPreparedEventV2 ,
2020} from "@nhsdigital/nhs-notify-event-schemas-letter-rendering" ;
2121import z from "zod" ;
22+ import { metricScope , Unit } from "aws-embedded-metrics" ;
2223import { Deps } from "../config/deps" ;
2324
2425type SupplierSpec = { supplierId : string ; specId : string } ;
@@ -153,33 +154,50 @@ async function runUpsert(
153154}
154155
155156export 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}
0 commit comments