LuigiのCentral Schedulerで見れること

[luigiでタスク実行にかかった時間を取得する](http://qiita.com/bwtakacy/items/9620d227251dee75be9f)の続き。

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`にアクセスすると以下のような画面が見える。

<img width="1325" alt="スクリーンショット 2016-11-07 22.55.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/82034/2785ae4b-4a2d-4083-19c6-7a0540d2e64d.png">

ここのタスクの親子関係が確認できる

<img width="1323" alt="スクリーンショット 2016-11-07 22.59.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/82034/5ee9f606-42dc-4e3d-3106-eed4db27a972.png">

### history画面

ドキュメントには書かれていないし、トップ画面からのリンクも存在しないが、`http://luigidが動作しているサーバのホスト名:8082/history`にアクセスすると、実行したタスクの起動時間、パラメータなどが見える。

これまたソースコードを読んで発見した。

<img width="1324" alt="スクリーンショット 2016-11-07 23.03.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/82034/604e7e41-6441-38c2-748b-19a181ef6ac7.png">

ここのリンク先でタスクのイベントが発生した時刻が見れる。

<img width="1326" alt="スクリーンショット 2016-11-07 23.04.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/82034/392dc8ac-a487-09db-d377-dc33b0cbfeb1.png">


### tasklist画面

同じく、ソースコードを読むことでしか分からないが、`http://luigidが動作しているサーバのホスト名:8082/tasklist`にアクセスすると、実行したタスクの一覧が出る。


<img width="1326" alt="スクリーンショット 2016-11-07 23.00.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/82034/76e6124d-fe50-d146-5264-d979f0330b40.png">

それぞれのリンク先にて、過去の実行時の実行時間の分布が見える。

<img width="1324" alt="スクリーンショット 2016-11-07 23.01.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/82034/48cc3ae0-f99b-29fc-8106-22b63ec1880e.png">

やった！！
これでローカルでイベントを取らなくても良くなるわ〜

きっとCentral SchedulerにPROCESSING_TIMEイベントを送って記録しているんだろうな〜

とか思ってソースコードを読むと、tasklistを表示するHTMLの中でタスクの開始時刻と終了時刻を引き算して普通に計算してたりする。

どういうこっちゃ・・・


以上。