From f575fb12adfacad5937389d381ede98b4909e4f8 Mon Sep 17 00:00:00 2001 From: Julian Boilen Date: Mon, 11 May 2026 17:28:39 -0400 Subject: [PATCH 1/2] Setup datadog llm observability to trace llm calls --- backend/appHandler.ts | 2 ++ backend/serverless.yml | 1 + backend/src/business/ai/AiService.ts | 14 ++++++++++---- backend/src/tracer.ts | 10 ++++++++++ backend/withSetup.ts | 1 + frontend/package-lock.json | 3 +-- 6 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 backend/src/tracer.ts diff --git a/backend/appHandler.ts b/backend/appHandler.ts index b23e4c6b6..b178b9cb3 100644 --- a/backend/appHandler.ts +++ b/backend/appHandler.ts @@ -1,3 +1,5 @@ +import './src/tracer'; + import 'reflect-metadata'; import serverlessHttp from 'serverless-http'; import 'source-map-support/register'; diff --git a/backend/serverless.yml b/backend/serverless.yml index 2af722651..69353aadb 100644 --- a/backend/serverless.yml +++ b/backend/serverless.yml @@ -47,6 +47,7 @@ provider: OPENAI_SK: ${ssm:/${self:service}-${sls:stage}-openai-sk} RAPIDAPI_API_KEY: ${ssm:/${self:service}-${sls:stage}-rapidapi-api-key} PRINTFUL_SK: ${ssm:/${self:service}-${sls:stage}-printful-sk} + DD_LLMOBS_ML_APP: fourtiesnyc plugins: - serverless-plugin-conditional-functions - serverless-webpack diff --git a/backend/src/business/ai/AiService.ts b/backend/src/business/ai/AiService.ts index d2ee44c83..de16ec50c 100644 --- a/backend/src/business/ai/AiService.ts +++ b/backend/src/business/ai/AiService.ts @@ -1,3 +1,4 @@ +import tracer from 'dd-trace'; import OpenAI from 'openai'; import createStoryTitlePrompt from './createStoryTitlePrompt'; @@ -7,9 +8,14 @@ const openai = new OpenAI({ }); export async function suggestStoryTitle(storyContent: string): Promise { - const response = await openai.chat.completions.create( - createStoryTitlePrompt(storyContent) - ); + return tracer.llmobs.trace( + { kind: 'task', name: 'story-title-generation' }, + async () => { + const response = await openai.chat.completions.create( + createStoryTitlePrompt(storyContent) + ); - return response.choices[0].message.content?.trim() ?? ''; + return response.choices[0].message.content?.trim() ?? ''; + } + ); } diff --git a/backend/src/tracer.ts b/backend/src/tracer.ts new file mode 100644 index 000000000..dafc4b057 --- /dev/null +++ b/backend/src/tracer.ts @@ -0,0 +1,10 @@ +import tracer from 'dd-trace'; + +tracer.init({ + llmobs: { + mlApp: process.env.DD_LLMOBS_ML_APP, + agentlessEnabled: true, + }, +}); + +export default tracer; diff --git a/backend/withSetup.ts b/backend/withSetup.ts index 27df84238..866444c6b 100644 --- a/backend/withSetup.ts +++ b/backend/withSetup.ts @@ -1,3 +1,4 @@ +import './src/tracer'; import 'reflect-metadata'; import 'source-map-support/register'; diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 29755b48e..f1a923ab8 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -15018,8 +15018,7 @@ }, "node_modules/tslib": { "version": "2.8.1", - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/tsyringe": { "version": "4.10.0", From b759184409b546bb43cfbe25dee7e9d51326bc3d Mon Sep 17 00:00:00 2001 From: Julian Boilen Date: Mon, 11 May 2026 19:02:42 -0400 Subject: [PATCH 2/2] Limit dd-trace init to functions that have the Datadog layer Putting the tracer import in withSetup caused functions excluded from the Datadog plugin (like renderMerchPrintfiles) to fail with "Cannot find module 'dd-trace'" on cold start. Co-Authored-By: Claude Opus 4.7 --- backend/generateStoryTitles.ts | 1 + backend/withSetup.ts | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/generateStoryTitles.ts b/backend/generateStoryTitles.ts index c14466a93..3f525175d 100644 --- a/backend/generateStoryTitles.ts +++ b/backend/generateStoryTitles.ts @@ -1,3 +1,4 @@ +import './src/tracer'; import generateStoryTitlesImpl from './src/cron/generateStoryTitles'; import withSetup from './withSetup'; diff --git a/backend/withSetup.ts b/backend/withSetup.ts index 866444c6b..27df84238 100644 --- a/backend/withSetup.ts +++ b/backend/withSetup.ts @@ -1,4 +1,3 @@ -import './src/tracer'; import 'reflect-metadata'; import 'source-map-support/register';