luigiにあるCentral SchedulerというのがWebUI画面を持っているとのことで、これを使えばタスクの実行時間が確認できるのではないかと思って調査した結果をまとめる。
結果、確かにタスクの実行時間は確認できるのだが、その方法はドキュメントに書かれておらずソースコード上のコメント(!!)にしか書かれていなかった。
luigiさん、君はずっとそういうスタンスなのね。。。
以下、luigiのCentral Schedulerを動作させる手順。
インストール
luigi
$ pip install luigi
PostgreSQL
luigiのスケジューラの履歴情報を保存する先としてRDBが選べる。
SQLAlchemyを使っているので、Oracle, MySQL, PostgreSQL, SQLite, SQL Serverが使えるっぽい。
PostgreSQLを今回は使う。luigiがPostgreSQL接続用に使うpsycopg2もインストールしておく。
$ pip install psycopg2
$ brew install postgresql
$ cd Develop/PostgreSQL/pg_data
$ initdb --no-locale .
$ vim postgresql.conf
$ cd ..
$ pg_ctl start -D pg_data
PostgreSQLの設定
luigiの履歴情報を格納する先としてluigiデータベースを作成し、接続用ユーザluigiを作成しておく。
$ psql -d postgres
postgres=# CREATE USER luigi WITH PASSWORD 'luigi';
CREATE ROLE
postgres=# CREATE DATABASE luigi;
CREATE DATABASE
postgres=# GRANT ALL ON DATABASE luigi TO luigi;
GRANT
luigiの設定
luigi.cfgというファイルを作業ディレクトリに作成する。
$ cat luigi.cfg
[scheduler]
record_task_history = True
state_path = /Users/bwtakacy/Develop/luigi/luigi-state.pickle
[task_history]
db_connection = postgresql://luigi:luigi@localhost/luigi
起動・終了
luigidの起動
luigi.cfgを作ったディレクトリで以下のコマンドを実行する。
$ luigid --background --logdir /Users/bwtakacy/Develop/luigi/logs
luigidの終了
ドキュメントには書かれていないが、luigiのソースコードを見るとシグナルハンドラが設定されているので、SIGTERMかSIGINTを送ると正常終了できることがわかる。
$ pgrep -fl luigid
$ kill -15 <PID> ## kill -2 でもOK
なお、SIGKILLを送ってしまうと、スケジューラの状態を保存するpickleファイルを書き出す前にluigidプロセスが終了してしまうため、再起動時にタスクの実行状況が失われてしまう。
WebUI
トップ画面
http://luigidが動作しているサーバのホスト名:8082
にアクセスすると以下のような画面が見える。
ここのタスクの親子関係が確認できる
history画面
ドキュメントには書かれていないし、トップ画面からのリンクも存在しないが、http://luigidが動作しているサーバのホスト名:8082/history
にアクセスすると、実行したタスクの起動時間、パラメータなどが見える。
これまたソースコードを読んで発見した。
ここのリンク先でタスクのイベントが発生した時刻が見れる。
tasklist画面
同じく、ソースコードを読むことでしか分からないが、http://luigidが動作しているサーバのホスト名:8082/tasklist
にアクセスすると、実行したタスクの一覧が出る。
それぞれのリンク先にて、過去の実行時の実行時間の分布が見える。
やった!!
これでローカルでイベントを取らなくても良くなるわ〜
きっとCentral SchedulerにPROCESSING_TIMEイベントを送って記録しているんだろうな〜
とか思ってソースコードを読むと、tasklistを表示するHTMLの中でタスクの開始時刻と終了時刻を引き算して普通に計算してたりする。
どういうこっちゃ・・・
以上。