fluent-plugin-envoy-parser 0.0.6

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