管理ダッシュボードのレポート参照ガイド

:bookmark: これは、管理ダッシュボードのレポート機能、それらが表示するデータ、対応するData ExplorerのSQLクエリ、および各レポートのRubyコードの場所を説明するためのリファレンスガイドです。

:person_raising_hand: 必要なユーザーレベル: スタッフ

Discourseには、コミュニティの統計を調べるのに役立ついくつかの組み込みの管理ダッシュボードレポートが含まれています。これらのレポートにアクセスするには、サイトの discourse.example.com/admin/dashboard/reports を訪問するか、サイドバーの Reports リンクをクリックしてください。これらのレポートにアクセスできるのはスタッフユーザーのみであることに注意してください。

サイト上のすべてのユーザーのデータがこれらのレポートに含まれます(管理ページへのアクセスなどのスタッフのアクティビティも含まれます)。レポート内でユーザーに適用される唯一の条件は、彼らが「実在する」ユーザーであることであり、これにより system ユーザーをレポートから除外するために使用されます。

プラグインは add_report(name, &block) を使用してダッシュボードにレポートを追加することもできます。

:gem: ほとんどのレポートのRubyモデルは、discourse/app/models/concerns/reports/ にあります。一部のレポートはまた、discourse/app/models/report.rb も参照しています。

:bulb: dashboard-sql トピックには、管理ダッシュボードレポートと同一のレポートを生成するために使用できるすべての対応するSQLクエリが含まれています。これらのクエリは、Data Explorer プラグイン内で、およびDiscourse APIを使用してData Explorerクエリを実行する際に使用できます。

:wrench: ダッシュボードから特定のレポートを非表示にするには、dashboard_hidden_reports サイト設定を使用してください。

Accepted solutions

解決策としてマークされた投稿の1日ごとの集計を表示します。

Rubyコード: discourse-solved/plugin.rb at main · discourse/discourse-solved · GitHub

SQLクエリ: Dashboard Report - Accepted Solutions

Admin Logins

管理者のログイン時刻と場所のリスト。

Rubyコード: discourse/app/models/concerns/reports/staff_logins.rb

SQLクエリ: Dashboard Report - Admin Logins

Anonymous

アカウントにログインしていない訪問者による新規ページビューの数。

Rubyコード: discourse/app/models/concerns/reports/consolidated_page_views.rb

SQLクエリ: Dashboard Report - Anonymous

Bookmarks

ブックマークされた新規トピックと投稿の数。

Rubyコード: discourse/app/models/concerns/reports/bookmarks.rb

SQLクエリ: Dashboard Report - Bookmarks

Consolidated API Requests

日付別のAPI使用統計。通常のAPIリクエストとユーザーAPIリクエストの両方を追跡します。

Rubyコード: discourse/app/models/concerns/reports/consolidated_api_requests.rb at main · discourse/discourse · GitHub

SQLクエリ: Dashboard Report - Consolidated API Requests

Consolidated Pageviews

ログインユーザー、匿名ユーザー、クローラーのページビュー。これはレガシーレポートで、Site Traffic レポートによって置き換えられました。

Rubyコード: discourse/app/models/concerns/reports/consolidated_page_views.rb

SQLクエリ: Dashboard Report - Consolidated Pageviews

Consolidated Pageviews with Browser Detection (Deprecated)

ログインユーザー、匿名ユーザー、既知のクローラー、その他のページビュー。このレポートは非推奨であり、現在は Site Traffic レポートに委譲されます。

Rubyコード: discourse/app/models/concerns/reports/consolidated_page_views_browser_detection.rb

SQLクエリ: Dashboard Report - Consolidated Pageviews with Browser Detection

DAU/MAU

過去1日間にログインしたメンバー数を過去1か月にログインしたメンバー数で割ったもの。コミュニティの「スティッキーネス」(継続性)を示す%を返します。目標は20%以上です。

Rubyコード: discourse/app/models/concerns/reports/dau_by_mau.rb

SQLクエリ: Dashboard Report - DAU/MAU

Daily Engaged Users

過去1日間に「いいね」または投稿を行ったユーザー数。

Rubyコード: discourse/app/models/concerns/reports/daily_engaged_users.rb

SQLクエリ: Dashboard Report - Daily Engaged Users

Emails Sent

送信された新規メールの数。

Rubyコード: discourse/app/models/concerns/reports/emails.rb

SQLクエリ: Dashboard Report - Emails Sent

Flags

新規フラグの数。

Rubyコード: discourse/app/models/concerns/reports/flags.rb

SQLクエリ: Dashboard Report - Flags

Flags Status

フラグのステータスのリスト。フラグの種類、投稿者、フラグを立てた者、解決までの時間を含む。

Rubyコード: discourse/app/models/concerns/reports/flags_status.rb

SQLクエリ: Dashboard Report - Flags Status

Likes

新規「いいね」の数。

Rubyコード: discourse/app/models/concerns/reports/likes.rb

SQLクエリ: Dashboard Report - Likes

Logged In

ログインユーザーからの新規ページビューの数。

Rubyコード: discourse/app/controllers/admin/reports_controller.rb#L5

SQLクエリ: Dashboard Report - Logged In

Moderator Activity

モデレーターのアクティビティのリスト。レビューされたフラグ、閲読時間、作成されたトピック、作成された投稿、作成された個人メッセージ、および修正を含む。

SQLクエリ: Dashboard Report - Moderator Activity

Moderator Warning

モデレーターが個人メッセージで送信した警告の数。

Rubyコード: discourse/app/models/concerns/reports/moderator_warning_private_messages.rb

SQLクエリ: Dashboard Report - Moderator Warnings

New Contributors

この期間中に最初の投稿を行ったユーザー数。

Rubyコード: discourse/app/models/concerns/reports/new_contributors.rb

SQLクエリ: Dashboard Report - New Contributors

Notify Moderators

フラグによってモデレーターがプライベートに通知された回数。

Rubyコード: discourse/app/models/concerns/reports/notify_moderators_private_messages.rb

SQLクエリ: Dashboard Report - Notify Moderators

Notify User

フラグによってユーザーがプライベートに通知された回数。

Rubyコード: discourse/app/models/concerns/reports/notify_user_private_messages.rb

SQLクエリ: Dashboard Report - Notify User

Overall Sentiment

指定された期間において、「Sentiment」AIによってポジティブまたはネガティブと分類された投稿の数。

Rubyコード: https://github.com/discourse/discourse-ai/blob/main/lib/sentiment/entry_point.rb

SQLクエリ: Dashboard Report - Overall Sentiment

Pageviews

すべての訪問者からの新規ページビューの数。Consolidated Pageviewsの合計と同じです。

Discourseは、総ページビューを決定するために次のクエリを使用します:

SQLクエリ: Dashboard Report - Consolidated Pageviews

Post Edits

新規投稿編集の数。

Rubyコード: discourse/app/models/concerns/reports/post_edits.rb

SQLクエリ: Dashboard Report - Post Edits

Posts

選択された期間中に作成された新規投稿。

Rubyコード: discourse/app/models/concerns/reports/posts.rb

SQLクエリ: Dashboard Report - Posts

Post Emotion

指定された期間において、AIによって以下の感情のいずれかに分類された投稿の数:悲しみ、驚き、恐怖、怒り、喜び、嫌悪。投稿者のトラストレベル別にグループ化します。

Rubyコード: https://github.com/discourse/discourse-ai/blob/main/lib/sentiment/entry_point.rb

SQLクエリ: Dashboard Report - Post Emotion

Reactions

最新のリアクションのリスト。

Rubyコード: discourse-reactions/plugin.rb at main · discourse/discourse-reactions · GitHub

SQLクエリ: Dashboard Report - Reactions

Signups

この期間中の新規アカウント登録。

Rubyコード: discourse/app/models/concerns/reports/signups.rb

SQLクエリ: Dashboard Report - Signups

Site Traffic

ログインブラウザ、匿名ブラウザ、クローラー、およびその他のトラフィックのページビュー。これは主要なトラフィックレポートで、レガシーのConsolidated Pageviewsレポートに取って代わります。

Rubyコード: discourse/app/models/concerns/reports/site_traffic.rb

SQLクエリ: Dashboard Report - Site Traffic

Suspicious Logins

以前のログインと疑わしく異なる新規ログインの詳細。

Rubyコード: discourse/app/models/concerns/reports/suspicious_logins.rb

SQLクエリ: Dashboard Report - Suspicious Logins

System

Systemによって自動的に送信された個人メッセージの数。

Rubyコード: discourse/app/models/concerns/reports/system_private_messages.rb

SQLクエリ: Dashboard Report - System

Time to first response

新規トピックへの最初のレスポンスまでの平均時間(時間単位)。

Rubyコード: discourse/app/models/concerns/reports/time_to_first_response.rb + discourse/discourse/blob/main/app/models/topic.rb#L1799-L1844

SQLクエリ: Dashboard Report - Time to First Response

Top Ignored / Muted Users

多くの他のユーザーによってミュートおよび/または無視されているユーザー。

Rubyコード: discourse/app/models/concerns/reports/top_ignored_users.rb

SQLクエリ: Dashboard Report - Top Ignored / Muted Users

Top Referred Topics

外部ソースからのクリックが最も多かったトピック。

Rubyコード: discourse/app/models/concerns/reports/top_referred_topics.rb

SQLクエリ: Dashboard Report - Top Referred Topics

Top Referrers

共有したリンクへのクリック数で並べられたユーザー。

Rubyコード: discourse/app/models/concerns/reports/top_referrers.rb

SQLクエリ: Dashboard Report - Top Referrers

Top Traffic Sources

このサイトに最も多くリンクしている外部ソース。

Rubyコード: discourse/app/models/concerns/reports/top_traffic_sources.rb

SQLクエリ: Dashboard Report - Top Traffic Sources

Top Uploads

拡張子、ファイルサイズ、著者別にすべてのアップロードをリストします。

Rubyコード: discourse/app/models/concerns/reports/top_uploads.rb

SQLクエリ: Dashboard Report - Top Uploads

Top Users by likes received

「いいね」を最も多く受けた上位10ユーザー。

Rubyコード: discourse/app/models/concerns/reports/top_users_by_likes_received.rb

SQLクエリ: Dashboard Report - Top Users by Likes Received

Top Users by likes received from a user with a lower trust level

より低いトラストレベルの人々から「いいね」を受けた、より高いトラストレベルの上位10ユーザー。

Rubyコード: discourse/app/models/concerns/reports/top_users_by_likes_received_from_inferior_trust_level.rb

SQLクエリ: Dashboard Report - Top Users by Likes Received from a User with a Lower Trust Level

Top Users by likes received from a variety of people

幅広い人々から「いいね」を受けた上位10ユーザー。

Rubyコード: discourse/app/models/concerns/reports/top_users_by_likes_received_from_a_variety_of_people.rb

SQLクエリ: Dashboard Report - Top Users by Likes Received From a Variety of People

Topics

この期間中に作成された新規トピック。

Rubyコード: discourse/app/models/concerns/reports/topics.rb

SQLクエリ: Dashboard Report - Topics

Topics with no response

レスポンスを受けなかった新規作成トピックの数。

Rubyコード: discourse/app/models/concerns/reports/topics_with_no_response.rb

SQLクエリ: Dashboard Report - Topics with No Response

Topic View Stats

匿名ユーザーとログインユーザーの内訳付きで、ビュー数に基づく上位100トピック。カテゴリでフィルタリング可能。

Rubyコード: discourse/app/models/concerns/reports/topic_view_stats.rb

SQLクエリ: Dashboard Report - Topic View Stats

Trending Search Terms

クリックスルー率付きの最も人気のある検索キーワード。

Rubyコード: discourse/app/models/concerns/reports/trending_search.rb

SQLクエリ: Dashboard Report - Trending Search Terms

Trust Level growth

この期間中にトラストレベルを上げたユーザー数。

トラストレベル成長レポートは、Discourseデータベースの user_histories テーブルからデータを取得します。具体的には、このレポートはユーザーのトラストレベルの上昇に対して user_histories.action が記録された回数をカウントします。

Rubyコード: discourse/app/models/concerns/reports/trust_level_growth.rb

SQLクエリ: Dashboard Report - Trust Level Growth

Unaccepted policies

特定のユーザーによって承認されていないポリシーを持つトピックを特定するこのダッシュボードレポート。

Rubyコード: discourse-policy/plugin.rb at main · discourse/discourse-policy · GitHub

SQLクエリ: Dashboard Report - Unaccepted Policies

User Flagging Ratio

フラグに対するスタッフのレスポンス比率(不一致から一致へ)で並べられたユーザーのリスト。

Rubyコード: discourse/app/models/concerns/reports/user_flagging_ratio.rb

SQLクエリ: Dashboard Report - User Flagging Ratio

User notes

最新のユーザーノートのリスト。

Rubyコード: discourse-user-notes/plugin.rb at main · discourse/discourse-user-notes · GitHub

SQLクエリ: Dashboard Report - User Notes

User Profile Views

ユーザープロフィールの新規ビューの総数。

Rubyコード: discourse/app/models/concerns/reports/profile_views.rb

SQLクエリ: Dashboard Report - User Profile Views

User Visits

選択された期間(今日、昨日、過去7日間など)におけるフォーラムへのログインユーザーの訪問総数。

ユーザー訪問は、一意のログインユーザーがサイトに訪問したたびにカウントされます。1日あたり最大1回です。例えば、ユーザーが1週間のうちに毎日サイトに訪問した場合、Discourseはそれを7回のユーザー訪問としてカウントします。

Rubyコード: discourse/app/models/concerns/reports/visits.rb

SQLクエリ: Dashboard Report - User Visits

User Visits (mobile)

モバイルデバイスを使用して訪問した一意のログインユーザー数。

Rubyコード: discourse/app/models/concerns/reports/mobile_visits.rb

SQLクエリ: Dashboard Report - User Visits

User-to-User (excluding replies)

新たに開始された個人メッセージの数。

Rubyコード: discourse/app/models/concerns/reports/user_to_user_private_messages.rb

SQLクエリ: Dashboard Report - User-to-User

User-to-User (with replies)

すべての新規個人メッセージと返信の数。

Rubyコード: discourse/app/models/concerns/reports/user_to_user_private_messages_with_replies.rb

SQLクエリ: Dashboard Report - User-to-User

Users per Trust Level

トラストレベル別にグループ化されたユーザー数。

Rubyコード: discourse/app/models/concerns/reports/users_by_trust_level.rb

SQLクエリ: Dashboard Report - Users Per Trust Level

Users per Type

管理者、モデレーター、停止中、サイレンスされたユーザーでグループ化されたユーザー数。

Rubyコード: discourse/app/models/concerns/reports/users_by_type.rb

SQLクエリ: Dashboard Report - Users Per Type

Web Crawler Pageviews

時間経過に伴うウェブクローラーからのページビューの総数。

Rubyコード: discourse/app/models/report.rb

SQLクエリ: Dashboard Report - Web Crawler Pageviews

Web Crawler User Agents

ページビュー順に並べられたウェブクローラーのユーザーエージェントのリスト。

Rubyコード: discourse/app/models/concerns/reports/web_crawlers.rb

SQLクエリ: Dashboard Report - Web Crawler User Agents

「いいね!」 18

/admin にリンクが見つかりません。読み方が足りないのでしょうか?これらのレポートはもっと見つけやすい場所にあるべきだと思います。これらのレポートがあることは知っていたと思いますが、探しても見つかりませんでした。

数分で見つけることができましたが、次のようなものを追加すると良いかもしれません。

「いいね!」 3

ええ、サイトが最初に作成されたときに、スタッフへのPMで言及すると良いかもしれませんね。 :thinking:

「いいね!」 1

:crying_cat_face:

すみません。どこかで見たことがあると思ったのですが。

人々は物事を読もうとしませんね…しかし、プラグインでそれを行う方法を見つけるためにソースコードを読むことはできますか?

しかし、上記を次のように更新しますか?

それが本当に私を混乱させた原因だと思います。(しかし、いいえ、言い訳はありません。)

トピックをウィキにしました。どうぞ! :+1:

「いいね!」 2

UI(UIは20%を使用しています)と一致しませんが、どちらを使用すべきでしょうか?

「いいね!」 2

よく見つけました。最近20%に更新されました。OPで変更します。:slight_smile: :+1:

「いいね!」 2

@SaraDev さん、このレポートの出力はSQLクエリで取得できますか?共有していただけますか?
ありがとうございます。

「いいね!」 1

はい、トップトラフィックソースの以下のSQLレポートを使用できます。

-- [params]
-- date :start_date = 01/05/2023
-- date :end_date = 03/06/2023

WITH count_links AS (

SELECT COUNT(*) AS clicks,
       ind.name AS domain
FROM incoming_links il
  INNER JOIN posts p ON p.deleted_at ISNULL AND p.id = il.post_id
  INNER JOIN topics t ON t.deleted_at ISNULL AND t.id = p.topic_id
  INNER JOIN incoming_referers ir ON ir.id = il.incoming_referer_id
  INNER JOIN incoming_domains ind ON ind.id = ir.incoming_domain_id
WHERE t.archetype = 'regular'
  AND il.created_at::date BETWEEN :start_date AND :end_date
GROUP BY ind.name
ORDER BY clicks DESC
),

count_topics AS (

SELECT COUNT(DISTINCT p.topic_id) AS topics,
       ind.name AS domain
FROM incoming_links il
INNER JOIN posts p ON p.deleted_at ISNULL AND p.id = il.post_id
INNER JOIN topics t ON t.deleted_at ISNULL AND t.id = p.topic_id
INNER JOIN incoming_referers ir ON ir.id = il.incoming_referer_id
INNER JOIN incoming_domains ind ON ind.id = ir.incoming_domain_id
WHERE t.archetype = 'regular'
  AND il.created_at > (CURRENT_TIMESTAMP - INTERVAL '30 DAYS')
GROUP BY ind.name
)

SELECT cl.domain,
       cl.clicks AS "Clicks",
       ct.topics AS "Topics"
FROM count_links cl
JOIN count_topics ct ON cl.domain = ct.domain
LIMIT 10

このクエリでは、日付パラメータは 日/月/年 の形式の日付を受け入れることに注意してください。

「いいね!」 1

@SaraDevさん、クエリの共有ありがとうございます。
このレポートとincoming_linksテーブルに関する、より一般的な質問ですが、これは投稿ページへのトラフィックのみを表しており、フォーラムの全ページへのトラフィックではないですよね?

コンテキスト:フォーラム全体のトラフィックの傾向を分析したいと考えており、トップトラフィックソースレポートからソースごとの全体的なトラフィックを取得できることを期待していました。
しかし、全体的なトラフィックが過去1か月で約272K(ユーザーと匿名)であるのに対し、同じ期間のトラフィックソースレポートの総クリック数は59Kにすぎません。
また、topicsテーブルとpostsテーブルとの内部結合を使用しているため、クリックにpost_idが添付されていない場合はカウントしないことになります。

私の結論を確認していただけますでしょうか。また、incoming_linksテーブルの背後にあるロジックについて少し説明していただけると幸いです。

@SaraDev
このクエリを実行しましたが、結果が一般タブの「投稿」レポートと正確に一致しません。
例:11月30日:
クエリ = 112 件の投稿
レポート = 120 件の投稿
この差について確認していただけますでしょうか?
よろしくお願いします。

「いいね!」 1

念のためお知らせします @Yotam_Hagay - サラさんがスレッドの作成者ですが、ガイドは全員の責任です :slight_smile: :discourse: 各投稿でメンションする必要はありません。 :slight_smile:

「いいね!」 2

明確にしてくれてありがとう、@JammyDodger

他にタグ付けしたり、回答を得るために頼ったりできる人はいますか?

「いいね!」 1

このクエリの結果は、「Time to first response」レポートとはわずかに異なります。
例えば11月8日:
クエリ:93時間
レポート:116時間
どなたかアドバイスをいただけますか?

「いいね!」 1

これらの中には調査に時間がかかるものがあるかもしれませんが、私自身も何が起こっているのか調べてみます(SQLスキルとRubyスキルの間には大きな隔たりがありますが :slight_smile:)。

しかし、この情報をすべて確定させるために、引き続き調査結果を教えてください。:+1:

「いいね!」 2

投稿については、在庫レポートがトピックの投稿とシステムユーザーからの投稿もカウントしていると思いますが、post_typeが1のもの(つまり、ウィスパー、小さなアクション投稿、またはモデレーターアクションではないもの)のみを対象としている可能性があります。

SQLは以下のようになると考えられます。

--[params]
-- date :start_date
-- date :end_date

SELECT
    p.created_at::date AS "Day",
    COUNT(p.id) AS "Count"
FROM posts p
INNER JOIN topics t ON t.id = p.topic_id AND t.deleted_at ISNULL
WHERE p.created_at::date BETWEEN :start_date AND :end_date
    AND p.deleted_at ISNULL
    AND t.archetype = 'regular'
    AND p.post_type = 1
GROUP BY p.created_at::date
ORDER BY 1

これをサイトで実行して、一致するかどうか確認していただけますか?

「いいね!」 2

Jammyさん、ありがとうございます。確認します!
現在、初回応答時間(Time to first response)の分析に取り組んでいるため、こちらの件も確認していただけると幸いです。

「いいね!」 1

SQLバージョンを確認したところ、OPからの返信を除外するために AND p.user_id <> t.user_id が欠けていると思います。それを追加すると、OPと他の誰かからの最初の応答との間の正確な時間が出力されます。

--[params]
-- date :date_start
-- date :date_end

WITH first_reply AS (
    SELECT
        p.topic_id,
        MIN(post_number) post_number,
        t.created_at
    FROM posts p
    INNER JOIN topics t ON (p.topic_id = t.id)
    WHERE p.deleted_at IS NULL
        AND p.user_id <> t.user_id
        AND p.post_number != 1
        AND p.post_type = 1
        AND p.user_id > 0
        AND t.user_id > 0
        AND t.deleted_at IS NULL
        AND t.archetype = 'regular'
        AND t.created_at::date BETWEEN :date_start AND :date_end
    GROUP BY p.topic_id, t.created_at
    ORDER BY 2 DESC
)

SELECT
    p.topic_id,
    fr.created_at::date dt_topic_created,
    (p.created_at - fr.created_at) response_time
FROM posts p
INNER JOIN first_reply fr
    ON fr.topic_id = p.topic_id
    AND fr.post_number = p.post_number
    AND p.created_at > fr.created_at
ORDER BY response_time

また、ストックレポートはSQLの時間の代わりに小数で表示されていると思います。それに合わせるように再度試してみます。:+1:


AVG を含めるように少し更新しました。これにより、ストックレポートの出力とより似たものになります。

--[params]
-- date :date_start
-- date :date_end

WITH first_reply AS (
    SELECT
        p.topic_id,
        MIN(post_number) post_number,
        t.created_at
    FROM posts p
    INNER JOIN topics t ON p.topic_id = t.id
    WHERE p.deleted_at IS NULL
        AND p.user_id <> t.user_id
        AND p.post_type = 1
        AND p.user_id > 0
        AND t.user_id > 0
        AND t.deleted_at IS NULL
        AND t.archetype = 'regular'
        AND t.created_at::date BETWEEN :date_start AND :date_end
    GROUP BY p.topic_id, t.created_at
)

SELECT
    fr.created_at::date dt_topic_created,
    AVG(p.created_at - fr.created_at) response_time
FROM posts p
INNER JOIN first_reply fr
    ON fr.topic_id = p.topic_id
    AND fr.post_number = p.post_number
    AND p.created_at > fr.created_at
GROUP BY fr.created_at::date
ORDER BY response_time

これで、一方は小数で、もう一方はHH:MMであるということを考慮すれば、ストックレポートと一致するようです。SQLの response_time を小数に変換する方法があると思いますが、HH:MMの方が直感的な方法だと思います。(また、必要ないかもしれない余分な基準がいくつかあると思いますが、安全策として、どちらか確信が持てるまでそのままにしておきました :slight_smile:

これを実行して、どのように一致するか確認していただけますか?

「いいね!」 4

はい、これで株主報告書の数値と一致するようになりました。ありがとうございます。
1点だけコメントがあります。
以下のAVG関数は、時間が24時間以上の場合(日数部分が欠けていると思われます)、結果が欠落することがわかりました。

AVG(p.created_at - fr.created_at)::time response_time

「いいね!」 1

time へのキャストは悪い選択でしたね。:)\n\n::time を削除すると、より正確な(しかし、見るのが少し大変な)バージョンに戻ります。\n\n上のものも編集しますね。:+1:

「いいね!」 2