Cómo ver el historial de pasos de ejecución

Puedes recuperar el historial de una ejecución de flujo de trabajo especificado como una lista de entradas de pasos. Cada entrada de paso proporciona información que puede ayudarte a analizar, depurar u optimizar un flujo de trabajo. Por ejemplo, puedes confirmar qué pasos se ejecutaron en realidad y puedes determinar la duración y el éxito de un paso. Esto puede ser muy útil cuando se depura un flujo de trabajo no lineal grande o complicado (uno con muchas ramas paralelas, por ejemplo).

Una entrada de paso representa un paso real en el código fuente (por ejemplo, assign o call) o un bloque de instrucciones (por ejemplo, un bucle for o un bloque try/retry/except). Para obtener una lista completa de los tipos de pasos, consulta StepType.

Cómo recuperar entradas de pasos

Para recuperar entradas de pasos, envía una solicitud a la API de REST de ejecuciones de flujos de trabajo o a través de la consola de Google Cloud:

Información de entrada de pasos

Una entrada de paso incluye la siguiente información. Para obtener más detalles en este documento, consulta Ejemplos.

Nombre Es el nombre completo del recurso de la entrada del paso, que es un ID único con el siguiente formato y en el que STEPENTRY_ID es un contador creciente:

projects/PROJECT_NUMBER/locations/LOCATION/workflows/WORKFLOW_ID/executions/EXECUTION_ID/stepEntries/STEPENTRY_ID
Por ejemplo:

projects/123456789012/locations/us-central1/workflows/myFirstWorkflow/executions/ae8a66a1-cefa-4d16-8a2f-d50c712d8ef1/stepEntries/2
Fechas de creación y actualización Marcas de tiempo de la hora de creación de la entrada del paso y su actualización más reciente. Si se completó una entrada de paso, updateTime indica el tiempo de finalización.
Nombres de pasos y rutina Los nombres de la rutina y el paso a los que pertenece la entrada del paso. Un nombre de rutina es el nombre del subflujo de trabajo definido en el código fuente YAML o JSON. El nombre de la rutina de nivel superior es main.
Estado y tipo de progreso El estado de la entrada del paso (por ejemplo, si la entrada se realizó correctamente o falló, si una entrada de paso está en curso y el tipo de progreso). Para obtener una lista completa de los estados y los tipos de progreso, consulta Estado y ProgressType.
Información de navegación Es la posición de la entrada del paso para que puedas comprender mejor la jerarquía y el flujo del flujo de trabajo (por ejemplo, qué entradas de pasos aparecen antes o después de la entrada de paso actual, o cuáles son los elementos superiores o secundarios de la entrada del paso). Para obtener más información, consulta NavigationInfo.
Metadatos Datos relacionados con una entrada de paso iterativa, incluido un ID que indica el subproceso secundario (por ejemplo, que STEP_PARALLEL_BRANCH_ENTRY en STEP_PARALLEL_BRANCH) o la iteración de un bucle for (por ejemplo, que STEP_FOR_ITERATION en STEP_FOR). Para obtener más información, consulta StepEntryMetadata.
Excepciones Carga útil relacionada con cualquier excepción y que proporciona una descripción de por qué falló una entrada de paso.

Visualiza las entradas de pasos en la consola

Puedes ver las entradas de los pasos para la ejecución de un flujo de trabajo específico en la consola de Google Cloud.

  1. En la consola de Google Cloud, ve a la página Workflows.

    Ir a Workflows

  2. Haz clic en el nombre del flujo de trabajo para ir a la página Detalles del flujo de trabajo.

  3. Para obtener detalles sobre una ejecución en particular, haz clic en su ID de ejecución.

    En la pestaña Resumen, se proporciona información sobre la ejecución general, incluida cualquier excepción que haya generado la falla de la ejecución. Para obtener más información, consulta Mensajes de error de ejecución.

  4. Para ver el historial de ejecuciones de flujos de trabajo como una lista de entradas de pasos, haz clic en la pestaña Pasos.

    Se enumeran todas las entradas de los pasos para la ejecución del flujo de trabajo.

  5. Si deseas filtrar las entradas del paso, usa el campo Filtro en la parte superior de la tabla para seleccionar una propiedad y un valor, por ejemplo, State: Failed.

  6. Para mostrar vínculos de cualquier entrada de paso Parent, secundario, Next y Previous, haz clic en una entrada de paso específica.

    Si haces clic en un vínculo, los demás se actualizarán automáticamente. Por ejemplo, superior vinculará al elemento superior de la entrada del paso en la que hiciste clic.

  7. El panel de visualización proporciona una representación gráfica de los pasos en el flujo de trabajo y te ayuda a comprender la ruta del flujo de trabajo.

    Ejemplo de panel de visualización

    Haz clic en el diagrama para ampliarlo:

    Panel de visualización que muestra el flujo de trabajo con pasos con errores

    Ten en cuenta que la visualización puede ser diferente de las entradas de los pasos. Por ejemplo, un bloque for se representa como un solo componente en la visualización. Sin embargo, según la cantidad de iteraciones, puede haber varias entradas de paso.

    En el panel, puedes hacer lo siguiente:

    • Acercar o alejar la visualización
    • Contraer o expandir las entradas de los pasos principales
    • Hacer clic en una entrada de paso y ver las entradas anterior y siguiente
    • Confirma las entradas de pasos correctas y fallidas como se indica con una marca de verificación verde o un signo de exclamación rojo.
    • Para cerrar el panel Visualización, haz clic en la flecha de expansión ; vuelve a hacer clic en ella para abrir el panel.

Antes de recuperar una entrada de paso

Si quieres obtener los permisos que necesitas para recuperar una entrada de paso, pídele a tu administrador que te otorgue el rol de IAM Administrador de Workflows (workflows.stepEntries.get) en tu proyecto. Para obtener más información sobre cómo otorgar roles, consulta Cómo administrar el acceso.

Es posible que también puedas obtener los permisos necesarios a través de los roles personalizados o de otros roles predefinidos.

Recupera una entrada de paso

Si deseas recuperar una entrada de paso para una ejecución de flujo de trabajo determinada, usa el método projects.locations.workflows.executions.stepEntries.get.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • PROJECT_NUMBER: El número de proyecto de Google Cloud que aparece en la página Configuración de IAM y administración
  • LOCATION: Es la región en la que se implementa el flujo de trabajo, por ejemplo, us-central1.
  • WORKFLOW_ID: Es el nombre definido por el usuario para el flujo de trabajo, por ejemplo, myFirstWorkflow.
  • EXECUTION_ID: Es el ID único de la ejecución de un flujo de trabajo que se muestra después de ejecutar un flujo de trabajo.
  • STEPENTRY_ID: Es el ID único de una entrada de paso, por ejemplo, 1.

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/workflows/WORKFLOW_ID/executions/EXECUTION_ID/stepEntries/STEPENTRY_ID",
  "createTime": "2023-10-19T13:49:56.522717646Z",
  "updateTime": "2023-10-19T13:49:56.525439354Z",
  "routine": "main",
  "step": "checkSearchTermInInput",
  "stepType": "STEP_CONDITION",
  "state": "STATE_SUCCEEDED",
  "entryId": "2",
  "navigationInfo": {
    "children": [
      "3"
    ],
    "parent": "1",
    "next": "3",
    "previous": "1"
  }
}

Antes de enumerar las entradas de pasos

Si quieres obtener los permisos que necesitas para enumerar las entradas de pasos, pídele a tu administrador que te otorgue el rol de IAM Administrador de Workflows (workflows.stepEntries.list) en tu proyecto. Para obtener más información sobre cómo otorgar roles, consulta Cómo administrar el acceso.

Es posible que también puedas obtener los permisos necesarios a través de los roles personalizados o de otros roles predefinidos.

Enumera las entradas de pasos

Si quieres enumerar las entradas de pasos para una ejecución de flujo de trabajo determinada, usa el método projects.locations.workflows.executions.stepEntries.list. De forma predeterminada, los resultados se muestran en orden ascendente de los createTime de las entradas de pasos.

Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

  • PROJECT_NUMBER: El número de proyecto de Google Cloud que aparece en la página Configuración de IAM y administración
  • LOCATION: Es la región en la que se implementa el flujo de trabajo, por ejemplo, us-central1.
  • WORKFLOW_ID: Es el nombre definido por el usuario para el flujo de trabajo, por ejemplo, myFirstWorkflow.
  • EXECUTION_ID: Es el ID único de la ejecución de un flujo de trabajo que se muestra después de ejecutar un flujo de trabajo.

Para enviar tu solicitud, expande una de estas opciones:

Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

{
  "stepEntries": [
    {
      "name": "projects/PROJECT_NUMBER/locations/LOCATION/workflows/WORKFLOW_ID/executions/EXECUTION_ID/stepEntries/1",
      "createTime": "2023-10-19T13:49:56.522705770Z",
      "updateTime": "2023-10-19T13:49:56.525439429Z",
      "routine": "main",
      "step": "checkSearchTermInInput",
      "stepType": "STEP_SWITCH",
      "state": "STATE_SUCCEEDED",
      "entryId": "1",
      "navigationInfo": {
        "children": [
          "2"
        ],
        "next": "2"
      }
    },
    {
      "name": "projects/PROJECT_NUMBER/locations/LOCATION/workflows/WORKFLOW_ID/executions/EXECUTION_ID/stepEntries/2",
      "createTime": "2023-10-19T13:49:56.522717646Z",
      "updateTime": "2023-10-19T13:49:56.525439354Z",
      "routine": "main",
      "step": "checkSearchTermInInput",
      "stepType": "STEP_CONDITION",
      "state": "STATE_SUCCEEDED",
      "entryId": "2",
      "navigationInfo": {
        "children": [
          "3"
        ],
        "parent": "1",
        "next": "3",
        "previous": "1"
      }
    },
    {
      "name": "projects/PROJECT_NUMBER/locations/LOCATION/workflows/WORKFLOW_ID/executions/EXECUTION_ID/stepEntries/3",
      "createTime": "2023-10-19T13:49:56.525379814Z",
      "updateTime": "2023-10-19T13:49:56.525439285Z",
      "routine": "main",
      "step": "checkSearchTermInInput.condition1",
      "stepType": "STEP_ASSIGN",
      "state": "STATE_SUCCEEDED",
      "entryId": "3",
      "navigationInfo": {
        "parent": "2",
        "next": "4",
        "previous": "2"
      }
    },
    {
      "name": "projects/PROJECT_NUMBER/locations/LOCATION/workflows/WORKFLOW_ID/executions/EXECUTION_ID/stepEntries/4",
      "createTime": "2023-10-19T13:49:56.525440360Z",
      "updateTime": "2023-10-19T13:49:56.716973793Z",
      "routine": "main",
      "step": "readWikipedia",
      "stepType": "STEP_CALL",
      "state": "STATE_SUCCEEDED",
      "entryId": "4",
      "navigationInfo": {
        "next": "5",
        "previous": "3"
      }
    },
    {
      "name": "projects/PROJECT_NUMBER/locations/LOCATION/workflows/WORKFLOW_ID/executions/EXECUTION_ID/stepEntries/5",
      "createTime": "2023-10-19T13:49:56.717263008Z",
      "updateTime": "2023-10-19T13:49:56.717353199Z",
      "routine": "main",
      "step": "returnOutput",
      "stepType": "STEP_RETURN",
      "state": "STATE_SUCCEEDED",
      "entryId": "5",
      "navigationInfo": {
        "previous": "4"
      }
    }
  ],
  "totalSize": 5
}

Ejemplos

Flujo de trabajo con un bloque for

Flujo de trabajo

YAML

- assignStep:
    assign:
      - sum: 0
- forStep:
    for:
      range: [1, 2]
      value: v
      steps:
        - sumStep:
            assign:
              - sum: ${sum + v}
- returnStep:
    return: ${sum}

JSON

[
  {
    "assignStep": {
      "assign": [
        {
          "sum": 0
        }
      ]
    }
  },
  {
    "forStep": {
      "for": {
        "range": [
          1,
          2
        ],
        "value": "v",
        "steps": [
          {
            "sumStep": {
              "assign": [
                {
                  "sum": "${sum + v}"
                }
              ]
            }
          }
        ]
      }
    }
  },
  {
    "returnStep": {
      "return": "${sum}"
    }
  }
]

Diagrama

Flujo de trabajo con un bloque for

Entradas de pasos

  {
  "stepEntries": [
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/74785b43-5b9f-4adf-bde7-a9880d0e100a/stepEntries/1",
      "createTime": "2023-10-20T17:19:37.889232683Z",
      "updateTime": "2023-10-20T17:19:37.889275457Z",
      "routine": "main",
      "step": "assignStep",
      "stepType": "STEP_ASSIGN",
      "state": "STATE_SUCCEEDED",
      "entryId": "1",
      "navigationInfo": {
        "next": "2"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/74785b43-5b9f-4adf-bde7-a9880d0e100a/stepEntries/2",
      "createTime": "2023-10-20T17:19:37.889276124Z",
      "updateTime": "2023-10-20T17:19:37.889474759Z",
      "routine": "main",
      "step": "forStep",
      "stepType": "STEP_FOR",
      "state": "STATE_SUCCEEDED",
      "entryId": "2",
      "navigationInfo": {
        "children": [
          "3",
          "5"
        ],
        "next": "3",
        "previous": "1"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/74785b43-5b9f-4adf-bde7-a9880d0e100a/stepEntries/3",
      "createTime": "2023-10-20T17:19:37.889313107Z",
      "updateTime": "2023-10-20T17:19:37.889382353Z",
      "routine": "main",
      "step": "forStep",
      "stepType": "STEP_FOR_ITERATION",
      "state": "STATE_SUCCEEDED",
      "entryId": "3",
      "navigationInfo": {
        "children": [
          "4"
        ],
        "parent": "2",
        "next": "4",
        "previous": "2"
      },
      "stepEntryMetadata": {
        "progressType": "PROGRESS_TYPE_FOR",
        "progressNumber": "1"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/74785b43-5b9f-4adf-bde7-a9880d0e100a/stepEntries/4",
      "createTime": "2023-10-20T17:19:37.889317653Z",
      "updateTime": "2023-10-20T17:19:37.889382265Z",
      "routine": "main",
      "step": "sumStep",
      "stepType": "STEP_ASSIGN",
      "state": "STATE_SUCCEEDED",
      "entryId": "4",
      "navigationInfo": {
        "parent": "3",
        "next": "5",
        "previous": "3"
      },
      "stepEntryMetadata": {
        "progressType": "PROGRESS_TYPE_FOR",
        "progressNumber": "1"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/74785b43-5b9f-4adf-bde7-a9880d0e100a/stepEntries/5",
      "createTime": "2023-10-20T17:19:37.889383134Z",
      "updateTime": "2023-10-20T17:19:37.889474707Z",
      "routine": "main",
      "step": "forStep",
      "stepType": "STEP_FOR_ITERATION",
      "state": "STATE_SUCCEEDED",
      "entryId": "5",
      "navigationInfo": {
        "children": [
          "6"
        ],
        "parent": "2",
        "next": "6",
        "previous": "4"
      },
      "stepEntryMetadata": {
        "progressType": "PROGRESS_TYPE_FOR",
        "progressNumber": "2"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/74785b43-5b9f-4adf-bde7-a9880d0e100a/stepEntries/6",
      "createTime": "2023-10-20T17:19:37.889384893Z",
      "updateTime": "2023-10-20T17:19:37.889474649Z",
      "routine": "main",
      "step": "sumStep",
      "stepType": "STEP_ASSIGN",
      "state": "STATE_SUCCEEDED",
      "entryId": "6",
      "navigationInfo": {
        "parent": "5",
        "next": "7",
        "previous": "5"
      },
      "stepEntryMetadata": {
        "progressType": "PROGRESS_TYPE_FOR",
        "progressNumber": "2"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/74785b43-5b9f-4adf-bde7-a9880d0e100a/stepEntries/7",
      "createTime": "2023-10-20T17:19:37.889475882Z",
      "updateTime": "2023-10-20T17:19:37.889483477Z",
      "routine": "main",
      "step": "returnStep",
      "stepType": "STEP_RETURN",
      "state": "STATE_SUCCEEDED",
      "entryId": "7",
      "navigationInfo": {
        "previous": "6"
      }
    }
  ],
  "totalSize": 7
}

Flujo de trabajo con una llamada de subflujo de trabajo

Flujo de trabajo

YAML

main:
  steps:
    - callStep:
        call: square
        args:
          x: 10
        result: t
    - retStep:
        return: ${t}
square:
  params: [x]
  steps:
    - assignStep:
        assign:
          - y: ${x*x}
    - retStep:
        return: ${y}

JSON

{
  "main": {
    "steps": [
      {
        "callStep": {
          "call": "square",
          "args": {
            "x": 10
          },
          "result": "t"
        }
      },
      {
        "retStep": {
          "return": "${t}"
        }
      }
    ]
  },
  "square": {
    "params": [
      "x"
    ],
    "steps": [
      {
        "assignStep": {
          "assign": [
            {
              "y": "${x*x}"
            }
          ]
        }
      },
      {
        "retStep": {
          "return": "${y}"
        }
      }
    ]
  }
}

Diagrama

Flujo de trabajo con una llamada de subflujo de trabajo

Entradas de pasos

{
  "stepEntries": [
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/69da2159-1039-4f88-8d8a-12baf398f372/stepEntries/1",
      "createTime": "2023-10-21T15:25:55.406007695Z",
      "updateTime": "2023-10-21T15:25:55.412984492Z",
      "routine": "main",
      "step": "callStep",
      "stepType": "STEP_CALL",
      "state": "STATE_SUCCEEDED",
      "entryId": "1",
      "navigationInfo": {
        "children": [
          "2",
          "3"
        ],
        "next": "2"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/69da2159-1039-4f88-8d8a-12baf398f372/stepEntries/2",
      "createTime": "2023-10-21T15:25:55.412921902Z",
      "updateTime": "2023-10-21T15:25:55.412967631Z",
      "routine": "square",
      "step": "assignStep",
      "stepType": "STEP_ASSIGN",
      "state": "STATE_SUCCEEDED",
      "entryId": "2",
      "navigationInfo": {
        "parent": "1",
        "next": "3",
        "previous": "1"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/69da2159-1039-4f88-8d8a-12baf398f372/stepEntries/3",
      "createTime": "2023-10-21T15:25:55.412968712Z",
      "updateTime": "2023-10-21T15:25:55.412978913Z",
      "routine": "square",
      "step": "retStep",
      "stepType": "STEP_RETURN",
      "state": "STATE_SUCCEEDED",
      "entryId": "3",
      "navigationInfo": {
        "parent": "1",
        "next": "4",
        "previous": "2"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/69da2159-1039-4f88-8d8a-12baf398f372/stepEntries/4",
      "createTime": "2023-10-21T15:25:55.412992302Z",
      "updateTime": "2023-10-21T15:25:55.412998396Z",
      "routine": "main",
      "step": "retStep",
      "stepType": "STEP_RETURN",
      "state": "STATE_SUCCEEDED",
      "entryId": "4",
      "navigationInfo": {
        "previous": "3"
      }
    }
  ],
  "totalSize": 4
}

Flujo de trabajo con una entrada de paso con errores

Flujo de trabajo

YAML

- tryStep:
    try:
      return: ${1 / 0}
    except:
      return: 0

JSON

[
  {
    "tryStep": {
      "try": {
        "return": "${1 / 0}"
      },
      "except": {
        "return": 0
      }
    }
  }
]

Diagrama

Flujo de trabajo con una entrada de paso con errores

Entradas de pasos

{
  "stepEntries": [
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/8ec49dae-ab0c-4b55-b1c4-b809244be913/stepEntries/1",
      "createTime": "2023-10-20T18:06:50.395938752Z",
      "updateTime": "2023-10-20T18:06:50.396525946Z",
      "routine": "main",
      "step": "tryStep",
      "stepType": "STEP_TRY_RETRY_EXCEPT",
      "state": "STATE_SUCCEEDED",
      "entryId": "1",
      "navigationInfo": {
        "children": [
          "2",
          "4"
        ],
        "next": "2"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/8ec49dae-ab0c-4b55-b1c4-b809244be913/stepEntries/2",
      "createTime": "2023-10-20T18:06:50.395942598Z",
      "updateTime": "2023-10-20T18:06:50.396497992Z",
      "routine": "main",
      "step": "tryStep",
      "stepType": "STEP_TRY",
      "state": "STATE_FAILED",
      "entryId": "2",
      "navigationInfo": {
        "children": [
          "3"
        ],
        "parent": "1",
        "next": "3",
        "previous": "1"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/8ec49dae-ab0c-4b55-b1c4-b809244be913/stepEntries/3",
      "createTime": "2023-10-20T18:06:50.395944871Z",
      "updateTime": "2023-10-20T18:06:50.396497499Z",
      "routine": "main",
      "step": "tryStep.try",
      "stepType": "STEP_RETURN",
      "state": "STATE_FAILED",
      "exception": {
        "payload": "{\"message\":\"ZeroDivisionError: division by zero\",\"tags\":[\"ZeroDivisionError\",\"ArithmeticError\"]}"
      },
      "entryId": "3",
      "navigationInfo": {
        "parent": "2",
        "next": "4",
        "previous": "2"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/8ec49dae-ab0c-4b55-b1c4-b809244be913/stepEntries/4",
      "createTime": "2023-10-20T18:06:50.396506860Z",
      "updateTime": "2023-10-20T18:06:50.396525900Z",
      "routine": "main",
      "step": "tryStep",
      "stepType": "STEP_EXCEPT",
      "state": "STATE_SUCCEEDED",
      "entryId": "4",
      "navigationInfo": {
        "children": [
          "5"
        ],
        "parent": "1",
        "next": "5",
        "previous": "3"
      }
    },
    {
      "name": "projects/200478149810/locations/us-central1/workflows/ck-for-block/executions/8ec49dae-ab0c-4b55-b1c4-b809244be913/stepEntries/5",
      "createTime": "2023-10-20T18:06:50.396516994Z",
      "updateTime": "2023-10-20T18:06:50.396525818Z",
      "routine": "main",
      "step": "tryStep.except",
      "stepType": "STEP_RETURN",
      "state": "STATE_SUCCEEDED",
      "entryId": "5",
      "navigationInfo": {
        "parent": "4",
        "previous": "4"
      }
    }
  ],
  "totalSize": 5
}

¿Qué sigue?