継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

redash のデータソースで Python を使ってみる

タダです.

redash のデータソースとして Python を使ってみる機会があったので,この記事にまとめていきます.なお,redash のバージョンは 8.0.0+b32245 で確認しています.

Python をデータソースに追加

デフォルトでは,データソースに Python がないため追加の設定が必要です.自分の確認環境は EC2 の AMI を使っているため /opt/redash/env に下記の記述を追記後,docker-compse up -d で起動し直せばデータソースに Python が追加されます.

REDASH_ADDITIONAL_QUERY_RUNNERS=redash.query_runner.python

追加されたデータソース画面

f:id:sadayoshi_tada:20211211141627p:plain

データソース追加後のコードを書いてみる

別々のクエリの結果をテーブル表示したいみたいな場合は下記のようなコードで表示できました.この場合は ALB のログの中から0.5秒以上のログと全件のログを出して表示させるみたいなことができます.

queryResults1 = execute_query('データソース名',"SELECT COUNT(*) FROM alb_logs WHERE url LIKE '%/hoge/hoge?%' target_processing_time >= 0.5 AND target_status_code != '-'")
queryResults2 = execute_query('データソース名',"SELECT COUNT(*) FROM alb_logs WHERE url LIKE '%/hoge/hoge?%' AND target_status_code != '-'")

results = {}
for rows1 in queryResults1['rows']:
    for rows2 in queryResults2['rows']:
        add_result_row(result, {
            'over': rows1['_col0'],
            'all': rows2['_col0']
        })
    break

add_result_column(result, 'all', '', 'string')
add_result_column(result, 'over', '', 'string')

クエリ結果

f:id:sadayoshi_tada:20211211150752p:plain

また, 上記のクエリを複数保存していたのを合体して表にさせることも下記のようなクエリでできます.

queryResults1 = get_query_result(redash のクエリ ID)
queryResults2 = get_query_result(redash のクエリ ID)

results = {}
for rows1 in queryResults['rows']:
    add_result_row(result, {
        'over': rows1['over'],
        'all': rows1['all'] 
    })

for rows2 in queryResults2['rows']:
    add_result_row(result, {
        'over': rows2['over'],
        'all': rows2['all'] 
    })

add_result_column(result, 'all', '', 'string')
add_result_column(result, 'over', '', 'string')

クエリ結果

f:id:sadayoshi_tada:20211211151020p:plain

まとめ

redash のデータソースとして Python を使うことがあったのでまとめました.SQL だけでなく Python のコードを書いてデータを集計したりできるのは redash の特徴だと思いますので,今後も適宜使っていきます!