diff --git a/infrastructure/curated-corpus-api/src/config/index.ts b/infrastructure/curated-corpus-api/src/config/index.ts index bc971370..77543e65 100644 --- a/infrastructure/curated-corpus-api/src/config/index.ts +++ b/infrastructure/curated-corpus-api/src/config/index.ts @@ -48,4 +48,9 @@ export const config = { timeout: 5, startPeriod: 0, }, + tracing: { + url: isDev + ? 'https://otel-collector.getpocket.dev:443' + : 'https://otel-collector.readitlater.com:443', + }, }; diff --git a/infrastructure/curated-corpus-api/src/main.ts b/infrastructure/curated-corpus-api/src/main.ts index 74befa43..3c02f3d7 100644 --- a/infrastructure/curated-corpus-api/src/main.ts +++ b/infrastructure/curated-corpus-api/src/main.ts @@ -269,10 +269,14 @@ class CuratedCorpusAPI extends TerraformStack { name: 'AWS_REGION', value: region.name, }, + { + name: 'OTLP_COLLECTOR_URL', + value: config.tracing.url, + }, { name: 'LOG_LEVEL', - // do not log http, graphql, or debug events in production - value: config.environment === 'Prod' ? 'info' : 'debug', + // do not log http, graphql, or debug events + value: 'info', }, ], logGroup: this.createCustomLogGroup('app'), @@ -286,6 +290,14 @@ class CuratedCorpusAPI extends TerraformStack { name: 'DATABASE_URL', valueFrom: `${rds.secretARN}:database_url::`, }, + { + name: 'UNLEASH_ENDPOINT', + valueFrom: `arn:aws:ssm:${region.name}:${caller.accountId}:parameter/Shared/${config.environment}/UNLEASH_ENDPOINT`, + }, + { + name: 'UNLEASH_KEY', + valueFrom: `arn:aws:secretsmanager:${region.name}:${caller.accountId}:secret:${config.name}/${config.environment}/UNLEASH_KEY`, + }, ], }, ], @@ -329,6 +341,8 @@ class CuratedCorpusAPI extends TerraformStack { resources: [ `arn:aws:ssm:${region.name}:${caller.accountId}:parameter/${config.name}/${config.environment}`, `arn:aws:ssm:${region.name}:${caller.accountId}:parameter/${config.name}/${config.environment}/*`, + `arn:aws:ssm:${region.name}:${caller.accountId}:parameter/Shared/${config.environment}/*`, + `arn:aws:ssm:${region.name}:${caller.accountId}:parameter/Shared/${config.environment}`, ], effect: 'Allow', }, @@ -353,11 +367,6 @@ class CuratedCorpusAPI extends TerraformStack { 'logs:CreateLogStream', 'logs:DescribeLogStreams', 'logs:DescribeLogGroups', - 'xray:PutTraceSegments', - 'xray:PutTelemetryRecords', - 'xray:GetSamplingRules', - 'xray:GetSamplingTargets', - 'xray:GetSamplingStatisticSummaries', ], resources: ['*'], effect: 'Allow', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e6fff7a..af64377d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -310,52 +310,6 @@ importers: specifier: 5.6.2 version: 5.6.2 - lambdas/prospect-api-bridge-lambda: - dependencies: - '@aws-sdk/client-eventbridge': - specifier: 3.529.1 - version: 3.529.1 - '@aws-sdk/client-firehose': - specifier: 3.529.1 - version: 3.529.1 - '@sentry/serverless': - specifier: 7.112.2 - version: 7.112.2 - tslib: - specifier: 2.7.0 - version: 2.7.0 - typia: - specifier: ^6.0.3 - version: 6.12.0(typescript@5.6.2) - devDependencies: - '@types/aws-lambda': - specifier: 8.10.134 - version: 8.10.134 - '@types/jest': - specifier: 29.5.12 - version: 29.5.12 - eslint-config-custom: - specifier: workspace:* - version: link:../../packages/eslint-config-custom - jest: - specifier: 29.7.0 - version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.2)) - ts-jest: - specifier: 29.1.2 - version: 29.1.2(@babel/core@7.26.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.6.2)))(typescript@5.6.2) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@22.9.0)(typescript@5.6.2) - ts-patch: - specifier: ^3.1.2 - version: 3.2.1 - tsconfig: - specifier: workspace:* - version: link:../../packages/tsconfig - typescript: - specifier: 5.6.2 - version: 5.6.2 - lambdas/prospect-translation-lambda: dependencies: '@aws-sdk/client-dynamodb': @@ -431,22 +385,22 @@ importers: version: link:../eslint-config-custom jest: specifier: 29.7.0 - version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)) + version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)) msw: specifier: 2.4.7 - version: 2.4.7(typescript@5.8.0-dev.20241113) + version: 2.4.7(typescript@5.8.0-dev.20241114) node-fetch: specifier: ^2.6.7 version: 2.7.0(encoding@0.1.13) ts-jest: specifier: 29.1.2 - version: 29.1.2(@babel/core@7.26.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)))(typescript@5.8.0-dev.20241113) + version: 29.1.2(@babel/core@7.26.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)))(typescript@5.8.0-dev.20241114) tsconfig: specifier: workspace:* version: link:../tsconfig tsup: specifier: 8.2.4 - version: 8.2.4(typescript@5.8.0-dev.20241113) + version: 8.2.4(typescript@5.8.0-dev.20241114) packages/eslint-config-custom: devDependencies: @@ -559,19 +513,19 @@ importers: version: link:../eslint-config-custom jest: specifier: 29.7.0 - version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)) + version: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)) msw: specifier: 2.4.7 - version: 2.4.7(typescript@5.8.0-dev.20241113) + version: 2.4.7(typescript@5.8.0-dev.20241114) ts-jest: specifier: 29.1.2 - version: 29.1.2(@babel/core@7.26.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)))(typescript@5.8.0-dev.20241113) + version: 29.1.2(@babel/core@7.26.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)))(typescript@5.8.0-dev.20241114) tsconfig: specifier: workspace:* version: link:../tsconfig tsup: specifier: 8.2.4 - version: 8.2.4(typescript@5.8.0-dev.20241113) + version: 8.2.4(typescript@5.8.0-dev.20241114) packages/tsconfig: dependencies: @@ -753,6 +707,15 @@ importers: '@pocket-tools/apollo-utils': specifier: 3.5.0 version: 3.5.0(encoding@0.1.13) + '@pocket-tools/feature-flags-client': + specifier: 1.0.0 + version: 1.0.0 + '@pocket-tools/sentry': + specifier: 1.0.0 + version: 1.0.0(@sentry/node@8.37.1) + '@pocket-tools/tracing': + specifier: 1.8.9 + version: 1.8.9(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(encoding@0.1.13) '@pocket-tools/ts-logger': specifier: ^1.9.4 version: 1.9.6 @@ -1114,10 +1077,6 @@ packages: resolution: {integrity: sha512-VUQd+IkNXt6fJTr9R199avvlFoKW0zDDsA2Nvi0PeF5m17SKS92dgDnFRHjyAKFG2gG9bHOht+YMTcamRjd2ug==} engines: {node: '>=14.0.0'} - '@aws-sdk/client-firehose@3.529.1': - resolution: {integrity: sha512-3CuaN9txx0BxG79FTs2HR/2zoAKmIni1V0G+josmI2XHsL2ZPdRMkyuQ8sW/YDV+dEgfe/J9nhYLg01Wta6vmw==} - engines: {node: '>=14.0.0'} - '@aws-sdk/client-s3@3.529.1': resolution: {integrity: sha512-ZpvyO4w3XWo/OjXLd3fm7CLcKUUYcyady9qzTnKKSnp8a2NqO7UvU/1zhYdm+yyy8TR/9t7sDy+q6AYd4Nsr8g==} engines: {node: '>=14.0.0'} @@ -7472,8 +7431,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@5.8.0-dev.20241113: - resolution: {integrity: sha512-UHZg5oh4kRf5PSlyJapVs80pWwb3qxK4MP07PxOz7KDYRf0vWBBepHbZI6Xmx1syYb9M+plmem9PUT2kM2YlzQ==} + typescript@5.8.0-dev.20241114: + resolution: {integrity: sha512-FCT0wJBcmIXGSTij0CscfHzyI8aOtjnknnrKcSQZ8mzvQ9fQgvpqeIFToCyXkfaHmObw0Lom+J45w7NDh5WIAg==} engines: {node: '>=14.17'} hasBin: true @@ -8064,51 +8023,6 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-firehose@3.529.1': - dependencies: - '@aws-crypto/sha256-browser': 3.0.0 - '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sts': 3.529.1(@aws-sdk/credential-provider-node@3.529.1) - '@aws-sdk/core': 3.529.1 - '@aws-sdk/credential-provider-node': 3.529.1 - '@aws-sdk/middleware-host-header': 3.523.0 - '@aws-sdk/middleware-logger': 3.523.0 - '@aws-sdk/middleware-recursion-detection': 3.523.0 - '@aws-sdk/middleware-user-agent': 3.525.0 - '@aws-sdk/region-config-resolver': 3.525.0 - '@aws-sdk/types': 3.523.0 - '@aws-sdk/util-endpoints': 3.525.0 - '@aws-sdk/util-user-agent-browser': 3.523.0 - '@aws-sdk/util-user-agent-node': 3.525.0 - '@smithy/config-resolver': 2.2.0 - '@smithy/core': 1.4.2 - '@smithy/fetch-http-handler': 2.5.0 - '@smithy/hash-node': 2.2.0 - '@smithy/invalid-dependency': 2.2.0 - '@smithy/middleware-content-length': 2.2.0 - '@smithy/middleware-endpoint': 2.5.1 - '@smithy/middleware-retry': 2.3.1 - '@smithy/middleware-serde': 2.3.0 - '@smithy/middleware-stack': 2.2.0 - '@smithy/node-config-provider': 2.3.0 - '@smithy/node-http-handler': 2.5.0 - '@smithy/protocol-http': 3.3.0 - '@smithy/smithy-client': 2.5.1 - '@smithy/types': 2.12.0 - '@smithy/url-parser': 2.2.0 - '@smithy/util-base64': 2.3.0 - '@smithy/util-body-length-browser': 2.2.0 - '@smithy/util-body-length-node': 2.3.0 - '@smithy/util-defaults-mode-browser': 2.2.1 - '@smithy/util-defaults-mode-node': 2.3.1 - '@smithy/util-endpoints': 1.2.0 - '@smithy/util-middleware': 2.2.0 - '@smithy/util-retry': 2.2.0 - '@smithy/util-utf8': 2.3.0 - tslib: 2.7.0 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/client-s3@3.529.1': dependencies: '@aws-crypto/sha1-browser': 3.0.0 @@ -9453,7 +9367,7 @@ snapshots: - supports-color - ts-node - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113))': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -9467,7 +9381,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.12.14)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)) + jest-config: 29.7.0(@types/node@20.12.14)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -12563,13 +12477,13 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)): + create-jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)) + jest-config: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -12777,7 +12691,7 @@ snapshots: dependencies: semver: 7.6.3 shelljs: 0.8.5 - typescript: 5.8.0-dev.20241113 + typescript: 5.8.0-dev.20241114 drange@1.1.1: {} @@ -14255,16 +14169,16 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)): + jest-cli@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)) + create-jest: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)) + jest-config: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -14336,7 +14250,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@20.12.14)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)): + jest-config@29.7.0(@types/node@20.12.14)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)): dependencies: '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 @@ -14362,7 +14276,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 20.12.14 - ts-node: 10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113) + ts-node: 10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -14398,7 +14312,7 @@ snapshots: - babel-plugin-macros - supports-color - jest-config@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)): + jest-config@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)): dependencies: '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 @@ -14424,7 +14338,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.9.0 - ts-node: 10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113) + ts-node: 10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -14668,12 +14582,12 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)): + jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)) + jest-cli: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -15166,7 +15080,7 @@ snapshots: optionalDependencies: typescript: 5.6.2 - msw@2.4.7(typescript@5.8.0-dev.20241113): + msw@2.4.7(typescript@5.8.0-dev.20241114): dependencies: '@bundled-es-modules/cookie': 2.0.1 '@bundled-es-modules/statuses': 1.0.1 @@ -15186,7 +15100,7 @@ snapshots: type-fest: 4.26.1 yargs: 17.7.2 optionalDependencies: - typescript: 5.8.0-dev.20241113 + typescript: 5.8.0-dev.20241114 murmurhash3js@3.0.1: {} @@ -15228,7 +15142,7 @@ snapshots: node-abi@3.71.0: dependencies: - semver: 7.6.2 + semver: 7.6.3 node-abort-controller@3.1.1: {} @@ -16458,17 +16372,17 @@ snapshots: dependencies: tslib: 2.7.0 - ts-jest@29.1.2(@babel/core@7.26.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)))(typescript@5.8.0-dev.20241113): + ts-jest@29.1.2(@babel/core@7.26.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.23.1)(jest@29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)))(typescript@5.8.0-dev.20241114): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113)) + jest: 29.7.0(@types/node@22.9.0)(ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.6.3 - typescript: 5.8.0-dev.20241113 + typescript: 5.8.0-dev.20241114 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.26.0 @@ -16545,8 +16459,9 @@ snapshots: typescript: 5.6.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optional: true - ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241113): + ts-node@10.9.2(@types/node@22.9.0)(typescript@5.8.0-dev.20241114): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -16560,7 +16475,7 @@ snapshots: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.8.0-dev.20241113 + typescript: 5.8.0-dev.20241114 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optional: true @@ -16615,7 +16530,7 @@ snapshots: - tsx - yaml - tsup@8.2.4(typescript@5.8.0-dev.20241113): + tsup@8.2.4(typescript@5.8.0-dev.20241114): dependencies: bundle-require: 5.0.0(esbuild@0.23.1) cac: 6.7.14 @@ -16634,7 +16549,7 @@ snapshots: sucrase: 3.35.0 tree-kill: 1.2.2 optionalDependencies: - typescript: 5.8.0-dev.20241113 + typescript: 5.8.0-dev.20241114 transitivePeerDependencies: - jiti - supports-color @@ -16738,7 +16653,7 @@ snapshots: typescript@5.6.2: {} - typescript@5.8.0-dev.20241113: {} + typescript@5.8.0-dev.20241114: {} typia@6.12.0(typescript@5.6.2): dependencies: diff --git a/servers/curated-corpus-api/package.json b/servers/curated-corpus-api/package.json index f6c305e2..e935cccb 100644 --- a/servers/curated-corpus-api/package.json +++ b/servers/curated-corpus-api/package.json @@ -39,6 +39,9 @@ "@aws-sdk/lib-storage": "3.529.1", "@devoxa/prisma-relay-cursor-connection": "3.1.0", "@pocket-tools/apollo-utils": "3.5.0", + "@pocket-tools/feature-flags-client": "1.0.0", + "@pocket-tools/sentry": "1.0.0", + "@pocket-tools/tracing": "1.8.9", "@pocket-tools/ts-logger": "^1.9.4", "@prisma/client": "5.22.0", "@sentry/node": "8.37.1", diff --git a/servers/curated-corpus-api/src/config/index.ts b/servers/curated-corpus-api/src/config/index.ts index 1e042d88..83e88506 100644 --- a/servers/curated-corpus-api/src/config/index.ts +++ b/servers/curated-corpus-api/src/config/index.ts @@ -20,51 +20,52 @@ if (!awsEnvironments.includes(process.env.NODE_ENV ?? '')) { // Environment variables below are set in .aws/src/main.ts export default { app: { - port: 4025, - environment: process.env.NODE_ENV || 'development', defaultMaxAge: 86400, + environment: process.env.NODE_ENV || 'development', pagination: { approvedItemsPerPage: 30, rejectedItemsPerPage: 30, maxAllowedResults: 100, scheduledSurfaceHistory: 10, }, + port: 4025, removeReasonMaxLength: 100, + serviceName: 'curated-corpus-api', upload: { maxSize: 10000000, // in bytes => 10MB maxFiles: 10, }, }, aws: { - region: process.env.AWS_REGION || 'us-east-1', endpoint: localEndpoint, + eventBus: { + name: process.env.EVENT_BUS_NAME || 'default', + }, + region: process.env.AWS_REGION || 'us-east-1', s3: { localEndpoint, bucket, path: s3path, }, - eventBus: { - name: process.env.EVENT_BUS_NAME || 'default', - }, }, events: { source: 'curated-corpus-api', version: '0.0.2', }, eventBridge: { - addScheduledItemEventType: 'add-scheduled-item', - removeScheduledItemEventType: 'remove-scheduled-item', - updateScheduledItemEventType: 'update-scheduled-item', - updateApprovedItemEventType: 'update-approved-item', addApprovedItemEventType: 'add-approved-item', + addScheduledItemEventType: 'add-scheduled-item', removeApprovedItemEventType: 'remove-approved-item', + removeScheduledItemEventType: 'remove-scheduled-item', source: 'curation-migration-datasync', + updateApprovedItemEventType: 'update-approved-item', + updateScheduledItemEventType: 'update-scheduled-item', }, sentry: { dsn: process.env.SENTRY_DSN || '', - release: process.env.GIT_SHA || '', environment: process.env.NODE_ENV || 'development', includeLocalVariables: true, + release: process.env.GIT_SHA || '', }, snowplow: { // appId should end in '-dev' outside of production such that Dbt can filter events: @@ -84,8 +85,15 @@ export default { }, }, tracing: { - // for AWS, it's fine to leave this defaulting to localhost - host: process.env.OTLP_COLLECTOR_HOST || 'localhost', + flagName: 'perm.content.tracing.collections', + release: process.env.GIT_SHA || 'local', serviceName: 'curated-corpus-api', + url: process.env.OTLP_COLLECTOR_URL || 'http://localhost:4318', + }, + unleash: { + clientKey: process.env.UNLEASH_KEY || 'unleash-key-fake', + endpoint: process.env.UNLEASH_ENDPOINT || 'http://localhost:4242/api', + refreshInterval: 60 * 1000, // ms + timeout: 2 * 1000, // ms }, }; diff --git a/servers/curated-corpus-api/src/database/client.ts b/servers/curated-corpus-api/src/database/client.ts index 8c2d965c..6288f485 100644 --- a/servers/curated-corpus-api/src/database/client.ts +++ b/servers/curated-corpus-api/src/database/client.ts @@ -14,21 +14,8 @@ export function client(): PrismaClient { level: 'error', emit: 'event', }, - { - level: 'warn', - emit: 'event', - }, - { - level: 'info', - emit: 'event', - }, ]; - // For non-prod environments, log all queries, too. - if (config.app.environment !== 'production') { - log.push({ level: 'query', emit: 'event' }); - } - prisma = new PrismaClient({ log, }); @@ -38,27 +25,13 @@ export function client(): PrismaClient { serverLogger.error(e); }); - prisma.$on('warn', (e) => { - e.source = 'prisma'; - serverLogger.warn(e); - }); - - prisma.$on('info', (e) => { - e.source = 'prisma'; - serverLogger.info(e); - }); + // local development - for easy viewing of the actual SQL being + // generated/sent by prisma, uncomment the block below. - // Allow logger to subscribe to query events from Prisma - // in non-production environments only. - if (config.app.environment !== 'production') { - prisma.$on('query', (e) => { - e.source = 'prisma'; - serverLogger.debug(e); - // local development - for easy viewing of the actual SQL being - // generated/sent by prisma, uncomment the console.log statement below. - //console.log(e); - }); - } + //prisma.$on('query', (e) => { + // e.source = 'prisma'; + // console.log(e); + //}); return prisma; } diff --git a/servers/curated-corpus-api/src/database/mutations/TrustedDomain.ts b/servers/curated-corpus-api/src/database/mutations/TrustedDomain.ts index 796c060f..d8add1f3 100644 --- a/servers/curated-corpus-api/src/database/mutations/TrustedDomain.ts +++ b/servers/curated-corpus-api/src/database/mutations/TrustedDomain.ts @@ -1,5 +1,6 @@ -import { PrismaClient } from '.prisma/client'; -import { TrustedDomain } from '.prisma/client'; +import { serverLogger } from '@pocket-tools/ts-logger'; + +import { PrismaClient, TrustedDomain } from '.prisma/client'; /** * Created a TrustedDomain if the domain has been scheduled in the past, and can therefore be trusted. @@ -50,7 +51,7 @@ export async function createTrustedDomain( } catch (error) { if (error.code === 'P2002') { // Concurrent inserts with the same domain can cause a unique constraint failure. - console.log(`TrustedDomain ${domainName} already existed.`); + serverLogger.info(`TrustedDomain ${domainName} already existed.`); return await getTrustedDomain(db, domainName); } else { // For all other errors, do not retry. diff --git a/servers/curated-corpus-api/src/main.ts b/servers/curated-corpus-api/src/main.ts index 0fffbc17..0ef1d76b 100644 --- a/servers/curated-corpus-api/src/main.ts +++ b/servers/curated-corpus-api/src/main.ts @@ -1,5 +1,37 @@ +import { initSentry } from '@pocket-tools/sentry'; +import config from './config'; + +// Init sentry MUST come before any other imports for auto instrumentation to kick in (request isolation) +initSentry({ + ...config.sentry, + skipOpenTelemetrySetup: true, + integrations(integrations) { + // we need to filter out NodeFetch integrations to avoid double tracing of + // HTTP requests. HTTP instrumentation is already configured by default in + // Sentry, which captures HTTP requests made by node fetch. + return integrations.filter((integration) => { + return integration.name !== 'NodeFetch'; + }); + }, +}); + +import { nodeSDKBuilder } from '@pocket-tools/tracing'; +import { unleash } from './unleash'; + +nodeSDKBuilder({ ...config.tracing, unleash: unleash() }).then(() => { + startServer(config.app.port).then(async ({ publicUrl, adminUrl }) => { + serverLogger.info( + `🚀 Public server is ready at http://localhost:${config.app.port}${publicUrl}`, + ); + + serverLogger.info( + `🚀 Admin server is ready at http://localhost:${config.app.port}${adminUrl}`, + ); + }); +}); + import { serverLogger } from '@pocket-tools/ts-logger'; -import * as Sentry from '@sentry/node'; +import { startServer } from './express'; import { curatedCorpusEventEmitter, @@ -12,18 +44,6 @@ import { eventBusHandler, } from './events/eventHandlers'; -import { startServer } from './express'; -import config from './config'; - -Sentry.init({ - ...config.sentry, - tracesSampleRate: 0.0, - includeLocalVariables: true, - maxValueLength: 2000, - integrations: [Sentry.prismaIntegration()], - debug: config.sentry.environment == 'development', -}); - // Initialize event handlers, this is outside server setup as tests // mock event handling initItemEventHandlers(curatedCorpusEventEmitter, [ @@ -31,15 +51,3 @@ initItemEventHandlers(curatedCorpusEventEmitter, [ corpusScheduleSnowplowEventHandler, eventBusHandler, ]); - -(async () => { - const { adminUrl, publicUrl } = await startServer(config.app.port); - - serverLogger.info( - `🚀 Public server is ready at http://localhost:${config.app.port}${publicUrl}`, - ); - - serverLogger.info( - `🚀 Admin server is ready at http://localhost:${config.app.port}${adminUrl}`, - ); -})(); diff --git a/servers/curated-corpus-api/src/unleash.ts b/servers/curated-corpus-api/src/unleash.ts new file mode 100644 index 00000000..bf7d3724 --- /dev/null +++ b/servers/curated-corpus-api/src/unleash.ts @@ -0,0 +1,18 @@ +import { getUnleash } from '@pocket-tools/feature-flags-client'; +import type { Unleash } from '@pocket-tools/feature-flags-client'; + +import config from './config'; + +let _unleash: Unleash; + +export function unleash(): Unleash { + if (_unleash != null) return _unleash; + _unleash = getUnleash({ + url: config.unleash.endpoint, + appName: config.app.serviceName, + customHeaders: { Authorization: config.unleash.clientKey }, + timeout: config.unleash.timeout, + refreshInterval: config.unleash.refreshInterval, + }); + return _unleash; +}