yabeda-karafka-2 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/yabeda/karafka/base.rb +19 -0
- data/lib/yabeda/karafka/config.rb +17 -0
- data/lib/yabeda/karafka/consumer.rb +91 -0
- data/lib/yabeda/karafka/producer.rb +61 -0
- data/lib/yabeda/karafka/version.rb +7 -0
- data/lib/yabeda/karafka.rb +28 -0
- metadata +142 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 96679ba8966c5530ab8c543803f8be3f338c23cf2931e54c3a68f61d232b1543
|
4
|
+
data.tar.gz: 6423f70840140e060920c32766c255e1aa22b1d99b13833675722f01a90e934c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c903fadb57b8cb8db23ca50dce3e6fa20e6c85ba8010590e7fda3fc2cfd37e662331a6f359f87aa0ce38921f9ce8a7956cca5f9003f8b53b3c9e74e8f120d645
|
7
|
+
data.tar.gz: '082cc670d4fe7ce085070af654574efb64087208942c9553ab00d574f1b248dab79e0a3036f25a7e4109a38fca3be1533d7664520bc9f064640a4bb9a4e028cc'
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Yabeda
|
4
|
+
module Karafka
|
5
|
+
class Base
|
6
|
+
class << self
|
7
|
+
def register_metrics
|
8
|
+
Yabeda.configure do
|
9
|
+
group :karafka do
|
10
|
+
counter :errors_total,
|
11
|
+
tags: %i[type base_type],
|
12
|
+
comment: 'A counter of the total number of errors'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'anyway'
|
4
|
+
|
5
|
+
module Yabeda
|
6
|
+
module Karafka
|
7
|
+
class Config < ::Anyway::Config
|
8
|
+
config_name :yabeda_karafka
|
9
|
+
|
10
|
+
# Declare consumer metrics
|
11
|
+
attr_config consumer_metrics: true
|
12
|
+
|
13
|
+
# Declare producer metrics
|
14
|
+
attr_config producer_metrics: true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'karafka'
|
4
|
+
|
5
|
+
module Yabeda
|
6
|
+
module Karafka
|
7
|
+
class Consumer
|
8
|
+
BATCH_PROCESSING_TIME_BUCKETS = [
|
9
|
+
1, 3, 5, 10, 15, 25, 50, 75, 100, 125, 150, 175, 200, 225, 250, 275,
|
10
|
+
300, 350, 400, 450, 500, 550, 600, 650, 700, 800, 900, 1_000, 1_500, 2_000,
|
11
|
+
3_000, 4_000, 5_000, 6_000, 7_000, 8_000, 9_000, 10_000
|
12
|
+
].freeze
|
13
|
+
|
14
|
+
MESSAGE_PER_BATCH_BUCKETS = [
|
15
|
+
1, 5, 10, 15, 20, 25, 30, 40, 50, 60, 75, 100, 125, 150, 200, 250, 300, 400, 500
|
16
|
+
].freeze
|
17
|
+
|
18
|
+
class << self
|
19
|
+
def register_metrics # rubocop:disable Metrics/MethodLength
|
20
|
+
Yabeda.configure do
|
21
|
+
group :karafka_consumer do
|
22
|
+
counter :received_message_total,
|
23
|
+
tags: %i[topic partition consumer],
|
24
|
+
comment: 'A counter of the total number of messages received'
|
25
|
+
|
26
|
+
counter :processed_message_total,
|
27
|
+
tags: %i[topic partition consumer],
|
28
|
+
comment: 'A counter of the total number of messages processed'
|
29
|
+
|
30
|
+
histogram :messages_per_batch,
|
31
|
+
unit: :messages,
|
32
|
+
per: :batch,
|
33
|
+
tags: %i[topic partition consumer],
|
34
|
+
buckets: MESSAGE_PER_BATCH_BUCKETS,
|
35
|
+
comment: 'Quantity of messages on a given batch'
|
36
|
+
|
37
|
+
histogram :batch_processing_time,
|
38
|
+
unit: :milliseconds,
|
39
|
+
per: :batch,
|
40
|
+
tags: %i[topic partition consumer],
|
41
|
+
buckets: BATCH_PROCESSING_TIME_BUCKETS,
|
42
|
+
comment: 'Time that took to process a given batch (ms)'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def register_events
|
48
|
+
messages_received
|
49
|
+
messages_consumed
|
50
|
+
error
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def register_event(event_name, &block)
|
56
|
+
::Karafka.monitor.subscribe(event_name, &block)
|
57
|
+
end
|
58
|
+
|
59
|
+
def messages_received
|
60
|
+
register_event('consumer.consume') do |event|
|
61
|
+
consumer = event[:caller]
|
62
|
+
labels = { topic: consumer.topic.name, partition: consumer.partition, consumer: consumer.class.name }
|
63
|
+
message_count = consumer.messages.count
|
64
|
+
Yabeda.karafka_consumer_received_message_total.increment(labels, by: message_count)
|
65
|
+
Yabeda.karafka_consumer_messages_per_batch.measure(labels, message_count)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def messages_consumed
|
70
|
+
register_event('consumer.consumed') do |event|
|
71
|
+
consumer = event[:caller]
|
72
|
+
labels = { topic: consumer.topic.name, partition: consumer.partition, consumer: consumer.class.name }.compact
|
73
|
+
message_count = consumer.messages.count
|
74
|
+
time = event[:time]
|
75
|
+
Yabeda.karafka_consumer_processed_message_total.increment(labels, by: message_count)
|
76
|
+
Yabeda.karafka_consumer_batch_processing_time.measure(labels, time)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def error
|
81
|
+
register_event('error.occurred') do |event|
|
82
|
+
type = event[:type]
|
83
|
+
base_type = type.split('.').first
|
84
|
+
labels = { type: type, base_type: base_type }.compact
|
85
|
+
Yabeda.karafka_errors_total.increment(labels)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'karafka'
|
4
|
+
|
5
|
+
module Yabeda
|
6
|
+
module Karafka
|
7
|
+
class Producer
|
8
|
+
class << self
|
9
|
+
def register_metrics
|
10
|
+
Yabeda.configure do
|
11
|
+
group :karafka_producer do
|
12
|
+
counter :sent_message_total,
|
13
|
+
tags: %i[topic type],
|
14
|
+
comment: 'A counter of the total number of messages sent'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def register_events
|
20
|
+
%w[sync async].each do |type|
|
21
|
+
message_sent(type)
|
22
|
+
message_batch_sent(type)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def register_event(event_name, &block)
|
29
|
+
::Karafka.producer.monitor.subscribe(event_name, &block)
|
30
|
+
end
|
31
|
+
|
32
|
+
def message_sent(type)
|
33
|
+
register_event("message.produced_#{type}") do |event|
|
34
|
+
message = event[:message]
|
35
|
+
labels = { topic: message.topic.name, type: type }
|
36
|
+
Yabeda.karafka_producer_sent_message_total.increment(labels)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def message_batch_sent(type)
|
41
|
+
register_event("messages.produced_#{type}") do |event|
|
42
|
+
messages = event[:messages]
|
43
|
+
messages.each do |message|
|
44
|
+
labels = { topic: message.topic.name, type: type }
|
45
|
+
Yabeda.karafka_producer_sent_message_total.increment(labels)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def error
|
51
|
+
register_event('error.occurred') do |event|
|
52
|
+
type = event[:type]
|
53
|
+
base_type = type.split('.').first
|
54
|
+
labels = { type: type, base_type: base_type }.compact
|
55
|
+
Yabeda.karafka_errors_total.increment(labels)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'karafka'
|
4
|
+
require 'yabeda'
|
5
|
+
|
6
|
+
require 'yabeda/karafka/version'
|
7
|
+
require 'yabeda/karafka/config'
|
8
|
+
|
9
|
+
require 'yabeda/karafka/base'
|
10
|
+
require 'yabeda/karafka/consumer'
|
11
|
+
require 'yabeda/karafka/producer'
|
12
|
+
|
13
|
+
module Yabeda
|
14
|
+
module Karafka
|
15
|
+
def self.config
|
16
|
+
@config ||= Config.new
|
17
|
+
end
|
18
|
+
|
19
|
+
Base.register_metrics if config.consumer_metrics || config.producer_metrics
|
20
|
+
Consumer.register_metrics if config.consumer_metrics
|
21
|
+
Producer.register_metrics if config.producer_metrics
|
22
|
+
|
23
|
+
::Karafka.monitor.subscribe('app.initialized') do |_event|
|
24
|
+
Consumer.register_events if config.consumer_metrics
|
25
|
+
Producer.register_events if config.producer_metrics
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: yabeda-karafka-2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Henrique Bontempo
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-08-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: anyway_config
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
- - "<"
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '3'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.3'
|
30
|
+
- - "<"
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '3'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: karafka
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '2.0'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '2.0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: yabeda
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0.8'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0.8'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: bundler
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '2.0'
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: '2.0'
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rake
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - "~>"
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '13.0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - "~>"
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '13.0'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: rspec
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '3.0'
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '3.0'
|
103
|
+
description: Extends Yabeda to collect Karafka metrics
|
104
|
+
email: me@hbontempo.dev
|
105
|
+
executables: []
|
106
|
+
extensions: []
|
107
|
+
extra_rdoc_files: []
|
108
|
+
files:
|
109
|
+
- lib/yabeda/karafka.rb
|
110
|
+
- lib/yabeda/karafka/base.rb
|
111
|
+
- lib/yabeda/karafka/config.rb
|
112
|
+
- lib/yabeda/karafka/consumer.rb
|
113
|
+
- lib/yabeda/karafka/producer.rb
|
114
|
+
- lib/yabeda/karafka/version.rb
|
115
|
+
homepage: https://github.com/hbontempo-br/yabeda-karafka
|
116
|
+
licenses:
|
117
|
+
- MIT
|
118
|
+
metadata:
|
119
|
+
homepage_uri: https://github.com/hbontempo-br/yabeda-karafka
|
120
|
+
source_code_uri: https://github.com/hbontempo-br/yabeda-karafka
|
121
|
+
changelog_uri: https://github.com/hbontempo-br/yabeda-karafka/blob/master/CHANGELOG.md
|
122
|
+
bug_tracker_uri: https://github.com/hbontempo-br/yabeda-karafka/issues
|
123
|
+
post_install_message:
|
124
|
+
rdoc_options: []
|
125
|
+
require_paths:
|
126
|
+
- lib
|
127
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '2.7'
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
requirements:
|
134
|
+
- - ">="
|
135
|
+
- !ruby/object:Gem::Version
|
136
|
+
version: '0'
|
137
|
+
requirements: []
|
138
|
+
rubygems_version: 3.4.10
|
139
|
+
signing_key:
|
140
|
+
specification_version: 4
|
141
|
+
summary: Monitoring of Karafka operation
|
142
|
+
test_files: []
|