fluent-plugin-dynatrace 0.1.2 → 0.1.6

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: '079c6d4ed7f57e7515b28e0534d17184348f4a5f7923671db41938e8e2311f42'
4
- data.tar.gz: 50d12a02dc77792523d4f4054842bba5f946c76e593bba3b360b9f380ad1b291
3
+ metadata.gz: 3ed15669d3529fd2d869b4e620a38caee00310b2cc5a56bd3ea5d879b3e0a61a
4
+ data.tar.gz: a4cb4ba89820f96e07fc9b0f96bc9716d97c64d86987d6a7eee9e54bc8a69936
5
5
  SHA512:
6
- metadata.gz: 4b2a31a3d1bad3a41da2f1604e5fd62115288389132266530ed3e048824d2399a2380a7d4a312c5e14dbfbe1159dfb7b54b17c24fbc62ddbf8ad42678e175e39
7
- data.tar.gz: 365bcde6db2227dadc32ae83cf8644795a3cc67563c8ebd657c874a6ef55e21dc7606188368bb8646baa13154caa66649ad02fb508f2d0fe41571d9dbfad6051
6
+ metadata.gz: 5d610192bd5c57739f5fb3a0cc37d4e2ab277a08b049ebf719051b624e755f67fc46392758042de0982b56bbd5ca2c821d88e9a8d481370899e7b0d20cb8f907
7
+ data.tar.gz: 232945ad4cc7cc31f01599700a465868b1e97159371b7a09a4ad8abac7347ae4ccdb8460831eea6c0ad632d2d4dd18defe951bc7f806a95a30263f369024dc4b
@@ -20,7 +20,7 @@ module Fluent
20
20
  class DynatraceOutputConstants
21
21
  # The version of the Dynatrace output plugin
22
22
  def self.version
23
- '0.1.2'
23
+ '0.1.6'
24
24
  end
25
25
  end
26
26
  end
@@ -24,17 +24,24 @@ module Fluent
24
24
  class DynatraceOutput < Output
25
25
  Fluent::Plugin.register_output('dynatrace', self)
26
26
 
27
+ HTTP_REQUEST_LOCK = Mutex.new
28
+
27
29
  helpers :compat_parameters # add :inject if need be
28
30
 
29
31
  # Configurations
30
32
  desc 'The full URL of the Dynatrace log ingestion endpoint, e.g. https://my-active-gate.example.com/api/logs/ingest'
31
33
  config_param :active_gate_url, :string
32
- desc 'The API token to use to authenticate requests to the log ingestion endpoint. Must have TODO scope'
34
+ desc 'The API token to use to authenticate requests to the log ingestion endpoint. '\
35
+ 'Must have logs.ingest (Ingest Logs) scope. '\
36
+ 'It is recommended to limit scope to only this one.'
33
37
  config_param :api_token, :string, secret: true
34
38
 
35
39
  desc 'Disable SSL validation by setting :verify_mode OpenSSL::SSL::VERIFY_NONE'
36
40
  config_param :ssl_verify_none, :bool, default: false
37
41
 
42
+ desc 'Inject timestamp into each log message'
43
+ config_param :inject_timestamp, :bool, default: false
44
+
38
45
  #############################################
39
46
 
40
47
  config_section :buffer do
@@ -74,20 +81,29 @@ module Fluent
74
81
  #############################################
75
82
 
76
83
  def process(_tag, es)
84
+ log.on_trace { log.trace('#process') }
85
+ records = 0
77
86
  # es = inject_values_to_event_stream(tag, es)
78
- es.each do |_time, record|
79
- send_to_dynatrace("#{record.to_json.chomp}\n")
87
+ es.each do |time, record|
88
+ records += 1
89
+ log.on_trace { log.trace("#process Processing record #{records}") }
90
+ record['@timestamp'] = time * 1000 if @inject_timestamp
91
+ synchronized_send_records(record)
80
92
  end
93
+ log.on_trace { log.trace("#process Processed #{records} records") }
81
94
  end
82
95
 
83
96
  def write(chunk)
84
- body = []
85
- chunk.each do |_time, record|
86
- # body.push(inject_values_to_record(chunk.metadata.tag, time, record))
87
- body.push(record)
97
+ log.on_trace { log.trace('#write') }
98
+ records = []
99
+ chunk.each do |time, record|
100
+ # records.push(inject_values_to_record(chunk.metadata.tag, time, record))
101
+ record['@timestamp'] = time * 1000 if @inject_timestamp
102
+ records.push(record)
88
103
  end
89
104
 
90
- send_to_dynatrace("#{body.to_json.chomp}\n")
105
+ log.on_trace { log.trace("#write sent #{records.length} records") }
106
+ synchronized_send_records(records) unless records.empty?
91
107
  end
92
108
 
93
109
  #############################################
@@ -106,7 +122,8 @@ module Fluent
106
122
  "fluent-plugin-dynatrace v#{DynatraceOutputConstants.version}"
107
123
  end
108
124
 
109
- def prepare_request(uri)
125
+ def prepare_request
126
+ log.on_trace { log.trace('#prepare_request') }
110
127
  req = Net::HTTP::Post.new(uri, { 'User-Agent' => user_agent })
111
128
  req['Content-Type'] = 'application/json; charset=utf-8'
112
129
  req['Authorization'] = "Api-Token #{@api_token}"
@@ -114,15 +131,37 @@ module Fluent
114
131
  req
115
132
  end
116
133
 
117
- def send_to_dynatrace(body)
134
+ def synchronized_send_records(records)
135
+ log.on_trace { log.trace('#synchronized_send_records') }
136
+ HTTP_REQUEST_LOCK.synchronize do
137
+ send_records(records)
138
+ end
139
+ end
140
+
141
+ def send_records(records)
142
+ log.on_trace { log.trace('#send_records') }
143
+
118
144
  agent.start unless agent.started?
119
145
 
120
- req = prepare_request(@uri)
121
- res = @agent.request(req, body)
146
+ response = send_request(serialize(records))
147
+
148
+ return if response.is_a?(Net::HTTPSuccess)
122
149
 
123
- return if res.is_a?(Net::HTTPSuccess)
150
+ raise failure_message response
151
+ end
152
+
153
+ def serialize(records)
154
+ log.on_trace { log.trace('#serialize') }
155
+ body = "#{records.to_json.chomp}\n"
156
+ log.on_trace { log.trace("#serialize body length #{body.length}") }
157
+ body
158
+ end
124
159
 
125
- raise failure_message res
160
+ def send_request(body)
161
+ log.on_trace { log.trace('#send_request') }
162
+ response = @agent.request(prepare_request, body)
163
+ log.on_trace { log.trace("#send_request response #{response}") }
164
+ response
126
165
  end
127
166
 
128
167
  def failure_message(res)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-dynatrace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dynatrace Open Source Engineering
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-03-25 00:00:00.000000000 Z
11
+ date: 2021-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -102,7 +102,7 @@ files:
102
102
  - LICENSE
103
103
  - lib/fluent/plugin/dynatrace_constants.rb
104
104
  - lib/fluent/plugin/out_dynatrace.rb
105
- homepage: https://www.dynatrace.com/
105
+ homepage: https://github.com/dynatrace-oss/fluent-plugin-dynatrace
106
106
  licenses:
107
107
  - Apache-2.0
108
108
  metadata:
@@ -124,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
124
  - !ruby/object:Gem::Version
125
125
  version: '0'
126
126
  requirements: []
127
- rubygems_version: 3.1.4
127
+ rubygems_version: 3.1.6
128
128
  signing_key:
129
129
  specification_version: 4
130
130
  summary: A fluentd output plugin for sending logs to the Dynatrace Generic log ingest