promenade 0.1.0 → 0.1.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 +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +10 -0
- data/Gemfile +0 -2
- data/Gemfile.lock +19 -1
- data/README.md +3 -0
- data/Rakefile +3 -1
- data/lib/promenade/helper.rb +1 -1
- data/lib/promenade/kafka/async_producer_subscriber.rb +51 -0
- data/lib/promenade/kafka/connection_subscriber.rb +47 -0
- data/lib/promenade/kafka/consumer_subscriber.rb +145 -0
- data/lib/promenade/kafka/fetcher_subscriber.rb +21 -0
- data/lib/promenade/kafka/producer_subscriber.rb +117 -0
- data/lib/promenade/kafka/subscriber.rb +18 -0
- data/lib/promenade/kafka.rb +5 -0
- data/lib/promenade/prometheus.rb +45 -51
- data/lib/promenade/version.rb +1 -1
- data/promenade.gemspec +7 -6
- metadata +41 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7623122f1e7054e684064826e995acb44df8d056574b2c942a91d033d0a996a
|
4
|
+
data.tar.gz: 6da50efcc35f572b65a8bb0d85380442cdaa7529f8250efc00386ad2a0eb6267
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7bd6eb7ade6531acfbabb050c7d93986a9af727256f02afaef949146c286ea70a54ea6039eb48a18c60aa5662610111557db83ef2ab653ae3ba93436e6eb72c8
|
7
|
+
data.tar.gz: bf642c2d8e698be5d6d01b827472a1fbc65c7c6eb1db6ba5094e266b53339155b94454c73d1f0a3406b8fe9153728186d931c5cc16d79ff568ee377a92b60e53
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
inherit_from:
|
2
|
+
- https://raw.githubusercontent.com/cookpad/guides/master/.rubocop.yml
|
3
|
+
|
4
|
+
AllCops:
|
5
|
+
TargetRubyVersion: 2.4
|
6
|
+
|
7
|
+
Style/TrailingCommaInHashLiteral:
|
8
|
+
EnforcedStyleForMultiline: comma
|
9
|
+
Style/TrailingCommaInArguments:
|
10
|
+
EnforcedStyleForMultiline: comma
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
promenade (0.1.
|
4
|
+
promenade (0.1.1)
|
5
5
|
activesupport
|
6
6
|
prometheus-client-mmap (~> 0.9.3)
|
7
7
|
|
@@ -13,14 +13,21 @@ GEM
|
|
13
13
|
i18n (>= 0.7, < 2)
|
14
14
|
minitest (~> 5.1)
|
15
15
|
tzinfo (~> 1.1)
|
16
|
+
ast (2.4.0)
|
16
17
|
concurrent-ruby (1.0.5)
|
17
18
|
diff-lcs (1.3)
|
18
19
|
docile (1.3.1)
|
19
20
|
i18n (1.0.1)
|
20
21
|
concurrent-ruby (~> 1.0)
|
22
|
+
jaro_winkler (1.5.1)
|
21
23
|
json (2.1.0)
|
22
24
|
minitest (5.11.3)
|
25
|
+
parallel (1.12.1)
|
26
|
+
parser (2.5.1.0)
|
27
|
+
ast (~> 2.4.0)
|
28
|
+
powerpack (0.1.2)
|
23
29
|
prometheus-client-mmap (0.9.3)
|
30
|
+
rainbow (3.0.0)
|
24
31
|
rake (10.5.0)
|
25
32
|
rspec (3.7.0)
|
26
33
|
rspec-core (~> 3.7.0)
|
@@ -35,6 +42,15 @@ GEM
|
|
35
42
|
diff-lcs (>= 1.2.0, < 2.0)
|
36
43
|
rspec-support (~> 3.7.0)
|
37
44
|
rspec-support (3.7.1)
|
45
|
+
rubocop (0.57.2)
|
46
|
+
jaro_winkler (~> 1.5.1)
|
47
|
+
parallel (~> 1.10)
|
48
|
+
parser (>= 2.5)
|
49
|
+
powerpack (~> 0.1)
|
50
|
+
rainbow (>= 2.2.2, < 4.0)
|
51
|
+
ruby-progressbar (~> 1.7)
|
52
|
+
unicode-display_width (~> 1.0, >= 1.0.1)
|
53
|
+
ruby-progressbar (1.9.0)
|
38
54
|
simplecov (0.16.1)
|
39
55
|
docile (~> 1.1)
|
40
56
|
json (>= 1.8, < 3)
|
@@ -43,6 +59,7 @@ GEM
|
|
43
59
|
thread_safe (0.3.6)
|
44
60
|
tzinfo (1.2.5)
|
45
61
|
thread_safe (~> 0.1)
|
62
|
+
unicode-display_width (1.4.0)
|
46
63
|
|
47
64
|
PLATFORMS
|
48
65
|
ruby
|
@@ -52,6 +69,7 @@ DEPENDENCIES
|
|
52
69
|
promenade!
|
53
70
|
rake (~> 10.0)
|
54
71
|
rspec (~> 3.0)
|
72
|
+
rubocop
|
55
73
|
simplecov
|
56
74
|
|
57
75
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Promenade
|
2
2
|
|
3
|
+
[](https://travis-ci.org/errm/promenade)
|
4
|
+
[](https://badge.fury.io/rb/promenade)
|
5
|
+
|
3
6
|
Promenade is a libary to simplify instrumenting Ruby applications with prometheus.
|
4
7
|
|
5
8
|
It is currently under development.
|
data/Rakefile
CHANGED
data/lib/promenade/helper.rb
CHANGED
@@ -5,7 +5,7 @@ module Promenade
|
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
class_methods do
|
8
|
-
%i
|
8
|
+
%i(gauge counter summary histogram).each do |type|
|
9
9
|
define_method type do |*args, &block|
|
10
10
|
Promenade::Prometheus.define_metric(type, *args, &block)
|
11
11
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "promenade/kafka/subscriber"
|
2
|
+
|
3
|
+
module Promenade
|
4
|
+
module Kafka
|
5
|
+
class AsyncProducerSubscriber < Subscriber
|
6
|
+
attach_to "async_producer.kafka"
|
7
|
+
|
8
|
+
gauge :kafka_async_producer_queue_size do
|
9
|
+
doc "Size of Kafka async producer queue"
|
10
|
+
end
|
11
|
+
|
12
|
+
gauge :kafka_async_producer_max_queue_size do
|
13
|
+
doc "Max size of Kafka async producer queue"
|
14
|
+
end
|
15
|
+
|
16
|
+
gauge :kafka_async_producer_queue_fill_ratio do
|
17
|
+
doc "Size of Kafka async producer queue"
|
18
|
+
end
|
19
|
+
|
20
|
+
counter :kafka_async_producer_buffer_overflows do
|
21
|
+
doc "Count of buffer overflows"
|
22
|
+
end
|
23
|
+
|
24
|
+
counter :kafka_async_producer_dropped_messages do
|
25
|
+
doc "Count of dropped messages"
|
26
|
+
end
|
27
|
+
|
28
|
+
def enqueue_message(event)
|
29
|
+
labels = get_labels(event)
|
30
|
+
queue_size = event.payload.fetch(:queue_size)
|
31
|
+
max_queue_size = event.payload.fetch(:max_queue_size)
|
32
|
+
queue_fill_ratio = queue_size.to_f / max_queue_size.to_f
|
33
|
+
|
34
|
+
metric(:kafka_async_producer_queue_size).set(labels, queue_size)
|
35
|
+
metric(:kafka_async_producer_max_queue_size).set(labels, max_queue_size)
|
36
|
+
metric(:kafka_async_producer_queue_fill_ratio).set(labels, queue_fill_ratio)
|
37
|
+
end
|
38
|
+
|
39
|
+
def buffer_overflow(event)
|
40
|
+
metric(:kafka_async_producer_buffer_overflows).increment(get_labels(event))
|
41
|
+
end
|
42
|
+
|
43
|
+
def drop_messages(event)
|
44
|
+
client = event.payload.fetch(:client_id)
|
45
|
+
message_count = event.payload.fetch(:message_count)
|
46
|
+
|
47
|
+
metric(:kafka_async_producer_dropped_messages).increment({ client: client }, message_count)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "promenade/kafka/subscriber"
|
2
|
+
|
3
|
+
module Promenade
|
4
|
+
module Kafka
|
5
|
+
class ConnectionSubscriber < Subscriber
|
6
|
+
attach_to "connection.kafka"
|
7
|
+
|
8
|
+
histogram :kafka_connection_latency do
|
9
|
+
doc "Request latency"
|
10
|
+
buckets :network
|
11
|
+
end
|
12
|
+
|
13
|
+
counter :kafka_connection_calls do
|
14
|
+
doc "Count of calls made to Kafka broker"
|
15
|
+
end
|
16
|
+
|
17
|
+
summary :kafka_connection_request_size do
|
18
|
+
doc "Average size of requests made to kafka"
|
19
|
+
end
|
20
|
+
|
21
|
+
summary :kafka_connection_response_size do
|
22
|
+
doc "Average size of responses made by kafka"
|
23
|
+
end
|
24
|
+
|
25
|
+
histogram :kafka_connection_errors do
|
26
|
+
doc "Count of Kafka connection errors"
|
27
|
+
buckets :memory
|
28
|
+
end
|
29
|
+
|
30
|
+
def request(event) # rubocop:disable Metrics/AbcSize
|
31
|
+
labels = {
|
32
|
+
client: event.payload.fetch(:client_id),
|
33
|
+
api: event.payload.fetch(:api, "unknown"),
|
34
|
+
broker: event.payload.fetch(:broker_host),
|
35
|
+
}
|
36
|
+
|
37
|
+
metric(:kafka_connection_calls).increment(labels)
|
38
|
+
metric(:kafka_connection_latency).observe(labels, event.duration)
|
39
|
+
|
40
|
+
metric(:kafka_connection_request_size).observe(labels, event.payload.fetch(:request_size, 0))
|
41
|
+
metric(:kafka_connection_response_size).observe(labels, event.payload.fetch(:response_size, 0))
|
42
|
+
|
43
|
+
metric(:kafka_connection_errors).increment if event.payload.key?(:exception)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require "promenade/kafka/subscriber"
|
2
|
+
|
3
|
+
module Promenade
|
4
|
+
module Kafka
|
5
|
+
class ConsumerSubscriber < Subscriber
|
6
|
+
attach_to "consumer.kafka"
|
7
|
+
|
8
|
+
gauge :kafka_consumer_time_lag do
|
9
|
+
doc "Lag between message create and consume time"
|
10
|
+
end
|
11
|
+
|
12
|
+
gauge :kafka_consumer_ofset_lag do
|
13
|
+
doc "Lag between message create and consume time"
|
14
|
+
end
|
15
|
+
|
16
|
+
histogram :kafka_consumer_message_processing_latency do
|
17
|
+
doc "Consumer message processing latency"
|
18
|
+
buckets :network
|
19
|
+
end
|
20
|
+
|
21
|
+
counter :kafka_consumer_messages_processed do
|
22
|
+
doc "Messages processed by this consumer"
|
23
|
+
end
|
24
|
+
|
25
|
+
counter :kafka_consumer_message_processing_errors do
|
26
|
+
doc "Consumer errors while processing a message"
|
27
|
+
end
|
28
|
+
|
29
|
+
histogram :kafka_consumer_batch_processing_latency do
|
30
|
+
doc "Consumer batch processing latency"
|
31
|
+
buckets :network
|
32
|
+
end
|
33
|
+
|
34
|
+
counter :kafka_consumer_batch_processing_errors do
|
35
|
+
doc "Consumer errors while processing a batch"
|
36
|
+
end
|
37
|
+
|
38
|
+
histogram :kafka_consumer_join_group do
|
39
|
+
doc "Time taken to join"
|
40
|
+
buckets :network
|
41
|
+
end
|
42
|
+
|
43
|
+
counter :kafka_consumer_join_group_errors do
|
44
|
+
doc "Errors joining the group"
|
45
|
+
end
|
46
|
+
|
47
|
+
histogram :kafka_consumer_sync_group do
|
48
|
+
doc "Time taken to sync"
|
49
|
+
buckets :network
|
50
|
+
end
|
51
|
+
|
52
|
+
counter :kafka_consumer_sync_group_errors do
|
53
|
+
doc "Errors syncing the group"
|
54
|
+
end
|
55
|
+
|
56
|
+
histogram :kafka_consumer_leave_group do
|
57
|
+
doc "Time taken to leave group"
|
58
|
+
buckets :network
|
59
|
+
end
|
60
|
+
|
61
|
+
counter :kafka_consumer_leave_group_errors do
|
62
|
+
doc "Errors leaving the group"
|
63
|
+
end
|
64
|
+
|
65
|
+
histogram :kafka_consumer_pause_duration do
|
66
|
+
doc "Time taken to leave group"
|
67
|
+
buckets :network
|
68
|
+
end
|
69
|
+
|
70
|
+
def process_message(event) # rubocop:disable Metrics/AbcSize
|
71
|
+
labels = get_labels(event)
|
72
|
+
offset_lag = event.payload.fetch(:offset_lag)
|
73
|
+
create_time = event.payload.fetch(:create_time)
|
74
|
+
time_lag = create_time && ((Time.now.utc - create_time) * 1000).to_i
|
75
|
+
|
76
|
+
if event.payload.key?(:exception)
|
77
|
+
metric(:kafka_consumer_message_processing_errors).increment(labels)
|
78
|
+
else
|
79
|
+
metric(:kafka_consumer_messages_processed).increment(labels)
|
80
|
+
metric(:kafka_consumer_message_processing_latency).observe(labels, event.duration)
|
81
|
+
end
|
82
|
+
|
83
|
+
metric(:kafka_consumer_ofset_lag).set(labels, offset_lag)
|
84
|
+
|
85
|
+
# Not all messages have timestamps.
|
86
|
+
metric(:kafka_consumer_time_lag).set(labels, time_lag) if time_lag
|
87
|
+
end
|
88
|
+
|
89
|
+
def process_batch(event) # rubocop:disable Metrics/AbcSize
|
90
|
+
labels = get_labels(event)
|
91
|
+
lag = event.payload.fetch(:offset_lag)
|
92
|
+
messages = event.payload.fetch(:message_count)
|
93
|
+
|
94
|
+
if event.payload.key?(:exception)
|
95
|
+
metric(:kafka_consumer_batch_processing_errors).increment(labels)
|
96
|
+
else
|
97
|
+
metric(:kafka_consumer_messages_processed).increment(labels, messages)
|
98
|
+
metric(:kafka_consumer_batch_processing_latency).observe(labels, event.duration)
|
99
|
+
end
|
100
|
+
|
101
|
+
metric(:kafka_consumer_ofset_lag).set(labels, lag)
|
102
|
+
end
|
103
|
+
|
104
|
+
def join_group(event)
|
105
|
+
labels = group_labels(event)
|
106
|
+
metric(:kafka_consumer_join_group).observe(labels, event.duration)
|
107
|
+
metric(:kafka_consumer_join_group_errors).increment(labels) if event.payload.key?(:exception)
|
108
|
+
end
|
109
|
+
|
110
|
+
def sync_group(event)
|
111
|
+
labels = group_labels(event)
|
112
|
+
metric(:kafka_consumer_sync_group).observe(labels, event.duration)
|
113
|
+
metric(:kafka_consumer_sync_group_errors).increment(labels) if event.payload.key?(:exception)
|
114
|
+
end
|
115
|
+
|
116
|
+
def leave_group(event)
|
117
|
+
labels = group_labels(event)
|
118
|
+
metric(:kafka_consumer_leave_group).observe(labels, event.duration)
|
119
|
+
metric(:kafka_consumer_leave_group_errors).increment(labels) if event.payload.key?(:exception)
|
120
|
+
end
|
121
|
+
|
122
|
+
def pause_status(event)
|
123
|
+
metric(:kafka_consumer_pause_duration).observe(get_labels(event), event.payload.fetch(:duration))
|
124
|
+
end
|
125
|
+
|
126
|
+
private
|
127
|
+
|
128
|
+
def get_labels(event)
|
129
|
+
{
|
130
|
+
client: event.payload.fetch(:client_id),
|
131
|
+
group: event.payload.fetch(:group_id),
|
132
|
+
topic: event.payload.fetch(:topic),
|
133
|
+
partition: event.payload.fetch(:partition),
|
134
|
+
}
|
135
|
+
end
|
136
|
+
|
137
|
+
def group_labels(event)
|
138
|
+
{
|
139
|
+
client: event.payload.fetch(:client_id),
|
140
|
+
group: event.payload.fetch(:group_id),
|
141
|
+
}
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require "promenade/kafka/subscriber"
|
2
|
+
|
3
|
+
module Promenade
|
4
|
+
module Kafka
|
5
|
+
class FetcherSubscriber < Subscriber
|
6
|
+
attach_to "fetcher.kafka"
|
7
|
+
|
8
|
+
gauge :kafka_fetcher_queue_size do
|
9
|
+
doc "Fetcher queue size"
|
10
|
+
end
|
11
|
+
|
12
|
+
def loop(event)
|
13
|
+
queue_size = event.payload.fetch(:queue_size)
|
14
|
+
client = event.payload.fetch(:client_id)
|
15
|
+
group_id = event.payload.fetch(:group_id)
|
16
|
+
|
17
|
+
metric(:kafka_fetcher_queue_size).set({ client: client, group: group_id }, queue_size)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require "promenade/kafka/subscriber"
|
2
|
+
|
3
|
+
module Promenade
|
4
|
+
module Kafka
|
5
|
+
class ProducerSubscriber < Subscriber
|
6
|
+
attach_to "producer.kafka"
|
7
|
+
|
8
|
+
counter :kafka_producer_messages do
|
9
|
+
doc "Number of messages written to Kafka producer"
|
10
|
+
end
|
11
|
+
|
12
|
+
histogram :kafka_producer_message_size do
|
13
|
+
doc "Historgram of message sizes written to Kafka producer"
|
14
|
+
buckets :memory
|
15
|
+
end
|
16
|
+
|
17
|
+
gauge :kafka_producer_buffer_size do
|
18
|
+
doc "The current size of the Kafka producer buffer, in messages"
|
19
|
+
end
|
20
|
+
|
21
|
+
gauge :kafka_producer_max_buffer_size do
|
22
|
+
doc "The max size of the Kafka producer buffer"
|
23
|
+
end
|
24
|
+
|
25
|
+
gauge :kafka_producer_buffer_fill_ratio do
|
26
|
+
doc "The current ratio of Kafka producer buffer in use"
|
27
|
+
end
|
28
|
+
|
29
|
+
counter :kafka_producer_buffer_overflows do
|
30
|
+
doc "A count of kafka producer buffer overflow errors"
|
31
|
+
end
|
32
|
+
|
33
|
+
counter :kafka_producer_delivery_errors do
|
34
|
+
doc "A count of kafka producer delivery errors"
|
35
|
+
end
|
36
|
+
|
37
|
+
histogram :kafka_producer_delivery_latency do
|
38
|
+
doc "Kafka producer delivery latency histogram"
|
39
|
+
buckets :network
|
40
|
+
end
|
41
|
+
|
42
|
+
counter :kafka_producer_delivered_messages do
|
43
|
+
doc "A count of the total messages delivered to Kafka"
|
44
|
+
end
|
45
|
+
|
46
|
+
histogram :kafka_producer_delivery_attempts do
|
47
|
+
doc "A count of the total message deliveries attempted"
|
48
|
+
buckets [0, 6, 12, 18, 24, 30]
|
49
|
+
end
|
50
|
+
|
51
|
+
counter :kafka_producer_ack_messages do
|
52
|
+
doc "Count of the number of messages Acked by Kafka"
|
53
|
+
end
|
54
|
+
|
55
|
+
histogram :kafka_producer_ack_latency do
|
56
|
+
doc "Delay between message being produced and Acked"
|
57
|
+
buckets :network
|
58
|
+
end
|
59
|
+
|
60
|
+
counter :kafka_producer_ack_errors do
|
61
|
+
doc "Count of the number of Kafka Ack errors"
|
62
|
+
end
|
63
|
+
|
64
|
+
def produce_message(event) # rubocop:disable Metrics/AbcSize
|
65
|
+
labels = get_labels(event)
|
66
|
+
message_size = event.payload.fetch(:message_size)
|
67
|
+
buffer_size = event.payload.fetch(:buffer_size)
|
68
|
+
max_buffer_size = event.payload.fetch(:max_buffer_size)
|
69
|
+
buffer_fill_ratio = buffer_size.to_f / max_buffer_size.to_f
|
70
|
+
|
71
|
+
metric(:kafka_producer_messages).increment(labels)
|
72
|
+
metric(:kafka_producer_message_size).observe(labels, message_size)
|
73
|
+
metric(:kafka_producer_buffer_size).set(labels.slice(:client), buffer_size)
|
74
|
+
metric(:kafka_producer_max_buffer_size).set(labels.slice(:client), max_buffer_size)
|
75
|
+
metric(:kafka_producer_buffer_fill_ratio).set(labels.slice(:client), buffer_fill_ratio)
|
76
|
+
end
|
77
|
+
|
78
|
+
def buffer_overflow(event)
|
79
|
+
metric(:kafka_producer_buffer_overflows).increment(get_labels(event))
|
80
|
+
end
|
81
|
+
|
82
|
+
def deliver_messages(event) # rubocop:disable Metrics/AbcSize
|
83
|
+
labels = { client: event.payload.fetch(:client_id) }
|
84
|
+
message_count = event.payload.fetch(:delivered_message_count)
|
85
|
+
attempts = event.payload.fetch(:attempts)
|
86
|
+
|
87
|
+
metric(:kafka_producer_delivery_errors).increment(labels) if event.payload.key?(:exception)
|
88
|
+
metric(:kafka_producer_delivery_latency).observe(labels, event.duration)
|
89
|
+
metric(:kafka_producer_delivered_messages).increment(labels, message_count)
|
90
|
+
metric(:kafka_producer_delivery_attempts).observe(labels, attempts)
|
91
|
+
end
|
92
|
+
|
93
|
+
def ack_message(event)
|
94
|
+
labels = get_labels(event)
|
95
|
+
delay = event.payload.fetch(:delay)
|
96
|
+
|
97
|
+
metric(:kafka_producer_ack_messages).increment(labels)
|
98
|
+
metric(:kafka_producer_ack_latency).observe(labels, delay)
|
99
|
+
end
|
100
|
+
|
101
|
+
def topic_error(event)
|
102
|
+
client = event.payload.fetch(:client_id)
|
103
|
+
topic = event.payload.fetch(:topic)
|
104
|
+
|
105
|
+
metric(:kafka_producer_ack_errors).increment(client: client, topic: topic)
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def get_labels(event)
|
111
|
+
client = event.payload.fetch(:client_id)
|
112
|
+
topic = event.payload.fetch(:topic)
|
113
|
+
{ client: client, topic: topic }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "promenade/helper"
|
2
|
+
require "active_support/subscriber"
|
3
|
+
|
4
|
+
module Promenade
|
5
|
+
module Kafka
|
6
|
+
class Subscriber < ActiveSupport::Subscriber
|
7
|
+
include ::Promenade::Helper
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def get_labels(event)
|
12
|
+
client = event.payload.fetch(:client_id)
|
13
|
+
topic = event.payload.fetch(:topic)
|
14
|
+
{ client: client, topic: topic }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/promenade/prometheus.rb
CHANGED
@@ -25,68 +25,62 @@ module Promenade
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.registry
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def self.reset!
|
36
|
-
@_registry = nil
|
37
|
-
::Prometheus::Client.reset!
|
28
|
+
REGISTRY_MUTEX.synchronize do
|
29
|
+
@_registry ||= ::Prometheus::Client.registry
|
30
|
+
end
|
38
31
|
end
|
39
|
-
end
|
40
32
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
33
|
+
class Options
|
34
|
+
BUCKET_PRESETS = {
|
35
|
+
network: [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10].freeze,
|
36
|
+
memory: (0..10).map { |i| 128 * 2**i },
|
37
|
+
}.freeze
|
45
38
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
39
|
+
def initialize
|
40
|
+
@buckets = BUCKET_PRESETS[:network]
|
41
|
+
@base_labels = {}
|
42
|
+
@doc = nil
|
43
|
+
@multiprocess_mode = :all
|
44
|
+
end
|
52
45
|
|
53
|
-
|
54
|
-
|
55
|
-
|
46
|
+
def doc(str)
|
47
|
+
@doc = str
|
48
|
+
end
|
56
49
|
|
57
|
-
|
58
|
-
|
59
|
-
|
50
|
+
def base_labels(labels)
|
51
|
+
@base_labels = labels
|
52
|
+
end
|
60
53
|
|
61
|
-
|
62
|
-
|
63
|
-
|
54
|
+
def multiprocess_mode(mode)
|
55
|
+
@multiprocess_mode = mode
|
56
|
+
end
|
64
57
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
58
|
+
def buckets(buckets)
|
59
|
+
if buckets.is_a?(Symbol)
|
60
|
+
@buckets = BUCKET_PRESETS[buckets]
|
61
|
+
fail "#{buckets} is not a valid bucket preset" if @buckets.nil?
|
62
|
+
else
|
63
|
+
@buckets = buckets
|
64
|
+
end
|
71
65
|
end
|
72
|
-
end
|
73
66
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
67
|
+
def args(type)
|
68
|
+
case type
|
69
|
+
when :gauge
|
70
|
+
[@doc, @base_labels, @multiprocess_mode]
|
71
|
+
when :histogram
|
72
|
+
[@doc, @base_labels, @buckets]
|
73
|
+
when :counter, :summary
|
74
|
+
[@doc, @base_labels]
|
75
|
+
else
|
76
|
+
fail "Unsupported metric type: #{type}"
|
77
|
+
end
|
84
78
|
end
|
85
|
-
end
|
86
79
|
|
87
|
-
|
88
|
-
|
89
|
-
|
80
|
+
def evaluate(&block)
|
81
|
+
instance_eval(&block) if block_given?
|
82
|
+
self
|
83
|
+
end
|
90
84
|
end
|
91
85
|
end
|
92
86
|
end
|
data/lib/promenade/version.rb
CHANGED
data/promenade.gemspec
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
lib = File.expand_path("../lib", __FILE__)
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
3
2
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
3
|
require "promenade/version"
|
5
4
|
|
@@ -9,22 +8,24 @@ Gem::Specification.new do |spec|
|
|
9
8
|
spec.authors = ["Ed Robinson"]
|
10
9
|
spec.email = ["edward-robinson@cookpad.com"]
|
11
10
|
|
12
|
-
spec.summary =
|
11
|
+
spec.summary = "Promenade makes it simple to instrument Ruby apps for prometheus scraping"
|
13
12
|
spec.homepage = "https://github.com/errm/promenade"
|
14
13
|
spec.license = "MIT"
|
15
14
|
|
16
15
|
# Specify which files should be added to the gem when it is released.
|
17
16
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
18
|
-
spec.files = Dir.chdir(File.expand_path(
|
17
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
19
18
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
20
19
|
end
|
21
20
|
|
22
21
|
spec.require_paths = ["lib"]
|
23
22
|
|
23
|
+
spec.add_dependency "activesupport"
|
24
|
+
spec.add_dependency "prometheus-client-mmap", "~> 0.9.3"
|
25
|
+
|
24
26
|
spec.add_development_dependency "bundler", "~> 1.16"
|
25
27
|
spec.add_development_dependency "rake", "~> 10.0"
|
26
28
|
spec.add_development_dependency "rspec", "~> 3.0"
|
29
|
+
spec.add_development_dependency "rubocop"
|
27
30
|
spec.add_development_dependency "simplecov"
|
28
|
-
spec.add_dependency "activesupport"
|
29
|
-
spec.add_dependency "prometheus-client-mmap", "~> 0.9.3"
|
30
31
|
end
|
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: promenade
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ed Robinson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-07-
|
11
|
+
date: 2018-07-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: prometheus-client-mmap
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.9.3
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.9.3
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: bundler
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,7 +81,7 @@ dependencies:
|
|
53
81
|
- !ruby/object:Gem::Version
|
54
82
|
version: '3.0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
84
|
+
name: rubocop
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
58
86
|
requirements:
|
59
87
|
- - ">="
|
@@ -67,33 +95,19 @@ dependencies:
|
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: '0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
98
|
+
name: simplecov
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
72
100
|
requirements:
|
73
101
|
- - ">="
|
74
102
|
- !ruby/object:Gem::Version
|
75
103
|
version: '0'
|
76
|
-
type: :
|
104
|
+
type: :development
|
77
105
|
prerelease: false
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
108
|
- - ">="
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: prometheus-client-mmap
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - "~>"
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: 0.9.3
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - "~>"
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: 0.9.3
|
97
111
|
description:
|
98
112
|
email:
|
99
113
|
- edward-robinson@cookpad.com
|
@@ -103,6 +117,7 @@ extra_rdoc_files: []
|
|
103
117
|
files:
|
104
118
|
- ".gitignore"
|
105
119
|
- ".rspec"
|
120
|
+
- ".rubocop.yml"
|
106
121
|
- ".travis.yml"
|
107
122
|
- CODE_OF_CONDUCT.md
|
108
123
|
- Gemfile
|
@@ -115,6 +130,13 @@ files:
|
|
115
130
|
- bin/setup
|
116
131
|
- lib/promenade.rb
|
117
132
|
- lib/promenade/helper.rb
|
133
|
+
- lib/promenade/kafka.rb
|
134
|
+
- lib/promenade/kafka/async_producer_subscriber.rb
|
135
|
+
- lib/promenade/kafka/connection_subscriber.rb
|
136
|
+
- lib/promenade/kafka/consumer_subscriber.rb
|
137
|
+
- lib/promenade/kafka/fetcher_subscriber.rb
|
138
|
+
- lib/promenade/kafka/producer_subscriber.rb
|
139
|
+
- lib/promenade/kafka/subscriber.rb
|
118
140
|
- lib/promenade/prometheus.rb
|
119
141
|
- lib/promenade/version.rb
|
120
142
|
- promenade.gemspec
|