
# Työnkulun tapahtumaloki

Työnkulun tapahtumaloki tallentaa jäljen jokaisesta pysyvästä työnkulun rajakohdasta. Kukin jälkitapahtuma voi sisältää vaiheen syötteen ja tulosteen, julkisen tilan ennen vaihetta ja sen jälkeen, ajonaikaisen kontekstin, artefaktiviitteet, suoratoistopalat, ajoitustiedot ja virheen tiedot.

## Tallennettavat tiedot

| Tapahtuma | Ajankohta | Tallennetut tiedot |
|---|---|---|
| `step_started` | Ennen vaiheenkäsittelijän suorittamista | Työn tunnus, jono, yritys, vaiheen nimi, vaiheen tyyppi, syöte ja tila ennen suorittamista |
| `step_completed` | Kun vaiheenkäsittelijä onnistuu | Syöte, tuloste, tila ennen ja jälkeen, konteksti, artefaktit, palat ja kesto |
| `step_failed` | Kun vaiheenkäsittelijä heittää poikkeuksen | Syöte, tila ennen ja jälkeen, jos saatavilla, konteksti, virheluokka, virheilmoitus, jälki ja kesto |
| `step_branch_completed` | Kun rinnakkaishaara onnistuu | Haaran syöte ja tuloste, tila ennen ja jälkeen, konteksti ja kesto |
| `step_item_completed` | Kun for-each-kohde onnistuu | Kohteen syöte ja tuloste, tila ennen ja jälkeen, kohteen metatiedot, konteksti ja kesto |
| `workflow_waiting` | Kun odotusvaihe pysäyttää suorituksen | Odotuksen tyyppi, kohteet, tila, tulosavain, täsmäytyksen metatiedot ja tila odotuksen aikana |
| `workflow_resumed` | Kun odotusvaiheen ehto täyttyy | Jatkamisen hyötykuorma, tila ennen jatkamista ja tila jatkamisen jälkeen |
| `workflow_replayed` | Kun vienti luodaan uudelleen | Lähdetyönkulun metatiedot ja toistotila |

## Aikajanan kyselyt

```php
$events = Queuety::workflow_timeline( $workflow_id );

foreach ( $events as $event ) {
    echo $event['step_index'] . ' ' . $event['event'] . ' ' . $event['handler'] . "\n";

    if ( 'step_completed' === $event['event'] ) {
        $input        = $event['input'];
        $output       = $event['output'];
        $state_before = $event['state_before'];
        $state_after  = $event['state_after'];
    }

    if ( 'step_failed' === $event['event'] ) {
        echo 'Error: ' . $event['error']['message'] . "\n";
    }
}
```

Jokainen tapahtumarivi sisältää:

- `id`
- `workflow_id`
- `job_id`
- `parent_event_id`
- `step_index`
- `step_name`
- `step_type`
- `handler`
- `event`
- `queue`
- `attempt`
- `input`
- `output`
- `state_before`
- `state_after`
- `context`
- `artifacts`
- `chunks`
- `error`
- `duration_ms`
- `created_at`

## Normalisoitu jälkipaketti

Käytä `workflow_trace()`-toimintoa, kun rakennat virheenjäljittäjän UI:

```php
$trace = Queuety::workflow_trace( $workflow_id );
```

Jälkipaketti sisältää:

- `workflow`
- `steps`
- `events`
- `jobs`
- `logs`
- `artifacts`
- `chunks`
- `signals`
- `wait_dependencies`

`steps` ryhmittelee tapahtumat vaiheen indeksin mukaan ja sisällyttää kunkin vaiheen viimeisimmän tärkeän tapahtuman.

## Vaiheen tilan haku

```php
$state = Queuety::workflow_state_at( $workflow_id, $step_index );
```

Tämä palauttaa vaiheen viimeisimmän valmistuneen tai jatketun tapahtuman julkisen `state_after`-tilan tai arvon `null`, jos tilaa ei tallennettu.

## Ajonaikaisen jäljen metatiedot

Käsittelijät voivat lisätä sovellustason jälkitietoja suorituksensa aikana:

```php
Queuety::trace_input( [ 'resolved' => $resolved_input ] );
Queuety::trace_context( [ 'ability' => 'content/load-post' ] );
Queuety::trace_output( [ 'post' => $post ] );
```

Vaiheenkäsittelijät voivat myös palauttaa varattuja jäljen metatietoja:

```php
return [
    'result' => 'done',
    '_queuety_trace' => [
        'input' => [ 'resolved' => $resolved_input ],
        'context' => [ 'node_id' => 'loadPost' ],
        'artifacts' => [
            [ 'key' => 'brief', 'kind' => 'markdown' ],
        ],
    ],
];
```

`_queuety_trace`-avain tallennetaan tapahtumalokiin, eikä sitä yhdistetä työnkulun tilaan.

## CLI

Näytä aikajana taulukkona:

```bash
wp queuety workflow timeline 42
```

Näytä vaiheen jälkeinen tila:

```bash
wp queuety workflow state-at 42 0
```

## Säilytys

Tapahtumalokeja kertyy ajan mittaan. Poista vanhoja jälkitapahtumia käyttämällä toimintoa `prune()`:

```php
$deleted = Queuety::workflow_events()->prune( 30 );
```
