mirror of
https://github.com/discourse/discourse.git
synced 2024-11-24 23:20:33 +08:00
820ce8765e
split traffic report in 2, page view vs raw traffic hide raw traffic report by default improve flushing logic for application reqs
190 lines
6.4 KiB
Ruby
190 lines
6.4 KiB
Ruby
require_dependency 'mem_info'
|
|
|
|
class AdminDashboardData
|
|
|
|
REPORTS = [
|
|
'visits',
|
|
'signups',
|
|
'topics',
|
|
'posts',
|
|
'flags',
|
|
'users_by_trust_level',
|
|
'likes',
|
|
'bookmarks',
|
|
'emails',
|
|
'user_to_user_private_messages',
|
|
'system_private_messages',
|
|
'moderator_warning_private_messages',
|
|
'notify_moderators_private_messages',
|
|
'notify_user_private_messages',
|
|
'page_view_total_reqs'
|
|
] + ApplicationRequest.req_types.keys.map{|r| r + "_reqs"}
|
|
|
|
def problems
|
|
[ rails_env_check,
|
|
ruby_version_check,
|
|
host_names_check,
|
|
gc_checks,
|
|
sidekiq_check || queue_size_check,
|
|
ram_check,
|
|
old_google_config_check,
|
|
both_googles_config_check,
|
|
google_oauth2_config_check,
|
|
facebook_config_check,
|
|
twitter_config_check,
|
|
github_config_check,
|
|
s3_config_check,
|
|
image_magick_check,
|
|
failing_emails_check,
|
|
default_logo_check,
|
|
contact_email_check,
|
|
send_consumer_email_check,
|
|
title_check,
|
|
site_description_check,
|
|
site_contact_username_check,
|
|
notification_email_check
|
|
].compact
|
|
end
|
|
|
|
|
|
def self.fetch_stats
|
|
AdminDashboardData.new
|
|
end
|
|
def self.fetch_cached_stats
|
|
# The DashboardStats job is responsible for generating and caching this.
|
|
stats = $redis.get(stats_cache_key)
|
|
stats ? JSON.parse(stats) : nil
|
|
end
|
|
def self.stats_cache_key
|
|
'dash-stats'
|
|
end
|
|
|
|
def self.fetch_problems
|
|
AdminDashboardData.new.problems
|
|
end
|
|
|
|
def as_json(_options = nil)
|
|
@json ||= {
|
|
reports: REPORTS.map { |type| Report.find(type).as_json },
|
|
admins: User.admins.count,
|
|
moderators: User.moderators.count,
|
|
suspended: User.suspended.count,
|
|
blocked: User.blocked.count,
|
|
top_referrers: IncomingLinksReport.find('top_referrers').as_json,
|
|
top_traffic_sources: IncomingLinksReport.find('top_traffic_sources').as_json,
|
|
top_referred_topics: IncomingLinksReport.find('top_referred_topics').as_json,
|
|
updated_at: Time.zone.now.as_json
|
|
}
|
|
end
|
|
|
|
def self.recalculate_interval
|
|
# Could be configurable, multisite need to support it.
|
|
30 # minutes
|
|
end
|
|
|
|
def rails_env_check
|
|
I18n.t("dashboard.rails_env_warning", env: Rails.env) unless Rails.env.production?
|
|
end
|
|
|
|
def host_names_check
|
|
I18n.t("dashboard.host_names_warning") if ['localhost', 'production.localhost'].include?(Discourse.current_hostname)
|
|
end
|
|
|
|
def gc_checks
|
|
I18n.t("dashboard.gc_warning") if ENV['RUBY_GC_MALLOC_LIMIT'].nil?
|
|
end
|
|
|
|
def sidekiq_check
|
|
last_job_performed_at = Jobs.last_job_performed_at
|
|
I18n.t('dashboard.sidekiq_warning') if Jobs.queued > 0 and (last_job_performed_at.nil? or last_job_performed_at < 2.minutes.ago)
|
|
end
|
|
|
|
def queue_size_check
|
|
queue_size = Jobs.queued
|
|
I18n.t('dashboard.queue_size_warning', queue_size: queue_size) unless queue_size < 100
|
|
end
|
|
|
|
def ram_check
|
|
I18n.t('dashboard.memory_warning') if MemInfo.new.mem_total and MemInfo.new.mem_total < 1_000_000
|
|
end
|
|
|
|
def old_google_config_check
|
|
I18n.t('dashboard.enable_google_logins_warning') if SiteSetting.enable_google_logins
|
|
end
|
|
|
|
def both_googles_config_check
|
|
I18n.t('dashboard.both_googles_warning') if SiteSetting.enable_google_logins && SiteSetting.enable_google_oauth2_logins
|
|
end
|
|
|
|
def google_oauth2_config_check
|
|
I18n.t('dashboard.google_oauth2_config_warning') if SiteSetting.enable_google_oauth2_logins && (SiteSetting.google_oauth2_client_id.blank? || SiteSetting.google_oauth2_client_secret.blank?)
|
|
end
|
|
|
|
def facebook_config_check
|
|
I18n.t('dashboard.facebook_config_warning') if SiteSetting.enable_facebook_logins && (SiteSetting.facebook_app_id.blank? || SiteSetting.facebook_app_secret.blank?)
|
|
end
|
|
|
|
def twitter_config_check
|
|
I18n.t('dashboard.twitter_config_warning') if SiteSetting.enable_twitter_logins and (SiteSetting.twitter_consumer_key.blank? or SiteSetting.twitter_consumer_secret.blank?)
|
|
end
|
|
|
|
def github_config_check
|
|
I18n.t('dashboard.github_config_warning') if SiteSetting.enable_github_logins and (SiteSetting.github_client_id.blank? or SiteSetting.github_client_secret.blank?)
|
|
end
|
|
|
|
def s3_config_check
|
|
bad_keys = (SiteSetting.s3_access_key_id.blank? or SiteSetting.s3_secret_access_key.blank?) and !SiteSetting.s3_use_iam_profile
|
|
|
|
return I18n.t('dashboard.s3_config_warning') if SiteSetting.enable_s3_uploads and (bad_keys or SiteSetting.s3_upload_bucket.blank?)
|
|
return I18n.t('dashboard.s3_backup_config_warning') if SiteSetting.enable_s3_backups and (bad_keys or SiteSetting.s3_backup_bucket.blank?)
|
|
nil
|
|
end
|
|
|
|
def image_magick_check
|
|
I18n.t('dashboard.image_magick_warning') if SiteSetting.create_thumbnails and !system("command -v convert >/dev/null;")
|
|
end
|
|
|
|
def failing_emails_check
|
|
num_failed_jobs = Jobs.num_email_retry_jobs
|
|
I18n.t('dashboard.failing_emails_warning', num_failed_jobs: num_failed_jobs) if num_failed_jobs > 0
|
|
end
|
|
|
|
def default_logo_check
|
|
if SiteSetting.logo_url =~ /#{SiteSetting.defaults[:logo_url].split('/').last}/ or
|
|
SiteSetting.logo_small_url =~ /#{SiteSetting.defaults[:logo_small_url].split('/').last}/ or
|
|
SiteSetting.favicon_url =~ /#{SiteSetting.defaults[:favicon_url].split('/').last}/
|
|
I18n.t('dashboard.default_logo_warning')
|
|
end
|
|
end
|
|
|
|
def contact_email_check
|
|
return I18n.t('dashboard.contact_email_missing') if !SiteSetting.contact_email.present?
|
|
return I18n.t('dashboard.contact_email_invalid') if !(SiteSetting.contact_email =~ User::EMAIL)
|
|
end
|
|
|
|
def title_check
|
|
I18n.t('dashboard.title_nag') if SiteSetting.title == SiteSetting.defaults[:title]
|
|
end
|
|
|
|
def site_description_check
|
|
I18n.t('dashboard.site_description_missing') if !SiteSetting.site_description.present?
|
|
end
|
|
|
|
def send_consumer_email_check
|
|
I18n.t('dashboard.consumer_email_warning') if Rails.env.production? and ActionMailer::Base.smtp_settings[:address] =~ /gmail\.com|live\.com|yahoo\.com/
|
|
end
|
|
|
|
def site_contact_username_check
|
|
I18n.t('dashboard.site_contact_username_warning') if !SiteSetting.site_contact_username.present? || SiteSetting.site_contact_username == SiteSetting.defaults[:site_contact_username]
|
|
end
|
|
|
|
def notification_email_check
|
|
I18n.t('dashboard.notification_email_warning') if !SiteSetting.notification_email.present? || SiteSetting.notification_email == SiteSetting.defaults[:notification_email]
|
|
end
|
|
|
|
def ruby_version_check
|
|
I18n.t('dashboard.ruby_version_warning') if RUBY_VERSION == '2.0.0' and RUBY_PATCHLEVEL < 247
|
|
end
|
|
|
|
end
|