🎃

Databricksの code内から、Jobで実行している場合の当該URLを発行する方法

2025/03/08に公開

結論

def get_databrikcs_run_url():
    """
    Retrieve the Databricks run URL.

    Returns:
        str: The URL of the current Databricks job run.
    """
    try:
        metadata = json.loads(
            dbutils.notebook.entry_point.getDbutils().notebook().getContext().toJson()
        )
        hostname = (
            dbutils.notebook.entry_point.getDbutils()
            .notebook()
            .getContext()
            .workspaceId()
            .get()
        )
        job_id = metadata["tags"]["jobId"]
        run_id = metadata["currentRunId"]["id"]
        run_url = f"https://{hostname}/jobs/{job_id}/runs/{run_id}"
    except:  # it fails when running from Databricks Browser
        raise ValueError("Unable to retrieve Databricks run URL.")
    return run_url

解説

Databricks jobs/workflowsにはエラー通知機能があり、例えばteams/slackのwebhookに対してエラーメッセージを発行したり、メールに対して通知を送ることができます。
ただしwarningレベルの通知は現状存在しないかつ、何か特殊なケースから通知を送信したい時には、自分でコードを書かなくてはいけません。
上記はそのコードの一例です。これを使うと run_urlから、直接そのrunに飛ぶことができます。

ただし、dbutils.notebook.entry_point.getDbutils().notebook().getContext().toJson()が若干曲者で、notebookでdirectに打ち込んだ時と、job上で実行した時に出力内容が異なります。とあるkeyがないとかではなく、構造まで異なります。例えばcurretRunIdは直接idを参照していたところから、なぜかcurretRunId.idという形でもう一階層掘り下げられていたり、この点がわかりにくと感じました。またそれに関してドキュメントを見つけられなかったので、少し不安材料が残ります。
上記はコード一発で済ませる方法でしたが、jobから引数を渡す時に {{job_id}}や{{run_id}}と書き込むことtでidを渡せると同時に、公式への明記とわかりやすさを兼ね備えているので、こうした方が安全かもしれません。

Discussion