pooja-test 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 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