digdag

digdagのschedule機能について調査メモ

以下のようなprojectを作る。

$ tree
.
└── test.dig

あらかじめserverを起動しておく。

$ digdag server --memory
2017-07-21 15:26:52 +0900: Digdag v0.9.13
2017-07-21 15:26:53 +0900 [INFO] (main): secret encryption engine: disabled
2017-07-21 15:26:54 +0900 [INFO] (main): XNIO version 3.3.6.Final
2017-07-21 15:26:54 +0900 [INFO] (main): XNIO NIO Implementation Version 3.3.6.Final
2017-07-21 15:26:54 +0900 [INFO] (main): Starting server on 127.0.0.1:65432
2017-07-21 15:26:54 +0900 [INFO] (main): Bound on 127.0.0.1:65432 (api)

schedule:を指定しないworkflowの場合

test.dig
timezone: Asia/Tokyo

_export:
  A: 1000
  B: 2000

+echo_A:
  echo>: ${A}

+echo_B:
  echo>: ${B}

test-projectとしてpushする。

$ digdag push test-project
2017-07-21 15:43:41 +0900: Digdag v0.9.13
Creating .digdag/tmp/archive-227388074632667374.tar.gz...
  Archiving test.dig
Workflows:
  test.dig
Uploaded:
  id: 1
  name: test-project
  revision: 875fbaa9-eddd-4ae7-a424-76d591655b87
  archive type: db
  project created at: 2017-07-21T06:43:43Z
  revision updated at: 2017-07-21T06:43:43Z

Use `digdag workflows` to show all workflows.

workflow一覧を見てみる。
test-projectがproject名、testがworkflow名(.digファイルの名前と同じ)である。

$ digdag workflows
2017-07-21 15:45:04 +0900: Digdag v0.9.13
  test-project
    test

Use `digdag workflows <project-name> <name>` to show details.

schedule一覧を見てみる。
登録が無い。

$ digdag schedules
2017-07-21 15:45:23 +0900: Digdag v0.9.13
Schedules:
0 entries.
Use `digdag workflows [project-name] [workflow-name]` to show workflow details.

--session hourlyとしてstartしてみる。

$ digdag start test-project test --session hourly
2017-07-21 15:45:54 +0900: Digdag v0.9.13
Started a session attempt:
  session id: 1
  attempt id: 1
  uuid: 5e3ee879-d376-404f-81af-ab67c53d7e93
  project: test-project
  workflow: test
  session time: 2017-07-21 15:00:00 +0900
  retry attempt name:
  params: {}
  created at: 2017-07-21 15:45:55 +0900

* Use `digdag session 1` to show session status.
* Use `digdag task 1` and `digdag log 1` to show task status and logs.

serverの出力は以下。

2017-07-21 15:45:56 +0900 [INFO] (0057@[0:test-project]+test+echo_A): echo>: 1000
1000
2017-07-21 15:45:57 +0900 [INFO] (0057@[0:test-project]+test+echo_B): echo>: 2000
2000

再度実行しても、当時間のsessionが既に存在するためスキップされる。

$ digdag start test-project test --session hourly
2017-07-21 15:47:11 +0900: Digdag v0.9.13
error: A session for the requested session_time already exists (session_id=1, attempt_id=1, session_time=2017-07-21T15:00+09:00)
hint: use `digdag retry 1 --latest-revision --all` command to run the session again for the samesession_time

start --session hourlyしたことでscheduleに登録されるのか?と思いつつ
再度schedule一覧を見てみるが、やはり登録は無い。

$ digdag schedules
2017-07-21 15:50:05 +0900: Digdag v0.9.13
Schedules:
0 entries.
Use `digdag workflows [project-name] [workflow-name]` to show workflow details.

結論

schedule一覧に載せるためにはschedule:をworkflow(=.digファイル)に指定する必要がある。
schedule:無しでpushしても定期実行はできない。

schedule:を指定したworkflowの場合

$ cat test.dig
timezone: Asia/Tokyo

schedule:
  hourly>: 55:00

_export:
  A: 1000
  B: 2000

+echo_A:
  echo>: ${A}

+echo_B:
  echo>: ${B}

pushする。

$ digdag push test-project
2017-07-21 15:54:28 +0900: Digdag v0.9.13
Creating .digdag/tmp/archive-2310627203464168029.tar.gz...
  Archiving test.dig
Workflows:
  test.dig
Uploaded:
  id: 1
  name: test-project
  revision: 002718e7-4a55-4e08-8f06-de4854d0ad70
  archive type: db
  project created at: 2017-07-21T06:54:30Z
  revision updated at: 2017-07-21T06:54:30Z

Use `digdag workflows` to show all workflows.

schedule一覧を見てみると、登録がある。
毎時55分に実行されるよう指定したので次回実行は15:55になっている。

$ digdag schedules
2017-07-21 15:54:34 +0900: Digdag v0.9.13
Schedules:
  id: 1
  project: test-project
  workflow: test
  disabled at:
  next session time: 2017-07-21 15:00:00 +0900
  next scheduled to run at: 2017-07-21 15:55:00 +0900 (in 25s)

1 entries.
Use `digdag workflows [project-name] [workflow-name]` to show workflow details.

15:55になったら自動で実行される。

2017-07-21 15:55:00 +0900 [INFO] (scheduler-0): Starting a new session project id=1 workflow name=test session_time=2017-07-21T15:00:00+09:00
2017-07-21 15:55:02 +0900 [INFO] (0050@[0:test-project]+test+echo_A): echo>: 1000
1000
2017-07-21 15:55:02 +0900 [INFO] (0050@[0:test-project]+test+echo_B): echo>: 2000
2000

再度schedule一覧を見てみると、次回実行が16:55に更新されている。

$ digdag schedules
2017-07-21 15:55:06 +0900: Digdag v0.9.13
Schedules:
  id: 1
  project: test-project
  workflow: test
  disabled at:
  next session time: 2017-07-21 16:00:00 +0900
  next scheduled to run at: 2017-07-21 16:55:00 +0900 (in 59m 52s)

1 entries.
Use `digdag workflows [project-name] [workflow-name]` to show workflow details.

結論

schedule:をworkflowに指定するとpushするだけでschedule一覧に登録される。

schedule:を指定しているが-pでパラメータ指定が必要な場合。

$ cat test.dig
timezone: Asia/Tokyo

schedule:
  hourly>: 05:00

_export:
  A: 1000
  B: 2000

+echo_A:
  echo>: ${A}

+echo_B:
  echo>: ${B}

+echo_C:
  echo>: ${C}

pushする。

$ digdag push test-project
2017-07-21 16:06:49 +0900: Digdag v0.9.13
Creating .digdag/tmp/archive-644867903567847050.tar.gz...
  Archiving test.dig
Workflows:
  test.dig
Uploaded:
  id: 1
  name: test-project
  revision: 14a36033-9bf5-48f3-a932-2a98b92fa40d
  archive type: db
  project created at: 2017-07-21T07:06:51Z
  revision updated at: 2017-07-21T07:06:51Z

Use `digdag workflows` to show all workflows.

scheduleに登録がある。次回実行は16:05にセットされている。

$ digdag schedules
2017-07-21 16:06:54 +0900: Digdag v0.9.13
Schedules:
  id: 1
  project: test-project
  workflow: test
  disabled at:
  next session time: 2017-07-21 16:00:00 +0900
  next scheduled to run at: 2017-07-21 16:08:00 +0900 (in 1m 4s)

1 entries.
Use `digdag workflows [project-name] [workflow-name]` to show workflow details.

しかし-p C=3000できないので定期実行はコケる。

2017-07-21 16:08:02 +0900 [INFO] (0050@[0:test-project]+test+echo_A): echo>: 1000
1000
2017-07-21 16:08:02 +0900 [INFO] (0050@[0:test-project]+test+echo_B): echo>: 2000
2000
2017-07-21 16:08:02 +0900 [ERROR] (0050@[0:test-project]+test+C): Configuration error at task +test+C: Failed to evaluate a variable ${C} (ReferenceError: "C" is not defined) (config)
2017-07-21 16:08:03 +0900 [INFO] (0050@[0:test-project]+test^failure-alert): type: notify

しかもretryしようとしてもretryコマンドは-pを受け付けないのでやはりコケる。

$ digdag retry 1 --latest-revision --resume -p C=3000
2017-07-21 16:10:22 +0900: Digdag v0.9.13
Started a session attempt:
  session id: 1
  attempt id: 4
  uuid: 3a81c73c-08cb-493b-8842-26a9c6595367
  project: test-project
  workflow: test
  session time: 2017-07-21 16:00:00 +0900
  retry attempt name: c4389ddd-97ac-408e-8f53-926115368cb0
  params: {"last_session_time":"2017-07-21T15:00:00+09:00","next_session_time":"2017-07-21T17:00:00+09:00"}
  created at: 2017-07-21 16:10:23 +0900

* Use `digdag session 1` to show session status.
* Use `digdag task 4` and `digdag log 4` to show task status and logs.
2017-07-21 16:10:13 +0900 [INFO] (XNIO-1 task-13): Starting a new session project id=1 workflow name=test session_time=2017-07-21T16:00:00+09:00
2017-07-21 16:10:14 +0900 [ERROR] (0069@[0:test-project]+test+C): Configuration error at task +test+C: Failed to evaluate a variable ${C} (ReferenceError: "C" is not defined) (config)
2017-07-21 16:10:23 +0900 [INFO] (XNIO-1 task-17): Starting a new session project id=1 workflow name=test session_time=2017-07-21T16:00:00+09:00
2017-07-21 16:10:23 +0900 [ERROR] (0069@[0:test-project]+test+C): Configuration error at task +test+C: Failed to evaluate a variable ${C} (ReferenceError: "C" is not defined) (config)

既存のsessionを消すためにserverを再起動して再度pushする。
hourly>: 20:00に変更。

$ digdag push test-project
2017-07-21 16:18:50 +0900: Digdag v0.9.13
Creating .digdag/tmp/archive-5989548799081272140.tar.gz...
  Archiving test.dig
Workflows:
  test.dig
Uploaded:
  id: 1
  name: test-project
  revision: 9d7c1996-00f8-4e96-b2b8-564bb3439c2f
  archive type: db
  project created at: 2017-07-21T07:18:52Z
  revision updated at: 2017-07-21T07:18:52Z

Use `digdag workflows` to show all workflows.

次回実行は16:20にセットされている。

$ digdag schedules
2017-07-21 16:18:55 +0900: Digdag v0.9.13
Schedules:
  id: 1
  project: test-project
  workflow: test
  disabled at:
  next session time: 2017-07-21 16:00:00 +0900
  next scheduled to run at: 2017-07-21 16:20:00 +0900 (in 1m 3s)

1 entries.
Use `digdag workflows [project-name] [workflow-name]` to show workflow details.

ここで、定期実行を待たずに-pでパラメータを指定してstartしてみる。
するとエラー無く実行され、paramsの情報が入ったsessionが作成される。

$ digdag start test-project test --session hourly -p C=3000
2017-07-21 16:19:26 +0900: Digdag v0.9.13
Started a session attempt:
  session id: 1
  attempt id: 1
  uuid: 184cd3b0-4fd1-4b7e-bd80-10078b2724ad
  project: test-project
  workflow: test
  session time: 2017-07-21 16:00:00 +0900
  retry attempt name:
  params: {"C":"3000","last_session_time":"2017-07-21T15:00:00+09:00","next_session_time":"2017-07-21T17:00:00+09:00"}
  created at: 2017-07-21 16:19:28 +0900

* Use `digdag session 1` to show session status.
* Use `digdag task 1` and `digdag log 1` to show task status and logs.
2017-07-21 16:19:28 +0900 [INFO] (XNIO-1 task-9): Starting a new session project id=1 workflow name=test session_time=2017-07-21T16:00:00+09:00
2017-07-21 16:19:29 +0900 [INFO] (0055@[0:test-project]+test+echo_A): echo>: 1000
1000
2017-07-21 16:19:30 +0900 [INFO] (0055@[0:test-project]+test+echo_B): echo>: 2000
2000
2017-07-21 16:19:30 +0900 [INFO] (0055@[0:test-project]+test+C): echo>: 3000
3000

ただし、-pで渡す値を変えてもsessionが存在すると言われ、実行できない。

$ digdag start test-project test --session hourly -p C=4000
2017-07-21 16:24:48 +0900: Digdag v0.9.13
error: A session for the requested session_time already exists (session_id=1, attempt_id=1, session_time=2017-07-21T16:00+09:00)
hint: use `digdag retry 1 --latest-revision --all` command to run the session again for the same session_time

結論

  • -pでパラメータの指定が必要なworkflowはpushするだけでは定期実行されず、startコマンドで-pを指定する必要がある。
  • ただし、-pで渡す値を変えて別々のsessionのような扱いにすることはできない。

所感

はじめは-pで渡す値を変え、それぞれを別々のworkflowのような扱いで定期実行させようとしていたが、-pで渡す値を変えても作成されるsessionは1つなので無理だということがわかった。

-p-Pは.digに直接定義するのが憚られるもの(例えばawsのsecret access keyのような機密情報的なもの)をコマンドラインorファイルから渡すようにするためのものなのかな。

-pなしだとpushするだけでscheduleに登録されるので、-pなしでworkflowを作成できると楽そうだ。