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.
- 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.
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.
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}{
"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ável | O que guarda | Vazio quando |
|---|---|---|
WAISO_RUN_ID | Esta 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_ID | A execução de flow a que este passo pertence. | O código não é um passo de flow. |
WAISO_ROOT_FLOW_RUN_ID | A 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_ID | O id do passo no flow. | O código não é um passo de flow. |
WAISO_LOOP_INDEX | A posição do item no loop mais interno, a partir de 0. | O passo não está dentro de um loop. |
WAISO_PROJECT_ID | O projeto a que a execução pertence. | Nunca. |
WAISO_ITEM_PATH | O caminho do script (ou flow) salvo, como reports/daily. | O código nunca foi salvo. |
WAISO_TRIGGER | Como a execução começou (as palavras abaixo). | Nunca. |
WAISO_SCHEDULE_ID | O agendamento que disparou. | O gatilho não é schedule. |
Como uma execução começou
| Gatilho | Iniciada por |
|---|---|
manual | Uma pessoa, pelo editor, pela página do flow ou pela página de execuções. |
api | Uma chamada ao endpoint de API do item. |
schedule | Um agendamento; WAISO_SCHEDULE_ID diz qual. |
flow | Um flow, como um dos passos ou como subflow. |
event | Um gatilho de evento: um e-mail, uma mudança no banco ou uma mensagem MQTT. |
link | Um visitante num link compartilhado. |
script | Outro 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:
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.