ScriptsReferência

O que uma execução sabe sobre si

O código muitas vezes precisa saber qual execução ele é: para gravar o id da execução numa linha de log, montar uma chave única por item de loop, distinguir uma execução agendada de um teste, ou apontar de volta para a execução que mandou um e-mail. Toda execução leva esse contexto — como nove variáveis de ambiente e como uma chamada na biblioteca de cada linguagem, com os mesmos valores.

O que você vai aprender
  • Ler o contexto da execução em Python, TypeScript, JavaScript, C, C++, Go, Bash, PHP e Ruby
  • Saber o que cada campo guarda e quando fica vazio
  • Relacionar o índice do loop com o #N que a página de execuções mostra
  • Conhecer os nomes de variável reservados

O contexto de uma execução

Os valores são os que a página de execuções mostra: WAISO_RUN_ID é o id que você abre nessa página, um passo de flow vê a execução do flow a que pertence e a execução de flow mais externa acima dela, e o gatilho diz como a execução começou. Nada no contexto é segredo — ids, um caminho e uma palavra — então é seguro imprimir e enviar a outro sistema. Entradas, saídas e valores de variáveis nunca fazem parte dele.

ExecuçõesToda execução de script e flow deste projeto
Live
Busque nome ou valor · amount>100Ctrl KHoje7 dias30 diasTudo
Tipo: todosStatus: todosAguardando você 1
campaignFlowIniciado porAgendamentoDuração713msRodou emhá 5 hStatusSucesso
load_customerspasso 1 de campaignIniciado porcampaignDuração38msRodou emhá 5 hStatusSucesso
send_offer ×4passo 2 · loopIniciado porcampaignDuração188msRodou emhá 5 hStatusSucesso
approvalFlowIniciado porana@shop.devDuração174msRodou emhá 5 hStatusAguardando
report.pyIniciado porAgendamentoDuração6.7sRodou emhá 4 hStatusSucesso
broken.pyIniciado porana@shop.devDuração877msRodou emhá 26 minStatusFalhou
A página de execuções: o id de cada linha é o WAISO_RUN_ID que o código dela leu, e as linhas de um loop levam #1, #2…

Leia na sua linguagem

O Python tem waiso.run.context(); TypeScript e JavaScript importam run de waiso e chamam run.context(); o C tem waiso_run_context(), o C++ waiso::run::context(), o Go waiso.RunContext(), o PHP Waiso::runContext() e o Ruby Waiso.run_context. Em Bash, leia as variáveis diretamente.

who_am_i.py
import waiso

def main():
    ctx = waiso.run.context()
    print("run", ctx.run_id, "started by", ctx.trigger)
    if ctx.flow_run_id:                     # None outside a flow
        print("step", ctx.flow_step_id, "of flow run", ctx.flow_run_id)
    if ctx.loop_index is not None:          # 0-based: the Runs page shows #1 for 0
        print("loop item #", ctx.loop_index + 1)
    return {"runId": ctx.run_id, "trigger": ctx.trigger, "itemPath": ctx.item_path}
Saída esperadaSucessoExecutado pelo editor
{
  "runId": "0f0b6c1e-…",
  "trigger": "manual",
  "itemPath": "reports/who_am_i"
}

Os campos

Python, C, C++ e Ruby dão aos campos nomes em snake case (run_id); TypeScript, JavaScript e PHP em camel case (runId); o Go com maiúsculas (RunID). Um valor vazio é null / None / NULL / nil na biblioteca e uma string vazia no ambiente.

VariávelO que guardaVazio quando
WAISO_RUN_IDEsta execução, como na página de execuções.Um passo de transformação (ele não roda código próprio).
WAISO_FLOW_RUN_IDA execução de flow a que este passo pertence.O código não é um passo de flow.
WAISO_ROOT_FLOW_RUN_IDA execução de flow mais externa: a mesma da execução do flow, a não ser que um subflow a tenha iniciado.O código não é um passo de flow.
WAISO_FLOW_STEP_IDO id do passo no flow.O código não é um passo de flow.
WAISO_LOOP_INDEXA posição do item no loop mais interno, a partir de 0.O passo não está dentro de um loop.
WAISO_PROJECT_IDO projeto a que a execução pertence.Nunca.
WAISO_ITEM_PATHO caminho do script (ou flow) salvo, como reports/daily.O código nunca foi salvo.
WAISO_TRIGGERComo a execução começou (as palavras abaixo).Nunca.
WAISO_SCHEDULE_IDO agendamento que disparou.O gatilho não é schedule.

Como uma execução começou

GatilhoIniciada por
manualUma pessoa, pelo editor, pela página do flow ou pela página de execuções.
apiUma chamada ao endpoint de API do item.
scheduleUm agendamento; WAISO_SCHEDULE_ID diz qual.
flowUm flow, como um dos passos ou como subflow.
eventUm gatilho de evento: um e-mail, uma mudança no banco ou uma mensagem MQTT.
linkUm visitante num link compartilhado.
scriptOutro script, pela chamada de execução da biblioteca.

Loops e subflows

Dentro de um loop o índice começa em 0, enquanto a página de execuções e a visão da execução numeram os itens a partir de 1: WAISO_LOOP_INDEX=0 é a linha marcada #1. Num loop dentro de outro loop, o índice é o do loop interno. O id da execução do flow mais o índice formam uma chave única por item, que é o que uma chave de idempotência ou um nome de arquivo por item precisa:

send_one.py
import os

def main(email: str):
    # The same values, read straight from the environment (empty string = not applicable).
    flow_run = os.environ["WAISO_FLOW_RUN_ID"]
    index = int(os.environ["WAISO_LOOP_INDEX"])     # 0, 1, 2…
    key = f"{flow_run}:{index}"                     # unique per item of this flow run
    print("sending", email, "as", key)
    return {"key": key}

Um subflow é uma execução de flow própria: os passos dele veem a execução do subflow como WAISO_FLOW_RUN_ID e o flow que o chamou como WAISO_ROOT_FLOW_RUN_ID, não importa a profundidade do aninhamento. Um flow que pausa numa aprovação mantém os ids: os passos depois da decisão veem a mesma execução de flow e a mesma raiz.

Nomes reservados

  • Os nove nomes pertencem à execução. Uma variável nova não pode usar nenhum deles: salvar é recusado com variable_name_reserved, também ao importar, copiar e sincronizar com o Git.
  • Uma variável que já tinha um desses nomes continua na página de Variáveis com a marca Nome reservado, mas nunca chega ao código: o valor da própria execução vence. Renomeie-a.
  • Ler o contexto não custa nada: os valores já estão no ambiente quando o seu código começa.