From 77e4fa8535cdcc1a7cb2564bcac37b8dcc0b1829 Mon Sep 17 00:00:00 2001 From: "denis.tarasenko" Date: Fri, 10 Jan 2025 01:24:42 +0300 Subject: [PATCH] [DEX-2707] feat: add metrics for delete items --- CHANGELOG.md | 6 +++ .../outbox/base_delete_stale_items_job.rb | 37 ++++++++++++++++--- config/initializers/yabeda.rb | 10 +++++ lib/sbmt/outbox/version.rb | 2 +- .../base_delete_stale_items_job_spec.rb | 8 +++- 5 files changed, 55 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc53287..124a245 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Fixed +## [6.13.0] - 2025-01-15 + +### Added + +- Add metrics `delete_latency` and `deleted_counter` + ## [6.12.0] - 2025-01-10 ### Added diff --git a/app/jobs/sbmt/outbox/base_delete_stale_items_job.rb b/app/jobs/sbmt/outbox/base_delete_stale_items_job.rb index a8d68be..ca0f384 100644 --- a/app/jobs/sbmt/outbox/base_delete_stale_items_job.rb +++ b/app/jobs/sbmt/outbox/base_delete_stale_items_job.rb @@ -116,12 +116,17 @@ def delete_items_in_batches(table, condition) delete_statement = Arel::Nodes::DeleteStatement.new delete_statement.relation = table delete_statement.wheres = [table[:id].in(subquery)] + deleted_count = nil loop do - deleted_count = item_class - .connection - .execute(delete_statement.to_sql) - .cmd_tuples + track_deleted_latency do + deleted_count = item_class + .connection + .execute(delete_statement.to_sql) + .cmd_tuples + end + + track_deleted_counter(deleted_count) logger.log_info("Deleted #{deleted_count} #{box_type} items for #{box_name} items") break if deleted_count == 0 @@ -158,8 +163,14 @@ def mysql_delete_in_batches(waterline_failed, waterline_delivered) end def delete_items_in_batches_mysql(query) + deleted_count = nil + loop do - deleted_count = query.limit(BATCH_SIZE).delete_all + track_deleted_latency do + deleted_count = query.limit(BATCH_SIZE).delete_all + end + + track_deleted_counter(deleted_count) logger.log_info("Deleted #{deleted_count} #{box_type} items for #{box_name} items") break if deleted_count == 0 @@ -179,6 +190,22 @@ def database_type :unknown end end + + def track_deleted_counter(deleted_count) + ::Yabeda + .outbox + .deleted_counter + .increment({box_type: box_type, box_name: box_name}, by: deleted_count) + end + + def track_deleted_latency + ::Yabeda + .outbox + .delete_latency + .measure({box_type: box_type, box_name: box_name}) do + yield + end + end end end end diff --git a/config/initializers/yabeda.rb b/config/initializers/yabeda.rb index 268e8a7..2539a2c 100644 --- a/config/initializers/yabeda.rb +++ b/config/initializers/yabeda.rb @@ -43,6 +43,16 @@ unit: :seconds, buckets: [0.5, 1, 2.5, 5, 10, 15, 20, 30, 45, 60, 300].freeze, comment: "A histogram outbox process latency" + + histogram :delete_latency, + tags: %i[box_type box_name], + unit: :seconds, + buckets: [0.005, 0.01, 0.05, 0.1, 0.25, 0.5, 1, 2, 5, 10, 20, 30].freeze, + comment: "A histogram for outbox/inbox deletion latency" + + counter :deleted_counter, + tags: %i[box_type box_name], + comment: "A counter for the number of deleted outbox/inbox items" end group :box_worker do diff --git a/lib/sbmt/outbox/version.rb b/lib/sbmt/outbox/version.rb index 64debb6..bb5c0d5 100644 --- a/lib/sbmt/outbox/version.rb +++ b/lib/sbmt/outbox/version.rb @@ -2,6 +2,6 @@ module Sbmt module Outbox - VERSION = "6.12.0" + VERSION = "6.13.0" end end diff --git a/spec/jobs/sbmt/outbox/base_delete_stale_items_job_spec.rb b/spec/jobs/sbmt/outbox/base_delete_stale_items_job_spec.rb index 1d702b9..78fa0fe 100644 --- a/spec/jobs/sbmt/outbox/base_delete_stale_items_job_spec.rb +++ b/spec/jobs/sbmt/outbox/base_delete_stale_items_job_spec.rb @@ -25,17 +25,21 @@ def item_classes end end - it "deletes items with status 2 and old items with status 1" do + it "deletes items with status 2 and old items with status 1 and tracks metrics" do expect { job_class.perform_now("OutboxItem") } .to change(OutboxItem, :count).by(-2) + .and increment_yabeda_counter(Yabeda.outbox.deleted_counter).with_tags(box_name: "outbox_item", box_type: :outbox).by(2) + .and measure_yabeda_histogram(Yabeda.outbox.delete_latency).with_tags(box_name: "outbox_item", box_type: :outbox) end context "when an element with status 1 does not retention" do let(:created_at) { 6.hours.ago } - it "doesn't delete item with status 1 but deletes item with status 2" do + it "doesn't delete item with status 1 but deletes item with status 2 and tracks metrics" do expect { job_class.perform_now("OutboxItem") } .to change(OutboxItem, :count).by(-1) + .and increment_yabeda_counter(Yabeda.outbox.deleted_counter).with_tags(box_name: "outbox_item", box_type: :outbox).by(1) + .and measure_yabeda_histogram(Yabeda.outbox.delete_latency).with_tags(box_name: "outbox_item", box_type: :outbox) end end end