logstash-output-lmlogs 1.0.0 → 1.1.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: 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