zen: log error
parent
92a77b72fb
commit
8c56571ef9
|
|
@ -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_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")
|
const AWS_SES_SECRET_ACCESS_KEY = new sst.Secret("AWS_SES_SECRET_ACCESS_KEY")
|
||||||
|
|
||||||
let logProcessor
|
const logProcessor = new sst.cloudflare.Worker("LogProcessor", {
|
||||||
if ($app.stage === "production" || $app.stage === "frank") {
|
handler: "packages/console/function/src/log-processor.ts",
|
||||||
const HONEYCOMB_API_KEY = new sst.Secret("HONEYCOMB_API_KEY")
|
link: [new sst.Secret("HONEYCOMB_API_KEY")],
|
||||||
logProcessor = new sst.cloudflare.Worker("LogProcessor", {
|
})
|
||||||
handler: "packages/console/function/src/log-processor.ts",
|
|
||||||
link: [HONEYCOMB_API_KEY],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
new sst.cloudflare.x.SolidStart("Console", {
|
new sst.cloudflare.x.SolidStart("Console", {
|
||||||
domain,
|
domain,
|
||||||
|
|
@ -211,7 +207,7 @@ new sst.cloudflare.x.SolidStart("Console", {
|
||||||
transform: {
|
transform: {
|
||||||
worker: {
|
worker: {
|
||||||
placement: { mode: "smart" },
|
placement: { mode: "smart" },
|
||||||
tailConsumers: logProcessor ? [{ service: logProcessor.nodes.worker.scriptName }] : [],
|
tailConsumers: [{ service: logProcessor.nodes.worker.scriptName }],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -134,20 +134,26 @@ export async function handler(
|
||||||
body: reqBody,
|
body: reqBody,
|
||||||
})
|
})
|
||||||
|
|
||||||
// Try another provider => stop retrying if using fallback provider
|
if (res.status !== 200) {
|
||||||
if (
|
logger.metric({
|
||||||
res.status !== 200 &&
|
"llm.error.code": res.status,
|
||||||
// ie. openai 404 error: Item with id 'msg_0ead8b004a3b165d0069436a6b6834819896da85b63b196a3f' not found.
|
"llm.error.message": res.statusText,
|
||||||
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,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 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 }
|
return { providerInfo, reqBody, res, startTimestamp }
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ export default {
|
||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
let metrics = {
|
let data = {
|
||||||
event_type: "completions",
|
event_type: "completions",
|
||||||
"cf.continent": event.event.request.cf?.continent,
|
"cf.continent": event.event.request.cf?.continent,
|
||||||
"cf.country": event.event.request.cf?.country,
|
"cf.country": event.event.request.cf?.country,
|
||||||
|
|
@ -31,22 +31,28 @@ export default {
|
||||||
status: event.event.response?.status ?? 0,
|
status: event.event.response?.status ?? 0,
|
||||||
ip: event.event.request.headers["x-real-ip"],
|
ip: event.event.request.headers["x-real-ip"],
|
||||||
}
|
}
|
||||||
|
const time = event.eventTimestamp ?? Date.now()
|
||||||
|
const events = []
|
||||||
for (const log of event.logs) {
|
for (const log of event.logs) {
|
||||||
for (const message of log.message) {
|
for (const message of log.message) {
|
||||||
if (!message.startsWith("_metric:")) continue
|
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",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
"X-Honeycomb-Event-Time": (event.eventTimestamp ?? Date.now()).toString(),
|
|
||||||
"X-Honeycomb-Team": Resource.HONEYCOMB_API_KEY.value,
|
"X-Honeycomb-Team": Resource.HONEYCOMB_API_KEY.value,
|
||||||
},
|
},
|
||||||
body: JSON.stringify(metrics),
|
body: JSON.stringify(events),
|
||||||
})
|
})
|
||||||
console.log(ret.status)
|
console.log(ret.status)
|
||||||
console.log(await ret.text())
|
console.log(await ret.text())
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue