logstash-codec-prometheus 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b78c11762b5d2d8402571191124e55b4a34efcfbbe7d835eac871ef7163bad9
4
- data.tar.gz: f290451b60e77b02591ea3295dbb80fbd88a8375102657a9546c148d589fc485
3
+ metadata.gz: 70f42545c6c2f2afb23084ba07f144c67ae4501cb29e0fbdfb18755039e0e151
4
+ data.tar.gz: abbfce71f80d73b0584694c3fb136515cf141e1dbd270f3bdbe44b34e29792da
5
5
  SHA512:
6
- metadata.gz: 38c3a2575b1478f98981278c60d8ab959bf3f8736f0d1cd25ac0aeae8bf2f5a1f3ce7b3822786755e438a0a179084ce60e8fbe3cf5e72a2e554019ffa596a62e
7
- data.tar.gz: dfdf449288985f78a1f278605398af1ddb0fd73db95fa38a016d2af0095020278cbdcccf2c8816f33ea3ec5c5d4bc245f5bf0450bdd61a3c69c60f2e44e40304
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
- yield LogStash::Event.new(metric_name => metric_value.to_f)
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
- custom_metric_name = [outside,key,value.gsub!(/^\"|\"?$/, "")].join('_')
27
- yield LogStash::Event.new(custom_metric_name => metric_value.to_f)
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
- h = {}
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.1.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(:codec) { LogStash::Codecs::Prometheus.new }
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 { !event_returned }
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 { event.is_a?(LogStash::Event) }
30
- insist { event.get("test") } == 1.to_f
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 an multiple events given multiple prometheus lines" do
36
+ it "should return single event given multiple prometheus lines" do
35
37
  counter = 0
36
- codec.decode("test 1\ntest 2\n") do |event|
37
- insist { event.is_a?(LogStash::Event) }
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 { counter } == 2
44
+ insist {counter} == 1
41
45
  end
42
46
 
43
- it "should return multiple events given a labeled metric" do
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 { event.is_a?(LogStash::Event) }
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 { counter } == 2
55
+ insist {counter} == 1
50
56
  end
51
57
 
52
- it "should have correct metric name for labeled metric" do
58
+ it "should return event with labels for labeled metric" do
53
59
  codec.decode("test{a=\"b\"} 1\n") do |event|
54
- insist { event.is_a?(LogStash::Event) }
55
- insist { event.get("test_a_b") } == 1.to_f
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 { message.chomp } == event.to_json
69
- insist { LogStash::Json.load(message)["foo"] } == data["foo"]
70
- insist { LogStash::Json.load(message)["bar"] } == data["bar"]
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 { got_event }
80
+ insist {got_event}
75
81
  end
76
82
 
77
83
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-codec-prometheus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Bartsch