logstash-output-lmlogs 1.0.0 → 1.1.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: 7a6870b79a3aa4828273152c3955c0bd9ab4268336497c5f2a149b3194775842
4
- data.tar.gz: 20a754e8964d1ddb7ee0e6f272b6a72035603071aef7e13863713ab0acc936d3
3
+ metadata.gz: d0215e007f329ca2c6538f6ec2d65932fe43d87c1396772e03c98ca132bc932e
4
+ data.tar.gz: 288bf0b9b00ab06c19a02d4f540daed77d50a797fcaaa4c96912b2ca1cc59140
5
5
  SHA512:
6
- metadata.gz: de15b190857a5c4343189c4e3cac70fda17b44672140dc31afd19b77ce6298ac205685957e922c0c687fc4cf913be3d11c93be6706d795be83362f1c801d840f
7
- data.tar.gz: 6b972a9c27bd57f27e2503ba32fdca11afe36b72a45e3395d5e2a68b6efaca72fe557bc23e5900bb1a1e92196adb3a28ddb67a55f0db6e471df1d81773fb0a9a
6
+ metadata.gz: 7703c1da2e96bb1fbf1f55e72c04f8d3c22c0fe164f07496d70535b7eb358f67064b0021c3857b551e46419a6a1a62f5a26a88efed83c4b3135be1a48da943be
7
+ data.tar.gz: a49bbfa5e88c5dc18d72d7d37f5141da160ee020802a2812680b5433c343cab5a70d11a5af94f2ecde638455efc836d8b47aca798411dba648b369322b8cb25d
data/CHANGELOG.md CHANGED
@@ -1,2 +1,2 @@
1
- ## 0.1.0
1
+ ## 1.0.0
2
2
  - First version of the plugin
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Build Status](https://travis-ci.org/unomaly/logstash-output-unomaly.svg?branch=master)](https://travis-ci.org/unomaly/logstash-output-unomaly)
1
+ [![Gem Version](https://badge.fury.io/rb/logstash-output-lmlogs.svg)](https://badge.fury.io/rb/logstash-output-lmlogs)
2
2
 
3
3
  This plugin sends Logstash events to the [Logicmonitor Logs](https://www.logicmonitor.com)
4
4
 
@@ -21,19 +21,18 @@ output {
21
21
  }
22
22
  ```
23
23
 
24
- ```
25
24
 
26
25
 
27
- # Important options
26
+ ## Important options
28
27
 
29
- | Option | Description | Default |
30
- |----------------------------|-------------------------------------------------------------------------------------|-----------------|
31
- | batch_size | Event batch size to send to LM Logs. | 100 |
32
- | message_key | Key that will be used by the plugin as the system key | "message" |
33
- | lm_property | Key that will be used by LM to match resource based on property |"system.hostname"|
34
- | keep_timestamp | If false, LM Logs will use the ingestion timestamp as the event timestamp | true |
35
- | timestamp_is_key | If true, LM Logs will use a specified key as the event timestamp | false |
36
- | timestamp_key | If timestamp_is_key is set, LM Logs will use this key in the event as the timestamp | "logtimestamp" |
28
+ | Option | Description| Default |
29
+ | --- | --- | --- |
30
+ | batch_size | Event batch size to send to LM Logs.| 100 |
31
+ | message_key | Key that will be used by the plugin as the system key | "message" |
32
+ | lm_property | Key that will be used by LM to match resource based on property | "system.hostname" |
33
+ | keep_timestamp | If false, LM Logs will use the ingestion timestamp as the event timestamp | true |
34
+ | timestamp_is_key | If true, LM Logs will use a specified key as the event timestamp | false |
35
+ | timestamp_key | If timestamp_is_key is set, LM Logs will use this key in the event as the timestamp | "logtimestamp" |
37
36
 
38
37
  See the [source code](lib/logstash/outputs/lmlogs.rb) for the full list of options
39
38
 
@@ -98,12 +98,17 @@ class LogStash::Outputs::LMLogs < LogStash::Outputs::Base
98
98
 
99
99
  @@MAX_PAYLOAD_SIZE = 8*1024*1024
100
100
 
101
+ # For developer debugging.
102
+ @@CONSOLE_LOGS = false
103
+
101
104
  public
102
105
  def register
103
106
  @total = 0
104
107
  @total_failed = 0
105
108
  logger.info("Initialized LogicMonitor output plugin with configuration",
106
109
  :host => @host)
110
+ logger.info("Max Payload Size: ",
111
+ :size => @@MAX_PAYLOAD_SIZE)
107
112
 
108
113
  end # def register
109
114
 
@@ -135,17 +140,18 @@ class LogStash::Outputs::LMLogs < LogStash::Outputs::Base
135
140
  end
136
141
 
137
142
  # Symbolize keys if necessary
138
- c[:auth] = {
139
- :access_id => @access_id,
140
- :access_key => @access_key.value,
141
- :eager => true
142
- }
143
+ # c[:auth] = {
144
+ # :user => @access_id,
145
+ # :password => @access_key.value,
146
+ # :eager => true
147
+ # }
143
148
  end
149
+ log_debug("manticore client config: ", :client => c)
150
+ return c
144
151
  end
145
152
 
146
153
  private
147
154
  def make_client
148
- puts client_config
149
155
  Manticore::Client.new(client_config)
150
156
  end
151
157
 
@@ -173,6 +179,8 @@ class LogStash::Outputs::LMLogs < LogStash::Outputs::Base
173
179
  end
174
180
 
175
181
  def send_batch(events)
182
+ log_debug("Started sending logs to LM: ",
183
+ :time => Time::now.utc)
176
184
  url = "https://" + @portal_name + ".logicmonitor.com/rest/log/ingest"
177
185
  body = events.to_json
178
186
  auth_string = generate_auth_string(body)
@@ -188,7 +196,7 @@ class LogStash::Outputs::LMLogs < LogStash::Outputs::Base
188
196
  request.on_success do |response|
189
197
  if response.code == 202
190
198
  @total += events.length
191
- @logger.debug("Successfully sent ",
199
+ log_debug("Successfully sent ",
192
200
  :response_code => response.code,
193
201
  :batch_size => events.length,
194
202
  :total_sent => @total,
@@ -213,10 +221,9 @@ class LogStash::Outputs::LMLogs < LogStash::Outputs::Base
213
221
 
214
222
  request.on_failure do |exception|
215
223
  @total_failed += 1
216
- log_failure("Could not access URL",
224
+ log_failure("The request failed. ",
217
225
  :url => url,
218
226
  :method => @http_method,
219
- :body => body,
220
227
  :message => exception.message,
221
228
  :class => exception.class.name,
222
229
  :backtrace => exception.backtrace,
@@ -224,7 +231,7 @@ class LogStash::Outputs::LMLogs < LogStash::Outputs::Base
224
231
  )
225
232
  end
226
233
 
227
- @logger.debug("Sending LM Logs",
234
+ log_debug("Completed sending logs to LM",
228
235
  :total => @total,
229
236
  :time => Time::now.utc)
230
237
  request.call
@@ -233,20 +240,29 @@ class LogStash::Outputs::LMLogs < LogStash::Outputs::Base
233
240
  @logger.error("[Exception=] #{e.message} #{e.backtrace}")
234
241
  end
235
242
 
243
+ def log_debug(message, *opts)
244
+ if @@CONSOLE_LOGS
245
+ puts "[#{DateTime::now}] [logstash.outputs.lmlogs] [DEBUG] #{message} #{opts.to_s}"
246
+ elsif debug
247
+ @logger.debug(message, *opts)
248
+ end
249
+ end
236
250
 
237
251
  public
238
252
  def multi_receive(events)
239
- puts @@MAX_PAYLOAD_SIZE
240
- if debug
241
- puts events.to_json
242
- end
253
+ if events.length() > 0
254
+ log_debug(events.to_json)
255
+ end
243
256
 
244
257
  events.each_slice(@batch_size) do |chunk|
245
258
  documents = []
246
259
  chunk.each do |event|
247
- lmlogs_event = {
248
- message: event.get(@message_key).to_s
249
- }
260
+ event_json = JSON.parse(event.to_json)
261
+ lmlogs_event = event_json
262
+ lmlogs_event.delete("@timestamp") # remove redundant timestamp field
263
+ lmlogs_event["event"].delete("original") # remove redundant log field
264
+
265
+ lmlogs_event["message"] = event.get(@message_key).to_s
250
266
 
251
267
  lmlogs_event["_lm.resourceId"] = {}
252
268
  lmlogs_event["_lm.resourceId"]["#{@lm_property}"] = event.get(@property_key.to_s)
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'logstash-output-lmlogs'
3
- s.version = '1.0.0'
4
- s.licenses = ['Apache License (2.0)']
3
+ s.version = '1.1.0'
4
+ s.licenses = ['Apache-2.0']
5
5
  s.summary = "Logstash output plugin for LM Logs"
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"
7
7
  s.authors = ["LogicMonitor"]
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.test_files = s.files.grep(%r{^(test|spec|features)/})
16
16
 
17
17
  # Special flag to let us know this is actually a logstash plugin
18
- s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" }
18
+ s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" , "rubygems_mfa_required" => "false"}
19
19
 
20
20
  # Gem dependencies
21
21
  #
@@ -6,6 +6,7 @@ require "logstash/event"
6
6
  describe LogStash::Outputs::LMLogs do
7
7
  let(:sample_event) { LogStash::Event.new("message" => "hello this is log") }
8
8
  let(:client) { @lmlogs.client }
9
+ let(:sample_lm_logs_event){{"message" => "hello this is log 1", "_lm.resourceId" => {"test.property" => "host1"}, "timestamp" => "2021-03-22T04:28:55.907121106Z"}}
9
10
 
10
11
  before do
11
12
  @lmlogs = LogStash::Outputs::LMLogs.new(
@@ -47,20 +48,14 @@ describe LogStash::Outputs::LMLogs do
47
48
  @lmlogs.multi_receive([sample_event, sample_event, sample_event, sample_event, sample_event])
48
49
  end
49
50
 
50
- it "max payload exceeded test" do
51
+ it "max payload exceeded" do
51
52
 
52
- document = [{"message" => "hello this is log 1", "_lm.resourceId" => {"test.property" => "host1"}, "timestamp" => "2021-03-22T04:28:55.907121106Z"},
53
- {"message" => "hello this is log 2", "_lm.resourceId" => {"test.property" => "host2"}, "timestamp" => "2021-03-22T04:28:55.907321106Z"},
54
- {"message" => "hello this is log 3", "_lm.resourceId" => {"test.property" => "host3"}, "timestamp" => "2021-03-22T04:28:55.907421106Z"}
55
- ]
53
+ document = [sample_lm_logs_event,sample_lm_logs_event]
56
54
 
57
- lm_logs_event = {"message" => "hello this is log 4", "_lm.resourceId" => {"test.property" => "host3"}, "timestamp" => "2021-03-22T04:28:55.909421106Z"}
58
- document_expected = [{"message" => "hello this is log 4", "_lm.resourceId" => {"test.property" => "host3"}, "timestamp" => "2021-03-22T04:28:55.909421106Z"}]
55
+ lm_logs_event = {"message" => "hello this is log 3", "_lm.resourceId" => {"test.property" => "host3"}, "timestamp" => "2021-03-22T04:28:55.909421106Z"}
56
+ document_expected = [lm_logs_event]
59
57
  expect(client).to receive(:post).once.with("https://localhost.logicmonitor.com/rest/log/ingest",hash_including(:body => LogStash::Json.dump(
60
- [{"message" => "hello this is log 1", "_lm.resourceId" => {"test.property" => "host1"}, "timestamp" => "2021-03-22T04:28:55.907121106Z"},
61
- {"message" => "hello this is log 2", "_lm.resourceId" => {"test.property" => "host2"}, "timestamp" => "2021-03-22T04:28:55.907321106Z"},
62
- {"message" => "hello this is log 3", "_lm.resourceId" => {"test.property" => "host3"}, "timestamp" => "2021-03-22T04:28:55.907421106Z"}
63
- ]
58
+ [sample_lm_logs_event,sample_lm_logs_event]
64
59
  ))).and_call_original
65
60
 
66
61
  document_result = @lmlogs.isValidPayloadSize(document,lm_logs_event,document.to_json.bytesize)
@@ -68,17 +63,11 @@ describe LogStash::Outputs::LMLogs do
68
63
  end
69
64
  it "max payload in limit" do
70
65
 
71
- document = [{"message" => "hello this is log 1", "_lm.resourceId" => {"test.property" => "host1"}, "timestamp" => "2021-03-22T04:28:55.907121106Z"},
72
- {"message" => "hello this is log 2", "_lm.resourceId" => {"test.property" => "host2"}, "timestamp" => "2021-03-22T04:28:55.907321106Z"},
73
- {"message" => "hello this is log 3", "_lm.resourceId" => {"test.property" => "host3"}, "timestamp" => "2021-03-22T04:28:55.907421106Z"}
74
- ]
66
+ document = [sample_lm_logs_event]
75
67
 
76
- lm_logs_event = {"message" => "hello this is log 4", "_lm.resourceId" => {"test.property" => "host3"}, "timestamp" => "2021-03-22T04:28:55.909421106Z"}
68
+ lm_logs_event = {"message" => "hello this is log 2", "_lm.resourceId" => {"test.property" => "host3"}, "timestamp" => "2021-03-22T04:28:55.909421106Z"}
77
69
 
78
- document_expected = [{"message" => "hello this is log 1", "_lm.resourceId" => {"test.property" => "host1"}, "timestamp" => "2021-03-22T04:28:55.907121106Z"},
79
- {"message" => "hello this is log 2", "_lm.resourceId" => {"test.property" => "host2"}, "timestamp" => "2021-03-22T04:28:55.907321106Z"},
80
- {"message" => "hello this is log 3", "_lm.resourceId" => {"test.property" => "host3"}, "timestamp" => "2021-03-22T04:28:55.907421106Z"},
81
- {"message" => "hello this is log 4", "_lm.resourceId" => {"test.property" => "host3"}, "timestamp" => "2021-03-22T04:28:55.909421106Z"}]
70
+ document_expected = [sample_lm_logs_event,lm_logs_event]
82
71
  expect(client).to receive(:post).exactly(0).times.and_call_original
83
72
 
84
73
  document_result = @lmlogs.isValidPayloadSize(document,lm_logs_event,document.to_json.bytesize + lm_logs_event.to_json.bytesize)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-output-lmlogs
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - LogicMonitor
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-01 00:00:00.000000000 Z
11
+ date: 2022-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  requirement: !ruby/object:Gem::Requirement
@@ -94,10 +94,11 @@ files:
94
94
  - spec/outputs/lmlogs_spec.rb
95
95
  homepage: https://www.logicmonitor.com
96
96
  licenses:
97
- - Apache License (2.0)
97
+ - Apache-2.0
98
98
  metadata:
99
99
  logstash_plugin: 'true'
100
100
  logstash_group: output
101
+ rubygems_mfa_required: 'false'
101
102
  post_install_message:
102
103
  rdoc_options: []
103
104
  require_paths:
@@ -113,7 +114,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
114
  - !ruby/object:Gem::Version
114
115
  version: '0'
115
116
  requirements: []
116
- rubygems_version: 3.1.6
117
+ rubygems_version: 3.3.25
117
118
  signing_key:
118
119
  specification_version: 4
119
120
  summary: Logstash output plugin for LM Logs