rack-fluentd-logger 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f5f1b9cd4ad76b71bc6fbc7f42f7d21eb016f65c4f378b577c1713bf894ad4a4
4
+ data.tar.gz: a8070a56def3ae1dc66c44e5a483e7250ed2d45d92863a88eeeabd3421eb12dc
5
+ SHA512:
6
+ metadata.gz: 357bfa292395d5ded226f3b246f39b821c01f29f1f763e4a16bcd9270c34c03e66d021a81a353fb805800b60dd6c9c66d4fa647a16c3f38f287fa06df45765cc
7
+ data.tar.gz: a9329565200892d2e4840d9c58f1555fbc483429f4a1969f426a8ef9dd5a9fd703ed0cfd1eea5865e6535b5c1ac0272a5665bd71b61adc5b3373f2de79c4dbf4
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rack/fluentd_logger'
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'fluent-logger'
4
+ require 'concurrent-ruby'
5
+ require 'json'
6
+
7
+ module Rack
8
+ class FluentdLogger
9
+ class << self
10
+ attr_reader :logger, :json_parser, :preprocessor
11
+
12
+ def configure(
13
+ name: ENV['FLUENTD_NAME'],
14
+ host: ENV['FLUENTD_HOST'],
15
+ port: (ENV['FLUENTD_PORT'] || 24_224).to_i,
16
+ json_parser: ->(str) { JSON.parse(str) },
17
+ preprocessor: ->(d) { d }
18
+ )
19
+ @logger = Fluent::Logger::FluentLogger.new(name, host: host, port: port)
20
+
21
+ @json_parser = json_parser
22
+ @preprocessor = preprocessor
23
+ end
24
+ end
25
+
26
+ def initialize(app)
27
+ @app = app
28
+ @executer = Concurrent::SingleThreadExecutor.new
29
+
30
+ self.class.configure if self.class.logger.nil?
31
+ end
32
+
33
+ def call(env)
34
+ start = Time.now
35
+ response = @app.call(env)
36
+
37
+ log_request(env, response, Time.now - start)
38
+
39
+ response
40
+ end
41
+
42
+ private
43
+
44
+ def log_request(env, response, response_time)
45
+ @executer.post do
46
+ record = self.class.preprocessor&.call(
47
+ env: drop_objects(env),
48
+ timestamp: Time.now,
49
+ response_time: response_time,
50
+ **format_response(response)
51
+ )
52
+
53
+ self.class.logger.post('rack-traffic-log', record)
54
+ end
55
+ end
56
+
57
+ def format_response(response)
58
+ code, headers, body = response
59
+
60
+ if headers['Content-Type'] == 'application/json'
61
+ body = body.map { |s| self.class.json_parser&.call(s) }
62
+ end
63
+
64
+ { code: code, body: body, headers: headers }
65
+ end
66
+
67
+ def drop_objects(obj)
68
+ allowed = [Hash, Array, String, Numeric]
69
+
70
+ return unless allowed.reduce(false) { |m, c| m || obj.is_a?(c) }
71
+
72
+ case obj
73
+ when Hash
74
+ obj.reduce({}) { |m, (k, v)| m.merge!(k => drop_objects(v)) }.compact
75
+ when Array
76
+ obj.map { |v| drop_objects(v) }.compact
77
+ else
78
+ obj
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rack
4
+ class FluentdLogger
5
+ VERSION = '0.1.0'
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-fluentd-logger
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Mikhail Slyusarev
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-12-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.8'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.8'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rubocop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.60'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.60'
41
+ - !ruby/object:Gem::Dependency
42
+ name: concurrent-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: fluent-logger
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.7'
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'
69
+ description:
70
+ email:
71
+ - slyusarevmikhail@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/rack/fluentd-logger.rb
77
+ - lib/rack/fluentd_logger.rb
78
+ - lib/rack/fluentd_logger_version.rb
79
+ homepage: https://github.com/mikhailvs/rack-fluentd-logger
80
+ licenses:
81
+ - MIT
82
+ metadata: {}
83
+ post_install_message:
84
+ rdoc_options: []
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ requirements: []
98
+ rubyforge_project:
99
+ rubygems_version: 2.7.7
100
+ signing_key:
101
+ specification_version: 4
102
+ summary: Rack middleware for logging traffic to fluentd.
103
+ test_files: []