From cc850dc5b83038a508808e6840351ed14e76a7aa Mon Sep 17 00:00:00 2001 From: Thibault Le Ouay Ducasse Date: Tue, 20 Oct 2026 16:42:39 +0200 Subject: [PATCH] tinybird: add per-type attempt datasources, attempts column, fix tcp cronTimestamp Adds {ping,tcp,dns,grpc,icmp}_attempt__v0 and endpoint__*_attempts__v0 to hold the failed attempts a retried check discards; the final attempt stays in *_response. Adds an attempts count (DEFAULT 1) to the five response datasources. tcp_response__v0.cronTimestamp read $.timestamp, which cloud fallback rows never set: every TCP error row (2M rows, 155 monitors) was stored with cronTimestamp = 0 and fell outside every TCP materialized view. aggregate__icmp_full_14d__v0 now lists its columns instead of SELECT *. Co-Authored-By: Claude Opus 5.5 --- .../datasources/dns_attempt__v0.datasource | 23 ++ .../datasources/dns_response__v0.datasource | 3 +- .../datasources/grpc_attempt__v0.datasource | 25 ++ .../datasources/grpc_response__v0.datasource | 3 +- .../datasources/icmp_attempt__v0.datasource | 26 ++ .../datasources/icmp_response__v0.datasource | 3 +- .../datasources/ping_attempt__v0.datasource | 27 ++ .../datasources/ping_response__v8.datasource | 3 +- .../datasources/tcp_attempt__v0.datasource | 22 ++ .../datasources/tcp_response__v0.datasource | 5 +- .../endpoints/endpoint__dns_attempts__v0.pipe | 13 + .../endpoint__grpc_attempts__v0.pipe | 13 + .../endpoint__http_attempts__v0.pipe | 13 + .../endpoint__icmp_attempts__v0.pipe | 13 + .../endpoints/endpoint__tcp_attempts__v0.pipe | 13 + .../pipes/aggregate__icmp_full_14d__v0.pipe | 19 +- packages/tinybird/src/client.test.ts | 30 +++ packages/tinybird/src/client.ts | 251 +++++++++++------- 18 files changed, 403 insertions(+), 102 deletions(-) create mode 100644 packages/tinybird/datasources/dns_attempt__v0.datasource create mode 100644 packages/tinybird/datasources/grpc_attempt__v0.datasource create mode 100644 packages/tinybird/datasources/icmp_attempt__v0.datasource create mode 100644 packages/tinybird/datasources/ping_attempt__v0.datasource create mode 100644 packages/tinybird/datasources/tcp_attempt__v0.datasource create mode 100644 packages/tinybird/endpoints/endpoint__dns_attempts__v0.pipe create mode 100644 packages/tinybird/endpoints/endpoint__grpc_attempts__v0.pipe create mode 100644 packages/tinybird/endpoints/endpoint__http_attempts__v0.pipe create mode 100644 packages/tinybird/endpoints/endpoint__icmp_attempts__v0.pipe create mode 100644 packages/tinybird/endpoints/endpoint__tcp_attempts__v0.pipe diff --git a/packages/tinybird/datasources/dns_attempt__v0.datasource b/packages/tinybird/datasources/dns_attempt__v0.datasource new file mode 100644 index 000000000..0111c7b01 --- /dev/null +++ b/packages/tinybird/datasources/dns_attempt__v0.datasource @@ -0,0 +1,23 @@ +DESCRIPTION > + Failed attempts of a retried DNS check. The final attempt is in dns_response__v0; join on monitorId, region, cronTimestamp. + +SCHEMA > + `assertions` String `json:$.assertions`, + `cronTimestamp` Int64 `json:$.cronTimestamp`, + `error` Int16 `json:$.error`, + `errorMessage` String `json:$.errorMessage`, + `id` String `json:$.id`, + `latency` Int32 `json:$.latency`, + `monitorId` Int32 `json:$.monitorId`, + `records` String `json:$.records`, + `region` String `json:$.region`, + `requestStatus` String `json:$.requestStatus`, + `timestamp` Int64 `json:$.timestamp`, + `trigger` String `json:$.trigger`, + `uri` String `json:$.uri`, + `workspaceId` Int32 `json:$.workspaceId`, + `attempt` UInt8 `json:$.attempt` + +ENGINE "MergeTree" +ENGINE_PARTITION_KEY "toYYYYMM(fromUnixTimestamp64Milli(cronTimestamp))" +ENGINE_SORTING_KEY "monitorId, cronTimestamp, region, attempt" diff --git a/packages/tinybird/datasources/dns_response__v0.datasource b/packages/tinybird/datasources/dns_response__v0.datasource index da7f9ee8a..0512f75dd 100644 --- a/packages/tinybird/datasources/dns_response__v0.datasource +++ b/packages/tinybird/datasources/dns_response__v0.datasource @@ -13,7 +13,8 @@ SCHEMA > `timestamp` Int64 `json:$.timestamp`, `trigger` String `json:$.trigger`, `uri` String `json:$.uri`, - `workspaceId` Int16 `json:$.workspaceId` + `workspaceId` Int16 `json:$.workspaceId`, + `attempts` UInt8 `json:$.attempts` DEFAULT 1 ENGINE "MergeTree" ENGINE_SORTING_KEY "trigger, uri, workspaceId" diff --git a/packages/tinybird/datasources/grpc_attempt__v0.datasource b/packages/tinybird/datasources/grpc_attempt__v0.datasource new file mode 100644 index 000000000..73b1e1820 --- /dev/null +++ b/packages/tinybird/datasources/grpc_attempt__v0.datasource @@ -0,0 +1,25 @@ +DESCRIPTION > + Failed attempts of a retried gRPC check. The final attempt is in grpc_response__v0; join on monitorId, region, cronTimestamp. + +SCHEMA > + `monitorId` Int32 `json:$.monitorId`, + `region` String `json:$.region`, + `timestamp` Int64 `json:$.timestamp`, + `cronTimestamp` Int64 `json:$.cronTimestamp`, + `timing` String `json:$.timing`, + `workspaceId` Int32 `json:$.workspaceId`, + `latency` Int64 `json:$.latency`, + `servingStatus` Nullable(String) `json:$.servingStatus`, + `grpcCode` Nullable(Int16) `json:$.grpcCode`, + `service` Nullable(String) `json:$.service`, + `errorMessage` Nullable(String) `json:$.errorMessage`, + `error` Int16 `json:$.error`, + `trigger` Nullable(String) `json:$.trigger`, + `uri` Nullable(String) `json:$.uri`, + `id` Nullable(String) `json:$.id`, + `requestStatus` Nullable(String) `json:$.requestStatus`, + `attempt` UInt8 `json:$.attempt` + +ENGINE "MergeTree" +ENGINE_PARTITION_KEY "toYYYYMM(fromUnixTimestamp64Milli(cronTimestamp))" +ENGINE_SORTING_KEY "monitorId, cronTimestamp, region, attempt" diff --git a/packages/tinybird/datasources/grpc_response__v0.datasource b/packages/tinybird/datasources/grpc_response__v0.datasource index 43a694f13..dd2fe37cb 100644 --- a/packages/tinybird/datasources/grpc_response__v0.datasource +++ b/packages/tinybird/datasources/grpc_response__v0.datasource @@ -14,7 +14,8 @@ SCHEMA > `trigger` Nullable(String) `json:$.trigger`, `uri` Nullable(String) `json:$.uri`, `id` Nullable(String) `json:$.id`, - `requestStatus` Nullable(String) `json:$.requestStatus` + `requestStatus` Nullable(String) `json:$.requestStatus`, + `attempts` UInt8 `json:$.attempts` DEFAULT 1 ENGINE "MergeTree" ENGINE_PARTITION_KEY "toYYYYMM(fromUnixTimestamp64Milli(cronTimestamp))" diff --git a/packages/tinybird/datasources/icmp_attempt__v0.datasource b/packages/tinybird/datasources/icmp_attempt__v0.datasource new file mode 100644 index 000000000..22a544d65 --- /dev/null +++ b/packages/tinybird/datasources/icmp_attempt__v0.datasource @@ -0,0 +1,26 @@ +DESCRIPTION > + Failed attempts of a retried ICMP check. The final attempt is in icmp_response__v0; join on monitorId, region, cronTimestamp. + +SCHEMA > + `monitorId` Int32 `json:$.monitorId`, + `region` String `json:$.region`, + `timestamp` Int64 `json:$.timestamp`, + `cronTimestamp` Int64 `json:$.cronTimestamp`, + `timing` String `json:$.timing`, + `workspaceId` Int32 `json:$.workspaceId`, + `latency` Int64 `json:$.latency`, + `latencyMin` Int64 `json:$.latencyMin`, + `latencyMax` Int64 `json:$.latencyMax`, + `packetsSent` UInt8 `json:$.packetsSent`, + `packetsReceived` UInt8 `json:$.packetsReceived`, + `errorMessage` Nullable(String) `json:$.errorMessage`, + `error` Int16 `json:$.error`, + `trigger` Nullable(String) `json:$.trigger`, + `uri` Nullable(String) `json:$.uri`, + `id` Nullable(String) `json:$.id`, + `requestStatus` Nullable(String) `json:$.requestStatus`, + `attempt` UInt8 `json:$.attempt` + +ENGINE "MergeTree" +ENGINE_PARTITION_KEY "toYYYYMM(fromUnixTimestamp64Milli(cronTimestamp))" +ENGINE_SORTING_KEY "monitorId, cronTimestamp, region, attempt" diff --git a/packages/tinybird/datasources/icmp_response__v0.datasource b/packages/tinybird/datasources/icmp_response__v0.datasource index 9f4b34737..9be3a47b6 100644 --- a/packages/tinybird/datasources/icmp_response__v0.datasource +++ b/packages/tinybird/datasources/icmp_response__v0.datasource @@ -15,7 +15,8 @@ SCHEMA > `trigger` Nullable(String) `json:$.trigger`, `uri` Nullable(String) `json:$.uri`, `id` Nullable(String) `json:$.id`, - `requestStatus` Nullable(String) `json:$.requestStatus` + `requestStatus` Nullable(String) `json:$.requestStatus`, + `attempts` UInt8 `json:$.attempts` DEFAULT 1 ENGINE "MergeTree" ENGINE_PARTITION_KEY "toYYYYMM(fromUnixTimestamp64Milli(cronTimestamp))" diff --git a/packages/tinybird/datasources/ping_attempt__v0.datasource b/packages/tinybird/datasources/ping_attempt__v0.datasource new file mode 100644 index 000000000..9ae065882 --- /dev/null +++ b/packages/tinybird/datasources/ping_attempt__v0.datasource @@ -0,0 +1,27 @@ +DESCRIPTION > + Failed attempts of a retried HTTP check. The final attempt is in ping_response__v8; join on monitorId, region, cronTimestamp. + +SCHEMA > + `latency` Int64 `json:$.latency`, + `monitorId` String `json:$.monitorId`, + `region` LowCardinality(String) `json:$.region`, + `statusCode` Nullable(Int16) `json:$.statusCode`, + `error` Int8 `json:$.error`, + `timestamp` Int64 `json:$.timestamp`, + `url` String `json:$.url`, + `workspaceId` String `json:$.workspaceId`, + `cronTimestamp` Int64 `json:$.cronTimestamp`, + `message` Nullable(String) `json:$.message`, + `timing` Nullable(String) `json:$.timing`, + `headers` Nullable(String) `json:$.headers`, + `assertions` Nullable(String) `json:$.assertions`, + `body` Nullable(String) `json:$.body`, + `trigger` Nullable(String) `json:$.trigger`, + `id` Nullable(String) `json:$.id`, + `requestStatus` Nullable(String) `json:$.requestStatus`, + `method` String `json:$.method`, + `attempt` UInt8 `json:$.attempt` + +ENGINE "MergeTree" +ENGINE_PARTITION_KEY "toYYYYMM(fromUnixTimestamp64Milli(cronTimestamp))" +ENGINE_SORTING_KEY "monitorId, cronTimestamp, region, attempt" diff --git a/packages/tinybird/datasources/ping_response__v8.datasource b/packages/tinybird/datasources/ping_response__v8.datasource index 10144240a..35515f4d2 100644 --- a/packages/tinybird/datasources/ping_response__v8.datasource +++ b/packages/tinybird/datasources/ping_response__v8.datasource @@ -17,7 +17,8 @@ SCHEMA > `trigger` Nullable(String) `json:$.trigger`, `id` Nullable(String) `json:$.id`, `requestStatus` Nullable(String) `json:$.requestStatus`, - `method` String `json:$.method` + `method` String `json:$.method`, + `attempts` UInt8 `json:$.attempts` DEFAULT 1 ENGINE "MergeTree" ENGINE_PARTITION_KEY "toYYYYMM(fromUnixTimestamp64Milli(cronTimestamp))" diff --git a/packages/tinybird/datasources/tcp_attempt__v0.datasource b/packages/tinybird/datasources/tcp_attempt__v0.datasource new file mode 100644 index 000000000..ec4815378 --- /dev/null +++ b/packages/tinybird/datasources/tcp_attempt__v0.datasource @@ -0,0 +1,22 @@ +DESCRIPTION > + Failed attempts of a retried TCP check. The final attempt is in tcp_response__v0; join on monitorId, region, cronTimestamp. + +SCHEMA > + `monitorId` Int32 `json:$.monitorId`, + `region` String `json:$.region`, + `timestamp` Int64 `json:$.timestamp`, + `cronTimestamp` Int64 `json:$.cronTimestamp`, + `timing` String `json:$.timing`, + `workspaceId` Int32 `json:$.workspaceId`, + `latency` Int64 `json:$.latency`, + `errorMessage` Nullable(String) `json:$.errorMessage`, + `error` Int16 `json:$.error`, + `trigger` Nullable(String) `json:$.trigger`, + `uri` Nullable(String) `json:$.uri`, + `id` Nullable(String) `json:$.id`, + `requestStatus` Nullable(String) `json:$.requestStatus`, + `attempt` UInt8 `json:$.attempt` + +ENGINE "MergeTree" +ENGINE_PARTITION_KEY "toYYYYMM(fromUnixTimestamp64Milli(cronTimestamp))" +ENGINE_SORTING_KEY "monitorId, cronTimestamp, region, attempt" diff --git a/packages/tinybird/datasources/tcp_response__v0.datasource b/packages/tinybird/datasources/tcp_response__v0.datasource index ae4f7aa97..b81f0247f 100644 --- a/packages/tinybird/datasources/tcp_response__v0.datasource +++ b/packages/tinybird/datasources/tcp_response__v0.datasource @@ -3,7 +3,7 @@ SCHEMA > `monitorId` Int32 `json:$.monitorId`, `region` String `json:$.region`, `timestamp` Int64 `json:$.timestamp`, - `cronTimestamp` Int64 `json:$.timestamp`, + `cronTimestamp` Int64 `json:$.cronTimestamp`, `timing` String `json:$.timing`, `workspaceId` Int32 `json:$.workspaceId`, `latency` Int64 `json:$.latency`, @@ -12,7 +12,8 @@ SCHEMA > `trigger` Nullable(String) `json:$.trigger`, `uri` Nullable(String) `json:$.uri`, `id` Nullable(String) `json:$.id`, - `requestStatus` Nullable(String) `json:$.requestStatus` + `requestStatus` Nullable(String) `json:$.requestStatus`, + `attempts` UInt8 `json:$.attempts` DEFAULT 1 ENGINE "MergeTree" ENGINE_PARTITION_KEY "toYYYYMM(fromUnixTimestamp64Milli(timestamp))" diff --git a/packages/tinybird/endpoints/endpoint__dns_attempts__v0.pipe b/packages/tinybird/endpoints/endpoint__dns_attempts__v0.pipe new file mode 100644 index 000000000..3533a3f1f --- /dev/null +++ b/packages/tinybird/endpoints/endpoint__dns_attempts__v0.pipe @@ -0,0 +1,13 @@ +NODE endpoint +SQL > + + % + SELECT * + FROM dns_attempt__v0 + WHERE + monitorId = {{ Int32(monitorId, required=True) }} + AND region = {{ String(region, required=True) }} + AND cronTimestamp = {{ Int64(cronTimestamp, required=True) }} + ORDER BY attempt ASC + +TYPE ENDPOINT diff --git a/packages/tinybird/endpoints/endpoint__grpc_attempts__v0.pipe b/packages/tinybird/endpoints/endpoint__grpc_attempts__v0.pipe new file mode 100644 index 000000000..2f661750d --- /dev/null +++ b/packages/tinybird/endpoints/endpoint__grpc_attempts__v0.pipe @@ -0,0 +1,13 @@ +NODE endpoint +SQL > + + % + SELECT * + FROM grpc_attempt__v0 + WHERE + monitorId = {{ Int32(monitorId, required=True) }} + AND region = {{ String(region, required=True) }} + AND cronTimestamp = {{ Int64(cronTimestamp, required=True) }} + ORDER BY attempt ASC + +TYPE ENDPOINT diff --git a/packages/tinybird/endpoints/endpoint__http_attempts__v0.pipe b/packages/tinybird/endpoints/endpoint__http_attempts__v0.pipe new file mode 100644 index 000000000..a6d8f9976 --- /dev/null +++ b/packages/tinybird/endpoints/endpoint__http_attempts__v0.pipe @@ -0,0 +1,13 @@ +NODE endpoint +SQL > + + % + SELECT * + FROM ping_attempt__v0 + WHERE + monitorId = {{ String(monitorId, required=True) }} + AND region = {{ String(region, required=True) }} + AND cronTimestamp = {{ Int64(cronTimestamp, required=True) }} + ORDER BY attempt ASC + +TYPE ENDPOINT diff --git a/packages/tinybird/endpoints/endpoint__icmp_attempts__v0.pipe b/packages/tinybird/endpoints/endpoint__icmp_attempts__v0.pipe new file mode 100644 index 000000000..7a2cf6035 --- /dev/null +++ b/packages/tinybird/endpoints/endpoint__icmp_attempts__v0.pipe @@ -0,0 +1,13 @@ +NODE endpoint +SQL > + + % + SELECT * + FROM icmp_attempt__v0 + WHERE + monitorId = {{ Int32(monitorId, required=True) }} + AND region = {{ String(region, required=True) }} + AND cronTimestamp = {{ Int64(cronTimestamp, required=True) }} + ORDER BY attempt ASC + +TYPE ENDPOINT diff --git a/packages/tinybird/endpoints/endpoint__tcp_attempts__v0.pipe b/packages/tinybird/endpoints/endpoint__tcp_attempts__v0.pipe new file mode 100644 index 000000000..2428e3100 --- /dev/null +++ b/packages/tinybird/endpoints/endpoint__tcp_attempts__v0.pipe @@ -0,0 +1,13 @@ +NODE endpoint +SQL > + + % + SELECT * + FROM tcp_attempt__v0 + WHERE + monitorId = {{ Int32(monitorId, required=True) }} + AND region = {{ String(region, required=True) }} + AND cronTimestamp = {{ Int64(cronTimestamp, required=True) }} + ORDER BY attempt ASC + +TYPE ENDPOINT diff --git a/packages/tinybird/pipes/aggregate__icmp_full_14d__v0.pipe b/packages/tinybird/pipes/aggregate__icmp_full_14d__v0.pipe index 112c8d70c..10afd565d 100644 --- a/packages/tinybird/pipes/aggregate__icmp_full_14d__v0.pipe +++ b/packages/tinybird/pipes/aggregate__icmp_full_14d__v0.pipe @@ -9,8 +9,25 @@ SQL > SELECT toDateTime(fromUnixTimestamp64Milli(cronTimestamp)) AS time, - * + monitorId, + region, + timestamp, + cronTimestamp, + timing, + workspaceId, + latency, + latencyMin, + latencyMax, + packetsSent, + packetsReceived, + errorMessage, + error, + trigger, + uri, + id, + requestStatus FROM icmp_response__v0 TYPE materialized DATASOURCE mv__icmp_full_14d__v0 +DEPLOYMENT_METHOD alter diff --git a/packages/tinybird/src/client.test.ts b/packages/tinybird/src/client.test.ts index ac5d53cfe..c5bb1e48e 100644 --- a/packages/tinybird/src/client.test.ts +++ b/packages/tinybird/src/client.test.ts @@ -266,3 +266,33 @@ describe("15m status pipes", () => { }); } }); + +const attemptsGetters = [ + "httpAttempts", + "tcpAttempts", + "dnsAttempts", + "grpcAttempts", + "icmpAttempts", +] as const; + +describe("attempt pipes", () => { + const tb = new OSTinybird({ token: "a-token" }); + + for (const name of attemptsGetters) { + test(`${name} accepts a check lookup`, async () => { + expect( + await tb[name]({ + monitorId: "1", + region: "ams", + cronTimestamp: 1_700_000_000_000, + }), + ).toEqual({ meta: [], data: [] }); + }); + + test(`${name} rejects a non-integer cronTimestamp`, async () => { + await expect( + tb[name]({ monitorId: "1", region: "ams", cronTimestamp: 1.5 }), + ).rejects.toThrow(); + }); + } +}); diff --git a/packages/tinybird/src/client.ts b/packages/tinybird/src/client.ts index fde1f7af5..5483fb857 100644 --- a/packages/tinybird/src/client.ts +++ b/packages/tinybird/src/client.ts @@ -362,6 +362,112 @@ export type OSTinybirdConfig = { noop?: boolean | string; }; +const attemptsParameters = z.object({ + monitorId: z.string(), + region: z.string(), + cronTimestamp: z.int(), +}); + +const httpGetRowShape = { + type: z.literal("http").prefault("http"), + latency: z.int(), + statusCode: z.int().nullable(), + requestStatus: z.enum(["error", "success", "degraded"]).nullable(), + monitorId: z.string(), + url: z.url(), + error: z.coerce.boolean(), + region: z.enum(monitorRegions).or(z.string()), + cronTimestamp: z.int(), + message: z.string().nullable(), + headers: headersSchema, + timing: timingPhasesSchema, + assertions: z.string().nullable(), + body: z.string().nullable(), + trigger: z.enum(triggers).nullable().prefault("cron"), + timestamp: z.number(), + workspaceId: z.string(), + id: z.string().nullable(), +}; + +const tcpGetRowShape = { + type: z.literal("tcp").prefault("tcp"), + id: z.string().nullable(), + uri: z.string(), + latency: z.int(), + monitorId: z.coerce.string(), + error: z.coerce.boolean(), + region: z.enum(monitorRegions).or(z.string()), + cronTimestamp: z.int(), + trigger: z.enum(triggers).nullable().prefault("cron"), + timestamp: z.number(), + requestStatus: z.enum(["error", "success", "degraded"]).nullable(), + errorMessage: z.string().nullable(), +}; + +const icmpGetRowShape = { + type: z.literal("icmp").prefault("icmp"), + id: z.string().nullable(), + uri: z.string(), + latency: z.int(), + latencyMin: z.int().prefault(0), + latencyMax: z.int().prefault(0), + packetsSent: z.int().prefault(0), + packetsReceived: z.int().prefault(0), + monitorId: z.coerce.string(), + error: z.coerce.boolean(), + region: z.enum(monitorRegions).or(z.string()), + cronTimestamp: z.int(), + trigger: z.enum(triggers).nullable().prefault("cron"), + timestamp: z.number(), + requestStatus: z.enum(["error", "success", "degraded"]).nullable(), + errorMessage: z.string().nullable(), +}; + +const grpcGetRowShape = { + type: z.literal("grpc").prefault("grpc"), + id: z.string().nullable(), + uri: z.string(), + latency: z.int(), + servingStatus: z.string().nullable(), + grpcCode: z.int().nullable(), + service: z.string().nullable(), + monitorId: z.coerce.string(), + error: z.coerce.boolean(), + region: z.enum(monitorRegions).or(z.string()), + cronTimestamp: z.int(), + trigger: z.enum(triggers).nullable().prefault("cron"), + timestamp: z.number(), + requestStatus: z.enum(["error", "success", "degraded"]).nullable(), + errorMessage: z.string().nullable(), +}; + +const dnsGetRowShape = { + type: z.literal("dns").prefault("dns"), + id: z.coerce.string().nullable(), + uri: z.string(), + latency: z.int(), + monitorId: z.coerce.string(), + error: z.coerce.boolean(), + region: z.enum(monitorRegions).or(z.string()), + cronTimestamp: z.int(), + trigger: z.enum(triggers).nullable().prefault("cron"), + timestamp: z.number(), + requestStatus: z.enum(["error", "success", "degraded"]).nullable(), + errorMessage: z.string().nullable(), + assertions: z.string().nullable(), + records: z + .string() + .transform((str) => { + try { + return JSON.parse(str) as Record; + } catch (error) { + console.error(error); + return {}; + } + }) + .pipe(z.record(z.string(), z.array(z.string()))), +}; + export class OSTinybird { private readonly tb: Client; @@ -896,31 +1002,57 @@ export class OSTinybird { id: z.string().nullable(), monitorId: z.string(), }), - data: z.object({ - type: z.literal("http").prefault("http"), - latency: z.int(), - statusCode: z.int().nullable(), - requestStatus: z.enum(["error", "success", "degraded"]).nullable(), - monitorId: z.string(), - url: z.url(), - error: z.coerce.boolean(), - region: z.enum(monitorRegions).or(z.string()), - cronTimestamp: z.int(), - message: z.string().nullable(), - headers: headersSchema, - timing: timingPhasesSchema, - assertions: z.string().nullable(), - body: z.string().nullable(), - trigger: z.enum(triggers).nullable().prefault("cron"), - timestamp: z.number(), - workspaceId: z.string(), - id: z.string().nullable(), - }), + data: z.object(httpGetRowShape), // REMINDER: cache the result for accessing the data for a check as it won't change opts: { cache: "force-cache" }, }); } + public get httpAttempts() { + return this.tb.buildPipe({ + pipe: "endpoint__http_attempts__v0", + parameters: attemptsParameters, + data: z.object({ ...httpGetRowShape, attempt: z.int() }), + opts: { cache: "force-cache" }, + }); + } + + public get tcpAttempts() { + return this.tb.buildPipe({ + pipe: "endpoint__tcp_attempts__v0", + parameters: attemptsParameters, + data: z.object({ ...tcpGetRowShape, attempt: z.int() }), + opts: { cache: "force-cache" }, + }); + } + + public get dnsAttempts() { + return this.tb.buildPipe({ + pipe: "endpoint__dns_attempts__v0", + parameters: attemptsParameters, + data: z.object({ ...dnsGetRowShape, attempt: z.int() }), + opts: { cache: "force-cache" }, + }); + } + + public get grpcAttempts() { + return this.tb.buildPipe({ + pipe: "endpoint__grpc_attempts__v0", + parameters: attemptsParameters, + data: z.object({ ...grpcGetRowShape, attempt: z.int() }), + opts: { cache: "force-cache" }, + }); + } + + public get icmpAttempts() { + return this.tb.buildPipe({ + pipe: "endpoint__icmp_attempts__v0", + parameters: attemptsParameters, + data: z.object({ ...icmpGetRowShape, attempt: z.int() }), + opts: { cache: "force-cache" }, + }); + } + public get httpGetMonthly() { return this.tb.buildPipe({ pipe: "endpoint__http_get_30d__v0", @@ -1506,20 +1638,7 @@ export class OSTinybird { id: z.string().nullable(), monitorId: z.string(), }), - data: z.object({ - type: z.literal("tcp").prefault("tcp"), - id: z.string().nullable(), - uri: z.string(), - latency: z.int(), - monitorId: z.coerce.string(), - error: z.coerce.boolean(), - region: z.enum(monitorRegions).or(z.string()), - cronTimestamp: z.int(), - trigger: z.enum(triggers).nullable().prefault("cron"), - timestamp: z.number(), - requestStatus: z.enum(["error", "success", "degraded"]).nullable(), - errorMessage: z.string().nullable(), - }), + data: z.object(tcpGetRowShape), // REMINDER: cache the result for accessing the data for a check as it won't change opts: { next: { revalidate: REVALIDATE } }, }); @@ -1643,24 +1762,7 @@ export class OSTinybird { id: z.string().nullable(), monitorId: z.string(), }), - data: z.object({ - type: z.literal("icmp").prefault("icmp"), - id: z.string().nullable(), - uri: z.string(), - latency: z.int(), - latencyMin: z.int().prefault(0), - latencyMax: z.int().prefault(0), - packetsSent: z.int().prefault(0), - packetsReceived: z.int().prefault(0), - monitorId: z.coerce.string(), - error: z.coerce.boolean(), - region: z.enum(monitorRegions).or(z.string()), - cronTimestamp: z.int(), - trigger: z.enum(triggers).nullable().prefault("cron"), - timestamp: z.number(), - requestStatus: z.enum(["error", "success", "degraded"]).nullable(), - errorMessage: z.string().nullable(), - }), + data: z.object(icmpGetRowShape), opts: { next: { revalidate: REVALIDATE } }, }); } @@ -2104,23 +2206,7 @@ export class OSTinybird { id: z.string().nullable(), monitorId: z.string(), }), - data: z.object({ - type: z.literal("grpc").prefault("grpc"), - id: z.string().nullable(), - uri: z.string(), - latency: z.int(), - servingStatus: z.string().nullable(), - grpcCode: z.int().nullable(), - service: z.string().nullable(), - monitorId: z.coerce.string(), - error: z.coerce.boolean(), - region: z.enum(monitorRegions).or(z.string()), - cronTimestamp: z.int(), - trigger: z.enum(triggers).nullable().prefault("cron"), - timestamp: z.number(), - requestStatus: z.enum(["error", "success", "degraded"]).nullable(), - errorMessage: z.string().nullable(), - }), + data: z.object(grpcGetRowShape), opts: { next: { revalidate: REVALIDATE } }, }); } @@ -2904,32 +2990,7 @@ export class OSTinybird { id: z.string().nullable(), monitorId: z.string(), }), - data: z.object({ - type: z.literal("dns").prefault("dns"), - id: z.coerce.string().nullable(), - uri: z.string(), - latency: z.int(), - monitorId: z.coerce.string(), - error: z.coerce.boolean(), - region: z.enum(monitorRegions).or(z.string()), - cronTimestamp: z.int(), - trigger: z.enum(triggers).nullable().prefault("cron"), - timestamp: z.number(), - requestStatus: z.enum(["error", "success", "degraded"]).nullable(), - errorMessage: z.string().nullable(), - assertions: z.string().nullable(), - records: z - .string() - .transform((str) => { - try { - return JSON.parse(str) as Record; - } catch (error) { - console.error(error); - return {}; - } - }) - .pipe(z.record(z.string(), z.array(z.string()))), - }), + data: z.object(dnsGetRowShape), // REMINDER: cache the result for accessing the data for a check as it won't change opts: { next: { revalidate: REVALIDATE } }, }); -- 2.54.0