fluent-plugin-datadog-log 0.1.0.rc18 → 0.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.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-datadog-log
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0.rc18
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yusuke KUOKA
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-20 00:00:00.000000000 Z
11
+ date: 2017-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.0.0
19
+ version: '0.14'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.0.0
26
+ version: '0.14'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: json
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -45,41 +45,13 @@ dependencies:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: 2.0.1
48
- type: :runtime
48
+ type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 2.0.1
55
- - !ruby/object:Gem::Dependency
56
- name: prometheus-client
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - "~>"
60
- - !ruby/object:Gem::Version
61
- version: 0.7.1
62
- type: :runtime
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - "~>"
67
- - !ruby/object:Gem::Version
68
- version: 0.7.1
69
- - !ruby/object:Gem::Dependency
70
- name: semantic_logger
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: 4.2.0
76
- type: :runtime
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: 4.2.0
83
55
  - !ruby/object:Gem::Dependency
84
56
  name: mocha
85
57
  requirement: !ruby/object:Gem::Requirement
@@ -150,6 +122,20 @@ dependencies:
150
122
  - - "~>"
151
123
  - !ruby/object:Gem::Version
152
124
  version: '3.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: prometheus-client
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: 0.7.1
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: 0.7.1
153
139
  description: |2
154
140
  Fluentd output plugin for the Datadog Log Intake API, which will make
155
141
  logs viewable in the Datadog's log viewer.
@@ -165,25 +151,15 @@ files:
165
151
  - README.rdoc
166
152
  - Rakefile
167
153
  - fluent-plugin-datadog-log.gemspec
168
- - fluent-plugin-datadog-log.gemspec~
169
154
  - fluent-plugin-datadog.gemspec~
170
- - lib/datadog/log.rb~
171
- - lib/fluent/plugin/datadog_log.rb
172
- - lib/fluent/plugin/datadog_log.rb~
173
155
  - lib/fluent/plugin/monitoring.rb
174
156
  - lib/fluent/plugin/out_datadog_log.rb
175
- - lib/fluent/plugin/out_datadog_log.rb~
176
- - pkg/fluent-plugin-datadog-log-0.1.0.rc13.gem
177
- - pkg/fluent-plugin-datadog-log-0.1.0.rc14.gem
178
- - pkg/fluent-plugin-datadog-log-0.1.0.rc15.gem
179
- - pkg/fluent-plugin-datadog-log-0.1.0.rc16.gem
180
- - pkg/fluent-plugin-datadog-log-0.1.0.rc17.gem
181
- - pkg/fluent-plugin-datadog-log-0.1.0.rc18.gem
157
+ - pkg/fluent-plugin-datadog-0.1.0.gem
158
+ - pkg/fluent-plugin-datadog-log-0.1.0.gem
182
159
  - test/helper.rb
183
160
  - test/plugin/base_test.rb
184
161
  - test/plugin/constants.rb
185
162
  - test/plugin/test_out_datadog_log.rb
186
- - test/plugin/test_out_datadog_log.rb~
187
163
  homepage: https://github.com/mumoshu/fluent-plugin-datadog-log
188
164
  licenses:
189
165
  - Apache-2.0
@@ -199,9 +175,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
199
175
  version: '2.0'
200
176
  required_rubygems_version: !ruby/object:Gem::Requirement
201
177
  requirements:
202
- - - ">"
178
+ - - ">="
203
179
  - !ruby/object:Gem::Version
204
- version: 1.3.1
180
+ version: '0'
205
181
  requirements: []
206
182
  rubyforge_project:
207
183
  rubygems_version: 2.6.13
@@ -213,4 +189,3 @@ test_files:
213
189
  - test/plugin/base_test.rb
214
190
  - test/plugin/constants.rb
215
191
  - test/plugin/test_out_datadog_log.rb
216
- - test/plugin/test_out_datadog_log.rb~
@@ -1,33 +0,0 @@
1
- Gem::Specification.new do |gem|
2
- gem.name = 'fluent-plugin-datadog-log'
3
- gem.description = <<-eos
4
- Fluentd output plugin for the Datadog Log Intake API, which will make
5
- logs viewable in the Datadog's log viewer.
6
- eos
7
- gem.summary = 'fluentd output plugin for the Datadog Log Intake API'
8
- gem.homepage = \
9
- 'https://github.com/mumoshu/fluent-plugin-datadog-log'
10
- gem.license = 'Apache-2.0'
11
- gem.version = '0.1.0.rc12'
12
- gem.authors = ['Yusuke KUOKA']
13
- gem.email = ['ykuoka@gmail.com']
14
- gem.required_ruby_version = Gem::Requirement.new('>= 2.0')
15
-
16
- gem.files = Dir['**/*'].keep_if { |file| File.file?(file) }
17
- gem.test_files = gem.files.grep(/^(test)/)
18
- gem.require_paths = ['lib']
19
-
20
- gem.add_runtime_dependency 'fluentd', '~> 1.0.0'
21
- # gem.add_runtime_dependency 'datadog-log-api-client', '~> 0.1'
22
- gem.add_runtime_dependency 'json', '~> 1.8'
23
-
24
- gem.add_dependency 'net_tcp_client', '~> 2.0.1'
25
- gem.add_dependency 'prometheus-client', '~> 0.7.1'
26
- gem.add_dependency 'semantic_logger', '~> 4.2.0'
27
-
28
- gem.add_development_dependency 'mocha', '~> 1.1'
29
- gem.add_development_dependency 'rake', '~> 10.3'
30
- gem.add_development_dependency 'rubocop', '~> 0.35.0'
31
- gem.add_development_dependency 'webmock', '~> 2.3.1'
32
- gem.add_development_dependency 'test-unit', '~> 3.0'
33
- end
@@ -1,125 +0,0 @@
1
- require 'openssl'
2
- require 'net/tcp_client'
3
- require 'socket'
4
- require 'time'
5
-
6
- module Datadog
7
- module Log
8
- TRUNCATED_MSG = '...TRUNCATED...'
9
-
10
- TRUNCATED_LEN = TRUNCATED_MSG.size
11
-
12
- # MaxMessageLen is the maximum length for any message we send to the intake
13
- # see https://github.com/DataDog/datadog-log-agent/blob/2394da8c79a6cadbcd1e98d6c89c437becec2732/pkg/config/constants.go#L9-L10
14
- DD_MAX_MESSAGE_LEN = 1 * 1000 * 1000
15
-
16
- MAX_MESSAGE_LEN = DD_MAX_MESSAGE_LEN - TRUNCATED_LEN
17
-
18
- def truncate_message(msg)
19
- if msg.size > DD_MAX_MESSAGE_LEN
20
- msg.slice(0, MAX_MESSAGE_LEN) + TRUNCATED_MSG
21
- else
22
- msg
23
- end
24
- end
25
-
26
- # Given a list of tags, build_tags_payload generates the bytes array
27
- # that will be inserted into messages
28
- # @see https://github.com/DataDog/datadog-log-agent/blob/2394da8c79a6cadbcd1e98d6c89c437becec2732/pkg/config/integration_config.go#L180
29
- def build_tags_payload(config_tags:, source:, source_category:)
30
- payload = ''
31
-
32
- payload = "[dd ddsource=\"#{source}\"]" if !source.nil? && source != ''
33
-
34
- if !source_category.nil? && source_category != ''
35
- payload = "#{payload}[dd ddsourcecategory=\"#{source_category}\"]"
36
- end
37
-
38
- if !config_tags.nil? && config_tags != ''
39
- config_tags = config_tags.join(',') if config_tags.is_a? ::Array
40
- payload = "#{payload}[dd ddtags=\"#{config_tags}\"]"
41
- end
42
-
43
- payload
44
- end
45
-
46
- # https://github.com/DataDog/datadog-log-agent/blob/db13b53dfdd036d43acfb15089a43eb31548f09f/pkg/processor/processor.go#L65
47
- def build_extra_content(timestamp:, hostname:, service:, tags_payload:)
48
- "<46>0 #{timestamp} #{hostname} #{service} - - #{tags_payload}"
49
- end
50
-
51
- def build_api_key_str(api_key:, logset:)
52
- if !logset.nil? && logset != ''
53
- "#{api_key}/#{logset}"
54
- else
55
- api_key
56
- end
57
- end
58
-
59
- # build_payload returns a processed payload from a raw message
60
- # @param [String] api_key_str
61
- # @param [String] extra_content
62
- # @param [String] msg
63
- def create_payload(api_key_str:, msg:, extra_content:)
64
- "#{api_key_str} #{extra_content} #{msg}\n"
65
- end
66
-
67
- class Client
68
- include ::Datadog::Log
69
-
70
- def initialize(log_dd_url: 'intake.logs.datadoghq.com', log_dd_port: 10516, api_key:, hostname:, skip_ssl_validation: false)
71
- @log_dd_url = log_dd_url
72
- @log_dd_port = log_dd_port
73
- @api_key = api_key
74
- @hostname = hostname
75
- @skip_ssl_validation = skip_ssl_validation
76
-
77
- init_api_client
78
- end
79
-
80
- def send_payload(logset: 'main', msg:, datetime: nil, service:, source:, source_category:, tags:)
81
- datetime = DateTime.now if datetime.nil?
82
-
83
- # new_offset(0) is required. otherwise datadog will silently throws away the log..
84
- timestamp_str = datetime.new_offset(0).rfc3339(6)
85
- payload = create_payload(
86
- api_key_str: build_api_key_str(api_key: @api_key, logset: logset),
87
- msg: truncate_message(msg),
88
- extra_content: build_extra_content(
89
- timestamp: timestamp_str,
90
- hostname: @hostname,
91
- service: service,
92
- tags_payload: build_tags_payload(
93
- config_tags: tags,
94
- source: source,
95
- source_category: source_category
96
- )
97
- )
98
- )
99
- @conn.retry_on_connection_failure do
100
- @conn.write(payload)
101
- end
102
- payload
103
- end
104
-
105
- def shutdown
106
- @conn.close unless @conn.nil?
107
- end
108
-
109
- class << self
110
- def from_env
111
- new(api_key: ENV['DD_LOG_API_KEY'], hostname: Socket.gethostname)
112
- end
113
- end
114
-
115
- private
116
-
117
- def init_api_client
118
- ssl = true
119
- ssl = { verify_mode: OpenSSL::SSL::VERIFY_NONE } if @skip_ssl_validation
120
- server = "#{@log_dd_url}:#{@log_dd_port}"
121
- @conn = Net::TCPClient.new(server: server, ssl: ssl)
122
- end
123
- end
124
- end
125
- end
@@ -1,166 +0,0 @@
1
- require 'openssl'
2
-
3
- require 'semantic_logger'
4
-
5
- SemanticLogger.default_level = :info
6
- SemanticLogger.add_appender(io: STDOUT, formatter: :json)
7
-
8
- require 'net/tcp_client'
9
- require 'socket'
10
- require 'time'
11
-
12
- # Never give up on a write timeout/Fix for:
13
- # Not retrying a log message later
14
- # error=\"Timed out after 60.0 seconds trying to write to
15
- # intake.logs.datadoghq.com[52.206.154.220]:10516\"
16
- # error_class=Net::TCPClient::WriteTimeout
17
- Net::TCPClient.reconnect_on_errors << Net::TCPClient::WriteTimeout
18
-
19
- # Never give up on a corrupted SSL connection/Fix for:
20
- # Not retrying a log message later
21
- # error="SSL_write: bad write retry"
22
- # error_class=OpenSSL::SSL::SSLError
23
- Net::TCPClient.reconnect_on_errors << OpenSSL::SSL::SSLError
24
-
25
- # Datadog provides various helpers to programatically access Datadog services
26
- module Datadog
27
- # Log provides various helpers and classes to support programatically
28
- # accessing Datadog Log Management
29
- module Log
30
- TRUNCATED_MSG = '...TRUNCATED...'
31
-
32
- TRUNCATED_LEN = TRUNCATED_MSG.size
33
-
34
- # MaxMessageLen is the maximum length for any message we send to the intake
35
- # see https://github.com/DataDog/datadog-log-agent/blob/2394da8c79a6cadbcd1e98d6c89c437becec2732/pkg/config/constants.go#L9-L10
36
- DD_MAX_MESSAGE_LEN = 1 * 1000 * 1000
37
-
38
- MAX_MESSAGE_LEN = DD_MAX_MESSAGE_LEN - TRUNCATED_LEN
39
-
40
- def truncate_message(msg)
41
- if msg.size > DD_MAX_MESSAGE_LEN
42
- msg.slice(0, MAX_MESSAGE_LEN) + TRUNCATED_MSG
43
- else
44
- msg
45
- end
46
- end
47
-
48
- # Given a list of tags, build_tags_payload generates the bytes array
49
- # that will be inserted into messages
50
- # @see https://github.com/DataDog/datadog-log-agent/blob/2394da8c79a6cadbcd1e98d6c89c437becec2732/pkg/config/integration_config.go#L180
51
- def build_tags_payload(config_tags:, source:, source_category:)
52
- payload = ''
53
-
54
- payload = "[dd ddsource=\"#{source}\"]" if !source.nil? && source != ''
55
-
56
- if !source_category.nil? && source_category != ''
57
- payload = "#{payload}[dd ddsourcecategory=\"#{source_category}\"]"
58
- end
59
-
60
- if !config_tags.nil? && config_tags != ''
61
- config_tags = config_tags.join(',') if config_tags.is_a? ::Array
62
- payload = "#{payload}[dd ddtags=\"#{config_tags}\"]"
63
- end
64
-
65
- payload
66
- end
67
-
68
- # https://github.com/DataDog/datadog-log-agent/blob/db13b53dfdd036d43acfb15089a43eb31548f09f/pkg/processor/processor.go#L65
69
- def build_extra_content(timestamp:, hostname:, service:, tags_payload:)
70
- "<46>0 #{timestamp} #{hostname} #{service} - - #{tags_payload}"
71
- end
72
-
73
- def build_api_key_str(api_key:, logset:)
74
- if !logset.nil? && logset != ''
75
- "#{api_key}/#{logset}"
76
- else
77
- api_key
78
- end
79
- end
80
-
81
- # build_payload returns a processed payload from a raw message
82
- # @param [String] api_key_str
83
- # @param [String] extra_content
84
- # @param [String] msg
85
- def create_payload(api_key_str:, msg:, extra_content:)
86
- "#{api_key_str} #{extra_content} #{msg}\n"
87
- end
88
-
89
- # Client supports building/sending payloads to Datadog Log Management
90
- class Client
91
- include ::Datadog::Log
92
-
93
- def initialize(
94
- log_dd_url: 'intake.logs.datadoghq.com',
95
- log_dd_port: 10516,
96
- api_key:,
97
- hostname:,
98
- skip_ssl_validation: false
99
- )
100
- @log_dd_url = log_dd_url
101
- @log_dd_port = log_dd_port
102
- @api_key = api_key
103
- @hostname = hostname
104
- @skip_ssl_validation = skip_ssl_validation
105
-
106
- init_api_client
107
- end
108
-
109
- # rubocop:disable Metrics/ParameterLists
110
- def send_payload(
111
- logset: 'main',
112
- msg:,
113
- datetime: nil,
114
- service:,
115
- source:,
116
- source_category:,
117
- tags:
118
- )
119
- # rubocop:enable Metrics/ParameterLists
120
-
121
- datetime = DateTime.now if datetime.nil?
122
-
123
- # new_offset(0) is required.
124
- # otherwise datadog will silently throws away the log..
125
- timestamp_str = datetime.new_offset(0).rfc3339(6)
126
- payload = create_payload(
127
- api_key_str: build_api_key_str(api_key: @api_key, logset: logset),
128
- msg: truncate_message(msg),
129
- extra_content: build_extra_content(
130
- timestamp: timestamp_str,
131
- hostname: @hostname,
132
- service: service,
133
- tags_payload: build_tags_payload(
134
- config_tags: tags,
135
- source: source,
136
- source_category: source_category
137
- )
138
- )
139
- )
140
- @conn.retry_on_connection_failure do
141
- @conn.write(payload)
142
- end
143
- payload
144
- end
145
-
146
- def shutdown
147
- @conn.close unless @conn.nil?
148
- end
149
-
150
- class << self
151
- def from_env
152
- new(api_key: ENV['DD_LOG_API_KEY'], hostname: Socket.gethostname)
153
- end
154
- end
155
-
156
- private
157
-
158
- def init_api_client
159
- ssl = true
160
- ssl = { verify_mode: OpenSSL::SSL::VERIFY_NONE } if @skip_ssl_validation
161
- server = "#{@log_dd_url}:#{@log_dd_port}"
162
- @conn = Net::TCPClient.new(server: server, ssl: ssl)
163
- end
164
- end
165
- end
166
- end