Application Debugging and Visualisation
Application DAG (directed acyclic graph) structures can get quite complex, especially with applications with over five tasks or nested DAGs.
To view individual task logs you can use the plane
command line utility. However, for a more holistic overview of your
application and its logs, Flightdeck has a built-in debug platform.
This document describes how to use the Flightdeck to debug your applications.
Flightdeck interface​
To view your application visualization and log overview, head over to Flightdeck and click on the projects tab.
From there click on the company associated with your account and next on the tenant in which your application is deployed. You can see a list of all the applications in the selected tenant. Select the application you are working on.
You are presented with a visual representation of your application. This is an interactive visualization that allows you to zoom and pan.
Each green block represents a task instance. Each blue block represents the application entry point or output.
Viewing Logs​
You can view the logs for each task by clicking the i
icon next to its name.
For example, the screenshot below shows the log for task_a
. You can view
multiple logs at the same time to follow requests through your DAG. The log
overview auto-updates as new logs come in. By default, the last 100 lines are
shown. You can change this by updating the number in the messages field.
Complex DAG structures​
Seaplane supports complicated DAG structures. Viewing your Flightdeck visualizations can be helpful in understanding which tasks are wired together and if the overall structure is as intended. Especially when working with nested DAGs and multiple inputs and outputs per task.
For example, the following code snippet is visualized in Flightdeck as follows.
from seaplane.apps import App
# create task definiton
def my_task(message):
return "hello world"
# create DAG definition
def dag_def(app, name, input):
# create DAG and wire in my_tasks
dag = app.dag(name)
out = dag.task(my_task, [input], instance_name="task-a")
out1 = dag.task(my_task, [out], instance_name="task-b")
out2 = dag.task(my_task, [out], instance_name="task-c")
out3 = dag.task(my_task, [out], instance_name="task-d")
out4 = dag.task(my_task, [out1, out2, out3], instance_name="task-e")
# set dag response and return dag
dag.respond(out4)
return dag
# create application
app = App("demo-app")
# create new base dag
dag = app.dag("my-dag")
# create wires in primary DAG
out1 = dag.task(my_task, [app.input()], instance_name="task-a")
dag_out1 = dag_def(app, "my-dag-2", out1)
out2 = dag.task(my_task, [dag_out1], instance_name="task-b")
# set app response and run app
app.respond(out2)
app.run()
Model Hub Vizualisation​
Using the Seaplane model hub allows you to use any of the available models in the Seaplane platform asynchronously. While initializing it is a single line of code, in the backend this generates multiple tasks to handle the asynchronous nature of the request. In Flightdeck this is visualized as follows.