pooja-test 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f327dd2f2b5838816cf000ba1b28948d97bc1f7500b544ebb074d4cb04e820ac
4
+ data.tar.gz: 88026e9d994f2272deb6db1dab81d647b96b20be466f9cfdf3b81841acb97bf4
5
+ SHA512:
6
+ metadata.gz: a30cc447c12347352f90648ed1d2bc93fe3b663c5ac1ae7331f6d8e81ec2e640e09c96a1a1030df0037baea76ad99454251a096ee0eba2d80b5af1ff2f3a8dbd
7
+ data.tar.gz: f6792c297ccd2bbc9b746d3d9cc203472cd8d74ec64d463501611eb545242f53acd5edf1e0344166dfb1ff6fd8e82520a07cbece479db76f70fa14af432c76fc
data/CHANGELOG.md ADDED
@@ -0,0 +1,2 @@
1
+ ## 1.0.0
2
+ - First version of the plugin
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
5
+ logstash_path = ENV["LOGSTASH_PATH"] || "../../logstash"
6
+ use_logstash_source = ENV["LOGSTASH_SOURCE"] && ENV["LOGSTASH_SOURCE"].to_s == "1"
7
+
8
+ if Dir.exist?(logstash_path) && use_logstash_source
9
+ gem 'logstash-core', :path => "#{logstash_path}/logstash-core"
10
+ gem 'logstash-core-plugin-api', :path => "#{logstash_path}/logstash-core-plugin-api"
11
+ end
data/README.md ADDED
@@ -0,0 +1,52 @@
1
+ [![Gem Version](https://badge.fury.io/rb/logstash-output-lmlogs.svg)](https://badge.fury.io/rb/logstash-output-lmlogs)
2
+
3
+ This plugin sends Logstash events to the [Logicmonitor Logs](https://www.logicmonitor.com)
4
+
5
+ # Getting started
6
+
7
+ ## Installing through rubygems
8
+
9
+ Run the following on your Logstash instance
10
+
11
+ `logstash-plugin install logstash-output-lmlogs`
12
+
13
+ ## Minimal configuration
14
+ ```
15
+ output {
16
+ lmlogs {
17
+ portal_name => "your company name"
18
+ access_id => "your lm access id"
19
+ access_key => "your access key"
20
+ }
21
+ }
22
+ ```
23
+
24
+
25
+
26
+ ## Important options
27
+
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" |
36
+
37
+ See the [source code](lib/logstash/outputs/lmlogs.rb) for the full list of options
38
+
39
+ The syntax for `message_key` and `source_key` values are available in the [Logstash Event API Documentation](https://www.elastic.co/guide/en/logstash/current/event-api.html)
40
+
41
+ ## Known issues
42
+ - Installation of the plugin fails on Logstash 6.2.1.
43
+
44
+
45
+ ## Contributing
46
+
47
+ Bug reports and pull requests are welcome. This project is intended to
48
+ be a safe, welcoming space for collaboration.
49
+
50
+ ## Development
51
+
52
+ We use docker to build the plugin. You can build it by running `docker-compose run jruby gem build logstash-output-lmlogs.gemspec `
@@ -0,0 +1,298 @@
1
+ # encoding: utf-8
2
+ require "logstash/outputs/base"
3
+ require "logstash/namespace"
4
+ require "logstash/json"
5
+ require 'uri'
6
+ require 'json'
7
+ require 'date'
8
+ require 'base64'
9
+ require 'openssl'
10
+ require 'manticore'
11
+
12
+ # An example output that does nothing.
13
+ class LogStash::Outputs::LMLogs < LogStash::Outputs::Base
14
+ class InvalidHTTPConfigError < StandardError; end
15
+
16
+ concurrency :shared
17
+ config_name "lmlogs"
18
+
19
+ # Event batch size to send to LM Logs. Increasing the batch size can increase throughput by reducing HTTP overhead
20
+ config :batch_size, :validate => :number, :default => 100
21
+
22
+ # Key that will be used by the plugin as the log message
23
+ config :message_key, :validate => :string, :default => "message"
24
+
25
+ # Key that will be used by the plugin as the system key
26
+ config :property_key, :validate => :string, :default => "host"
27
+
28
+ # Key that will be used by LM to match resource based on property
29
+ config :lm_property, :validate => :string, :default => "system.hostname"
30
+
31
+ # Keep logstash timestamp
32
+ config :keep_timestamp, :validate => :boolean, :default => true
33
+
34
+ # Use a configured message key for timestamp values
35
+ # Valid timestamp formats are ISO8601 strings or epoch in seconds, milliseconds or nanoseconds
36
+ config :timestamp_is_key, :validate => :boolean, :default => false
37
+ config :timestamp_key, :validate => :string, :default => "logtimestamp"
38
+
39
+ # Display debug logs
40
+ config :debug, :validate => :boolean, :default => false
41
+
42
+ # Timeout (in seconds) for the entire request
43
+ config :request_timeout, :validate => :number, :default => 60
44
+
45
+ # Timeout (in seconds) to wait for data on the socket. Default is `10s`
46
+ config :socket_timeout, :validate => :number, :default => 10
47
+
48
+ # Timeout (in seconds) to wait for a connection to be established. Default is `10s`
49
+ config :connect_timeout, :validate => :number, :default => 10
50
+
51
+ # Should redirects be followed? Defaults to `true`
52
+ config :follow_redirects, :validate => :boolean, :default => true
53
+
54
+ # Max number of concurrent connections. Defaults to `50`
55
+ config :pool_max, :validate => :number, :default => 50
56
+
57
+ # Max number of concurrent connections to a single host. Defaults to `25`
58
+ config :pool_max_per_route, :validate => :number, :default => 25
59
+
60
+ # Turn this on to enable HTTP keepalive support. We highly recommend setting `automatic_retries` to at least
61
+ # one with this to fix interactions with broken keepalive implementations.
62
+ config :keepalive, :validate => :boolean, :default => true
63
+
64
+ # How many times should the client retry a failing URL. We highly recommend NOT setting this value
65
+ # to zero if keepalive is enabled. Some servers incorrectly end keepalives early requiring a retry!
66
+ # Note: if `retry_non_idempotent` is set only GET, HEAD, PUT, DELETE, OPTIONS, and TRACE requests will be retried.
67
+ config :automatic_retries, :validate => :number, :default => 5
68
+
69
+ # If `automatic_retries` is enabled this will cause non-idempotent HTTP verbs (such as POST) to be retried.
70
+ config :retry_non_idempotent, :validate => :boolean, :default => true
71
+
72
+ # How long to wait before checking if the connection is stale before executing a request on a connection using keepalive.
73
+ # # You may want to set this lower, possibly to 0 if you get connection errors regularly
74
+ # Quoting the Apache commons docs (this client is based Apache Commmons):
75
+ # 'Defines period of inactivity in milliseconds after which persistent connections must be re-validated prior to being leased to the consumer. Non-positive value passed to this method disables connection validation. This check helps detect connections that have become stale (half-closed) while kept inactive in the pool.'
76
+ # See https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/conn/PoolingHttpClientConnectionManager.html#setValidateAfterInactivity(int)[these docs for more info]
77
+ config :validate_after_inactivity, :validate => :number, :default => 200
78
+
79
+ # Enable cookie support. With this enabled the client will persist cookies
80
+ # across requests as a normal web browser would. Enabled by default
81
+ config :cookies, :validate => :boolean, :default => true
82
+
83
+ # If you'd like to use an HTTP proxy . This supports multiple configuration syntaxes:
84
+ #
85
+ # 1. Proxy host in form: `http://proxy.org:1234`
86
+ # 2. Proxy host in form: `{host => "proxy.org", port => 80, scheme => 'http', user => 'username@host', password => 'password'}`
87
+ # 3. Proxy host in form: `{url => 'http://proxy.org:1234', user => 'username@host', password => 'password'}`
88
+ config :proxy
89
+
90
+ # LM Portal Name
91
+ config :portal_name, :validate => :string, :required => true
92
+
93
+ # Username to use for HTTP auth.
94
+ config :access_id, :validate => :string, :required => true
95
+
96
+ # Password to use for HTTP auth
97
+ config :access_key, :validate => :password, :required => true
98
+
99
+ @@MAX_PAYLOAD_SIZE = 8*1024*1024
100
+
101
+ # For developer debugging.
102
+ @@CONSOLE_LOGS = false
103
+
104
+ public
105
+ def register
106
+ @total = 0
107
+ @total_failed = 0
108
+ logger.info("Initialized LogicMonitor output plugin with configuration",
109
+ :host => @host)
110
+ logger.info("Max Payload Size: ",
111
+ :size => @@MAX_PAYLOAD_SIZE)
112
+
113
+ end # def register
114
+
115
+ def client_config
116
+ c = {
117
+ connect_timeout: @connect_timeout,
118
+ socket_timeout: @socket_timeout,
119
+ request_timeout: @request_timeout,
120
+ follow_redirects: @follow_redirects,
121
+ automatic_retries: @automatic_retries,
122
+ retry_non_idempotent: @retry_non_idempotent,
123
+ check_connection_timeout: @validate_after_inactivity,
124
+ pool_max: @pool_max,
125
+ pool_max_per_route: @pool_max_per_route,
126
+ cookies: @cookies,
127
+ keepalive: @keepalive
128
+ }
129
+
130
+ if @proxy
131
+ # Symbolize keys if necessary
132
+ c[:proxy] = @proxy.is_a?(Hash) ?
133
+ @proxy.reduce({}) {|memo,(k,v)| memo[k.to_sym] = v; memo} :
134
+ @proxy
135
+ end
136
+
137
+ if @access_id
138
+ if !@access_key || !@access_key.value
139
+ raise ::LogStash::ConfigurationError, "access_id '#{@access_id}' specified without access_key!"
140
+ end
141
+
142
+ # Symbolize keys if necessary
143
+ # c[:auth] = {
144
+ # :user => @access_id,
145
+ # :password => @access_key.value,
146
+ # :eager => true
147
+ # }
148
+ end
149
+ log_debug("manticore client config: ", :client => c)
150
+ return c
151
+ end
152
+
153
+ private
154
+ def make_client
155
+ Manticore::Client.new(client_config)
156
+ end
157
+
158
+ public
159
+ def client
160
+ @client ||= make_client
161
+ end
162
+
163
+ public
164
+ def close
165
+ @client.close
166
+ end
167
+
168
+
169
+ def generate_auth_string(body)
170
+ timestamp = DateTime.now.strftime('%Q')
171
+ hash_this = "POST#{timestamp}#{body}/log/ingest"
172
+ sign_this = OpenSSL::HMAC.hexdigest(
173
+ OpenSSL::Digest.new('sha256'),
174
+ "#{@access_key.value}",
175
+ hash_this
176
+ )
177
+ signature = Base64.strict_encode64(sign_this)
178
+ "LMv1 #{@access_id}:#{signature}:#{timestamp}"
179
+ end
180
+
181
+ def send_batch(events)
182
+ log_debug("Started sending logs to LM: ",
183
+ :time => Time::now.utc)
184
+ url = "https://" + @portal_name + ".logicmonitor.com/rest/log/ingest"
185
+ body = events.to_json
186
+ auth_string = generate_auth_string(body)
187
+ request = client.post(url, {
188
+ :body => body,
189
+ :headers => {
190
+ "Content-Type" => "application/json",
191
+ "User-Agent" => "LM Logs Logstash Plugin",
192
+ "Authorization" => "#{auth_string}"
193
+ }
194
+ })
195
+
196
+ request.on_success do |response|
197
+ if response.code == 202
198
+ @total += events.length
199
+ log_debug("Successfully sent ",
200
+ :response_code => response.code,
201
+ :batch_size => events.length,
202
+ :total_sent => @total,
203
+ :time => Time::now.utc)
204
+ elsif response.code == 207
205
+ log_failure(
206
+ "207 HTTP code - some of the events successfully parsed, some not. ",
207
+ :response_code => response.code,
208
+ :url => url,
209
+ :response_body => response.body,
210
+ :total_failed => @total_failed)
211
+ else
212
+ @total_failed += 1
213
+ log_failure(
214
+ "Encountered non-202/207 HTTP code #{response.code}",
215
+ :response_code => response.code,
216
+ :url => url,
217
+ :response_body => response.body,
218
+ :total_failed => @total_failed)
219
+ end
220
+ end
221
+
222
+ request.on_failure do |exception|
223
+ @total_failed += 1
224
+ log_failure("The request failed. ",
225
+ :url => url,
226
+ :method => @http_method,
227
+ :message => exception.message,
228
+ :class => exception.class.name,
229
+ :backtrace => exception.backtrace,
230
+ :total_failed => @total_failed
231
+ )
232
+ end
233
+
234
+ log_debug("Completed sending logs to LM",
235
+ :total => @total,
236
+ :time => Time::now.utc)
237
+ request.call
238
+
239
+ rescue Exception => e
240
+ @logger.error("[Exception=] #{e.message} #{e.backtrace}")
241
+ end
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
250
+
251
+ public
252
+ def multi_receive(events)
253
+ if events.length() > 0
254
+ log_debug(events.to_json)
255
+ end
256
+
257
+ events.each_slice(@batch_size) do |chunk|
258
+ documents = []
259
+ chunk.each do |event|
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
266
+
267
+ lmlogs_event["_lm.resourceId"] = {}
268
+ lmlogs_event["_lm.resourceId"]["#{@lm_property}"] = event.get(@property_key.to_s)
269
+
270
+ if @keep_timestamp
271
+ lmlogs_event["timestamp"] = event.get("@timestamp")
272
+ end
273
+
274
+ if @timestamp_is_key
275
+ lmlogs_event["timestamp"] = event.get(@timestamp_key.to_s)
276
+ end
277
+
278
+ documents = isValidPayloadSize(documents,lmlogs_event,@@MAX_PAYLOAD_SIZE)
279
+
280
+ end
281
+ send_batch(documents)
282
+ end
283
+ end
284
+
285
+ def log_failure(message, opts)
286
+ @logger.error("[HTTP Output Failure] #{message}", opts)
287
+ end
288
+
289
+ def isValidPayloadSize(documents,lmlogs_event,max_payload_size)
290
+ if (documents.to_json.bytesize + lmlogs_event.to_json.bytesize) > max_payload_size
291
+ send_batch(documents)
292
+ documents = []
293
+
294
+ end
295
+ documents.push(lmlogs_event)
296
+ return documents
297
+ end
298
+ end # class LogStash::Outputs::LMLogs
@@ -0,0 +1,28 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'pooja-test'
3
+ s.version = '1.1.0'
4
+ s.licenses = ['Apache-2.0']
5
+ s.summary = "test pooja"
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
+ s.authors = ["pooja"]
8
+ s.email = ""
9
+ s.homepage = ""
10
+ s.require_paths = ["lib"]
11
+
12
+ # Files
13
+ s.files = Dir['lib/**/*','spec/**/*','vendor/**/*','*.gemspec','*.md','Gemfile']
14
+ # Tests
15
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
16
+
17
+ # Special flag to let us know this is actually a logstash plugin
18
+ s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" , "rubygems_mfa_required" => "false"}
19
+
20
+ # Gem dependencies
21
+ #
22
+
23
+ s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
24
+ s.add_runtime_dependency "logstash-codec-plain"
25
+ s.add_runtime_dependency 'manticore', '>= 0.5.2', '< 1.0.0'
26
+
27
+ s.add_development_dependency 'logstash-devutils'
28
+ end
@@ -0,0 +1,77 @@
1
+ # encoding: utf-8
2
+ require "logstash/devutils/rspec/spec_helper"
3
+ require "logstash/outputs/lmlogs"
4
+ require "logstash/event"
5
+
6
+ describe LogStash::Outputs::LMLogs do
7
+ let(:sample_event) { LogStash::Event.new("message" => "hello this is log") }
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"}}
10
+
11
+ before do
12
+ @lmlogs = LogStash::Outputs::LMLogs.new(
13
+ "portal_name" => "localhost",
14
+ "access_id" => "access_id",
15
+ "access_key" => "access_key",
16
+ "batch_size" => 3,
17
+ "lm_property" => "test.property"
18
+ )
19
+ @lmlogs.register
20
+ allow(@lmlogs).to receive(:client).and_return(client)
21
+ allow(client).to receive(:post).and_call_original
22
+ end
23
+
24
+ before do
25
+ allow(@lmlogs).to receive(:client).and_return(client)
26
+ end
27
+
28
+ it "Forwards an event" do
29
+ expect(client).to receive(:post).once.and_call_original
30
+ @lmlogs.multi_receive([sample_event])
31
+ end
32
+
33
+ it "Batches multiple events and extracts metadata" do
34
+ event1 = LogStash::Event.new("message" => "hello this is log 1", "host" => "host1")
35
+ event2 = LogStash::Event.new("message" => "hello this is log 2", "host" => "host2")
36
+ event3 = LogStash::Event.new("message" => "hello this is log 3", "host" => "host3")
37
+ expect(client).to receive(:post).once.with("https://localhost.logicmonitor.com/rest/log/ingest",hash_including(:body => LogStash::Json.dump(
38
+ [{"message" => "hello this is log 1", "_lm.resourceId" => {"test.property" => "host1"}, "timestamp" => event1.timestamp.to_s},
39
+ {"message" => "hello this is log 2", "_lm.resourceId" => {"test.property" => "host2"}, "timestamp" => event2.timestamp.to_s},
40
+ {"message" => "hello this is log 3", "_lm.resourceId" => {"test.property" => "host3"}, "timestamp" => event3.timestamp.to_s}
41
+ ]
42
+ ))).and_call_original
43
+ @lmlogs.multi_receive([event1, event2, event3])
44
+ end
45
+
46
+ it "Batches data of size batch_size" do
47
+ expect(client).to receive(:post).exactly(2).times.and_call_original
48
+ @lmlogs.multi_receive([sample_event, sample_event, sample_event, sample_event, sample_event])
49
+ end
50
+
51
+ it "max payload exceeded" do
52
+
53
+ document = [sample_lm_logs_event,sample_lm_logs_event]
54
+
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]
57
+ expect(client).to receive(:post).once.with("https://localhost.logicmonitor.com/rest/log/ingest",hash_including(:body => LogStash::Json.dump(
58
+ [sample_lm_logs_event,sample_lm_logs_event]
59
+ ))).and_call_original
60
+
61
+ document_result = @lmlogs.isValidPayloadSize(document,lm_logs_event,document.to_json.bytesize)
62
+ expect(document_result).to eq(document_expected)
63
+ end
64
+ it "max payload in limit" do
65
+
66
+ document = [sample_lm_logs_event]
67
+
68
+ lm_logs_event = {"message" => "hello this is log 2", "_lm.resourceId" => {"test.property" => "host3"}, "timestamp" => "2021-03-22T04:28:55.909421106Z"}
69
+
70
+ document_expected = [sample_lm_logs_event,lm_logs_event]
71
+ expect(client).to receive(:post).exactly(0).times.and_call_original
72
+
73
+ document_result = @lmlogs.isValidPayloadSize(document,lm_logs_event,document.to_json.bytesize + lm_logs_event.to_json.bytesize)
74
+ expect(document_result).to eq(document_expected)
75
+ end
76
+
77
+ end
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pooja-test
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
5
+ platform: ruby
6
+ authors:
7
+ - pooja
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-11-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '1.60'
19
+ - - "<="
20
+ - !ruby/object:Gem::Version
21
+ version: '2.99'
22
+ name: logstash-core-plugin-api
23
+ prerelease: false
24
+ type: :runtime
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '1.60'
30
+ - - "<="
31
+ - !ruby/object:Gem::Version
32
+ version: '2.99'
33
+ - !ruby/object:Gem::Dependency
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ name: logstash-codec-plain
40
+ prerelease: false
41
+ type: :runtime
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: 0.5.2
53
+ - - "<"
54
+ - !ruby/object:Gem::Version
55
+ version: 1.0.0
56
+ name: manticore
57
+ prerelease: false
58
+ type: :runtime
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: 0.5.2
64
+ - - "<"
65
+ - !ruby/object:Gem::Version
66
+ version: 1.0.0
67
+ - !ruby/object:Gem::Dependency
68
+ requirement: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ name: logstash-devutils
74
+ prerelease: false
75
+ type: :development
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ description: This gem is a Logstash plugin required to be installed on top of the
82
+ Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This
83
+ gem is not a stand-alone program
84
+ email: ''
85
+ executables: []
86
+ extensions: []
87
+ extra_rdoc_files: []
88
+ files:
89
+ - CHANGELOG.md
90
+ - Gemfile
91
+ - README.md
92
+ - lib/logstash/outputs/lmlogs.rb
93
+ - logstash-output-lmlogs.gemspec
94
+ - spec/outputs/lmlogs_spec.rb
95
+ homepage: ''
96
+ licenses:
97
+ - Apache-2.0
98
+ metadata:
99
+ logstash_plugin: 'true'
100
+ logstash_group: output
101
+ rubygems_mfa_required: 'false'
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubygems_version: 3.2.33
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: test pooja
121
+ test_files:
122
+ - spec/outputs/lmlogs_spec.rb