fluent-plugin-envoy-parser 0.0.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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/fluent/plugin/parser_envoy.rb +116 -0
  3. metadata +102 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7c10f3da0b761807d3252acd763508bec26b911e
4
+ data.tar.gz: 34240bda20b56c637067307607d96003a4f976ff
5
+ SHA512:
6
+ metadata.gz: 7614a862d3d707776c069cc1ad73db8b13c509c45ae3da508e63a89cbfa200ac21cfc58e476e5d73b94b62fabacd1919fb493395db074aa47b382674b819a3d6
7
+ data.tar.gz: f83af30b11ba26488adcdd2bd8394769c5d001c842ed0ae2b4b6887b2f854820cc945391af92ec1c5cd62d1b61155c38854ad8eac95109ae390349e61839ea15
@@ -0,0 +1,116 @@
1
+ require 'fluent/plugin/parser'
2
+
3
+ module Fluent
4
+ module Plugin
5
+ class EnvoyParser < Parser
6
+ Plugin.register_parser('envoy', self)
7
+
8
+ config_param :log_format, :string, :default => 'envoy_http'
9
+ config_param :time_key, :string, :default => 'time'
10
+
11
+ @REGEXP = nil
12
+ DEFAULT_REGEXP = /^\[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>(?:[^\"]|\\.)*?)(?: +\S*)?) (?<protocol>\S+)?" (?<response_code>\S+) (?<response_flags>\S+) (?<bytes_received>\S+) (?<bytes_sent>\S+) (?<duration>\S+) (?<x_envoy_upstream_service_time>\S+) "(?<x_forwarded_for>[^\"]*)" "(?<user_agent>[^\"]*)" "(?<x_request_id>[^\"]*)" "(?<authority>[^\"]*)" "(?<upstream_host>[^\"]*)"?$/
13
+
14
+ TIME_FORMAT = "%Y-%m-%dT%H:%M:%S"
15
+
16
+ def initialize
17
+ super
18
+ @mutex = Mutex.new
19
+ end
20
+
21
+ def configure(conf={})
22
+ super
23
+ @REGEXP = /$^/
24
+
25
+ if @log_format == 'envoy_http' or @log_format == 'envoy_tcp'
26
+ @REGEXP = DEFAULT_REGEXP
27
+ end
28
+
29
+ @time_parser = time_parser_create(format: TIME_FORMAT)
30
+ end
31
+
32
+ def patterns
33
+ {'format' => @REGEXP, 'time_format' => TIME_FORMAT}
34
+ end
35
+
36
+ def parse(text)
37
+ m = @REGEXP.match(text)
38
+ unless m
39
+ yield nil, nil
40
+ return
41
+ end
42
+
43
+ time = m['time']
44
+ time = @mutex.synchronize { @time_parser.parse(time) }
45
+
46
+ if @log_format == 'envoy_http'
47
+ method = m['method']
48
+ path = m['path']
49
+ protocol = m['protocol']
50
+ response_flags = m['response_flags']
51
+
52
+ response_code = m['response_code'].to_i
53
+ response_code = nil if response_code == 0
54
+
55
+ bytes_sent = m['bytes_sent']
56
+ bytes_sent = (bytes_sent == '-') ? nil : bytes_sent.to_i
57
+
58
+ bytes_received = m['bytes_received']
59
+ bytes_received = (bytes_received == '-') ? nil : bytes_received.to_i
60
+
61
+ duration = m['duration']
62
+ duration = (duration == '-') ? nil : (Float(duration)/1000).to_s + "s"
63
+
64
+ x_envoy_upstream_service_time = m['x_envoy_upstream_service_time']
65
+ x_request_id = m['x_request_id']
66
+ authority = m['authority']
67
+ upstream_host = m['upstream_host']
68
+
69
+ user_agent = m['user_agent']
70
+ user_agent = (user_agent == '-') ? nil : user_agent
71
+
72
+ x_forwarded_for = m['x_forwarded_for']
73
+ x_forwarded_for = (x_forwarded_for == '-') ? nil : x_forwarded_for
74
+
75
+ record = {
76
+ "method" => method,
77
+ "path" => path,
78
+ "protocol" => protocol,
79
+ "response_code" => response_code,
80
+ "response_flags" => response_flags,
81
+ "bytes_received" => bytes_received,
82
+ "bytes_sent" => bytes_sent,
83
+ "duration" => duration,
84
+ "x_envoy_upstream_service_time" => x_envoy_upstream_service_time,
85
+ "x_forwarded_for" => x_forwarded_for,
86
+ "user_agent" => user_agent,
87
+ "authority" => authority,
88
+ "upstream_host" => upstream_host
89
+ }
90
+ elsif @log_format == 'envoy_tcp'
91
+
92
+ bytes_sent = m['bytes_sent']
93
+ bytes_sent = (bytes_sent == '-') ? nil : bytes_sent.to_i
94
+
95
+ bytes_received = m['bytes_received']
96
+ bytes_received = (bytes_received == '-') ? nil : bytes_received.to_i
97
+
98
+ duration = m['duration']
99
+ duration = (duration == '-') ? nil : (Float(duration)/1000).to_s + "s"
100
+
101
+ upstream_host = m['upstream_host']
102
+
103
+ record = {
104
+ "bytes_received" => bytes_received,
105
+ "bytes_sent" => bytes_sent,
106
+ "duration" => duration,
107
+ "upstream_host" => upstream_host
108
+ }
109
+ end
110
+ record["time"] = m['time'] if @keep_time_key
111
+
112
+ yield time, record
113
+ end
114
+ end
115
+ end
116
+ end
metadata ADDED
@@ -0,0 +1,102 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-envoy-parser
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
5
+ platform: ruby
6
+ authors:
7
+ - salrashid123
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-01-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.15.0
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.15.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 11.1.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 11.1.2
41
+ - !ruby/object:Gem::Dependency
42
+ name: test-unit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: fluentd
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 0.14.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 0.14.0
69
+ description: Fluentd parser plugin to parse standard Envoy Proxy access logs
70
+ email:
71
+ - salrashid123@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/fluent/plugin/parser_envoy.rb
77
+ homepage: https://github.com/salrashid123/fluent-plugin-envoy-parser
78
+ licenses:
79
+ - Apache License, Version 2.0
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project:
97
+ rubygems_version: 2.5.2.2
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: Fluentd parser plugin to parse envoy HTTP/TCP access logs for Fluentd and
101
+ Google Cloud Logging
102
+ test_files: []