MicroAd Developers Blog

マイクロアドのエンジニアブログです。インフラ、開発、分析について発信していきます。

Redashの利用状況をモニタリングする

京都研究所の田中です。

マイクロアドでは、主にエンジニア以外のメンバーが広告配信実績などの各種データにアクセスする際はRedashを利用しています。 Redashを使えば気軽にクエリを作成でき、同じUIからいろいろなデータベースにアクセスしてデータを取得できます。

マイクロアドでのRedash活用については以前のブログ記事でも取り上げているのでご参照ください*1

今回は、Redashのメタデータを使ってRedash上に作成されたクエリやダッシュボードの利用状況をモニタリングする方法をご紹介します。

Redashの利用状況をモニタリングすることの重要性

マイクロアドでRedashを使って作成されるクエリには大きく分けて次の2種類が存在します。

  • アドホックな分析や集計のために作成されたクエリ
  • 定常的なレポートやデータ抽出のために作成されたクエリ

前者のアドホッククエリはエンジニアだけでなくアナリストなどビジネス側のスタッフも作成しています。

後者に関しては、エンジニアやディレクターが作成することも多くあります。 レビューなどを通してデータの仕様に適した集計ができていることを確認した上で、クエリのURLをビジネス側のメンバーに共有し、利用してもらっています。

こちらは利用者や実行回数も多いため、パフォーマンスを向上するために中間テーブルの開発を検討したり、メンテナンスにも気を遣う必要があります。

しかしながら、クエリの数が増えるにつれて、そのすべてを同じ優先度でケアすることは人的リソースの問題から難しくなってきます。 実際にはより頻繁により多くの人が利用するクエリほど優先的に対応していく必要があります。

ダッシュボードについても同様で、より重要なもの・より多くのメンバーが利用するものの対応を優先する必要があります。

そこで、Redash上のクエリやダッシュボードの利用状況をモニタリングする仕組みを作っておくと、どれを重点的に対処すべきかといった判断がしやすくなります。

利用状況をモニタリングする方法

クエリの実行履歴

クエリの利用状況をモニタリングするには、 Redashのメタデータからクエリの実行履歴を取得して、それをグラフや表で可視化します。

クエリの実行履歴は以下のようなSQLで取得できます*2

select
  u.name as user_name
  , timezone('JST', e.created_at :: timestamptz) as executed_at
  , e.action
  , e.user_id
  , e.object_id as query_id
  , e.object_type
  , '<a href="https://<redashドメイン>/queries/' || e.object_id || '">' || q.name || '</a>' as query_name
from
    events as e
    inner join users as u
        on e.user_id = u.id
    inner join queries as q
        on cast(e.object_id as int) = q.id
where
    action ='execute'
    and q.name like '%<クエリタイトルの一部>%'   -- モニタリング対象のクエリをタイトルで検索
    and timezone('JST', e.created_at :: timestamptz) between current_date-180 and current_date + 2 -- 過去180日前から翌日0:00まで

この結果をQRDSにキャッシュしておき、さらに以下のようにして日単位・月単位などの粒度でそれぞれ集計します。

select
    strftime('%Y-%m-%d', executed_at) as '実行日'
    , query_name
    , count(1) as '実行回数'
    , count(distinct user_id) as 'ユニーク実行者数'
from
    cached_query_XXXX
group by
    strftime('%Y-%m-%d', executed_at)
    , query_name
order by
    strftime('%Y-%m-%d', executed_at) desc

この集計結果を表やグラフで可視化します。

クエリの利用状況を日単位で集計して可視化する例

これでクエリの利用状況を把握できるようになりました。 どのクエリの利用頻度が高いのか、よく利用しているはどの部署の人なのか、利用回数が多くなる時期はいつなのかといったことがわかります。

特によく利用されるクエリに対しては、実行時間を調べるなどした上で改善が必要そうな場合、中間テーブルを開発するといったクエリパフォーマンス向上のための施策を検討します。

また、「利用者は誰なのか」「利用頻度が高まるのはいつなのか」といった情報は、ユースケースを踏まえてサービスレベルを設定する上でも重要になります。

ダッシュボードの閲覧履歴

また、ダッシュボードについても同様で、メタデータからダッシュボードの閲覧履歴を取得して利用者や閲覧頻度を把握できます。

ダッシュボードの閲覧履歴もクエリの実行履歴の場合とほぼ同じようなSQLで取得できます。

select
    e.user_id
    , u.name as user_name
    , d.id as dashboard_id
    , '<a href="https://<redashドメイン>/dashboards/' || e.object_id || '">' || d.name || '</a>' as dashboard_name
    , e.created_at as viewed_at
from
    events as e
    inner join users as u
        on e.user_id = u.id
    inner join dashboards as d
        on cast(e.object_id as text) = cast(d.id as text)
where
    action ='view'
    and object_type = 'dashboard'
    and d.name like '%<ダッシュボードタイトルの一部>%'   -- モニタリング対象のダッシュボードをタイトルで検索
    and timezone('JST', e.created_at :: timestamptz) between current_date-180 and current_date + 2 -- 過去180日前から翌日0:00まで

先程と同様、この結果をQRDSにキャッシュしておき、さらに以下のようにして日単位・月単位などの粒度でそれぞれ集計します。

select
    strftime('%Y/%m', viewed_at) as '閲覧月'
    , user_name as '利用者名'
    , dashboard_name
    , count(1) as '閲覧回数'
from
    cached_query_XXXX
group by
    strftime('%Y/%m', viewed_at)
    , user_name
    , dashboard_name
order by
    strftime('%Y/%m', viewed_at) desc
    , count(1) desc

こうして得られた集計結果を表やグラフで可視化してみます。

ダッシュボードの利用状況を可視化する例

作成してしばらくは頻繁に見られていたダッシュボードも、いろいろな事情で徐々に使われなくなっていく場合もよくあります。

そんな使われなくなりつつあるダッシュボードもモニタリングの仕組みを準備しておけば見つけ出せます。 利用者に状況をヒアリングした上で改修したり、あるいはメンテナンスの優先度を下げるといったアクションにつなげることができます。

まとめ

今回はRedashのメタデータを利用してRedashの利用状況をモニタリングする方法をご紹介しました。

Redashの利用状況をモニタリングすることで、クエリやダッシュボードの利用者や利用頻度に関する情報が得られます。 これにより、改善の優先度やメンテナンスの強弱をつける判断の根拠が得られます。

データ活用プロセスを改善する際の参考となれば幸いです。