mirror of
https://github.com/discourse/discourse.git
synced 2025-06-03 19:39:30 +08:00
FEATURE: Add WebHookEventsDailyAggregate (#27542)
* FEATURE: Add WebHookEventsDailyAggregate Add WebHookEventsDailyAggregate model to store daily aggregates of web hook events. Add AggregateWebHooksEvents job to aggregate web hook events daily. Add spec for WebHookEventsDailyAggregate model. * DEV: Update annotations for web_hook_events_daily_aggregate.rb * DEV: Update app/jobs/scheduled/aggregate_web_hooks_events.rb Co-authored-by: Martin Brennan <martin@discourse.org> * DEV: Address review feedback Solves: - https://github.com/discourse/discourse/pull/27542#discussion_r1646961101 - https://github.com/discourse/discourse/pull/27542#discussion_r1646958890 - https://github.com/discourse/discourse/pull/27542#discussion_r1646976808 - https://github.com/discourse/discourse/pull/27542#discussion_r1646979846 - https://github.com/discourse/discourse/pull/27542#discussion_r1646981036 * A11Y: Add translation to retain_web_hook_events_aggregate_days key * FEATURE: Purge old web hook events daily aggregate Solves: https://github.com/discourse/discourse/pull/27542#discussion_r1646961101 * DEV: Update tests for web_hook_events_daily_aggregate Update WebHookEventsDailyAggregate to not use save! at the end Solves: https://github.com/discourse/discourse/pull/27542#discussion_r1646984601 * PERF: Change job query to use WebHook table instead of WebHookEvent table * DEV: Update tests to use `fab!` * DEV: Address code review feedback. Add idempotency to job Add has_many to WebHook * DEV: add test case for job and change job query * DEV: Change AggregateWebHooksEvents job test name --------- Co-authored-by: Martin Brennan <martin@discourse.org>
This commit is contained in:
@ -7,6 +7,7 @@ class WebHook < ActiveRecord::Base
|
||||
has_and_belongs_to_many :tags
|
||||
|
||||
has_many :web_hook_events, dependent: :destroy
|
||||
has_many :web_hook_events_daily_aggregates, dependent: :destroy
|
||||
|
||||
default_scope { order("id ASC") }
|
||||
|
||||
|
51
app/models/web_hook_events_daily_aggregate.rb
Normal file
51
app/models/web_hook_events_daily_aggregate.rb
Normal file
@ -0,0 +1,51 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class WebHookEventsDailyAggregate < ActiveRecord::Base
|
||||
belongs_to :web_hook
|
||||
|
||||
default_scope { order("created_at DESC") }
|
||||
before_create :aggregate!
|
||||
|
||||
def self.purge_old
|
||||
where("created_at < ?", SiteSetting.retain_web_hook_events_aggregate_days.days.ago).delete_all
|
||||
end
|
||||
|
||||
def self.by_day(start_date, end_date, web_hook_id = nil)
|
||||
result = where("date >= ? AND date <= ?", start_date.to_date, end_date.to_date)
|
||||
result = result.where(web_hook_id: web_hook_id) if web_hook_id
|
||||
result
|
||||
end
|
||||
|
||||
def aggregate!
|
||||
events =
|
||||
WebHookEvent.where(
|
||||
"created_at >= ? AND created_at < ? AND web_hook_id = ?",
|
||||
self.date,
|
||||
self.date + 1.day,
|
||||
self.web_hook_id,
|
||||
)
|
||||
|
||||
self.mean_duration = events.sum(:duration) / events.count
|
||||
|
||||
self.successful_event_count = events.where("status >= 200 AND status <= 299").count
|
||||
self.failed_event_count = events.where("status < 200 OR status > 299").count
|
||||
end
|
||||
end
|
||||
|
||||
# == Schema Information
|
||||
#
|
||||
# Table name: web_hook_events_daily_aggregates
|
||||
#
|
||||
# id :bigint not null, primary key
|
||||
# web_hook_id :bigint not null
|
||||
# date :date
|
||||
# successful_event_count :integer
|
||||
# failed_event_count :integer
|
||||
# mean_duration :integer default(0)
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
#
|
||||
# Indexes
|
||||
#
|
||||
# index_web_hook_events_daily_aggregates_on_web_hook_id (web_hook_id)
|
||||
#
|
Reference in New Issue
Block a user