Something went wrong. Try again.
[READ-ONLY] Mirror of https://github.com/openstatusHQ/openstatus. ๐ซ Status page with uptime monitoring & API monitoring as code ๐ซ openstatus.dev
bun drizzle-orm monitoring monitoring-as-code nextjs observability on-call open-source shadcn-ui status-page statuspage synthetic-monitoring tinybird turso uptime uptime-checker uptime-monitor
Something went wrong. Try again.
TypeScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165import type { z } from "@hono/zod-openapi";import type { selectMonitorSchema } from "@openstatus/db/src/schema";import { type DNSPayloadSchema, type httpPayloadSchema, type grpcPayloadSchema, type icmpPayloadSchema, type tpcPayloadSchema, transformHeaders,} from "@openstatus/utils";
import { OpenStatusApiError } from "@/libs/errors";
export function getCheckerPayload( monitor: z.infer<typeof selectMonitorSchema>, status: z.infer<typeof selectMonitorSchema>["status"],): | z.infer<typeof httpPayloadSchema> | z.infer<typeof tpcPayloadSchema> | z.infer<typeof DNSPayloadSchema> | z.infer<typeof icmpPayloadSchema> | z.infer<typeof grpcPayloadSchema> { const timestamp = new Date().getTime(); switch (monitor.jobType) { case "http": return { workspaceId: String(monitor.workspaceId), monitorId: String(monitor.id), url: monitor.url, method: monitor.method || "GET", cronTimestamp: timestamp, body: monitor.body, headers: monitor.headers, status: status, assertions: monitor.assertions ? JSON.parse(monitor.assertions) : null, degradedAfter: monitor.degradedAfter, timeout: monitor.timeout, trigger: "api", otelConfig: monitor.otelEndpoint ? { endpoint: monitor.otelEndpoint, headers: transformHeaders(monitor.otelHeaders), } : undefined, retry: monitor.retry ?? 0, followRedirects: monitor.followRedirects ?? false, }; case "tcp": return { workspaceId: String(monitor.workspaceId), monitorId: String(monitor.id), uri: monitor.url, status: status, assertions: monitor.assertions ? JSON.parse(monitor.assertions) : null, cronTimestamp: timestamp, degradedAfter: monitor.degradedAfter, timeout: monitor.timeout, trigger: "api", otelConfig: monitor.otelEndpoint ? { endpoint: monitor.otelEndpoint, headers: transformHeaders(monitor.otelHeaders), } : undefined, retry: monitor.retry ?? 0, followRedirects: monitor.followRedirects ?? false, }; case "dns": return { workspaceId: String(monitor.workspaceId), monitorId: String(monitor.id), uri: monitor.url, status: status, assertions: monitor.assertions ? JSON.parse(monitor.assertions) : null, cronTimestamp: timestamp, degradedAfter: monitor.degradedAfter, timeout: monitor.timeout, trigger: "api", otelConfig: monitor.otelEndpoint ? { endpoint: monitor.otelEndpoint, headers: transformHeaders(monitor.otelHeaders), } : undefined, retry: monitor.retry ?? 0, }; case "icmp": // No assertions: an ICMP check only reports reachability and latency. return { workspaceId: String(monitor.workspaceId), monitorId: String(monitor.id), uri: monitor.url, status: status, cronTimestamp: timestamp, degradedAfter: monitor.degradedAfter, timeout: monitor.timeout, trigger: "api", otelConfig: monitor.otelEndpoint ? { endpoint: monitor.otelEndpoint, headers: transformHeaders(monitor.otelHeaders), } : undefined, retry: monitor.retry ?? 0, }; case "grpc": // No assertions: a gRPC health check only reports the serving status. return { workspaceId: String(monitor.workspaceId), monitorId: String(monitor.id), uri: monitor.url, service: monitor.grpcService ?? undefined, tls: monitor.grpcTls ?? "tls", headers: transformHeaders(monitor.headers), status: status, cronTimestamp: timestamp, degradedAfter: monitor.degradedAfter, timeout: monitor.timeout, trigger: "api", otelConfig: monitor.otelEndpoint ? { endpoint: monitor.otelEndpoint, headers: transformHeaders(monitor.otelHeaders), } : undefined, retry: monitor.retry ?? 0, }; default: throw new OpenStatusApiError({ code: "BAD_REQUEST", message: `Invalid jobType '${monitor.jobType}'`, }); }}
// Bounds outbound checker fetches so a slow check can't pin API requests open// indefinitely: the monitor's own timeout plus a buffer for checker overhead.export function getCheckerTimeout( monitor: z.infer<typeof selectMonitorSchema>,): number { return (monitor.timeout ?? 45_000) + 15_000;}
export function getCheckerUrl( monitor: z.infer<typeof selectMonitorSchema>, opts: { trigger?: "api" | "cron"; data?: boolean } = { trigger: "api", data: false, },): string { switch (monitor.jobType) { case "http": case "tcp": case "dns": case "icmp": case "grpc": return `https://openstatus-checker.fly.dev/checker/${monitor.jobType}?monitor_id=${monitor.id}&trigger=${opts.trigger}&data=${opts.data}`; default: throw new OpenStatusApiError({ code: "BAD_REQUEST", message: `Invalid jobType '${monitor.jobType}'`, }); }}