logstash-codec-prometheus 0.1.0 → 0.2.0
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/lib/logstash/codecs/prometheus.rb +24 -10
- data/logstash-codec-prometheus.gemspec +1 -1
- data/spec/codecs/prometheus_spec.rb +25 -19
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70f42545c6c2f2afb23084ba07f144c67ae4501cb29e0fbdfb18755039e0e151
|
4
|
+
data.tar.gz: abbfce71f80d73b0584694c3fb136515cf141e1dbd270f3bdbe44b34e29792da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d85fa26f4a9854912d557834a9fcbbf26da58427ecf522b012e3815783602c67c589c112b40e69ea82fea638165cbdbb78dacb42060b0708fd844d7a98624367
|
7
|
+
data.tar.gz: b2835b957093bc69bf1177232d214d99511ca4789ca197b599fbf309e06943d7bebc09f7c10e60837851741a80f3584e0f4beae47b17b3fee4fb54770b1f6cbe
|
@@ -6,6 +6,9 @@ require 'json'
|
|
6
6
|
class LogStash::Codecs::Prometheus < LogStash::Codecs::Base
|
7
7
|
config_name "prometheus"
|
8
8
|
|
9
|
+
#
|
10
|
+
config :multi_event, :validate => :boolean, :default => false
|
11
|
+
|
9
12
|
public
|
10
13
|
def register
|
11
14
|
@lines = LogStash::Codecs::Line.new
|
@@ -13,33 +16,44 @@ class LogStash::Codecs::Prometheus < LogStash::Codecs::Base
|
|
13
16
|
|
14
17
|
public
|
15
18
|
def decode(data)
|
19
|
+
events = []
|
16
20
|
@lines.decode(data) do |event|
|
17
21
|
unless event.get("message").start_with?("#")
|
18
22
|
metric_name, metric_value = event.get("message").split(" ")
|
19
23
|
unless metric_name.match(/^.+{.+}$/)
|
20
|
-
|
24
|
+
events << {metric_name => metric_value.to_f}
|
21
25
|
else
|
22
26
|
outside, inside = metric_name.match(/^(.+){(.+)}$/).captures
|
23
27
|
vars = inside.split(",")
|
28
|
+
labels = {}
|
24
29
|
vars.each do |var|
|
25
30
|
key, value = var.split("=")
|
26
|
-
|
27
|
-
|
31
|
+
labels[key.downcase] = value.gsub!(/^\"|\"?$/, "")
|
32
|
+
end
|
33
|
+
events << {outside.downcase => {"value" => metric_value.to_f, "labels" => labels}}
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
unless events.empty?
|
38
|
+
if @multi_event
|
39
|
+
events.each do |event|
|
40
|
+
yield LogStash::Event.new(event)
|
41
|
+
end
|
42
|
+
else
|
43
|
+
hash = {}
|
44
|
+
events.each do |event|
|
45
|
+
event.to_h.each do |metric_name, metric_value|
|
46
|
+
hash[metric_name] = metric_value
|
28
47
|
end
|
29
48
|
end
|
49
|
+
yield LogStash::Event.new(hash)
|
30
50
|
end
|
31
51
|
end
|
32
52
|
end
|
33
53
|
|
34
54
|
public
|
35
55
|
def encode(event)
|
36
|
-
|
37
|
-
event.to_hash.each do |metric_name,metric_value|
|
38
|
-
h[metric_name] = metric_value
|
39
|
-
end
|
40
|
-
unless h.empty?
|
41
|
-
@on_event.call(event, h.to_json)
|
42
|
-
end
|
56
|
+
@on_event.call(event, event.to_json)
|
43
57
|
end
|
44
58
|
|
45
59
|
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-codec-prometheus'
|
3
|
-
s.version = '0.
|
3
|
+
s.version = '0.2.0'
|
4
4
|
s.licenses = ['Apache-2.0']
|
5
5
|
s.summary = 'Reads `prometheus` formatted lines'
|
6
6
|
s.description = 'This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program'
|
@@ -8,7 +8,9 @@ require "insist"
|
|
8
8
|
|
9
9
|
describe LogStash::Codecs::Prometheus do
|
10
10
|
|
11
|
-
let(:
|
11
|
+
let(:cfg) {{"multi_event" => false}}
|
12
|
+
|
13
|
+
let(:codec) {LogStash::Codecs::Prometheus.new(cfg)}
|
12
14
|
|
13
15
|
before do
|
14
16
|
codec.register
|
@@ -21,38 +23,42 @@ describe LogStash::Codecs::Prometheus do
|
|
21
23
|
codec.decode("#test 1\n") do |event|
|
22
24
|
event_returned = true
|
23
25
|
end
|
24
|
-
insist {
|
26
|
+
insist {!event_returned}
|
25
27
|
end
|
26
28
|
|
27
29
|
it "should return an event from single full prometheus line" do
|
28
30
|
codec.decode("test 1\n") do |event|
|
29
|
-
insist {
|
30
|
-
insist {
|
31
|
+
insist {event.is_a?(LogStash::Event)}
|
32
|
+
insist {event.get("test")} == 1.to_f
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
34
|
-
it "should return
|
36
|
+
it "should return single event given multiple prometheus lines" do
|
35
37
|
counter = 0
|
36
|
-
codec.decode("
|
37
|
-
insist {
|
38
|
+
codec.decode("test1 1\ntest2 2\n") do |event|
|
39
|
+
insist {event.is_a?(LogStash::Event)}
|
40
|
+
insist {event.get("test1")} == 1.to_f
|
41
|
+
insist {event.get("test2")} == 2.to_f
|
38
42
|
counter += 1
|
39
43
|
end
|
40
|
-
insist {
|
44
|
+
insist {counter} == 1
|
41
45
|
end
|
42
46
|
|
43
|
-
it "should return
|
47
|
+
it "should return single event given a labeled metric" do
|
48
|
+
|
44
49
|
counter = 0
|
45
50
|
codec.decode("test{a=\"b\",x=\"y\"} 1\n") do |event|
|
46
|
-
insist {
|
51
|
+
insist {event.is_a?(LogStash::Event)}
|
52
|
+
insist {event.get("test")} == { "value" => 1.0, "labels" => { "a" => "b", "x" => "y" }}
|
47
53
|
counter += 1
|
48
54
|
end
|
49
|
-
insist {
|
55
|
+
insist {counter} == 1
|
50
56
|
end
|
51
57
|
|
52
|
-
it "should
|
58
|
+
it "should return event with labels for labeled metric" do
|
53
59
|
codec.decode("test{a=\"b\"} 1\n") do |event|
|
54
|
-
insist {
|
55
|
-
insist {
|
60
|
+
insist {event.is_a?(LogStash::Event)}
|
61
|
+
insist {event.get("test")} == { "value" => 1.0, "labels" => { "a" => "b" }}
|
56
62
|
end
|
57
63
|
end
|
58
64
|
|
@@ -61,17 +67,17 @@ describe LogStash::Codecs::Prometheus do
|
|
61
67
|
context "#encode" do
|
62
68
|
|
63
69
|
it "should return json data" do
|
64
|
-
data = {"foo" => 1.0, "bar" => 2.0}
|
70
|
+
data = {"foo" => 1.0, "bar" => { "value" => 2.0, "labels" => { "a" => "b" }}}
|
65
71
|
event = LogStash::Event.new(data)
|
66
72
|
got_event = false
|
67
73
|
codec.on_event do |event, message|
|
68
|
-
insist {
|
69
|
-
insist {
|
70
|
-
insist {
|
74
|
+
insist {message.chomp} == event.to_json
|
75
|
+
insist {LogStash::Json.load(message)["foo"]} == data["foo"]
|
76
|
+
insist {LogStash::Json.load(message)["bar"]} == data["bar"]
|
71
77
|
got_event = true
|
72
78
|
end
|
73
79
|
codec.encode(event)
|
74
|
-
insist {
|
80
|
+
insist {got_event}
|
75
81
|
end
|
76
82
|
|
77
83
|
end
|