hts/internal/metrics/src/index.ts

68 lines
1.7 KiB
TypeScript

import { z } from "zod";
export const metricSchema = z.discriminatedUnion("metric", [
z.object({
metric: z.literal("metric.cache.read"),
key: z.string(),
hit: z.boolean(),
stale: z.boolean(),
latency: z.number(),
tier: z.string(),
namespace: z.string(),
}),
z.object({
metric: z.literal("metric.cache.write"),
key: z.string(),
tier: z.string(),
namespace: z.string(),
}),
z.object({
metric: z.literal("metric.cache.purge"),
key: z.string(),
tier: z.string(),
namespace: z.string(),
}),
z.object({
metric: z.literal("metric.key.verification"),
valid: z.boolean(),
code: z.string(),
workspaceId: z.string().optional(),
apiId: z.string().optional(),
keyId: z.string().optional(),
}),
z.object({
metric: z.literal("metric.http.request"),
path: z.string(),
method: z.string(),
status: z.number(),
error: z.string().optional(),
serviceLatency: z.number(),
requestId: z.string(),
// Regional data might be different on non-cloudflare deployments
colo: z.string().optional(),
continent: z.string().optional(),
country: z.string().optional(),
city: z.string().optional(),
userAgent: z.string().optional(),
fromAgent: z.string().optional(),
}),
z.object({
metric: z.literal("metric.db.read"),
query: z.enum(["getKeyAndApiByHash"]),
latency: z.number(),
}),
z.object({
metric: z.literal("metric.ratelimit"),
identifier: z.string(),
latency: z.number(),
tier: z.enum(["memory", "durable", "total"]),
}),
z.object({
metric: z.literal("metric.usagelimit"),
keyId: z.string(),
latency: z.number(),
}),
]);
export type Metric = z.infer<typeof metricSchema>;