From 29829c361d7a09094ce484d016d2895ca4066ef2 Mon Sep 17 00:00:00 2001 From: Jason Alafgani Date: Thu, 5 Mar 2026 10:07:48 -0800 Subject: [PATCH 1/2] Add Profound Agent Analytics Cloudflare Worker Set up a Cloudflare Worker (log-collector) that captures HTTP request metadata and forwards it to Profound's Agent Analytics API for appwrite.io. The PROFOUND_API_KEY secret must be configured via `npx wrangler secret put PROFOUND_API_KEY` before deploying. Made-with: Cursor --- log-collector/.gitignore | 3 +++ log-collector/package.json | 15 ++++++++++++ log-collector/src/index.ts | 49 +++++++++++++++++++++++++++++++++++++ log-collector/tsconfig.json | 14 +++++++++++ log-collector/wrangler.json | 16 ++++++++++++ 5 files changed, 97 insertions(+) create mode 100644 log-collector/.gitignore create mode 100644 log-collector/package.json create mode 100644 log-collector/src/index.ts create mode 100644 log-collector/tsconfig.json create mode 100644 log-collector/wrangler.json diff --git a/log-collector/.gitignore b/log-collector/.gitignore new file mode 100644 index 0000000000..073e02da0a --- /dev/null +++ b/log-collector/.gitignore @@ -0,0 +1,3 @@ +node_modules +.wrangler +.dev.vars diff --git a/log-collector/package.json b/log-collector/package.json new file mode 100644 index 0000000000..0a73055f66 --- /dev/null +++ b/log-collector/package.json @@ -0,0 +1,15 @@ +{ + "name": "log-collector", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "wrangler dev", + "deploy": "wrangler deploy", + "cf-typegen": "wrangler types" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20250124.0", + "typescript": "^5.5.2", + "wrangler": "^3.101.0" + } +} diff --git a/log-collector/src/index.ts b/log-collector/src/index.ts new file mode 100644 index 0000000000..a325c9f061 --- /dev/null +++ b/log-collector/src/index.ts @@ -0,0 +1,49 @@ +export interface Env { + PROFOUND_API_URL: string; + PROFOUND_API_KEY: string; +} + +export default { + async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise { + const response = await fetch(request); + const responseClone = response.clone(); + + ctx.waitUntil(handleRequest(request, responseClone, env)); + return response; + } +} satisfies ExportedHandler; + +async function handleRequest(request: Request, response: Response, env: Env) { + const requestUrl = new URL(request.url); + + const headerSize = Array.from(response.headers.entries()).reduce( + (total, [key, value]) => total + key.length + value.length + 4, + 0 + ); + + const responseBody = await response.blob(); + const bodySize = responseBody.size; + const totalBytesSent = headerSize + bodySize; + + const logData = { + timestamp: Date.now(), + host: requestUrl.hostname, + method: request.method, + pathname: requestUrl.pathname, + query_params: Object.fromEntries(requestUrl.searchParams), + ip: request.headers.get('cf-connecting-ip'), + userAgent: request.headers.get('user-agent'), + referer: request.headers.get('referer'), + bytes: totalBytesSent, + status: response.status + }; + + await fetch(env.PROFOUND_API_URL, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-API-Key': env.PROFOUND_API_KEY + }, + body: JSON.stringify([logData]) + }).catch((error) => console.error('Failed to send logs:', error)); +} diff --git a/log-collector/tsconfig.json b/log-collector/tsconfig.json new file mode 100644 index 0000000000..854d718456 --- /dev/null +++ b/log-collector/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["ESNext"], + "types": ["@cloudflare/workers-types/2023-07-01"], + "noEmit": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*.ts"] +} diff --git a/log-collector/wrangler.json b/log-collector/wrangler.json new file mode 100644 index 0000000000..7a8d7563cf --- /dev/null +++ b/log-collector/wrangler.json @@ -0,0 +1,16 @@ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "log-collector", + "main": "src/index.ts", + "compatibility_date": "2025-01-29", + "observability": { + "enabled": true + }, + "route": { + "pattern": "appwrite.io/*", + "zone_name": "appwrite.io" + }, + "vars": { + "PROFOUND_API_URL": "https://artemis.api.tryprofound.com/v1/logs/cloudflare_worker" + } +} From 0e84bb4c90fd30267bba9e80da3a9606698c146d Mon Sep 17 00:00:00 2001 From: Harsh Mahajan Date: Mon, 9 Mar 2026 11:46:31 +0530 Subject: [PATCH 2/2] fix format --- log-collector/package.json | 26 +++++++++++++------------- log-collector/tsconfig.json | 24 ++++++++++++------------ log-collector/wrangler.json | 28 ++++++++++++++-------------- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/log-collector/package.json b/log-collector/package.json index 0a73055f66..674b2fed34 100644 --- a/log-collector/package.json +++ b/log-collector/package.json @@ -1,15 +1,15 @@ { - "name": "log-collector", - "version": "1.0.0", - "private": true, - "scripts": { - "dev": "wrangler dev", - "deploy": "wrangler deploy", - "cf-typegen": "wrangler types" - }, - "devDependencies": { - "@cloudflare/workers-types": "^4.20250124.0", - "typescript": "^5.5.2", - "wrangler": "^3.101.0" - } + "name": "log-collector", + "version": "1.0.0", + "private": true, + "scripts": { + "dev": "wrangler dev", + "deploy": "wrangler deploy", + "cf-typegen": "wrangler types" + }, + "devDependencies": { + "@cloudflare/workers-types": "^4.20250124.0", + "typescript": "^5.5.2", + "wrangler": "^3.101.0" + } } diff --git a/log-collector/tsconfig.json b/log-collector/tsconfig.json index 854d718456..f2af70dda3 100644 --- a/log-collector/tsconfig.json +++ b/log-collector/tsconfig.json @@ -1,14 +1,14 @@ { - "compilerOptions": { - "target": "ESNext", - "module": "ESNext", - "moduleResolution": "Bundler", - "lib": ["ESNext"], - "types": ["@cloudflare/workers-types/2023-07-01"], - "noEmit": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true - }, - "include": ["src/**/*.ts"] + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "lib": ["ESNext"], + "types": ["@cloudflare/workers-types/2023-07-01"], + "noEmit": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src/**/*.ts"] } diff --git a/log-collector/wrangler.json b/log-collector/wrangler.json index 7a8d7563cf..5ba48ac535 100644 --- a/log-collector/wrangler.json +++ b/log-collector/wrangler.json @@ -1,16 +1,16 @@ { - "$schema": "node_modules/wrangler/config-schema.json", - "name": "log-collector", - "main": "src/index.ts", - "compatibility_date": "2025-01-29", - "observability": { - "enabled": true - }, - "route": { - "pattern": "appwrite.io/*", - "zone_name": "appwrite.io" - }, - "vars": { - "PROFOUND_API_URL": "https://artemis.api.tryprofound.com/v1/logs/cloudflare_worker" - } + "$schema": "node_modules/wrangler/config-schema.json", + "name": "log-collector", + "main": "src/index.ts", + "compatibility_date": "2025-01-29", + "observability": { + "enabled": true + }, + "route": { + "pattern": "appwrite.io/*", + "zone_name": "appwrite.io" + }, + "vars": { + "PROFOUND_API_URL": "https://artemis.api.tryprofound.com/v1/logs/cloudflare_worker" + } }