logstash-output-kusto 1.0.0-java

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.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +31 -0
  3. data/CONTRIBUTORS +10 -0
  4. data/Gemfile +20 -0
  5. data/LICENSE +201 -0
  6. data/README.md +79 -0
  7. data/lib/com/fasterxml/jackson/core/jackson-annotations/2.9.10/jackson-annotations-2.9.10.jar +0 -0
  8. data/lib/com/fasterxml/jackson/core/jackson-core/2.9.4/jackson-core-2.9.4.jar +0 -0
  9. data/lib/com/fasterxml/jackson/core/jackson-databind/2.9.10.7/jackson-databind-2.9.10.7.jar +0 -0
  10. data/lib/com/github/stephenc/jcip/jcip-annotations/1.0-1/jcip-annotations-1.0-1.jar +0 -0
  11. data/lib/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar +0 -0
  12. data/lib/com/google/guava/guava/20.0/guava-20.0.jar +0 -0
  13. data/lib/com/microsoft/azure/adal4j/1.6.5/adal4j-1.6.5.jar +0 -0
  14. data/lib/com/microsoft/azure/azure-keyvault-core/1.0.0/azure-keyvault-core-1.0.0.jar +0 -0
  15. data/lib/com/microsoft/azure/azure-storage/8.3.0/azure-storage-8.3.0.jar +0 -0
  16. data/lib/com/microsoft/azure/kusto/kusto-data/2.1.2/kusto-data-2.1.2.jar +0 -0
  17. data/lib/com/microsoft/azure/kusto/kusto-ingest/2.1.2/kusto-ingest-2.1.2.jar +0 -0
  18. data/lib/com/nimbusds/lang-tag/1.5/lang-tag-1.5.jar +0 -0
  19. data/lib/com/nimbusds/nimbus-jose-jwt/9.3/nimbus-jose-jwt-9.3.jar +0 -0
  20. data/lib/com/nimbusds/oauth2-oidc-sdk/6.5/oauth2-oidc-sdk-6.5.jar +0 -0
  21. data/lib/com/sun/mail/javax.mail/1.6.1/javax.mail-1.6.1.jar +0 -0
  22. data/lib/com/univocity/univocity-parsers/2.1.1/univocity-parsers-2.1.1.jar +0 -0
  23. data/lib/commons-codec/commons-codec/1.14/commons-codec-1.14.jar +0 -0
  24. data/lib/commons-logging/commons-logging/1.2/commons-logging-1.2.jar +0 -0
  25. data/lib/javax/activation/activation/1.1/activation-1.1.jar +0 -0
  26. data/lib/logstash-output-kusto_jars.rb +64 -0
  27. data/lib/logstash/outputs/kusto.rb +413 -0
  28. data/lib/logstash/outputs/kusto/ingestor.rb +123 -0
  29. data/lib/logstash/outputs/kusto/interval.rb +81 -0
  30. data/lib/net/minidev/accessors-smart/1.2/accessors-smart-1.2.jar +0 -0
  31. data/lib/net/minidev/json-smart/2.3/json-smart-2.3.jar +0 -0
  32. data/lib/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar +0 -0
  33. data/lib/org/apache/httpcomponents/httpclient/4.5.8/httpclient-4.5.8.jar +0 -0
  34. data/lib/org/apache/httpcomponents/httpcore/4.4.11/httpcore-4.4.11.jar +0 -0
  35. data/lib/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar +0 -0
  36. data/lib/org/json/json/20190722/json-20190722.jar +0 -0
  37. data/lib/org/ow2/asm/asm/5.0.4/asm-5.0.4.jar +0 -0
  38. data/lib/org/slf4j/slf4j-api/1.8.0-beta4/slf4j-api-1.8.0-beta4.jar +0 -0
  39. data/logstash-output-kusto.gemspec +35 -0
  40. data/spec/outputs/kusto/ingestor_spec.rb +109 -0
  41. data/spec/outputs/kusto_spec.rb +54 -0
  42. data/spec/spec_helpers.rb +21 -0
  43. metadata +203 -0
@@ -0,0 +1,81 @@
1
+ # encoding: utf-8
2
+
3
+ require 'logstash/outputs/base'
4
+ require 'logstash/namespace'
5
+ require 'logstash/errors'
6
+
7
+ class LogStash::Outputs::Kusto < LogStash::Outputs::Base
8
+ ##
9
+ # Bare-bones utility for running a block of code at an interval.
10
+ #
11
+ class Interval
12
+ ##
13
+ # Initializes a new Interval with the given arguments and starts it
14
+ # before returning it.
15
+ #
16
+ # @param interval [Integer] (see: Interval#initialize)
17
+ # @param procsy [#call] (see: Interval#initialize)
18
+ #
19
+ # @return [Interval]
20
+ #
21
+ def self.start(interval, procsy)
22
+ new(interval, procsy).tap(&:start)
23
+ end
24
+
25
+ ##
26
+ # @param interval [Integer]: time in seconds to wait between calling the given proc
27
+ # @param procsy [#call]: proc or lambda to call periodically; must not raise exceptions.
28
+ def initialize(interval, procsy)
29
+ @interval = interval
30
+ @procsy = procsy
31
+
32
+ # Mutex, ConditionVariable, etc.
33
+ @mutex = Mutex.new
34
+ @sleeper = ConditionVariable.new
35
+ end
36
+
37
+ ##
38
+ # Starts the interval, or returns if it has already been started.
39
+ #
40
+ # @return [void]
41
+ def start
42
+ @mutex.synchronize do
43
+ return if @thread && @thread.alive?
44
+
45
+ @thread = Thread.new { run }
46
+ end
47
+ end
48
+
49
+ ##
50
+ # Stop the interval.
51
+ # Does not interrupt if execution is in-progress.
52
+ def stop
53
+ @mutex.synchronize do
54
+ @stopped = true
55
+ end
56
+
57
+ @thread && @thread.join
58
+ end
59
+
60
+ ##
61
+ # @return [Boolean]
62
+ def alive?
63
+ @thread && @thread.alive?
64
+ end
65
+
66
+ private
67
+
68
+ def run
69
+ @mutex.synchronize do
70
+ loop do
71
+ @sleeper.wait(@mutex, @interval)
72
+ break if @stopped
73
+
74
+ @procsy.call
75
+ end
76
+ end
77
+ ensure
78
+ @sleeper.broadcast
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,35 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'logstash-output-kusto' #WATCH OUT: we hardcoded usage of this name in one of the classes.
3
+ s.version = '1.0.0'
4
+ s.licenses = ['Apache-2.0']
5
+ s.summary = 'Writes events to Azure Data Explorer (Kusto)'
6
+ s.description = 'This is a logstash output plugin used to write events to an Azure Data Explorer (a.k.a Kusto)'
7
+ s.homepage = 'https://github.com/Azure/logstash-output-kusto'
8
+ s.authors = ['Tamir Kamara', 'Asaf Mahlev']
9
+ s.email = 'nugetkusto@microsoft.com'
10
+ s.require_paths = ['lib']
11
+ s.platform = 'java'
12
+
13
+ # Files
14
+ s.files = Dir['lib/**/*', 'spec/**/*', 'vendor/**/*', '*.gemspec', '*.md', 'CONTRIBUTORS', 'Gemfile', 'LICENSE', 'NOTICE.TXT']
15
+
16
+ # Tests
17
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
18
+
19
+ # Special flag to let us know this is actually a logstash plugin
20
+ s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" }
21
+
22
+ # Gem dependencies
23
+ s.add_runtime_dependency 'logstash-core-plugin-api', '~> 2.0'
24
+ s.add_runtime_dependency 'logstash-codec-json_lines'
25
+ s.add_runtime_dependency 'logstash-codec-line'
26
+
27
+ s.add_development_dependency 'logstash-devutils'
28
+ s.add_development_dependency 'flores'
29
+ s.add_development_dependency 'logstash-input-generator'
30
+ s.add_development_dependency 'ruby-maven', '~> 3.3.11'
31
+
32
+ # Jar dependencies
33
+ s.requirements << "jar 'com.microsoft.azure.kusto, kusto-ingest, 2.1.2"
34
+ s.add_runtime_dependency 'jar-dependencies'
35
+ end
@@ -0,0 +1,109 @@
1
+ # encoding: utf-8
2
+ require_relative "../../spec_helpers.rb"
3
+ require 'logstash/outputs/kusto'
4
+ require 'logstash/outputs/kusto/ingestor'
5
+
6
+ describe LogStash::Outputs::Kusto::Ingestor do
7
+
8
+ let(:ingest_url) { "mycluster" }
9
+ let(:app_id) { "myid" }
10
+ let(:app_key) { LogStash::Util::Password.new("mykey") }
11
+ let(:app_tenant) { "mytenant" }
12
+ let(:database) { "mydatabase" }
13
+ let(:table) { "mytable" }
14
+ let(:json_mapping) { "mymapping" }
15
+ let(:delete_local) { false }
16
+ let(:logger) { spy('logger') }
17
+
18
+ describe '#initialize' do
19
+
20
+ it 'does not throw an error when initializing' do
21
+ # note that this will cause an internal error since connection is being tried.
22
+ # however we still want to test that all the java stuff is working as expected
23
+ expect {
24
+ ingestor = described_class.new(ingest_url, app_id, app_key, app_tenant, database, table, json_mapping, delete_local, logger)
25
+ ingestor.stop
26
+ }.not_to raise_error
27
+ end
28
+
29
+ dynamic_name_array = ['/a%{name}/', '/a %{name}/', '/a- %{name}/', '/a- %{name}']
30
+
31
+ context 'doesnt allow database to have some dynamic part' do
32
+ dynamic_name_array.each do |test_database|
33
+ it "with database: #{test_database}" do
34
+ expect {
35
+ ingestor = described_class.new(ingest_url, app_id, app_key, app_tenant, test_database, table, json_mapping, delete_local, logger)
36
+ ingestor.stop
37
+ }.to raise_error(LogStash::ConfigurationError)
38
+ end
39
+ end
40
+ end
41
+
42
+ context 'doesnt allow table to have some dynamic part' do
43
+ dynamic_name_array.each do |test_table|
44
+ it "with database: #{test_table}" do
45
+ expect {
46
+ ingestor = described_class.new(ingest_url, app_id, app_key, app_tenant, database, test_table, json_mapping, delete_local, logger)
47
+ ingestor.stop
48
+ }.to raise_error(LogStash::ConfigurationError)
49
+ end
50
+ end
51
+ end
52
+
53
+ context 'doesnt allow mapping to have some dynamic part' do
54
+ dynamic_name_array.each do |test_json_mapping|
55
+ it "with database: #{test_json_mapping}" do
56
+ expect {
57
+ ingestor = described_class.new(ingest_url, app_id, app_key, app_tenant, database, table, test_json_mapping, delete_local, logger)
58
+ ingestor.stop
59
+ }.to raise_error(LogStash::ConfigurationError)
60
+ end
61
+ end
62
+ end
63
+
64
+ end
65
+
66
+ # describe 'receiving events' do
67
+
68
+ # context 'with non-zero flush interval' do
69
+ # let(:temporary_output_file) { Stud::Temporary.pathname }
70
+
71
+ # let(:event_count) { 100 }
72
+ # let(:flush_interval) { 5 }
73
+
74
+ # let(:events) do
75
+ # event_count.times.map do |idx|
76
+ # LogStash::Event.new('subject' => idx)
77
+ # end
78
+ # end
79
+
80
+ # let(:output) { described_class.new(options.merge( {'path' => temporary_output_file, 'flush_interval' => flush_interval, 'delete_temp_files' => false } )) }
81
+
82
+ # before(:each) { output.register }
83
+
84
+ # after(:each) do
85
+ # output.close
86
+ # File.exist?(temporary_output_file) && File.unlink(temporary_output_file)
87
+ # File.exist?(temporary_output_file + '.kusto') && File.unlink(temporary_output_file + '.kusto')
88
+ # end
89
+
90
+ # it 'eventually flushes without receiving additional events' do
91
+ # output.multi_receive_encoded(events)
92
+
93
+ # # events should not all be flushed just yet...
94
+ # expect(File.read(temporary_output_file)).to satisfy("have less than #{event_count} lines") do |contents|
95
+ # contents && contents.lines.count < event_count
96
+ # end
97
+
98
+ # # wait for the flusher to run...
99
+ # sleep(flush_interval + 1)
100
+
101
+ # # events should all be flushed
102
+ # expect(File.read(temporary_output_file)).to satisfy("have exactly #{event_count} lines") do |contents|
103
+ # contents && contents.lines.count == event_count
104
+ # end
105
+ # end
106
+ # end
107
+
108
+ # end
109
+ end
@@ -0,0 +1,54 @@
1
+ # encoding: utf-8
2
+ require 'logstash/devutils/rspec/spec_helper'
3
+ require 'logstash/outputs/kusto'
4
+ require 'logstash/codecs/plain'
5
+ require 'logstash/event'
6
+
7
+ describe LogStash::Outputs::Kusto do
8
+
9
+ let(:options) { { "path" => "./kusto_tst/%{+YYYY-MM-dd-HH-mm}",
10
+ "ingest_url" => "mycluster",
11
+ "app_id" => "myid",
12
+ "app_key" => "mykey",
13
+ "app_tenant" => "mytenant",
14
+ "database" => "mydatabase",
15
+ "table" => "mytable",
16
+ "json_mapping" => "mymapping"
17
+ } }
18
+
19
+ describe '#register' do
20
+
21
+ it 'doesnt allow the path to start with a dynamic string' do
22
+ kusto = described_class.new(options.merge( {'path' => '/%{name}'} ))
23
+ expect { kusto.register }.to raise_error(LogStash::ConfigurationError)
24
+ kusto.close
25
+ end
26
+
27
+ it 'path must include a dynamic string to allow file rotation' do
28
+ kusto = described_class.new(options.merge( {'path' => '/{name}'} ))
29
+ expect { kusto.register }.to raise_error(LogStash::ConfigurationError)
30
+ kusto.close
31
+ end
32
+
33
+
34
+ dynamic_name_array = ['/a%{name}/', '/a %{name}/', '/a- %{name}/', '/a- %{name}']
35
+
36
+ context 'doesnt allow the root directory to have some dynamic part' do
37
+ dynamic_name_array.each do |test_path|
38
+ it "with path: #{test_path}" do
39
+ kusto = described_class.new(options.merge( {'path' => test_path} ))
40
+ expect { kusto.register }.to raise_error(LogStash::ConfigurationError)
41
+ kusto.close
42
+ end
43
+ end
44
+ end
45
+
46
+ it 'allow to have dynamic part after the file root' do
47
+ kusto = described_class.new(options.merge({'path' => '/tmp/%{name}'}))
48
+ expect { kusto.register }.not_to raise_error
49
+ kusto.close
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+ require "logstash/devutils/rspec/spec_helper"
3
+ require "logstash/logging/logger"
4
+
5
+ LogStash::Logging::Logger::configure_logging("debug")
6
+
7
+ RSpec.configure do |config|
8
+ # register around filter that captures stdout and stderr
9
+ config.around(:each) do |example|
10
+ $stdout = StringIO.new
11
+ $stderr = StringIO.new
12
+
13
+ example.run
14
+
15
+ example.metadata[:stdout] = $stdout.string
16
+ example.metadata[:stderr] = $stderr.string
17
+
18
+ $stdout = STDOUT
19
+ $stderr = STDERR
20
+ end
21
+ end
metadata ADDED
@@ -0,0 +1,203 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: logstash-output-kusto
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: java
6
+ authors:
7
+ - Tamir Kamara
8
+ - Asaf Mahlev
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2020-12-27 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.0'
20
+ name: logstash-core-plugin-api
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '2.0'
28
+ - !ruby/object:Gem::Dependency
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ name: logstash-codec-json_lines
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ name: logstash-codec-line
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ name: logstash-devutils
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ name: flores
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ name: logstash-input-generator
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ - !ruby/object:Gem::Dependency
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 3.3.11
104
+ name: ruby-maven
105
+ type: :development
106
+ prerelease: false
107
+ version_requirements: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - "~>"
110
+ - !ruby/object:Gem::Version
111
+ version: 3.3.11
112
+ - !ruby/object:Gem::Dependency
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ name: jar-dependencies
119
+ type: :runtime
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ description: This is a logstash output plugin used to write events to an Azure Data
127
+ Explorer (a.k.a Kusto)
128
+ email: nugetkusto@microsoft.com
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - CHANGELOG.md
134
+ - CONTRIBUTORS
135
+ - Gemfile
136
+ - LICENSE
137
+ - README.md
138
+ - lib/com/fasterxml/jackson/core/jackson-annotations/2.9.10/jackson-annotations-2.9.10.jar
139
+ - lib/com/fasterxml/jackson/core/jackson-core/2.9.4/jackson-core-2.9.4.jar
140
+ - lib/com/fasterxml/jackson/core/jackson-databind/2.9.10.7/jackson-databind-2.9.10.7.jar
141
+ - lib/com/github/stephenc/jcip/jcip-annotations/1.0-1/jcip-annotations-1.0-1.jar
142
+ - lib/com/google/code/gson/gson/2.8.0/gson-2.8.0.jar
143
+ - lib/com/google/guava/guava/20.0/guava-20.0.jar
144
+ - lib/com/microsoft/azure/adal4j/1.6.5/adal4j-1.6.5.jar
145
+ - lib/com/microsoft/azure/azure-keyvault-core/1.0.0/azure-keyvault-core-1.0.0.jar
146
+ - lib/com/microsoft/azure/azure-storage/8.3.0/azure-storage-8.3.0.jar
147
+ - lib/com/microsoft/azure/kusto/kusto-data/2.1.2/kusto-data-2.1.2.jar
148
+ - lib/com/microsoft/azure/kusto/kusto-ingest/2.1.2/kusto-ingest-2.1.2.jar
149
+ - lib/com/nimbusds/lang-tag/1.5/lang-tag-1.5.jar
150
+ - lib/com/nimbusds/nimbus-jose-jwt/9.3/nimbus-jose-jwt-9.3.jar
151
+ - lib/com/nimbusds/oauth2-oidc-sdk/6.5/oauth2-oidc-sdk-6.5.jar
152
+ - lib/com/sun/mail/javax.mail/1.6.1/javax.mail-1.6.1.jar
153
+ - lib/com/univocity/univocity-parsers/2.1.1/univocity-parsers-2.1.1.jar
154
+ - lib/commons-codec/commons-codec/1.14/commons-codec-1.14.jar
155
+ - lib/commons-logging/commons-logging/1.2/commons-logging-1.2.jar
156
+ - lib/javax/activation/activation/1.1/activation-1.1.jar
157
+ - lib/logstash-output-kusto_jars.rb
158
+ - lib/logstash/outputs/kusto.rb
159
+ - lib/logstash/outputs/kusto/ingestor.rb
160
+ - lib/logstash/outputs/kusto/interval.rb
161
+ - lib/net/minidev/accessors-smart/1.2/accessors-smart-1.2.jar
162
+ - lib/net/minidev/json-smart/2.3/json-smart-2.3.jar
163
+ - lib/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar
164
+ - lib/org/apache/httpcomponents/httpclient/4.5.8/httpclient-4.5.8.jar
165
+ - lib/org/apache/httpcomponents/httpcore/4.4.11/httpcore-4.4.11.jar
166
+ - lib/org/jetbrains/annotations/17.0.0/annotations-17.0.0.jar
167
+ - lib/org/json/json/20190722/json-20190722.jar
168
+ - lib/org/ow2/asm/asm/5.0.4/asm-5.0.4.jar
169
+ - lib/org/slf4j/slf4j-api/1.8.0-beta4/slf4j-api-1.8.0-beta4.jar
170
+ - logstash-output-kusto.gemspec
171
+ - spec/outputs/kusto/ingestor_spec.rb
172
+ - spec/outputs/kusto_spec.rb
173
+ - spec/spec_helpers.rb
174
+ homepage: https://github.com/Azure/logstash-output-kusto
175
+ licenses:
176
+ - Apache-2.0
177
+ metadata:
178
+ logstash_plugin: 'true'
179
+ logstash_group: output
180
+ post_install_message:
181
+ rdoc_options: []
182
+ require_paths:
183
+ - lib
184
+ required_ruby_version: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ required_rubygems_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ requirements:
195
+ - jar 'com.microsoft.azure.kusto, kusto-ingest, 2.1.2
196
+ rubygems_version: 3.0.6
197
+ signing_key:
198
+ specification_version: 4
199
+ summary: Writes events to Azure Data Explorer (Kusto)
200
+ test_files:
201
+ - spec/outputs/kusto/ingestor_spec.rb
202
+ - spec/outputs/kusto_spec.rb
203
+ - spec/spec_helpers.rb