logstash-output-monasca_log_api 0.3.3 → 0.4

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: 8a31e2b41940d7b7dec5eb88250d4bc27ce01e54
4
- data.tar.gz: 71eecb218d00a0b32f762202d34d52f7bfc93a89
3
+ metadata.gz: 59bde00a1b625fee42b79d0244c9f5bbb8852ca7
4
+ data.tar.gz: 906cf828c864a7b3f7d913d96cf26e47677afa10
5
5
  SHA512:
6
- metadata.gz: 95ec1d08625205ed811036c5b7eb142d3970901a693dc5c8455a1e41a7a1c799e4eefdb602a91e73fdbedf1864514229a040361156431f01d088254f5eaa07ce
7
- data.tar.gz: ab6ab077a31d5587cf8eae2063f1a05a6d7349d3ed179a912879119407947c6c94cba9827ba38a09f189f78065f043d60750ab48dc4a11d925fb45d801f2d28d
6
+ metadata.gz: 53bbbb42df6fcd83d4e7c31fbb93382607d497bcb69cd9585ae06578bf65542422ac661632061aedc71e86d9deeefa009811ea0048e11e944acf83a7e28ea751
7
+ data.tar.gz: 1154db9689c90dc9fadbe66076efe87c26f54ad04babcda105f6a18467b1056d10d05e16d59ae9f22acaa0092aa44a8e2a4d47bf9de273f07b34af1583bb803b
data/LICENSE CHANGED
@@ -1,11 +1,13 @@
1
- Copyright 2015 FUJITSU LIMITED
1
+ Copyright 2016 FUJITSU LIMITED
2
2
 
3
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
4
- in compliance with the License. You may obtain a copy of the License at
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not
4
+ use this file except in compliance with the License. You may obtain a copy of
5
+ the License at
5
6
 
6
7
  http://www.apache.org/licenses/LICENSE-2.0
7
8
 
8
- Unless required by applicable law or agreed to in writing, software distributed under the License
9
- is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
10
- or implied. See the License for the specific language governing permissions and limitations under
11
- the License.
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
+ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
+ License for the specific language governing permissions and limitations under
13
+ the License.
data/README.md CHANGED
@@ -1,4 +1,12 @@
1
1
  # Logstash Output Monasca-Log-Api Plugin
2
+ This module is a logstash-output-plugin for the Monasca Log Api.
3
+
4
+ ## Get latest stable version
5
+ https://rubygems.org/gems/logstash-output-monasca_log_api
6
+
7
+ ```bash
8
+ gem install logstash-output-monasca_log_api
9
+ ```
2
10
 
3
11
  ## Build from source
4
12
 
@@ -9,27 +17,15 @@
9
17
  * Git
10
18
  * bundler
11
19
 
12
- ### How to install the requirements
13
-
14
- #### Ubuntu 14.04
20
+ ### Install requirements
15
21
 
16
- ##### RVM
22
+ #### RVM
17
23
  ```bash
18
24
  gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
19
25
  \curl -sSL https://get.rvm.io | bash
20
26
  source /home/vagrant/.rvm/scripts/rvm
21
27
  ```
22
28
 
23
- #### Git
24
- ```bash
25
- sudo apt-get install git
26
- ```
27
-
28
- #### JDK
29
- ```bash
30
- sudo apt-get install default-jdk
31
- ```
32
-
33
29
  #### JRuby
34
30
  ```bash
35
31
  rvm install jruby
@@ -41,7 +37,7 @@ rvm install jruby
41
37
  git clone https://github.com/FujitsuEnablingSoftwareTechnologyGmbH/logstash-output-monasca_api.git
42
38
  ```
43
39
 
44
- ### Use rvm jruby
40
+ ### Use jruby
45
41
  ```bash
46
42
  rvm use jruby
47
43
  ```
@@ -75,8 +71,15 @@ JRUBY_OPTS="-Xcli.debug=true --debug" bundle exec rspec
75
71
 
76
72
  Coverage report can be found in ./coverage
77
73
 
74
+ ### Code style check
75
+ ```bash
76
+ rubocop lib/
77
+ ```
78
+
78
79
  ## Deploy Plugin to logstash
79
80
 
81
+ Source: [https://www.elastic.co/guide/en/logstash/current/_how_to_write_a_logstash_output_plugin.html#_building_and_testing_4](https://www.elastic.co/guide/en/logstash/current/_how_to_write_a_logstash_output_plugin.html#_building_and_testing_4)
82
+
80
83
  ### Build Gemfile
81
84
  First we need to create a Gemfile.
82
85
 
@@ -89,7 +92,7 @@ gem build logstash-output-monasca_log_api.gemspec
89
92
 
90
93
  ### Deploy Gemfile to logstash
91
94
 
92
- * [Download logstash](http://download.elastic.co/logstash/logstash/logstash-1.5.0.tar.gz) (>=1.5.0)
95
+ * [Download logstash](https://download.elastic.co/logstash/logstash/logstash-2.2.2.tar.gz) (>=2.2.0)
93
96
  * Extract logstash and navigate into the folder
94
97
  * Add this line to the Gemfile
95
98
 
@@ -112,34 +115,57 @@ With ``bin/plugin list`` you can check installed plugins. There should be ``logs
112
115
 
113
116
  ### Configuration
114
117
 
115
- Save the configfile wherever you like. For example ~/logstash.conf
118
+ Plugin name: monasca_log_api
116
119
 
117
- | name | description | required | example |
118
- | - | - | - | - |
119
- | monasca_log_api | monasca log api url | yes | http://192.168.10.4:8080 |
120
- | keystone_api | keystone api url | yes | http://192.168.10.5:5000 |
121
- | project_name | User-credentials: keystone project name | yes | mini-mon |
122
- | username | User-credentials: keystone username | yes | admin-agent |
123
- | password | User-credentials: keystone user password | yes | password |
124
- | domain_id | User-credentials: keystone user domain-id | yes | default |
125
- | dimensions | Dictionary of key-value pairs to describe logs | no | hostname: monasca, ip: 192.168.10.4 |
126
- | application_type_key | Application name | no | monasca |
120
+ Save the configfile wherever you like. For example ~/logstash.conf
127
121
 
128
- #### Example file
122
+ | name | description | type | required | default | example |
123
+ | --- | --- | --- | --- | --- | --- |
124
+ | monasca_log_api | monasca log api url | string | true | | http://192.168.10.4:8080 |
125
+ | monasca_log_api_version | monasca log api version | string | false | v3.0 | |
126
+ | keystone_api | keystone api url | string | true | | http://192.168.10.5:35357/v3 |
127
+ | project_name | Keystone user credentials: project name | string | true | | monasca |
128
+ | username | Keystone user credentials: username | string | true | | admin-agent |
129
+ | password | Keystone user credentials: password | string | true | | password |
130
+ | domain_id | Keystone user credentials: domain-id | string | true | | default |
131
+ | dimensions | global array dimensions in form of key-value pairs to describe the monitored node | array | false | | ['app_type:kafka', 'priority:high'] |
132
+ | num_of_logs | maximum number of logs that are send by one request to monasca-log-api | number | false | 125 | |
133
+ | elapsed_time_sec | send logs if the maximum elapsed time in seconds is reached | number | false | 30 | |
134
+ | delay | delay time in seconds to wait before checking the elapsed_time_sec again | number | false | 10 | |
135
+ | max_data_size_kb | maximum size in kb of logs that are send by one request to monasca-log-api | number | false | 5120 | |
136
+
137
+ #### Example configuration files
138
+
139
+ ##### Simple
129
140
  ```bash
130
- input {
131
- stdin { }
141
+ output {
142
+ monasca_log_api {
143
+ monasca_log_api => "http://192.168.10.4:8074"
144
+ keystone_api => "http://192.168.10.5:35357/v3"
145
+ project_name => "cmm"
146
+ username => "cmm-operator"
147
+ password => "admin"
148
+ domain_id => "default"
149
+ }
132
150
  }
151
+ ```
152
+
153
+ ##### Complete
154
+ ```bash
133
155
  output {
134
156
  monasca_log_api {
135
- monasca_log_api => "http://192.168.10.4:8080"
136
- keystone_api => "http://192.168.10.5:5000"
137
- project_name => "mini-mon"
138
- username => "admin-agent"
139
- password => "password"
157
+ monasca_log_api => "http://192.168.10.4:8074"
158
+ monasca_log_api_version => "v3.0"
159
+ keystone_api => "http://192.168.10.5:35357/v3"
160
+ project_name => "cmm"
161
+ username => "cmm-operator"
162
+ password => "admin"
140
163
  domain_id => "default"
141
- dimensions => "hostname: elkstack, ip: 192.168.10.4"
142
- application_type_key => "monasca"
164
+ dimensions => ["hostname:kamil", "ip:10.10.10.10"]
165
+ num_of_logs => 100
166
+ delay => 1
167
+ elapsed_time_sec => 600
168
+ max_data_size_kb => 5120
143
169
  }
144
170
  }
145
171
  ```
@@ -158,10 +184,26 @@ Specify log output file
158
184
  ```bash
159
185
  bin/logstash -f ~/logstash.conf -l /var/log/monasca/log/agent/test-log-agent.log
160
186
  ```
161
- ### Logstash Input plugins
162
- https://www.elastic.co/guide/en/logstash/current/input-plugins.html
187
+
188
+ ### Logstash File Input plugin
189
+ https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html
190
+
191
+ #### Configuration
192
+
193
+ Local dimensions can be added with ```add_field``` setting
194
+
195
+ ```bash
196
+ input {
197
+ file {
198
+ add_field => { "dimensions" => { "service" => "monasca-api" }}
199
+ add_field => { "dimensions" => { "language" => "java" }}
200
+ add_field => { "dimensions" => { "log_level" => "error" }}
201
+ path => "/var/log/monasca/api/error.log"
202
+ }
203
+ }
204
+ ```
163
205
 
164
206
  ## Open tasks
165
207
  * Language translations (Replace hardcoded String messages with a configuration/language file)
166
208
  * Exception handling (monasca-api requests)
167
- * Contribute to logstash http://www.elastic.co/guide/en/logstash/master/_how_to_write_a_logstash_output_plugin.html#_contributing_your_source_code_to_ulink_url_https_github_com_logstash_plugins_logstash_plugins_ulink_4
209
+ * https support
@@ -1,16 +1,16 @@
1
- =begin
2
- Copyright 2015 FUJITSU LIMITED
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
- in compliance with the License. You may obtain a copy of the License at
6
-
7
- http://www.apache.org/licenses/LICENSE-2.0
8
-
9
- Unless required by applicable law or agreed to in writing, software distributed under the License
10
- is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
- or implied. See the License for the specific language governing permissions and limitations under
12
- the License.
13
- =end
1
+ # Copyright 2016 FUJITSU LIMITED
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may not
4
+ # use this file except in compliance with the License. You may obtain a copy of
5
+ # the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
+ # License for the specific language governing permissions and limitations under
13
+ # the License.
14
14
 
15
15
  # encoding: utf-8
16
16
 
@@ -21,7 +21,8 @@ module LogStash::Outputs
21
21
  class UrlHelper
22
22
  def self.generate_url(host, path)
23
23
  uri = URI.parse(host)
24
- URI::HTTP.new(uri.scheme, nil, uri.host, uri.port, nil, path, nil, nil, nil)
24
+ URI::HTTP.new(uri.scheme, nil, uri.host, uri.port, nil, path, nil,
25
+ nil, nil)
25
26
  end
26
27
  end
27
28
  end
@@ -1,16 +1,16 @@
1
- =begin
2
- Copyright 2015 FUJITSU LIMITED
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
- in compliance with the License. You may obtain a copy of the License at
6
-
7
- http://www.apache.org/licenses/LICENSE-2.0
8
-
9
- Unless required by applicable law or agreed to in writing, software distributed under the License
10
- is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
- or implied. See the License for the specific language governing permissions and limitations under
12
- the License.
13
- =end
1
+ # Copyright 2016 FUJITSU LIMITED
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may not
4
+ # use this file except in compliance with the License. You may obtain a copy of
5
+ # the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
+ # License for the specific language governing permissions and limitations under
13
+ # the License.
14
14
 
15
15
  # encoding: utf-8
16
16
 
@@ -42,23 +42,52 @@ module LogStash::Outputs
42
42
  private
43
43
 
44
44
  def request(auth_hash)
45
- @client.post(auth_hash, :content_type => 'application/json', :accept => 'application/json')
45
+ @client.post(
46
+ auth_hash,
47
+ :content_type => 'application/json',
48
+ :accept => 'application/json')
46
49
  end
47
50
 
48
51
  def get_client(host, path)
49
- RestClient::Resource.new(LogStash::Outputs::Helper::UrlHelper.generate_url(host, path).to_s)
52
+ RestClient::Resource.new(
53
+ LogStash::Outputs::Helper::UrlHelper.generate_url(host, path).to_s)
50
54
  end
51
55
 
52
56
  def generate_hash(domain_id, username, password, project_name)
53
- "{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":{\"user\":{\"domain\":{\"id\":\"#{domain_id}\"},\"name\":\"#{username}\",\"password\":\"#{password}\"}}},\"scope\":{\"project\":{\"domain\":{\"id\":\"#{domain_id}\"},\"name\":\"#{project_name}\"}}}}"
57
+ {
58
+ "auth"=>{
59
+ "identity"=>{
60
+ "methods"=>["password"],
61
+ "password"=>{
62
+ "user"=>{
63
+ "domain"=>{"id"=>domain_id},
64
+ "name"=>username,
65
+ "password"=>password
66
+ }
67
+ }
68
+ },
69
+ "scope"=>{
70
+ "project"=>{
71
+ "domain"=>{"id"=>domain_id},
72
+ "name"=>project_name
73
+ }
74
+ }
75
+ }
76
+ }.to_json
54
77
  end
55
78
 
56
- def handle_response(response)
79
+ def handle_response(response)
57
80
  case response.code
58
81
  when 201
59
- expires_at = DateTime.parse(JSON.parse(response.body)["token"]["expires_at"])
60
- @logger.debug("Authentication succeed: code=#{response.code}, auth-token=#{response.headers[:x_subject_token]}, expires_at=#{expires_at.to_time}")
61
- Token.new(response.headers[:x_subject_token], expires_at)
82
+ expires_at = DateTime.parse(
83
+ JSON.parse(response.body)["token"]["expires_at"])
84
+
85
+ @logger.debug("Authentication succeed: code=#{response.code}, "\
86
+ "auth-token=#{response.headers[:x_subject_token]}, "\
87
+ "expires_at=#{expires_at.to_time}")
88
+
89
+ {:token => response.headers[:x_subject_token],
90
+ :expires_at => expires_at}
62
91
  else
63
92
  @logger.info("Authentication failed. Response=#{response}")
64
93
  end
@@ -1,31 +1,60 @@
1
- =begin
2
- Copyright 2015 FUJITSU LIMITED
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
- in compliance with the License. You may obtain a copy of the License at
6
-
7
- http://www.apache.org/licenses/LICENSE-2.0
8
-
9
- Unless required by applicable law or agreed to in writing, software distributed under the License
10
- is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
- or implied. See the License for the specific language governing permissions and limitations under
12
- the License.
13
- =end
1
+ # Copyright 2016 FUJITSU LIMITED
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may not
4
+ # use this file except in compliance with the License. You may obtain a copy of
5
+ # the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
+ # License for the specific language governing permissions and limitations under
13
+ # the License.
14
14
 
15
15
  # encoding: utf-8
16
16
 
17
+ require 'singleton'
18
+ require 'logger'
19
+ require_relative 'keystone_client'
20
+
17
21
  module LogStash::Outputs
18
22
  module Keystone
19
23
  class Token
20
- attr_accessor :id, :expire_at
21
- def initialize id, expire_at
24
+ include Singleton
25
+ attr_accessor :id, :expires_at, :keystone_client
26
+
27
+ def request_new_token(domain_id, username, password, project_name)
28
+ token = @keystone_client
29
+ .authenticate(domain_id, username, password, project_name)
30
+ set_token(token[:token], token[:expires_at])
31
+ @logger.info("New token requested")
32
+ @logger.debug("token=#{@id}, expire_at=#{@expires_at}")
33
+ end
34
+
35
+ def set_token id, expires_at
22
36
  @id = id
23
- @expire_at = expire_at
37
+ @expires_at = expires_at
38
+ end
39
+
40
+ def set_keystone_client keystone_api
41
+ @keystone_client = LogStash::Outputs::Keystone::KeystoneClient
42
+ .new keystone_api
24
43
  end
25
44
 
26
- def ==(another_token)
27
- self.id == another_token.id && self.expire_at == another_token.expire_at
45
+ def initialize
46
+ @logger = Cabin::Channel.get(LogStash)
28
47
  end
48
+
49
+ def valid?
50
+ token_valid = true
51
+ now = DateTime.now + Rational(1, 1440)
52
+ if @id.nil? or now >= @expires_at
53
+ token_valid = false
54
+ end
55
+ token_valid
56
+ end
57
+
29
58
  end
30
59
  end
31
60
  end
@@ -1,73 +1,66 @@
1
- =begin
2
- Copyright 2015 FUJITSU LIMITED
3
-
4
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
- in compliance with the License. You may obtain a copy of the License at
6
-
7
- http://www.apache.org/licenses/LICENSE-2.0
8
-
9
- Unless required by applicable law or agreed to in writing, software distributed under the License
10
- is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
- or implied. See the License for the specific language governing permissions and limitations under
12
- the License.
13
- =end
1
+ # Copyright 2016 FUJITSU LIMITED
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may not
4
+ # use this file except in compliance with the License. You may obtain a copy of
5
+ # the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12
+ # License for the specific language governing permissions and limitations under
13
+ # the License.
14
14
 
15
15
  # encoding: utf-8
16
16
 
17
17
  require 'rest-client'
18
18
  require 'logger'
19
+ require 'singleton'
19
20
 
20
21
  # relative requirements
21
22
  require_relative '../helper/url_helper'
22
23
 
23
- # This class creates a connection to monasca-api
24
+ # This class creates a connection to monasca-log-api
24
25
  module LogStash::Outputs
25
26
  module Monasca
26
27
  class MonascaLogApiClient
27
28
 
28
- SUPPORTED_API_VERSION = %w(2.0)
29
+ SUPPORTED_API_VERSION = %w(3.0)
29
30
 
30
31
  def initialize(host, version)
31
32
  @logger = Cabin::Channel.get(LogStash)
32
- @rest_client_url = LogStash::Outputs::Helper::UrlHelper.generate_url(host, '/' + check_version(version)).to_s
33
- @rest_client = RestClient::Resource.new(@rest_client_url)
33
+ rest_client_url = LogStash::Outputs::Helper::UrlHelper
34
+ .generate_url(host, '/' + check_version(version)).to_s
35
+ @rest_client = RestClient::Resource.new(rest_client_url)
34
36
  end
35
37
 
36
- # Send log events to monasca-api, requires token
37
- def send_event(event, data, token, dimensions, application_type=nil)
38
+ def send_logs(logs, auth_token)
38
39
  begin
39
- request(event, data, token, dimensions, application_type)
40
- @logger.debug("Successfully send event=#{event}, with token=#{token} and dimensions=#{dimensions} to monasca-api")
40
+ post_header = {
41
+ 'X-Auth-Token' => auth_token,
42
+ 'Content-Type' => 'application/json',
43
+ }
44
+ request(logs.to_json, post_header)
41
45
  rescue => e
42
- @logger.warn('Sending event to monasca-log-api threw exception', :exceptionew => e)
46
+ @logger.warn('Sending event to monasca-log-api threw exception',
47
+ :exceptionew => e)
43
48
  end
44
49
  end
45
50
 
46
51
  private
47
52
 
48
- def request(event, data, token, dimensions, application_type)
49
- post_headers = {
50
- :x_auth_token => token,
51
- :content_type => 'application/json',
52
- }
53
- if dimensions
54
- post_headers[:x_dimensions] = dimensions
55
- end
56
-
57
- if application_type
58
- post_headers[:x_application_type] = application_type
59
- end
60
-
61
- @logger.debug('Sending data to ', :url => @rest_client_url)
62
- @rest_client['log']['single'].post(data, post_headers)
53
+ def request(body, header)
54
+ @logger.debug('Sending data to ', :url => @rest_client.url)
55
+ @rest_client['logs'].post(body, header)
63
56
  end
64
57
 
65
-
66
58
  def check_version(version)
67
59
  tmp_version = version.sub('v','')
68
60
 
69
61
  unless SUPPORTED_API_VERSION.include? tmp_version
70
- raise "#{tmp_version} is not supported, supported versions are #{SUPPORTED_API_VERSION}"
62
+ raise "#{tmp_version} is not supported, "\
63
+ "supported versions are #{SUPPORTED_API_VERSION}"
71
64
  end
72
65
 
73
66
  version