logstash-output-loganalytics 0.1.0 → 0.2.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 +4 -4
- data/lib/logstash/outputs/loganalytics.rb +17 -10
- data/logstash-output-loganalytics.gemspec +1 -1
- data/spec/outputs/loganalytics_spec.rb +23 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1e42bcd913718ac95939b864d050d3ac6ac89286ae63dc1b96eb13af0dada1f1
|
4
|
+
data.tar.gz: 5fd60780a81eaf8482e4cb4bfd51dfd5e716b4a02cf7aa13dd6fe0cf8f5c02af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 71e115f3a2c9feb10a1a44fd0e7fbcbef6b5e1c2c0efbb3259909eec3205b62b623385f6e629e70b49d074a798c30b2a53752f4a3d824b759635e61cc48b65dc
|
7
|
+
data.tar.gz: 86d0f659d0ded7e622aaef9d9f5ce280e8df0e3e9480bf0142fa5a8de0464f2bf163232e8f8a271f5b777f3edfa030feae6c9e97ed8d7eba49ce61b56b2778e2
|
@@ -11,43 +11,50 @@ class LogStash::Outputs::Loganalytics < LogStash::Outputs::Base
|
|
11
11
|
config_name "loganalytics"
|
12
12
|
|
13
13
|
# Your Operations Management Suite workspace ID
|
14
|
-
config :
|
14
|
+
config :client_id, :validate => :string, :required => true
|
15
15
|
|
16
16
|
# The primary or the secondary Connected Sources client authentication key
|
17
|
-
config :
|
17
|
+
config :client_secret, :validate => :string, :required => true
|
18
18
|
|
19
19
|
# The name of the event type that is being submitted to Log Analytics. This must be only alpha characters.
|
20
|
-
config :
|
20
|
+
config :table, :validate => :string, :required => true
|
21
21
|
|
22
22
|
# The name of the time generated field. Be carefule that the value of field should strictly follow the ISO 8601 format (YYYY-MM-DDThh:mm:ssZ)
|
23
23
|
config :time_generated_field, :validate => :string, :default => '', :required => false
|
24
24
|
|
25
25
|
public
|
26
26
|
def register
|
27
|
-
raise ArgumentError, '
|
28
|
-
@uri = "https://#{@
|
27
|
+
raise ArgumentError, 'log type must be only alpha characters and less than 100 characters' unless @table.match(/^[a-zA-Z]{1,100}$/)
|
28
|
+
@uri = "https://#{@client_id}.ods.opinsights.azure.com/api/logs?api-version=2016-04-01"
|
29
29
|
end
|
30
30
|
|
31
31
|
def receive(event)
|
32
32
|
begin
|
33
33
|
body = event.to_json
|
34
|
+
#puts body
|
34
35
|
date = Time.now.httpdate
|
36
|
+
#puts date
|
35
37
|
string_to_hash = "POST\n#{body.bytesize}\napplication/json\nx-ms-date:#{date}\n/api/logs"
|
36
|
-
|
38
|
+
#puts string_to_hash
|
39
|
+
hashed_string = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), Base64.decode64(@client_secret), string_to_hash.encode('utf-8')))
|
40
|
+
#puts hashed_string
|
37
41
|
headers = {}
|
38
42
|
headers['Content-Type'] = 'application/json'
|
39
|
-
headers['Authorization'] = "SharedKey #{@
|
40
|
-
headers['Log-Type'] = @
|
43
|
+
headers['Authorization'] = "SharedKey #{@client_id}:#{hashed_string}"
|
44
|
+
headers['Log-Type'] = @table
|
41
45
|
headers['x-ms-date'] = date
|
42
46
|
unless @time_generated_field.empty?
|
43
47
|
headers['time-generated-field'] = @time_generated_field
|
44
48
|
end
|
45
49
|
response = RestClient.post(@uri, body, headers)
|
50
|
+
#puts response.code
|
46
51
|
unless response.code == 200
|
47
|
-
|
52
|
+
#puts "DataCollector API request failure: error code: #{response.code}, data=>#{event}"
|
53
|
+
@logger.error("DataCollector API request failure: error code: #{response.code}, data=>#{event}")
|
48
54
|
end
|
49
55
|
rescue Exception => ex
|
50
|
-
|
56
|
+
#puts "Exception occured in posting to DataCollector API: '#{ex}', data=>#{event}"
|
57
|
+
@logger.error("Exception occured in posting to DataCollector API: '#{ex}', data=>#{event}")
|
51
58
|
end
|
52
59
|
end
|
53
60
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'logstash-output-loganalytics'
|
3
|
-
s.version = '0.
|
3
|
+
s.version = '0.2.0'
|
4
4
|
s.licenses = ['Apache-2.0']
|
5
5
|
s.summary = 'Logstash output plugin for Azure Log Analytics.'
|
6
6
|
s.description = 'Logstash output plugin to send logs to Azure Log Analytics. Uses Log Analytics HTTP Data Collector API under the hood.'
|
@@ -5,18 +5,35 @@ require "logstash/codecs/plain"
|
|
5
5
|
require "logstash/event"
|
6
6
|
|
7
7
|
describe LogStash::Outputs::Loganalytics do
|
8
|
-
let(:
|
9
|
-
let(:
|
8
|
+
let(:client_id) { 'test' }
|
9
|
+
let(:client_secret) { 'test' }
|
10
|
+
let(:table) { 'logstashplugintest' }
|
11
|
+
|
12
|
+
let(:cfg) {
|
13
|
+
{
|
14
|
+
"client_id" => client_id,
|
15
|
+
"client_secret" => client_secret,
|
16
|
+
"table" => table
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
let(:output) { LogStash::Outputs::Loganalytics.new(cfg) }
|
10
21
|
|
11
22
|
before do
|
12
23
|
output.register
|
13
24
|
end
|
14
25
|
|
15
|
-
describe "receive
|
16
|
-
|
26
|
+
describe "#receive" do
|
27
|
+
it "Should successfully send the event to log analytics" do
|
28
|
+
log = {
|
29
|
+
:logid => "628cc9db-0aec-4423-83d2-c78c11bd9b94",
|
30
|
+
:message => "this is a test",
|
31
|
+
:level => "info"
|
32
|
+
}
|
17
33
|
|
18
|
-
|
19
|
-
expect(
|
34
|
+
event = LogStash::Event.new(log)
|
35
|
+
expect {output.receive(event)}.to_not raise_error
|
20
36
|
end
|
37
|
+
|
21
38
|
end
|
22
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-loganalytics
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Bartsch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-11-
|
11
|
+
date: 2018-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
requirement: !ruby/object:Gem::Requirement
|