From 35671d4c50cc52b88a72949f49ad2f63b008c585 Mon Sep 17 00:00:00 2001 From: Alexey Yarmosh Date: Wed, 5 Feb 2025 12:49:42 +0100 Subject: [PATCH] feat: mark measurement as failed in case of result validation error --- src/measurement/handler/result.ts | 13 ++++++-- src/measurement/types.ts | 51 +++++++++++++++---------------- 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/measurement/handler/result.ts b/src/measurement/handler/result.ts index a2478531..489446b6 100644 --- a/src/measurement/handler/result.ts +++ b/src/measurement/handler/result.ts @@ -145,7 +145,6 @@ const httpResultSchema = Joi.object({ const schema = Joi.object({ testId: Joi.string().required(), measurementId: Joi.string().required(), - overwrite: Joi.boolean(), result: Joi.alternatives([ pingResultSchema, tracerouteResultSchema, @@ -158,12 +157,22 @@ const schema = Joi.object({ const runner = getMeasurementRunner(); export const handleMeasurementResult = (probe: Probe) => async (data: MeasurementResultMessage): Promise => { + await getProbeValidator().validateProbe(data.measurementId, data.testId, probe.uuid); + const validation = schema.validate(data); if (validation.error) { + (data.measurementId && data.testId) && await runner.recordResult({ + measurementId: data.measurementId, + testId: data.testId, + result: { + status: 'failed', + rawOutput: 'Measurement result validation failed', + }, + }); + throw validation.error; } - await getProbeValidator().validateProbe(data.measurementId, data.testId, probe.uuid); await runner.recordResult(data); }; diff --git a/src/measurement/types.ts b/src/measurement/types.ts index 0f8f5eca..a382e921 100644 --- a/src/measurement/types.ts +++ b/src/measurement/types.ts @@ -20,10 +20,10 @@ type PingTiming = { }; export type PingResult = TestResult & { - resolvedAddress: string | null; - resolvedHostname: string | null; - timings: PingTiming[]; - stats: { + resolvedAddress?: string | null; + resolvedHostname?: string | null; + timings?: PingTiming[]; + stats?: { min: number | null; max: number | null; avg: number | null; @@ -51,9 +51,9 @@ type TraceHopResult = { }; export type TracerouteResult = TestResult & { - resolvedHostname: string | null; - resolvedAddress: string | null; - hops: TraceHopResult[]; + resolvedHostname?: string | null; + resolvedAddress?: string | null; + hops?: TraceHopResult[]; }; type MtrTest = { @@ -88,9 +88,9 @@ type MtrResultHop = { }; export type MtrResult = TestResult & { - resolvedAddress: string; - resolvedHostname: string; - hops: MtrResultHop[]; + resolvedAddress?: string; + resolvedHostname?: string; + hops?: MtrResultHop[]; }; type DnsQueryTypes = 'A' | 'AAAA' | 'ANY' | 'CNAME' | 'DNSKEY' | 'DS' | 'HTTPS' | 'MX' | 'NS' | 'NSEC' | 'PTR' | 'RRSIG' | 'SOA' | 'TXT' | 'SRV'; @@ -115,17 +115,17 @@ type DnsAnswer = { }; export type DnsRegularResult = { - statusCodeName: string; - statusCode: number | null; - answers: DnsAnswer[]; - timings: { + statusCodeName?: string; + statusCode?: number | null; + answers?: DnsAnswer[]; + resolver?: string | null; + timings?: { total: number | null; }; - resolver: string | null; }; export type DnsTraceResult = { - hops: DnsRegularResult; + hops?: DnsRegularResult; }; export type DnsResult = TestResult & (DnsRegularResult | DnsTraceResult); @@ -150,15 +150,15 @@ export type HttpProgress = TestProgress & { }; export type HttpResult = TestResult & { - resolvedAddress: string | null; - headers: Record; - rawHeaders: string | null; - rawBody: string | null; - truncated: boolean; - statusCode: number | null; - statusCodeName: string | null; - timings: Record; - tls: { + resolvedAddress?: string | null; + headers?: Record; + rawHeaders?: string | null; + rawBody?: string | null; + truncated?: boolean; + statusCode?: number | null; + statusCodeName?: string | null; + timings?: Record; + tls?: { authorized: boolean; createdAt: string; expiresAt: string; @@ -262,6 +262,5 @@ export type MeasurementProgressMessage = { export type MeasurementResultMessage = { testId: string; measurementId: string; - overwrite?: boolean; result: PingResult | TracerouteResult | DnsResult | MtrResult | HttpResult; };