discourse/app/models/web_hook_events_daily_aggregate.rb
Gabriel Grubba f3a89620a1
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>
2024-06-25 13:56:47 -03:00

52 lines
1.5 KiB
Ruby

# 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)
#