prometheus_exporter 0.1.3 → 0.1.4
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ce91417f88ed90178a27b9afabbd205375083260dae5eeaa07241dd03d71982
|
4
|
+
data.tar.gz: 95bcbb41f28bdf3c6ed0708c208d979f36728aa7ec339c0db69470789a4afb13
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53f83e8fee67c6d3ad13508b0785ff83d96117ae0dc1e560e12643e8983c19ed81a7f34a5951f2de707ad7c9b96fb921ba3ff7d7d8b45684175ecbf0c4818140
|
7
|
+
data.tar.gz: f5c4c83a44bdf8a1cf09c449af256426d1596f33c9dd94571bfca426f5cb0a94acae7031d983e8a63f49744b1c93b32e2605a88c99d720e4eadf73a6b0d79bcd
|
data/bench/bench.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require_relative '../lib/prometheus_exporter'
|
2
|
+
require_relative '../lib/prometheus_exporter/client'
|
3
|
+
require_relative '../lib/prometheus_exporter/server'
|
4
|
+
require 'oj'
|
5
|
+
|
6
|
+
# test how long it takes a custom collector to process 10k messages
|
7
|
+
|
8
|
+
class Collector
|
9
|
+
def initialize(done)
|
10
|
+
@i = 0
|
11
|
+
@done = done
|
12
|
+
end
|
13
|
+
|
14
|
+
def process(message)
|
15
|
+
_parsed = JSON.parse(message)
|
16
|
+
p @i if @i % 100 == 0
|
17
|
+
@done.call if (@i += 1) == 10_000
|
18
|
+
end
|
19
|
+
|
20
|
+
def prometheus_metrics_text
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
@start = nil
|
25
|
+
done = lambda do
|
26
|
+
puts "Elapsed for 10k messages is #{Time.now - @start}"
|
27
|
+
end
|
28
|
+
|
29
|
+
collector = Collector.new(done)
|
30
|
+
server = PrometheusExporter::Server::WebServer.new port: 12349, collector: collector
|
31
|
+
server.start
|
32
|
+
client = PrometheusExporter::Client.new port: 12349, max_queue_size: 20_000
|
33
|
+
|
34
|
+
@start = Time.now
|
35
|
+
10_000.times { client.send_json(hello: "world") }
|
36
|
+
|
37
|
+
sleep
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'json'
|
4
3
|
require 'socket'
|
5
4
|
require 'thread'
|
6
5
|
|
@@ -15,7 +14,7 @@ class PrometheusExporter::Client
|
|
15
14
|
end
|
16
15
|
|
17
16
|
def observe(value = 1, keys = nil)
|
18
|
-
@client.
|
17
|
+
@client.send_json(
|
19
18
|
type: @type,
|
20
19
|
help: @help,
|
21
20
|
name: @name,
|
@@ -28,7 +27,7 @@ class PrometheusExporter::Client
|
|
28
27
|
MAX_SOCKET_AGE = 25
|
29
28
|
MAX_QUEUE_SIZE = 10_000
|
30
29
|
|
31
|
-
def initialize(host
|
30
|
+
def initialize(host: 'localhost', port:, max_queue_size: nil, thread_sleep: 0.5)
|
32
31
|
@metrics = []
|
33
32
|
|
34
33
|
@queue = Queue.new
|
@@ -56,8 +55,12 @@ class PrometheusExporter::Client
|
|
56
55
|
metric
|
57
56
|
end
|
58
57
|
|
59
|
-
def
|
60
|
-
|
58
|
+
def send_json(obj)
|
59
|
+
send(obj.to_json)
|
60
|
+
end
|
61
|
+
|
62
|
+
def send(str)
|
63
|
+
@queue << str
|
61
64
|
if @queue.length > @max_queue_size
|
62
65
|
STDERR.puts "Prometheus Exporter client is dropping message cause queue is full"
|
63
66
|
@queue.pop
|
@@ -136,23 +139,23 @@ class PrometheusExporter::Client
|
|
136
139
|
end
|
137
140
|
|
138
141
|
def close_socket_if_old!
|
139
|
-
if @socket && ((@socket_started + MAX_SOCKET_AGE)
|
142
|
+
if @socket && ((@socket_started + MAX_SOCKET_AGE) < Time.now.to_f)
|
143
|
+
p "CLOSE OLD"
|
140
144
|
close_socket!
|
141
145
|
end
|
142
146
|
end
|
143
147
|
|
144
148
|
def ensure_socket!
|
145
149
|
close_socket_if_old!
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
@socket_started = Time.now.to_f
|
150
|
+
if !@socket
|
151
|
+
@socket = TCPSocket.new @host, @port
|
152
|
+
@socket.write("POST /send-metrics HTTP/1.1\r\n")
|
153
|
+
@socket.write("Transfer-Encoding: chunked\r\n")
|
154
|
+
@socket.write("Connection: Close\r\n")
|
155
|
+
@socket.write("Content-Type: application/octet-stream\r\n")
|
156
|
+
@socket.write("\r\n")
|
157
|
+
@socket_started = Time.now.to_f
|
158
|
+
end
|
156
159
|
|
157
160
|
nil
|
158
161
|
rescue
|
@@ -11,6 +11,12 @@ module PrometheusExporter::Server
|
|
11
11
|
|
12
12
|
def initialize(port: , collector: nil)
|
13
13
|
|
14
|
+
@total_metrics = PrometheusExporter::Metric::Counter.new("total_collector_metrics", "total metrics processed by exporter web")
|
15
|
+
|
16
|
+
@total_sessions = PrometheusExporter::Metric::Counter.new("total_collector_sessions", "total send_metric sessions processed by exporter web")
|
17
|
+
|
18
|
+
@total_bad_metrics = PrometheusExporter::Metric::Counter.new("total_collector_bad_metrics", "total mis-handled metrics by collector")
|
19
|
+
|
14
20
|
@server = WEBrick::HTTPServer.new(
|
15
21
|
Port: port,
|
16
22
|
AccessLog: [],
|
@@ -48,10 +54,13 @@ module PrometheusExporter::Server
|
|
48
54
|
end
|
49
55
|
|
50
56
|
def handle_metrics(req, res)
|
57
|
+
@total_sessions.observe
|
51
58
|
req.body do |block|
|
52
59
|
begin
|
53
|
-
@
|
60
|
+
@total_metrics.observe
|
61
|
+
@collector.process(block)
|
54
62
|
rescue => e
|
63
|
+
@total_bad_metrics.observe
|
55
64
|
res.body = "Bad Metrics #{e}"
|
56
65
|
res.status = e.respond_to?(:status_code) ? e.status_code : 500
|
57
66
|
return
|
@@ -87,22 +96,26 @@ module PrometheusExporter::Server
|
|
87
96
|
STDERR.puts "Generating Prometheus metrics text timed out"
|
88
97
|
end
|
89
98
|
|
90
|
-
|
99
|
+
metrics = []
|
91
100
|
|
92
|
-
add_gauge(
|
101
|
+
metrics << add_gauge(
|
93
102
|
"collector_working",
|
94
103
|
"Is the master process collector able to collect metrics",
|
95
104
|
metric_text && metric_text.length > 0 ? 1 : 0
|
96
105
|
)
|
97
106
|
|
98
|
-
add_gauge(
|
107
|
+
metrics << add_gauge(
|
99
108
|
"collector_rss",
|
100
109
|
"total memory used by collector process",
|
101
110
|
get_rss
|
102
111
|
)
|
103
112
|
|
113
|
+
metrics << @total_metrics
|
114
|
+
metrics << @total_sessions
|
115
|
+
metrics << @total_bad_metrics
|
116
|
+
|
104
117
|
<<~TEXT
|
105
|
-
#{
|
118
|
+
#{metrics.map(&:to_prometheus_text).join("\n\n")}
|
106
119
|
#{metric_text}
|
107
120
|
TEXT
|
108
121
|
end
|
@@ -116,7 +129,7 @@ module PrometheusExporter::Server
|
|
116
129
|
def add_gauge(name, help, value)
|
117
130
|
gauge = PrometheusExporter::Metric::Gauge.new(name, help)
|
118
131
|
gauge.observe(value)
|
119
|
-
|
132
|
+
gauge
|
120
133
|
end
|
121
134
|
|
122
135
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: prometheus_exporter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -96,6 +96,7 @@ files:
|
|
96
96
|
- LICENSE.txt
|
97
97
|
- README.md
|
98
98
|
- Rakefile
|
99
|
+
- bench/bench.rb
|
99
100
|
- examples/custom_collector.rb
|
100
101
|
- lib/prometheus_exporter.rb
|
101
102
|
- lib/prometheus_exporter/client.rb
|