@@ -236,61 +236,56 @@ func (e *ExecutionCheck) ListExecutionTimeline(
236236
237237 query := `
238238WITH params AS (
239- SELECT
240- $1::text AS service_id,
241- $2::text AS check_id,
242- $3::timestamptz AS from_ts,
243- $4::timestamptz AS to_ts,
244- $5::bigint AS bucket_step_us,
245- $6::bigint AS stale_after_us
246- ),
247- buckets AS (
248- SELECT
249- gs AS bucket_start,
250- gs + (p.bucket_step_us * interval '1 microsecond') AS bucket_end
251- FROM params p,
252- LATERAL generate_series(
253- p.from_ts,
254- p.to_ts,
255- p.bucket_step_us * interval '1 microsecond'
256- ) AS gs
257- ),
258- last_execution_per_bucket AS (
259- SELECT
260- b.bucket_start,
261- b.bucket_end,
262- e.finished_at AS last_observed_at,
263- e.status AS last_execution_status
264- FROM buckets b
265- CROSS JOIN params p
266- LEFT JOIN LATERAL (
267- SELECT
268- ce.finished_at,
269- ce.status
270- FROM pulse.check_executions ce
271- WHERE ce.service_id = p.service_id
272- AND ce.check_id = p.check_id
273- AND ce.finished_at <= b.bucket_end
274- ORDER BY ce.finished_at DESC
275- LIMIT 1
276- ) e ON TRUE
277- )
278- SELECT
279- bucket_start,
280- bucket_end,
281- last_observed_at,
282- last_execution_status,
283- CASE
284- WHEN last_observed_at IS NULL THEN 'unknown'::pulse.check_state_status
285- WHEN bucket_end - last_observed_at > (
286- (SELECT stale_after_us FROM params) * interval '1 microsecond'
287- ) THEN 'unknown'::pulse.check_state_status
288- WHEN last_execution_status = 'success' THEN 'healthy'::pulse.check_state_status
289- WHEN last_execution_status = 'failure' THEN 'unhealthy'::pulse.check_state_status
290- ELSE 'unknown'::pulse.check_state_status
291- END AS timeline_state
292- FROM last_execution_per_bucket
293- ORDER BY bucket_start
239+ SELECT
240+ $1::text AS service_id,
241+ $2::text AS check_id,
242+ $3::timestamptz AS from_ts,
243+ $4::timestamptz AS to_ts,
244+ $5::bigint AS bucket_step_us,
245+ $6::bigint AS stale_after_us
246+ ),
247+ buckets AS (
248+ SELECT
249+ gs AS bucket_start,
250+ LEAST(
251+ gs + (p.bucket_step_us * interval '1 microsecond'),
252+ p.to_ts
253+ ) AS bucket_end
254+ FROM params p,
255+ LATERAL generate_series(
256+ p.from_ts,
257+ p.to_ts,
258+ p.bucket_step_us * interval '1 microsecond'
259+ ) AS gs
260+ WHERE gs < p.to_ts
261+ )
262+ SELECT
263+ b.bucket_start,
264+ b.bucket_end,
265+ last_event.observed_at AS last_observed_at,
266+ last_event.last_status AS last_execution_status,
267+ CASE
268+ WHEN last_event.observed_at IS NULL THEN 'unknown'::pulse.check_state_status
269+ WHEN b.bucket_end - last_event.observed_at > (
270+ (SELECT stale_after_us FROM params) * interval '1 microsecond'
271+ ) THEN 'unknown'::pulse.check_state_status
272+ ELSE last_event.status
273+ END AS timeline_state
274+ FROM buckets b
275+ LEFT JOIN LATERAL (
276+ SELECT
277+ e.observed_at,
278+ e.last_status,
279+ e.status
280+ FROM pulse.check_state_events e
281+ CROSS JOIN params p
282+ WHERE e.service_id = p.service_id
283+ AND e.check_id = p.check_id
284+ AND e.observed_at <= b.bucket_end
285+ ORDER BY e.observed_at DESC, e.id DESC
286+ LIMIT 1
287+ ) last_event ON TRUE
288+ ORDER BY b.bucket_start
294289`
295290
296291 rows , err := e .db .Query (
0 commit comments