Files
open-gsio/packages/server/services/MetricsService.ts
2025-06-18 13:30:38 -04:00

51 lines
1.5 KiB
TypeScript

import { types, flow } from "mobx-state-tree";
const MetricsService = types
.model("MetricsService", {
isCollectingMetrics: types.optional(types.boolean, true),
})
.volatile((self) => ({
env: {} as Env,
ctx: {} as ExecutionContext,
}))
.actions((self) => ({
setEnv(env: Env) {
self.env = env;
},
setCtx(ctx: ExecutionContext) {
self.ctx = ctx;
},
handleMetricsRequest: flow(function* (request: Request) {
const url = new URL(request.url);
let proxyUrl = "";
if(self.env.METRICS_HOST) {
proxyUrl = new URL(`${self.env.METRICS_HOST}${url.pathname}${url.search}`).toString();
}
if(proxyUrl) {
try {
const response = yield fetch(proxyUrl, {
method: request.method,
headers: request.headers,
body: ["GET", "HEAD"].includes(request.method) ? null : request.body,
redirect: "follow",
});
return response;
} catch (error) {
console.error("Failed to proxy metrics request:", error);
return new Response("metrics misconfigured", { status: 200 });
}
} else {
const event = {
method: request.method,
headers: request.headers,
body: ["GET", "HEAD"].includes(request.method) ? null : request.body,
}
self.env.KV_STORAGE.put(`metrics_events::${crypto.randomUUID()}`, JSON.stringify(event));
}
}),
}));
export default MetricsService;