Skip to content

Registrar cada run i imputar correctament el runtime per dia #227

Description

@giscebot

Problema

La gràfica Runtime usage no representa correctament el temps executat pels jobs.

Actualment jobs només conserva un únic parell started_at / finished_at. Quan un job es torna a executar, claim_next() incrementa attempts però sobreescriu started_at. Per tant, no tenim un interval de temps persistent per cada run/intent i el runtime dels intents anteriors es perd.

A més, runtime_usage() calcula finished_at - started_at i imputa tot l'interval al dia (i mes) de finished_at. Això pot desplaçar temps al dia següent quan una execució travessa mitjanit.

Exemple

Un job té aquests runs:

  • run 1: 23:20–23:50
  • run 2: 23:55–00:35

Amb el model actual només queda representat l'últim interval. A més, els 40 minuts del segon run s'imputen íntegrament al dia en què acaba.

Proposta

Fer que cada run/intent tingui el seu propi interval persistent i usar aquests intervals com a font de veritat de les mètriques.

Model de dades

Afegir una taula job_runs (o nom equivalent) amb, com a mínim:

  • id
  • job_id
  • attempt
  • started_at
  • finished_at
  • status o resultat del run
  • worker_id / locked_by, si és útil per auditoria
  • session_id, per mantenir la correlació per intent

En reclamar un job, crear el run. En finalitzar, bloquejar, cancel·lar o reencuar l'execució, tancar el run corresponent. Els camps actuals de jobs es poden mantenir temporalment com a resum/compatibilitat, però no haurien de ser la font de veritat del consum.

Cal definir també la retenció dels runs: són dades útils d'auditoria i mètriques, però s'ha d'evitar creixement indefinit sense política explícita.

Imputació diària

Com que un run té una durada màxima aproximada d'una hora, no cal repartir-lo minut a minut entre dies. Imputar cada run al dia local que contingui la part més gran del seu interval:

  • calcular el solapament abans i després de mitjanit en la timezone sol·licitada pel dashboard;
  • assignar tot el runtime al dia amb més solapament;
  • definir un desempat determinista (proposta: dia d'inici);
  • derivar l'agrupació mensual a partir del dia imputat.

Això evita atribuir sistemàticament tot el temps al dia de finalització i manté la implementació simple. Si en el futur s'admeten runs llargs, es pot evolucionar a repartir l'interval entre buckets.

Criteris d'acceptació

  • Cada intent crea un run amb started_at propi.
  • Cada sortida de running tanca el run amb finished_at i resultat, inclosos retry/requeue, bloqueig i cancel·lació.
  • Els retries no sobreescriuen ni perden el runtime dels intents anteriors.
  • Runtime usage suma runs finalitzats, no el parell global del job.
  • Un run que travessa mitjanit s'imputa al dia amb més durada dins l'interval, respectant la timezone del dashboard.
  • El desempat s'imputa al dia d'inici.
  • Les agrupacions work / review es conserven.
  • Hi ha migració compatible amb les bases existents i una decisió explícita sobre si/cóm es fa backfill dels jobs històrics (només es pot reconstruir l'últim interval conegut).
  • Hi ha tests per múltiples intents, requeue, bloqueig/cancel·lació, canvi de dia, canvi de mes i timezone/DST.
  • La documentació explica que el consum es calcula per runs i quina regla d'imputació diària s'aplica.

Nota de compatibilitat

Les dades històriques actuals no permeten reconstruir tots els runs: només tenim attempts i l'últim started_at/finished_at. El backfill hauria de crear, com a màxim, un run històric marcat com a estimat/conegut, sense inventar intervals dels intents anteriors.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions