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 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