Skip to content

Commit

Permalink
feat: add support for FIFO payload parsing (#557)
Browse files Browse the repository at this point in the history
  • Loading branch information
GuyMoses authored Jan 23, 2025
1 parent b2f9609 commit a5b9f29
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 4 deletions.
23 changes: 23 additions & 0 deletions src/parsers/aws.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,29 @@ describe('aws parser', () => {
});
});

test('sqsParser -> request, response of FIFO queue', () => {
const requestData = {
host: 'https://sqs.eu-central-1.amazonaws.com/',
body: '{"MessageBody":"{\\"jobId\\":\\"1073a67a-fca7-403a-aaac-45c791863e3a\\",\\"createdAt\\":\\"2025-01-22T08:57:43.416Z\\",\\"updatedAt\\":\\"2025-01-22T08:57:43.416Z\\",\\"respondent\\":{\\"_id\\":\\"6790b3070735fa471ac8a0cd\\",\\"respondentId\\":\\"107b635a-c5d9-40de-af4c-6bd356056b93\\",\\"surveyName\\":\\"Highlights from Your Last Vaction\\",\\"survey\\":\\"675198ef8647858063795098\\"},\\"synchronousResponse\\":true}","MessageDeduplicationId":"1073a67a-fca7-403a-aaac-45c791863e3a","MessageGroupId":"1073a67a-fca7-403a-aaac-45c791863e3a","QueueUrl":"https://sqs.eu-central-1.amazonaws.com/741448950100/staging-api-jobs-queue.fifo"}',
method: 'POST',
headers: {
host: 'sqs.eu-central-1.amazonaws.com',
},
};

const responseBody =
'{"MD5OfMessageBody":"a2c0703fb5c6b057cb3cf2eb9ab6d5be","MessageId":"3e8805d5-2413-480c-b297-2f7269311840","SequenceNumber":"18891553357147631616"}';
const responseData = { body: responseBody };

const result = aws.sqsParser(requestData, responseData);

expect(result).toEqual({
'aws.resource.name':
'https://sqs.eu-central-1.amazonaws.com/741448950100/staging-api-jobs-queue.fifo',
messageId: '3e8805d5-2413-480c-b297-2f7269311840',
});
});

test('sqsParser -> empty request', () => {
const result = aws.sqsParser({}, null);
expect(result).toEqual({
Expand Down
7 changes: 4 additions & 3 deletions src/parsers/aws.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { logger } from '../logging';
import { md5Hash, parseQueryParams, removeDuplicates, safeGet } from '../utils';
import { md5Hash, parseQueryParams, removeDuplicates, safeGet, safeParse } from '../utils';
import { traverse } from '../tools/xmlToJson';
import type { HttpRawRequest, HttpRawResponse } from '@lumigo/node-core/lib/types/spans';
import { CommonUtils, Triggers } from '@lumigo/node-core';
Expand Down Expand Up @@ -167,7 +167,7 @@ export const sqsParser = (requestData, responseData, jsonResponseBody = undefine
const { body: reqBody, headers: requestHeaders } = requestData;
const { body: resBody } = responseData || {};
const parsedReqBody = reqBody ? parseQueryParams(reqBody) : undefined;
const parsedResBody = jsonResponseBody || (resBody ? traverse(resBody) : undefined);
const parsedResBody = jsonResponseBody || safeParse(resBody ? traverse(resBody) : undefined);
const resourceName = parsedReqBody ? parsedReqBody['QueueUrl'] : undefined;
const awsServiceData: AwsServiceAttributes = { 'aws.resource.name': resourceName };
awsServiceData.messageId =
Expand Down Expand Up @@ -202,7 +202,8 @@ export const sqsParser = (requestData, responseData, jsonResponseBody = undefine
parsedResBody,
['ReceiveMessageResponse', 'ReceiveMessageResult', 'Message', 0, 'MessageId'],
undefined
);
) ||
safeGet(parsedResBody, ['MessageId'], undefined);
const innerRaw = parsedResBody?.ReceiveMessageResponse?.ReceiveMessageResult?.Message?.Body || '';
if (innerRaw.search(Triggers.INNER_MESSAGES_IDENTIFIER_PATTERN) > 0) {
const inner = JSON.parse(innerRaw.replace(/"/g, '"'));
Expand Down
14 changes: 13 additions & 1 deletion src/utils.test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { getSpanAttributeMaxLength } from './utils';
import { getSpanAttributeMaxLength, safeParse } from './utils';

describe('getSpanAttributeMaxLength', () => {
describe('value according to env. vars', () => {
Expand Down Expand Up @@ -39,3 +39,15 @@ describe('getSpanAttributeMaxLength', () => {
});
});
});

describe('safeParse', () => {
it('should return the parsed object', () => {
const obj = { a: 1, b: 2 };
expect(safeParse(JSON.stringify(obj))).toEqual(obj);
});

it('should return the same string', () => {
const str = 'test';
expect(safeParse(str)).toEqual(str);
});
});
13 changes: 13 additions & 0 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -136,9 +136,22 @@ export const safeGet = (obj, arr, dflt = null) => {
return current || dflt;
};

export const safeParse = (parseable) => {
try {
return JSON.parse(parseable);
} catch (e) {
return parseable;
}
};

export const parseQueryParams = (queryParams) => {
return safeExecute(() => {
if (typeof queryParams !== 'string') return {};
try {
return JSON.parse(queryParams);
} catch (e) {
// ignore because sqs request body could also be not a JSON
}
const obj = {};
queryParams.replace(
/([^=&]+)=([^&]*)/g,
Expand Down

0 comments on commit a5b9f29

Please sign in to comment.