rack-fluentd-logger 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []