feat: add xray segment tracing on auth-worker

This commit is contained in:
Karol Sójko 2023-10-03 08:21:52 +02:00
parent b4a38d9dcc
commit b1b244a2cf
No known key found for this signature in database
GPG key ID: C2F813669419D05F
7 changed files with 76 additions and 3 deletions

1
.pnp.cjs generated
View file

@ -5963,6 +5963,7 @@ const RAW_RUNTIME_STATE =
["@types/newrelic", "npm:9.14.0"],\ ["@types/newrelic", "npm:9.14.0"],\
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:6.5.0"],\ ["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:6.5.0"],\
["@typescript-eslint/parser", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:6.5.0"],\ ["@typescript-eslint/parser", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:6.5.0"],\
["aws-xray-sdk", "npm:3.5.2"],\
["eslint", "npm:8.41.0"],\ ["eslint", "npm:8.41.0"],\
["eslint-plugin-prettier", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.0.0"],\ ["eslint-plugin-prettier", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.0.0"],\
["ioredis", "npm:5.3.2"],\ ["ioredis", "npm:5.3.2"],\

View file

@ -8,6 +8,7 @@ import { Env } from '../src/Bootstrap/Env'
import { DomainEventSubscriberFactoryInterface } from '@standardnotes/domain-events' import { DomainEventSubscriberFactoryInterface } from '@standardnotes/domain-events'
import * as dayjs from 'dayjs' import * as dayjs from 'dayjs'
import * as utc from 'dayjs/plugin/utc' import * as utc from 'dayjs/plugin/utc'
import * as AWSXRay from 'aws-xray-sdk'
const container = new ContainerConfigLoader('worker') const container = new ContainerConfigLoader('worker')
void container.load().then((container) => { void container.load().then((container) => {
@ -16,6 +17,14 @@ void container.load().then((container) => {
const env: Env = new Env() const env: Env = new Env()
env.load() env.load()
const isConfiguredForAWSProduction =
env.get('MODE', true) !== 'home-server' && env.get('MODE', true) !== 'self-hosted'
if (isConfiguredForAWSProduction) {
AWSXRay.enableManualMode()
AWSXRay.config([AWSXRay.plugins.EC2Plugin, AWSXRay.plugins.ECSPlugin])
}
const logger: Logger = container.get(TYPES.Auth_Logger) const logger: Logger = container.get(TYPES.Auth_Logger)
logger.info('Starting worker...') logger.info('Starting worker...')

View file

@ -93,7 +93,7 @@ import {
SNSDomainEventPublisher, SNSDomainEventPublisher,
SQSDomainEventSubscriberFactory, SQSDomainEventSubscriberFactory,
SQSEventMessageHandler, SQSEventMessageHandler,
SQSNewRelicEventMessageHandler, SQSXRayEventMessageHandler,
} from '@standardnotes/domain-events-infra' } from '@standardnotes/domain-events-infra'
import { GetUserSubscription } from '../Domain/UseCase/GetUserSubscription/GetUserSubscription' import { GetUserSubscription } from '../Domain/UseCase/GetUserSubscription/GetUserSubscription'
import { ChangeCredentials } from '../Domain/UseCase/ChangeCredentials/ChangeCredentials' import { ChangeCredentials } from '../Domain/UseCase/ChangeCredentials/ChangeCredentials'
@ -1236,8 +1236,8 @@ export class ContainerConfigLoader {
container container
.bind<DomainEventMessageHandlerInterface>(TYPES.Auth_DomainEventMessageHandler) .bind<DomainEventMessageHandlerInterface>(TYPES.Auth_DomainEventMessageHandler)
.toConstantValue( .toConstantValue(
env.get('NEW_RELIC_ENABLED', true) === 'true' isConfiguredForAWSProduction
? new SQSNewRelicEventMessageHandler(eventHandlers, container.get(TYPES.Auth_Logger)) ? new SQSXRayEventMessageHandler(eventHandlers, container.get(TYPES.Auth_Logger))
: new SQSEventMessageHandler(eventHandlers, container.get(TYPES.Auth_Logger)), : new SQSEventMessageHandler(eventHandlers, container.get(TYPES.Auth_Logger)),
) )

View file

@ -27,6 +27,7 @@
"@aws-sdk/client-sns": "^3.332.0", "@aws-sdk/client-sns": "^3.332.0",
"@aws-sdk/client-sqs": "^3.332.0", "@aws-sdk/client-sqs": "^3.332.0",
"@standardnotes/domain-events": "workspace:*", "@standardnotes/domain-events": "workspace:*",
"aws-xray-sdk": "^3.5.2",
"ioredis": "^5.2.4", "ioredis": "^5.2.4",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
"sqs-consumer": "^6.2.1", "sqs-consumer": "^6.2.1",

View file

@ -0,0 +1,60 @@
import { Logger } from 'winston'
import * as zlib from 'zlib'
import { Segment, Subsegment, captureAsyncFunc } from 'aws-xray-sdk'
import {
DomainEventHandlerInterface,
DomainEventInterface,
DomainEventMessageHandlerInterface,
} from '@standardnotes/domain-events'
export class SQSXRayEventMessageHandler implements DomainEventMessageHandlerInterface {
constructor(
private handlers: Map<string, DomainEventHandlerInterface>,
private logger: Logger,
) {}
async handleMessage(message: string): Promise<void> {
const messageParsed = JSON.parse(message)
const domainEventJson = zlib.unzipSync(Buffer.from(messageParsed.Message, 'base64')).toString()
const domainEvent: DomainEventInterface = JSON.parse(domainEventJson)
domainEvent.createdAt = new Date(domainEvent.createdAt)
const handler = this.handlers.get(domainEvent.type)
if (!handler) {
this.logger.debug(`Event handler for event type ${domainEvent.type} does not exist`)
return
}
this.logger.debug(`Received event: ${domainEvent.type}`)
const xRaySegment = new Segment(domainEvent.type)
if (domainEvent.meta.correlation.userIdentifierType === 'uuid') {
xRaySegment.setUser(domainEvent.meta.correlation.userIdentifier)
}
await captureAsyncFunc(
`${handler.constructor.name}.handle}`,
async (subsegment?: Subsegment) => {
await handler.handle(domainEvent)
if (subsegment) {
subsegment.close()
}
},
xRaySegment,
)
xRaySegment.close()
xRaySegment.flush()
}
async handleError(error: Error): Promise<void> {
this.logger.error('Error occured while handling SQS message: %O', error)
}
}

View file

@ -12,3 +12,4 @@ export * from './SQS/SQSNewRelicBounceNotificiationHandler'
export * from './SQS/SQSDomainEventSubscriberFactory' export * from './SQS/SQSDomainEventSubscriberFactory'
export * from './SQS/SQSEventMessageHandler' export * from './SQS/SQSEventMessageHandler'
export * from './SQS/SQSNewRelicEventMessageHandler' export * from './SQS/SQSNewRelicEventMessageHandler'
export * from './SQS/SQSXRayEventMessageHandler'

View file

@ -4834,6 +4834,7 @@ __metadata:
"@types/newrelic": "npm:^9.14.0" "@types/newrelic": "npm:^9.14.0"
"@typescript-eslint/eslint-plugin": "npm:^6.5.0" "@typescript-eslint/eslint-plugin": "npm:^6.5.0"
"@typescript-eslint/parser": "npm:^6.5.0" "@typescript-eslint/parser": "npm:^6.5.0"
aws-xray-sdk: "npm:^3.5.2"
eslint: "npm:^8.39.0" eslint: "npm:^8.39.0"
eslint-plugin-prettier: "npm:^5.0.0" eslint-plugin-prettier: "npm:^5.0.0"
ioredis: "npm:^5.2.4" ioredis: "npm:^5.2.4"