logstash-output-CiscoZeus 0.1.1 → 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
  SHA1:
3
- metadata.gz: 81ab38b656873f986e665b219a08401048f7c972
4
- data.tar.gz: 1b519c9b95e089476c3820b98fadf32b89e799d5
3
+ metadata.gz: 68bf5c8119361241419583ed926cebae9f0b8228
4
+ data.tar.gz: 9792bbe84a4e2ee5875f011a76c20188dd1036a8
5
5
  SHA512:
6
- metadata.gz: e2986ab1d7f36a4afb63a720cf8153c938c71b033f17d2302794107085eda211126045ee54ac93504cb23ceaad428a677b6243611b34cbd5a3e947d9244e10c5
7
- data.tar.gz: 0076f27596900e74513f0c4305896294578261f26e8d22eb2c58245b7d2dc6ce26241ada7e7f063a47a1055bb645296d4153fb8fe7474a78c6890ab8265055a9
6
+ metadata.gz: 4bca736aa33f43dde362bc330222edd958259f921dad5044b38d9001e617da470404cca692e334c737939af04b93f8b749ee04907c6402c7787b99dfa4b5aa90
7
+ data.tar.gz: 273d1de66c68882847320a28e8aab0abf3c76edea5b814223d0349d58cfa6191bd7013c89a0e63b99e20c392199430c8bf0b5ed2baf259bb4ba073d4145c3e1a
data/README.md CHANGED
@@ -20,11 +20,13 @@ jruby -S gem build logstash-output-CiscoZeus.gemspec
20
20
  ### Installation
21
21
 
22
22
  ```sh
23
- logstash-plugin install logstash-output-CiscoZeus-0.1.0.gem
23
+ logstash-plugin install logstash-output-CiscoZeus
24
24
  ```
25
25
 
26
26
  ### Configuration
27
27
 
28
+ #### Logs
29
+
28
30
  Add this configuration to the output section of your logstash configuration file.
29
31
 
30
32
  ```
@@ -37,6 +39,37 @@ output {
37
39
  }
38
40
  ```
39
41
 
42
+ #### Metrics
43
+
44
+ The basic configuration is analogous to the Logs plugin
45
+
46
+ ```
47
+ output {
48
+ CiscoZeusMetrics {
49
+ token => "my_token"
50
+ metric_name => "my_desired_log_name"
51
+ endpoint => "myendpoint.ciscozeus.io"
52
+ }
53
+ }
54
+ ```
55
+
56
+ With this configuration, the plugin will forward all the numeric fields to Zeus as metrics.
57
+
58
+ Optionally, you can use `fields` to select a specific set of fields instead. The plugin will try to do a type cast in case you select a non integer field.
59
+
60
+ ```
61
+ output {
62
+ CiscoZeusMetrics {
63
+ token => "my_token"
64
+ metric_name => "my_desired_log_name"
65
+ endpoint => "myendpoint.ciscozeus.io"
66
+ fields => ["foo","bar"]
67
+ }
68
+ }
69
+ ```
70
+
71
+
72
+
40
73
  ## License and copyright
41
74
 
42
75
  Copyright(C) 2017 - Cisco Systems, Inc.
@@ -7,11 +7,11 @@ require 'zeus/api_client'
7
7
  # Outputs events to CiscoZeus
8
8
  class LogStash::Outputs::Ciscozeus < LogStash::Outputs::Base
9
9
  config_name "CiscoZeus"
10
-
11
- config :token, :validate => :string
12
- config :endpoint, :validate => :string, :default => "data04.ciscozeus.io"
10
+
11
+ config :token, :validate => :string, :required => true
12
+ config :endpoint, :validate => :string, :default => "api.ciscozeus.io"
13
13
  config :log_name, :validate => :string, :default => "logstash_data"
14
-
14
+
15
15
  concurrency :single
16
16
 
17
17
  def register
@@ -23,7 +23,7 @@ class LogStash::Outputs::Ciscozeus < LogStash::Outputs::Base
23
23
 
24
24
  def multi_receive(events)
25
25
  result = @zeus_client.send_logs(@log_name, events)
26
- if not result.success?
26
+ if not result.success?
27
27
  STDERR.puts "Failed to send data to zeus: " + result.data.to_s
28
28
  end
29
29
  end # def receive
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+ require "logstash/outputs/base"
3
+ require "logstash/namespace"
4
+ require "logstash/json"
5
+ require 'zeus/api_client'
6
+
7
+ # Outputs metrics to CiscoZeus
8
+ class LogStash::Outputs::Ciscozeusmetrics < LogStash::Outputs::Base
9
+ config_name "CiscoZeusMetrics"
10
+
11
+ config :token, :validate => :string, :required => true
12
+ config :endpoint, :validate => :string, :default => "api.ciscozeus.io"
13
+ config :metric_name, :validate => :string, :default => "logstash_metric"
14
+
15
+ # The plugin forwards all the numeric fields in the event by default.
16
+ # Use this variable to select a specific set of fields instead,
17
+ # in such a case, only the selected fields will be forwarded to Zeus.
18
+ # Besides, even if some field is of a non-numeric type,
19
+ # the plugin will try to convert it using ruby type casting.
20
+ config :fields, :validate => :string, :list => true, :default => nil
21
+
22
+ concurrency :single
23
+
24
+ def register
25
+ @zeus_client = Zeus::APIClient.new({
26
+ access_token: @token,
27
+ endpoint: @endpoint
28
+ })
29
+ end # def register
30
+
31
+ def multi_receive(events)
32
+ metrics = events.map{|event| reform(event)}
33
+ result = @zeus_client.send_metrics(@metric_name, metrics)
34
+ if not result.success?
35
+ STDERR.puts "Failed to send data to zeus: " + result.data.to_s
36
+ end
37
+ end # def receive
38
+
39
+ #Matches Zeus metrics API format
40
+ def reform(event)
41
+ datapoint = {}
42
+ if @fields == nil
43
+ datapoint = event.to_hash.select{ |k,v| k != "@timestamp" and v.is_a? Numeric }
44
+ else
45
+ datapoint = event.to_hash.select{ |k,v| @fields.include? k }
46
+ datapoint = Hash[datapoint.map{ |k,v| [k,if v.is_a? Numeric then v else v.to_f end]}]
47
+ end
48
+ return {timestamp: event.get("@timestamp").to_f, point: datapoint}
49
+ end # def reform
50
+
51
+ end # class LogStash::Outputs::Ciscozeusmetrics
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-CiscoZeus'
3
- s.version = '0.1.1'
3
+ s.version = '0.2.0'
4
4
  s.licenses = ['Apache-2.0']
5
5
  s.summary = 'Logstash plugin to talk with the CiscoZeus HTTP API'
6
6
  s.homepage = 'http://ciscozeus.io'
@@ -9,13 +9,15 @@ Gem::Specification.new do |s|
9
9
  s.require_paths = ['lib']
10
10
 
11
11
  # Files
12
- s.files = Dir['lib/**/*', 'vendor/**/*','*.gemspec','*.md','Gemfile','LICENSE']
13
-
12
+ s.files = Dir['lib/**/*', 'spec/**/*', 'vendor/**/*','*.gemspec','*.md','Gemfile','LICENSE']
13
+ # Tests
14
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
15
+
14
16
  # Special flag to let us know this is actually a logstash plugin
15
17
  s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" }
16
18
 
17
19
  # Gem dependencies
18
- s.add_runtime_dependency "logstash-core", ">= 2.0.0", "< 3.0.0"
20
+ s.add_runtime_dependency "logstash-core", ">= 2.0.0"
19
21
  s.add_runtime_dependency "logstash-codec-plain"
20
22
  s.add_runtime_dependency "zeusclient", "~> 0"
21
23
  end
@@ -0,0 +1,66 @@
1
+ # encoding: utf-8
2
+ require "logstash/devutils/rspec/spec_helper"
3
+ require "logstash/outputs/Ciscozeusmetrics"
4
+ require "logstash/codecs/plain"
5
+ require "logstash/event"
6
+
7
+ describe LogStash::Outputs::Ciscozeusmetrics do
8
+
9
+ def performTest(input, expected_output, configuration)
10
+ event = LogStash::Event.new(input)
11
+
12
+ configuration["token"] = "tk"
13
+ metrics_plugin = LogStash::Outputs::Ciscozeusmetrics.new(configuration)
14
+
15
+ expected_output[:timestamp] = event.get("@timestamp").to_f
16
+
17
+ output = metrics_plugin.reform(event)
18
+
19
+ #Workaround to convert string keys into symbols
20
+ output[:point] = output[:point].inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
21
+
22
+ expect(output).to eq(expected_output)
23
+ end
24
+
25
+ describe "Simple message with one metric" do
26
+ input = {"metric1": 6}
27
+ output = {"point": {"metric1": 6}}
28
+ it "works as expected" do
29
+ performTest(input,output,{})
30
+ end
31
+ end
32
+
33
+ describe "Simple message with several metric" do
34
+ input = {"metric1": 6, "metric2":7}
35
+ output = {"point":{"metric1":6, "metric2":7}}
36
+ it "works as expected" do
37
+ performTest(input,output,{})
38
+ end
39
+ end
40
+
41
+ describe "Message with non numerical fields" do
42
+ input = {"message": "hello", "world": "earth", "metric1": 6.5, "metric2":7}
43
+ output = {"point":{"metric1":6.5, "metric2":7}}
44
+ it "works as expected" do
45
+ performTest(input,output,{})
46
+ end
47
+ end
48
+
49
+ describe "Field selection" do
50
+ input = {"message": "hello", "world": "earth", "metric1": 6.5, "metric2":7}
51
+ output = {"point":{"metric1":6.5}}
52
+ conf = {"fields" => "metric1"}
53
+ it "works as expected" do
54
+ performTest(input,output,conf)
55
+ end
56
+ end
57
+
58
+ describe "Field selection with type cast needed" do
59
+ input = {"metric1": 6.5, "metric2":7, "metric3":"24"}
60
+ output = {"point":{"metric1":6.5, "metric3": 24}}
61
+ conf = {"fields" => ["metric1", "metric3"]}
62
+ it "works as expected" do
63
+ performTest(input,output,conf)
64
+ end
65
+ end
66
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-CiscoZeus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yoel Cabo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-15 00:00:00.000000000 Z
11
+ date: 2017-04-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -16,9 +16,6 @@ dependencies:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
18
  version: 2.0.0
19
- - - "<"
20
- - !ruby/object:Gem::Version
21
- version: 3.0.0
22
19
  name: logstash-core
23
20
  prerelease: false
24
21
  type: :runtime
@@ -27,9 +24,6 @@ dependencies:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: 2.0.0
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: 3.0.0
33
27
  - !ruby/object:Gem::Dependency
34
28
  requirement: !ruby/object:Gem::Requirement
35
29
  requirements:
@@ -68,7 +62,9 @@ files:
68
62
  - LICENSE
69
63
  - README.md
70
64
  - lib/logstash/outputs/CiscoZeus.rb
65
+ - lib/logstash/outputs/CiscoZeusMetrics.rb
71
66
  - logstash-output-CiscoZeus.gemspec
67
+ - spec/outputs/CiscoZeusMetrics_spec.rb
72
68
  homepage: http://ciscozeus.io
73
69
  licenses:
74
70
  - Apache-2.0
@@ -95,4 +91,5 @@ rubygems_version: 2.6.8
95
91
  signing_key:
96
92
  specification_version: 4
97
93
  summary: Logstash plugin to talk with the CiscoZeus HTTP API
98
- test_files: []
94
+ test_files:
95
+ - spec/outputs/CiscoZeusMetrics_spec.rb