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

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

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

Discourse には、コミュニティの統計を調査するのに役立つ組み込みの管理ダッシュボードレポートがいくつか含まれています。これらのレポートにアクセスするには、サイトの discourse.example.com/admin/dashboard/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 サイト設定を使用します。

承認された解決策

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

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

SQL クエリ: Dashboard Report - Accepted Solutions

管理者ログイン

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

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

SQL クエリ: Dashboard Report - Admin Logins

アノニマス

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

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

SQL クエリ: Dashboard Report - Anonymous

ブックマーク

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

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

SQL クエリ: Dashboard Report - Bookmarks

統合された API リクエスト

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

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

SQL クエリ: Dashboard Report - Consolidated API Requests

統合されたページビュー

ログインユーザー、アノニマスユーザー、およびクローラーのページビュー。これは、サイトトラフィックレポートに置き換えられたレガシーレポートです。

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

SQL クエリ: Dashboard Report - Consolidated Pageviews

ブラウザ検出付きの統合されたページビュー(非推奨)

ログインユーザー、アノニマスユーザー、既知のクローラー、その他によるページビュー。このレポートは非推奨であり、現在はサイトトラフィックレポートに委任されます。

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

1 日のエンゲージユーザー

過去 1 日に「いいね」を押したり投稿したりしたユーザー数。

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

SQL クエリ: Dashboard Report - Daily Engaged Users

送信されたメール

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

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

SQL クエリ: Dashboard Report - Emails Sent

フラグ

新しいフラグの数。

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

SQL クエリ: Dashboard Report - Flags

フラグステータス

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

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

SQL クエリ: Dashboard Report - Flags Status

いいね

新しい「いいね」の数。

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

SQL クエリ: Dashboard Report - Likes

ログイン済み

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

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

SQL クエリ: Dashboard Report - Logged In

モデレーターアクティビティ

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

SQL クエリ: Dashboard Report - Moderator Activity

モデレーター警告

モデレーターから個人メッセージで送信された警告の数。

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

SQL クエリ: Dashboard Report - Moderator Warnings

新規貢献者

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

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

SQL クエリ: Dashboard Report - New Contributors

モデレーターへの通知

モデレーターがフラグによって個人通知された回数。

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

SQL クエリ: Dashboard Report - Notify Moderators

ユーザーへの通知

ユーザーがフラグによって個人通知された回数。

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

SQL クエリ: Dashboard Report - Notify User

全体のセンチメント

指定された期間中に、「センチメント」AI によってポジティブまたはネガティブに分類された投稿の数。

Ruby コード: discourse-ai/lib/sentiment/entry_point.rb at main · discourse/discourse-ai · GitHub

SQL クエリ: ダッシュボードレポート - 全体のセンチメント

ページビュー

すべての訪問者からの新しいページビュー数。統合されたページビューの合計と同じです。

Discourse は、合計ページビューを決定するために以下のクエリを使用します。

SQL クエリ: Dashboard Report - Consolidated Pageviews

投稿の編集

新しい投稿の編集数。

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

SQL クエリ: Dashboard Report - Post Edits

投稿

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

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

SQL クエリ: Dashboard Report - Posts

投稿の感情

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

Ruby コード: discourse-ai/lib/sentiment/entry_point.rb at main · discourse/discourse-ai · GitHub

SQL クエリ: ダッシュボードレポート - 投稿の感情

リアクション

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

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

SQL クエリ: Dashboard Report - Reactions

登録

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

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

SQL クエリ: Dashboard Report - Signups

サイトトラフィック

ログインブラウザ、アノニマスブラウザ、クローラー、その他のトラフィックのページビュー。これは、レガシーの統合されたページビューレポートに代わる主要なトラフィックレポートです。

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

SQL クエリ: ダッシュボードレポート - サイトトラフィック

疑わしいログイン

以前のログインと著しく異なる新しいログインの詳細。

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

SQL クエリ: Dashboard Report - Suspicious Logins

システム

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

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

SQL クエリ: Dashboard Report - System

最初のレスポンスまでの時間

新しいトピックに対する最初のレスポンスの平均時間(時間単位)。

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

最も無視/ミュートされたユーザー

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

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

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

最も参照されたトピック

外部ソースからのクリックを最も多く受けたトピック。

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

SQL クエリ: Dashboard Report - Top Referred Topics

主要なリファラー

共有したリンクのクリック数でリストされたユーザー。

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

SQL クエリ: Dashboard Report - Top Referrers

主要なトラフィックソース

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

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

SQL クエリ: Dashboard Report - Top Traffic Sources

主要なアップロード

拡張子、ファイルサイズ、投稿者によるすべてのアップロードのリスト。

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

SQL クエリ: Dashboard Report - Top Uploads

受け取ったいいね数による上位ユーザー

いいねを受け取った上位 10 人のユーザー。

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

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

より低い信頼レベルのユーザーから受け取ったいいね数による上位ユーザー

より高い信頼レベルのユーザーが、より低い信頼レベルの人々からいいねを受け取った上位 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

多様な人々から受け取ったいいね数による上位ユーザー

幅広い人々からいいねを受け取った上位 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

トピック

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

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

SQL クエリ: Dashboard Report - Topics

レスポンスのないトピック

レスポンスを受け取らなかった新しいトピックの数。

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

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

トピックビュー統計

カテゴリでフィルタリング可能な、アノニマスおよびログイン内訳付きのビュー数による上位 100 のトピック。

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

SQL クエリ: ダッシュボードレポート - トピックビュー統計

トレンド検索語句

クリック率を含む最も人気のある検索語句。

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

SQL クエリ: Dashboard Report - Trending Search Terms

信頼レベルの成長

この期間中に信頼レベルを上げたユーザー数。

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

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

SQL クエリ: Dashboard Report - Trust Level Growth

未承認のポリシー

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

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

SQL クエリ: Dashboard Report - Unaccepted Policies

ユーザーフラグ比率

スタッフの対応(異議あり対同意)の比率で並べ替えたユーザーのリスト。

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

SQL クエリ: Dashboard Report - User Flagging Ratio

ユーザーノート

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

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

SQL クエリ: Dashboard Report - User Notes

ユーザープロフィールビュー

ユーザープロフィールの新しいビューの合計数。

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

SQL クエリ: Dashboard Report - User Profile Views

ユーザー訪問

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

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

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

SQL クエリ: Dashboard Report - User Visits

ユーザー訪問(モバイル)

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

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

SQL クエリ: Dashboard Report - User Visits

ユーザー間(返信を除く)

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

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

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

ユーザー間(返信を含む)

すべての新しい個人メッセージとレスポンスの数。

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

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

信頼レベルごとのユーザー数

信頼レベルごとにグループ化されたユーザー数。

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

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

タイプごとのユーザー数

管理者、モデレーター、停止、沈黙によってグループ化されたユーザー数。

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

SQL クエリ: Dashboard Report - Users Per Type

ウェブクローラーページビュー

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

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

SQL クエリ: Dashboard Report - Web Crawler Pageviews

ウェブクローラーユーザーエージェント

ページビューでソートされたウェブクローラーユーザーエージェントのリスト。

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