summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--infra/console.ts14
-rw-r--r--packages/console/app/src/routes/zen/util/handler.ts32
-rw-r--r--packages/console/function/src/log-processor.ts18
3 files changed, 36 insertions, 28 deletions
diff --git a/infra/console.ts b/infra/console.ts
index 5abffb555..4e5a14b04 100644
--- a/infra/console.ts
+++ b/infra/console.ts
@@ -166,14 +166,10 @@ const bucketNew = new sst.cloudflare.Bucket("ZenDataNew")
const AWS_SES_ACCESS_KEY_ID = new sst.Secret("AWS_SES_ACCESS_KEY_ID")
const AWS_SES_SECRET_ACCESS_KEY = new sst.Secret("AWS_SES_SECRET_ACCESS_KEY")
-let logProcessor
-if ($app.stage === "production" || $app.stage === "frank") {
- const HONEYCOMB_API_KEY = new sst.Secret("HONEYCOMB_API_KEY")
- logProcessor = new sst.cloudflare.Worker("LogProcessor", {
- handler: "packages/console/function/src/log-processor.ts",
- link: [HONEYCOMB_API_KEY],
- })
-}
+const logProcessor = new sst.cloudflare.Worker("LogProcessor", {
+ handler: "packages/console/function/src/log-processor.ts",
+ link: [new sst.Secret("HONEYCOMB_API_KEY")],
+})
new sst.cloudflare.x.SolidStart("Console", {
domain,
@@ -211,7 +207,7 @@ new sst.cloudflare.x.SolidStart("Console", {
transform: {
worker: {
placement: { mode: "smart" },
- tailConsumers: logProcessor ? [{ service: logProcessor.nodes.worker.scriptName }] : [],
+ tailConsumers: [{ service: logProcessor.nodes.worker.scriptName }],
},
},
},
diff --git a/packages/console/app/src/routes/zen/util/handler.ts b/packages/console/app/src/routes/zen/util/handler.ts
index 1afd25799..a72435e68 100644
--- a/packages/console/app/src/routes/zen/util/handler.ts
+++ b/packages/console/app/src/routes/zen/util/handler.ts
@@ -134,20 +134,26 @@ export async function handler(
body: reqBody,
})
- // Try another provider => stop retrying if using fallback provider
- if (
- res.status !== 200 &&
- // ie. openai 404 error: Item with id 'msg_0ead8b004a3b165d0069436a6b6834819896da85b63b196a3f' not found.
- res.status !== 404 &&
- // ie. cannot change codex model providers mid-session
- modelInfo.stickyProvider !== "strict" &&
- modelInfo.fallbackProvider &&
- providerInfo.id !== modelInfo.fallbackProvider
- ) {
- return retriableRequest({
- excludeProviders: [...retry.excludeProviders, providerInfo.id],
- retryCount: retry.retryCount + 1,
+ if (res.status !== 200) {
+ logger.metric({
+ "llm.error.code": res.status,
+ "llm.error.message": res.statusText,
})
+
+ // Try another provider => stop retrying if using fallback provider
+ if (
+ // ie. openai 404 error: Item with id 'msg_0ead8b004a3b165d0069436a6b6834819896da85b63b196a3f' not found.
+ res.status !== 404 &&
+ // ie. cannot change codex model providers mid-session
+ modelInfo.stickyProvider !== "strict" &&
+ modelInfo.fallbackProvider &&
+ providerInfo.id !== modelInfo.fallbackProvider
+ ) {
+ return retriableRequest({
+ excludeProviders: [...retry.excludeProviders, providerInfo.id],
+ retryCount: retry.retryCount + 1,
+ })
+ }
}
return { providerInfo, reqBody, res, startTimestamp }
diff --git a/packages/console/function/src/log-processor.ts b/packages/console/function/src/log-processor.ts
index 9e76e2ceb..d5d6318ba 100644
--- a/packages/console/function/src/log-processor.ts
+++ b/packages/console/function/src/log-processor.ts
@@ -17,7 +17,7 @@ export default {
)
return
- let metrics = {
+ let data = {
event_type: "completions",
"cf.continent": event.event.request.cf?.continent,
"cf.country": event.event.request.cf?.country,
@@ -31,22 +31,28 @@ export default {
status: event.event.response?.status ?? 0,
ip: event.event.request.headers["x-real-ip"],
}
+ const time = event.eventTimestamp ?? Date.now()
+ const events = []
for (const log of event.logs) {
for (const message of log.message) {
if (!message.startsWith("_metric:")) continue
- metrics = { ...metrics, ...JSON.parse(message.slice(8)) }
+ const json = JSON.parse(message.slice(8))
+ data = { ...data, ...json }
+ if ("llm.error.code" in json) {
+ events.push({ time, data: { ...data } })
+ }
}
}
- console.log(JSON.stringify(metrics, null, 2))
+ events.push({ time, data })
+ console.log(JSON.stringify(data, null, 2))
- const ret = await fetch("https://api.honeycomb.io/1/events/zen", {
+ const ret = await fetch("https://api.honeycomb.io/1/batch/zen", {
method: "POST",
headers: {
"Content-Type": "application/json",
- "X-Honeycomb-Event-Time": (event.eventTimestamp ?? Date.now()).toString(),
"X-Honeycomb-Team": Resource.HONEYCOMB_API_KEY.value,
},
- body: JSON.stringify(metrics),
+ body: JSON.stringify(events),
})
console.log(ret.status)
console.log(await ret.text())