diff --git a/.rubocop.yml b/.rubocop.yml index 09a7846b..9a12b2d9 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -2,3 +2,6 @@ inherit_gem: rubocop-discourse: stree-compat.yml RSpec/NamedSubject: Enabled: false + +Style/GlobalVars: + AllowedVariables: [$prometheus_client] diff --git a/about.json b/about.json new file mode 100644 index 00000000..48d9cee0 --- /dev/null +++ b/about.json @@ -0,0 +1,7 @@ +{ + "tests": { + "requiredPlugins": [ + "https://github.com/discourse/discourse-prometheus" + ] + } +} diff --git a/lib/ai_moderation/spam_metric.rb b/lib/ai_moderation/spam_metric.rb new file mode 100644 index 00000000..dbceacd1 --- /dev/null +++ b/lib/ai_moderation/spam_metric.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true + +module DiscourseAi + module AiModeration + class SpamMetric + def self.update(new_status, reviewable) + ai_spam_log = AiSpamLog.find_by(reviewable:) + return if ai_spam_log.nil? + + increment("scanned") + increment("is_spam") if new_status == :approved && ai_spam_log.is_spam + increment("false_positive") if new_status == :rejected && ai_spam_log.is_spam + increment("false_negative") if new_status == :rejected && !ai_spam_log.is_spam + end + + private + + def self.increment(type, value = 1) + metric = ::DiscoursePrometheus::InternalMetric::Custom.new + metric.name = "discourse_ai_spam_detection" + metric.type = "Counter" + metric.description = "AI spam scanning statistics" + metric.labels = { db: RailsMultisite::ConnectionManagement.current_db, type: } + metric.value = value + $prometheus_client.send_json(metric.to_h) + end + end + end +end diff --git a/plugin.rb b/plugin.rb index 66fc60a5..36c9bca3 100644 --- a/plugin.rb +++ b/plugin.rb @@ -84,6 +84,9 @@ after_initialize do on(:reviewable_transitioned_to) do |new_status, reviewable| ModelAccuracy.adjust_model_accuracy(new_status, reviewable) + if DiscourseAi::AiModeration::SpamScanner.enabled? + DiscourseAi::AiModeration::SpamMetric.update(new_status, reviewable) + end end if Rails.env.test?