🎃
Databricksの code内から、Jobで実行している場合の当該URLを発行する方法
結論
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