fluent-plugin-masking 1.1.1 → 1.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 1c38cb2f6e5f95c87452557e16ccaeedafd724eb
4
- data.tar.gz: 3a0e9de85b4ffef48c6760a7071595e0897ed597
2
+ SHA256:
3
+ metadata.gz: b65e7110f05c463b085bb1db4a1432b38efbe6cf5c3b85f7a9d14d3d399b553e
4
+ data.tar.gz: 6fcb2ce8d9342fefaa678b76d0330a611d898fcc5a8c8420b273a414b7c79e82
5
5
  SHA512:
6
- metadata.gz: 29c779485680fde08dd0e5fbe02899380c5002492e191760b4bbd6ca47638dc5dd1bdff19a901bf519b8673bacf1cdb8a63694466aa09a6f36bab981345db112
7
- data.tar.gz: 1cdb78f278775ac82204d904669ac67a8b534d56b4ca7d62f5590c01440800f615dfae348a585379494362c6121377c9d6790348e82d2dfba20e52178c22f873
6
+ metadata.gz: 17ec1b2abeca93dd943df884e498a2009203f0baa74b810edb0549239dc4f05f6d8753df392fd88d145d7f93cf389345c072f50b2c256a29a32471247982e189
7
+ data.tar.gz: c850fe221489e61b55855f666785c3ee70ca1d076908b0f9a448e3ee85aec72f9c4b5f4a4de8bcc3b7683e8237c2fb6a19e8bf347be4b9c0b0280d4346e9616b
@@ -0,0 +1,29 @@
1
+ version: 2.1
2
+ orbs:
3
+ ruby: circleci/ruby@0.1.2
4
+
5
+ executors:
6
+ v2-5-0:
7
+ docker:
8
+ - image: circleci/ruby:2.5.0
9
+
10
+ jobs:
11
+ tests:
12
+ parameters:
13
+ ruby-version:
14
+ type: executor
15
+ executor: << parameters.ruby-version >>
16
+ steps:
17
+ - checkout
18
+ - run: gem install bundler
19
+ - run: bundle install
20
+ - run: ruby -r ./test/*.rb
21
+
22
+ workflows:
23
+ tests:
24
+ jobs:
25
+ - tests:
26
+ matrix:
27
+ parameters:
28
+ ruby-version: [v2-5-0]
29
+
data/.gitignore CHANGED
@@ -1,4 +1,6 @@
1
1
  .bundle/
2
2
  vendor/
3
3
  *.gem
4
- .idea/
4
+ .idea/
5
+ Gemfile.lock
6
+ Rakefile
data/README.md CHANGED
@@ -8,26 +8,30 @@ Fluentd filter plugin to mask sensitive or privacy records with `*******` in pla
8
8
  ## Requirements
9
9
  | fluent-plugin-masking | fluentd | ruby |
10
10
  | --------------------- | ---------- | ------ |
11
- | 1.0.x | >= v0.14.0 | >= 2.1 |
11
+ | 1.2.x | >= v0.14.0 | >= 2.5 |
12
12
 
13
13
 
14
14
  ## Installation
15
15
  Install with gem:
16
16
 
17
- `gem install fluent-plugin-masking`
17
+ `fluent-gem install fluent-plugin-masking`
18
18
 
19
19
  ## Setup
20
- In order to setup this plugin, the parameter `fieldsToMaskFilePath` needs to be a valid path to a file containing a list of all the fields to mask. The file should have a unique field on each line. These fields **are** case-sensitive (`Name` != `name`).
20
+ In order to setup this plugin, the parameter `fieldsToMaskFilePath` needs to be a valid path to a file containing a list of all the fields to mask. The file should have a unique field on each line. These fields **are** case-sensitive (`Name` != `name`). in case you need one (or more) of the fields to be case insensitive, use the `/i` suffix in your field name. see example below.
21
21
 
22
- In addition, there's an optional parameter called `fieldsToExcludeJSONPaths` which receives as input a comma separated string of JSON fields that should be excluded in the masking procedure. Nested JSON fields are supported by `dot notation` (i.e: `path.to.excluded.field.in.record.nestedExcludedField`)
23
- The JSON fields that are excluded are comma separated.
24
- This can be used for logs of registration services or audit log entries which do not need to be masked.
25
- This is configured as shown below:
22
+ ### Optional configuration
23
+ - `fieldsToExcludeJSONPaths` - this field receives as input a comma separated string of JSON fields that should be excluded in the masking procedure. Nested JSON fields are supported by `dot notation` (i.e: `path.to.excluded.field.in.record.nestedExcludedField`) The JSON fields that are excluded are comma separated.
24
+ This can be used for logs of registration services or audit log entries which do not need to be masked.
25
+
26
+ - `handleSpecialEscapedJsonCases` - a boolean value that try to fix special escaped json cases. this feature is currently on alpha stage (default: false). for more details about thoose special cases see [Special Json Cases](#Special-escaped-json-cases-handling)
27
+
28
+ An example with optional configuration parameters:
26
29
  ```
27
30
  <filter "**">
28
31
  @type masking
29
32
  fieldsToMaskFilePath "/path/to/fields-to-mask-file"
30
33
  fieldsToExcludeJSONPaths "excludedField,exclude.path.nestedExcludedField"
34
+ handleSpecialEscapedJsonCases true
31
35
  </filter>
32
36
  ```
33
37
 
@@ -35,10 +39,9 @@ Example fields-to-mask-file:
35
39
  ```
36
40
  name
37
41
  email
38
- phone
42
+ phone/i # the '/i' suffix will make sure phone field will be case insensitive
39
43
  ```
40
44
 
41
-
42
45
  ## Quick Guide
43
46
 
44
47
  ### Configuration:
@@ -98,3 +101,13 @@ echo '{ :body => "{\"first_name\":\"mickey\", \"type\":\"puggle\", \"last_name\"
98
101
  ```
99
102
  2019-12-01 14:25:53.385681000 +0300 maskme: {"message":"{ :body => \"{\\\"first_name\\\":\\\"mickey\\\", \\\"type\\\":\\\"puggle\\\", \\\"last_name\\\":\\\"the-dog\\\", \\\"password\\\":\\\"*******\\\"}\"}"}
100
103
  ```
104
+
105
+ ## Run Unit Tests
106
+ ```
107
+ gem install bundler
108
+ bundle install
109
+ ruby -r ./test/*.rb
110
+ ```
111
+
112
+ ## Special escaped json cases handling
113
+
@@ -18,11 +18,9 @@ Gem::Specification.new do |spec|
18
18
  spec.require_paths = ["lib"]
19
19
  spec.license = "Apache-2.0"
20
20
 
21
- spec.required_ruby_version = '>= 2.1'
21
+ spec.required_ruby_version = '>= 2.5.0'
22
22
 
23
23
  spec.add_runtime_dependency "fluentd", ">= 0.14.0"
24
- spec.add_development_dependency "bundler", "1.17.3"
25
- spec.add_development_dependency "rake", "~> 12.0"
26
24
  spec.add_development_dependency "test-unit", ">= 3.1.0"
27
25
  spec.add_development_dependency "test-unit-rr"
28
26
  end
@@ -1,5 +1,5 @@
1
1
  require 'fluent/filter'
2
- require './lib/fluent/plugin/helpers.rb'
2
+ require_relative './helpers.rb'
3
3
 
4
4
  module Fluent
5
5
  module Plugin
@@ -30,14 +30,20 @@ module Fluent
30
30
  end
31
31
  begin
32
32
  recordStr = record.to_s
33
+
34
+ if @handleSpecialEscapedJsonCases == true
35
+ @specialEscapedJsonRegexs.each do | regex, replace |
36
+ recordStr = recordStr.gsub(regex, replace)
37
+ end
38
+ end
39
+
33
40
  @fields_to_mask_regex.each do | fieldToMaskRegex, fieldToMaskRegexStringReplacement |
34
41
  if !(excludedFields.include? @fields_to_mask_keys[fieldToMaskRegex])
35
42
  recordStr = recordStr.gsub(fieldToMaskRegex, fieldToMaskRegexStringReplacement)
36
43
  end
37
44
  end
38
-
45
+
39
46
  maskedRecord = strToHash(recordStr)
40
-
41
47
  rescue Exception => e
42
48
  $log.error "Failed to mask record: #{e}"
43
49
  end
@@ -51,6 +57,11 @@ module Fluent
51
57
  @fields_to_mask_regex = {}
52
58
  @fields_to_mask_keys = {}
53
59
  @fieldsToExcludeJSONPathsArray = []
60
+
61
+ @handleSpecialEscapedJsonCases = false
62
+ @specialEscapedJsonRegexs = {
63
+ Regexp.new(/,(( *)(\\+)("*)( *)),/) => "\1,"
64
+ }
54
65
  end
55
66
 
56
67
  # this method only called ones (on startup time)
@@ -58,6 +69,7 @@ module Fluent
58
69
  super
59
70
  fieldsToMaskFilePath = conf['fieldsToMaskFilePath']
60
71
  fieldsToExcludeJSONPaths = conf['fieldsToExcludeJSONPaths']
72
+ handleSpecialCases = conf['handleSpecialEscapedJsonCases']
61
73
 
62
74
  if fieldsToExcludeJSONPaths != nil && fieldsToExcludeJSONPaths.size() > 0
63
75
  fieldsToExcludeJSONPaths.split(",").each do | field |
@@ -73,25 +85,37 @@ module Fluent
73
85
 
74
86
  File.open(fieldsToMaskFilePath, "r") do |f|
75
87
  f.each_line do |line|
76
-
77
88
  value = line.to_s # make sure it's string
78
89
  value = value.gsub(/\s+/, "") # remove spaces
79
90
  value = value.gsub('\n', '') # remove line breakers
80
91
 
92
+ if value.end_with? "/i"
93
+ # case insensitive
94
+ value = value.delete_suffix('/i')
95
+ hashObjectRegex = Regexp.new(/(?::#{value}=>")(.*?)(?:")/mi) # mask element in hash object
96
+ innerJSONStringRegex = Regexp.new(/(\\+)"#{value}\\+":\\+.+?((?=(})|,( *|)(\s|\\+)\")|(?=}"$))/mi) # mask element in json string using capture groups that count the level of escaping inside the json string
97
+ else
98
+ # case sensitive
99
+ hashObjectRegex = Regexp.new(/(?::#{value}=>")(.*?)(?:")/m) # mask element in hash object
100
+ innerJSONStringRegex = Regexp.new(/(\\+)"#{value}\\+":\\+.+?((?=(})|,( *|)(\s|\\+)\")|(?=}"$))/m) # mask element in json string using capture groups that count the level of escaping inside the json string
101
+ end
102
+
81
103
  @fields_to_mask.push(value)
82
104
 
83
- hashObjectRegex = Regexp.new(/(?::#{value}=>")(.*?)(?:")/m) # mask element in hash object
84
105
  hashObjectRegexStringReplacement = ":#{value}=>\"#{MASK_STRING}\""
85
106
  @fields_to_mask_regex[hashObjectRegex] = hashObjectRegexStringReplacement
86
107
  @fields_to_mask_keys[hashObjectRegex] = value
87
108
 
88
- innerJSONStringRegex = Regexp.new(/(\\+)"#{value}\\+":\\+.+?((?=(})|,( *|)(\s|\\+)\")|(?=}"$))/m) # mask element in json string using capture groups that count the level of escaping inside the json string
89
109
  innerJSONStringRegexStringReplacement = "\\1\"#{value}\\1\":\\1\"#{MASK_STRING}\\1\""
90
110
  @fields_to_mask_regex[innerJSONStringRegex] = innerJSONStringRegexStringReplacement
91
111
  @fields_to_mask_keys[innerJSONStringRegex] = value
92
112
  end
93
113
  end
94
114
 
115
+ # if true, each record (a json record), will be checked for a special escaped json cases
116
+ # any found case will be 'gsub' with the right solution
117
+ @handleSpecialEscapedJsonCases = handleSpecialCases != nil && handleSpecialCases.casecmp("true") == 0
118
+
95
119
  puts "black list fields:"
96
120
  puts @fields_to_mask
97
121
  end
@@ -1,3 +1,3 @@
1
1
  module FilterMasking
2
- VERSION = "1.1.1"
3
- end
2
+ VERSION = "1.3.1"
3
+ end
data/test/fields-to-mask CHANGED
@@ -3,4 +3,5 @@ first_name
3
3
  last_name
4
4
  street
5
5
  number
6
- password
6
+ password
7
+ cookie
@@ -0,0 +1,5 @@
1
+ email/i
2
+ first_name
3
+ last_name/i
4
+ street/i
5
+ number
@@ -1,12 +1,9 @@
1
- # test/plugin/test_filter_your_own.rb
2
-
3
1
  require "test-unit"
4
2
  require "fluent/test"
5
3
  require "fluent/test/driver/filter"
6
4
  require "fluent/test/helpers"
7
5
  require "./lib/fluent/plugin/filter_masking.rb"
8
6
 
9
-
10
7
  MASK_STRING = "*******"
11
8
 
12
9
  class YourOwnFilterTest < Test::Unit::TestCase
@@ -25,6 +22,18 @@ class YourOwnFilterTest < Test::Unit::TestCase
25
22
  fieldsToMaskFilePath test/fields-to-mask
26
23
  ]
27
24
 
25
+ # configuration for tests with case insensitive fields
26
+ CONFIG_CASE_INSENSITIVE = %[
27
+ fieldsToMaskFilePath test/fields-to-mask-insensitive
28
+ ]
29
+
30
+ # configuration for special json escaped cases
31
+ CONFIG_SPECIAL_CASES = %[
32
+ fieldsToMaskFilePath test/fields-to-mask
33
+ fieldsToExcludeJSONPaths excludedField,exclude.path.nestedExcludedField
34
+ handleSpecialEscapedJsonCases true
35
+ ]
36
+
28
37
  def create_driver(conf = CONFIG)
29
38
  Fluent::Test::Driver::Filter.new(Fluent::Plugin::MaskingFilter).configure(conf)
30
39
  end
@@ -39,7 +48,7 @@ class YourOwnFilterTest < Test::Unit::TestCase
39
48
  d.filtered_records
40
49
  end
41
50
 
42
- sub_test_case 'plugin will mask all fields that need masking' do
51
+ sub_test_case 'plugin will mask all fields that need masking - case sensitive fields' do
43
52
  test 'mask field in hash object' do
44
53
  conf = CONFIG_NO_EXCLUDE
45
54
  messages = [
@@ -99,6 +108,7 @@ class YourOwnFilterTest < Test::Unit::TestCase
99
108
  filtered_records = filter(conf, messages)
100
109
  assert_equal(expected, filtered_records)
101
110
  end
111
+
102
112
  test 'mask field in hash object with exclude' do
103
113
  conf = CONFIG
104
114
  messages = [
@@ -110,6 +120,7 @@ class YourOwnFilterTest < Test::Unit::TestCase
110
120
  filtered_records = filter(conf, messages)
111
121
  assert_equal(expected, filtered_records)
112
122
  end
123
+
113
124
  test 'mask field in hash object with nested exclude' do
114
125
  conf = CONFIG
115
126
  messages = [
@@ -121,6 +132,7 @@ class YourOwnFilterTest < Test::Unit::TestCase
121
132
  filtered_records = filter(conf, messages)
122
133
  assert_equal(expected, filtered_records)
123
134
  end
135
+
124
136
  test 'mask field in hash object with base and nested exclude' do
125
137
  conf = CONFIG
126
138
  messages = [
@@ -132,6 +144,7 @@ class YourOwnFilterTest < Test::Unit::TestCase
132
144
  filtered_records = filter(conf, messages)
133
145
  assert_equal(expected, filtered_records)
134
146
  end
147
+
135
148
  test 'mask field in json string with exclude' do
136
149
  conf = CONFIG
137
150
  messages = [
@@ -143,5 +156,85 @@ class YourOwnFilterTest < Test::Unit::TestCase
143
156
  filtered_records = filter(conf, messages)
144
157
  assert_equal(expected, filtered_records)
145
158
  end
159
+
146
160
  end
161
+
162
+ sub_test_case 'plugin will mask all fields that need masking - case INSENSITIVE fields' do
163
+
164
+ test 'mask field in hash object with camel case' do
165
+ conf = CONFIG_CASE_INSENSITIVE
166
+ messages = [
167
+ {:not_masked_field=>"mickey-the-dog", :Email=>"mickey-the-dog@zooz.com"}
168
+ ]
169
+ expected = [
170
+ {:not_masked_field=>"mickey-the-dog", :email=>MASK_STRING}
171
+ ]
172
+ filtered_records = filter(conf, messages)
173
+ assert_equal(expected, filtered_records)
174
+ end
175
+
176
+ test 'not mask field in hash object since case not match' do
177
+ conf = CONFIG_CASE_INSENSITIVE
178
+ messages = [
179
+ {:not_masked_field=>"mickey-the-dog", :FIRST_NAME=>"mickey-the-dog@zooz.com"}
180
+ ]
181
+ expected = [
182
+ {:not_masked_field=>"mickey-the-dog", :FIRST_NAME=>"mickey-the-dog@zooz.com"}
183
+ ]
184
+ filtered_records = filter(conf, messages)
185
+ assert_equal(expected, filtered_records)
186
+ end
187
+
188
+ test 'mask field in hash object with snakecase' do
189
+ conf = CONFIG_CASE_INSENSITIVE
190
+ messages = [
191
+ {:not_masked_field=>"mickey-the-dog", :LaSt_NaMe=>"mickey-the-dog@zooz.com"}
192
+ ]
193
+ expected = [
194
+ {:not_masked_field=>"mickey-the-dog", :last_name=>MASK_STRING}
195
+ ]
196
+ filtered_records = filter(conf, messages)
197
+ assert_equal(expected, filtered_records)
198
+ end
199
+
200
+ test 'mask case insensitive and case sensitive field in nested json escaped string' do
201
+ conf = CONFIG_CASE_INSENSITIVE
202
+ messages = [
203
+ { :body => "{\"firsT_naMe\":\"mickey\",\"last_NAME\":\"the-dog\",\"address\":\"{\\\"Street\":\\\"Austin\\\",\\\"number\":\\\"89\\\"}\", \"type\":\"puggle\"}" }
204
+ ]
205
+ expected = [
206
+ { :body => "{\"firsT_naMe\":\"mickey\",\"last_name\":\"*******\",\"address\":\"{\\\"street\\\":\\\"*******\\\",\\\"number\\\":\\\"*******\\\"}\", \"type\":\"puggle\"}" }
207
+ ]
208
+ filtered_records = filter(conf, messages)
209
+ assert_equal(expected, filtered_records)
210
+ end
211
+
212
+ end
213
+
214
+ sub_test_case 'plugin will mask all fields that need masking - special json escaped cases' do
215
+ test 'mask field in nested json escaped string when one of the values ends with "," (the value for "some_custom" field)' do
216
+ conf = CONFIG_SPECIAL_CASES
217
+ messages = [
218
+ { :body => "{\"first_name\":\"mickey\",\"last_name\":\"the-dog\",\"address\":\"{\\\"street\":\\\"Austin\\\",\\\"number\":\\\"89\\\"}\", \"type\":\"puggle\", \"cookie\":\"some_custom=,,live,default,,2097403972,2.22.242.38,\", \"city\":\"new york\"}" }
219
+ ]
220
+ expected = [
221
+ { :body => "{\"first_name\":\"*******\",\"last_name\":\"*******\",\"address\":\"{\\\"street\\\":\\\"*******\\\",\\\"number\\\":\\\"*******\\\"}\", \"type\":\"puggle\", \"cookie\":\"*******\", \"city\":\"new york\"}" }
222
+ ]
223
+ filtered_records = filter(conf, messages)
224
+ assert_equal(expected, filtered_records)
225
+ end
226
+
227
+
228
+ test 'mask field in nested json escaped string with long lines' do
229
+ conf = CONFIG_SPECIAL_CASES
230
+ messages = [
231
+ { :body => "{\"kubernetes\":{\"container_image\":\"docker-registry.gitlab.co:1234\\\/testing\\\/logging-service\\\/tags:v1.2.4\",\"container_name\":\"logging-service\",\"host\":\"ip-123-123-123-123.eu-central-2.compute.internal\",\"labels\":{\"app\":\"logging-gateway-service\",\"deployed_from_master\":\"false\",\"deployed_from_tag\":\"true\",\"deployment_tool_version\":\"k8s-tool-10.0.24\",\"instance_tag\":\"v1.2.4\",\"maskExclude\":\"email\",\"pod-template-hash\":\"6c74f7bdf6\",\"security.moti.io\\\/tlsMode\":\"moti\",\"service.moti.io\\\/canonical-name\":\"logging-gateway-service\",\"service.moti.io\\\/canonical-revision\":\"latest\"},\"namespace_name\":\"apps\",\"pod_id\":\"5f2474fd-d4ff-4842-b76f-143f240b0b28\",\"pod_name\":\"logging-gateway-service-deployment-6c74f7bdf6-lkbcq\"},\"message\":{\"name\":\"logging-gateway-logger\",\"hostname\":\"logging-gateway-service-deployment-88dd9f896-9bb8p\",\"pid\":1,\"level\":30,\"plugin_name\":\"some_plugin\",\"service_name\":\"sure-route-static-object\",\"gateway\":\"my-gateway\",\"original_request\":{\"method\":\"GET\",\"headers\":{\"host\":\"external.production.co\",\"x-forwarded-client-cert\":\"By=spiffe:\\\/\\\/cluster.local\\\/ns\\\/moti\\\/sa\\\/default;Hash=dfdsfdsfdsdsfdsdsdfdse9add38f1f99d9d022ef60a37d6269ec;Subject=\\\"\\\";URI=spiffe:\\\/\\\/cluster.local\\\/ns\\\/moti-system\\\/sa\\\/moti-ingressgateway-service-account\",\"x-moti-unique-id\":\"11111111\",\"moti-origin-hop\":\"2\",\"true-client-ip\":\"18.197.9.181\",\"x-b3-traceid\":\"e7f3b3bd9fc9d048886e2135a87af23a\",\"x-moti-server-time\":\"1634041132\",\"x-b3-spanid\":\"87b9c2d116f54ce9\",\"x-b3-sampled\":\"0\",\"x-request-id\":\"9989b2a9-408c-4ba2-ad15-2f11dd678ab6\",\"cookie\":\"some_custom=,,live,default,,1111111,3.3.3.3,\",\"strict-transport-security\":\"max-age=15768000; includeSubDomains\",\"via\":\"1.1 v1-moti.net(ghost) (moti), 1.1 moti.net(ghost) (moti)\",\"accept\":\"*\\\/*\",\"x-forwarded-for\":\"1.1.1.1, 1.1.1.1, 2.2.2.2\",\"x-moti-config-log-detail\":\"true\",\"cache-control\":\"no-cache, max-age=0\",\"x-forwarded-proto\":\"http\",\"content-length\":\"0\",\"pragma\":\"no-cache\",\"user-agent\":\"ELB-HealthChecker\\\/2.0\",\"x-guy-original-path\":\"\\\/admin-api-gateway-dbless\\\/sure-route\",\"x-guy-external-address\":\"11.28.29.60\",\"x-moti-edgescape\":\"georegion=125,country_code=DE,region_code=DE,city=FRANKFURT,lat=43.11,long=12.12,timezone=GMT+5,continent=EU,throughput=vhigh,bw=2000,network=aws,asnum=12345,network_type=hosted,location_id=0\",\"x-b3-parentspanid\":\"886e21mmmwwwa\"},\"uri\":\"\\\/sure-route\",\"body\":[]},\"stage\":\"log\",\"additional_info\":{\"response_body\":\"\\\"<!DOCTYPE html PUBLIC \\\\\\\"-\\\/\\\/W3C\\\/\\\/DTD HTML 4.01 Transitional\\\/\\\/EN\\\\\\\">\\\\r\\\\n<html>\\\\r\\\\n<head>\\\\r\\\\n\\\\r\\\\n <meta http-equiv=\\\\\\\"Content-Type\\\\\\\" content=\\\\\\\"text\\\/html; charset=ISO-8859-1\\\\\\\">\\\\r\\\\n <title>Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit<\\\/title>\\\\r\\\\n <style type=\\\\\\\"text\\\/css\\\\\\\">\\\\r\\\\n\\\/*<![CDATA[ XML blockout *\\\/\\\\r\\\\n\\\\r\\\\n\\\/* XML end ]]>*\\\/\\\\r\\\\n <\\\/style>\\\\r\\\\n<\\\/head>\\\\r\\\\n\\\\r\\\\n\\\\r\\\\n<body>\\\\r\\\\n\\\\r\\\\n<h2>Lorem Ipsum<\\\/h2>\\\\r\\\\n\\\\r\\\\n<h1>Ipsum, Lorem<\\\/h1>\\\\r\\\\n\\\\r\\\\n<div id=\\\\\\\"lipsum\\\\\\\">\\\\r\\\\n<p>\\\\r\\\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam massa enim, tincidunt non hendrerit eget, malesuada et nisi. In hac habitasse platea dictumst. Praesent nec laoreet ante. Aenean tempus nisi in erat tempus tempus. Vestibulum imperdiet lobortis sapien eu tempus. Vivamus volutpat quam sed eros molestie vitae dignissim nulla ultricies. Vivamus dictum elit velit. Pellentesque pellentesque ornare ornare. Mauris vel gravida sapien. Praesent eleifend tristique ipsum nec tempor. Vestibulum cursus eleifend tellus, a egestas lectus euismod sed.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nDuis nec massa quam. Nulla porta, enim ut consequat tincidunt, quam tortor consequat enim, eu interdum eros lorem eu turpis. Cras vestibulum orci quis felis tristique quis semper sem imperdiet. Sed mattis tincidunt risus scelerisque scelerisque. Aliquam nisl quam, bibendum quis luctus eu, sodales ut felis. Integer id turpis nisi. Phasellus mattis nulla eu odio faucibus a auctor orci tristique. Nulla ullamcorper, risus nec semper accumsan, libero lacus aliquet elit, quis lacinia metus nunc vestibulum turpis. Suspendisse vel sapien vel magna auctor aliquam. Aenean fringilla fringilla metus non imperdiet. Aliquam nisl lacus, tempus vitae commodo non, accumsan ut lectus. Nam in urna eu neque pretium aliquam. Maecenas sit amet urna lectus. Donec vitae metus enim.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nSed lacus nulla, faucibus eget ullamcorper ut, mollis at metus. Vivamus tortor felis, tincidunt at tristique ut, tincidunt feugiat velit. Ut euismod felis non urna luctus luctus. Integer nec urna massa. Mauris vestibulum hendrerit auctor. Morbi at tellus nec arcu scelerisque rhoncus. Phasellus facilisis interdum lorem vulputate posuere. Nullam quis felis est. Aenean metus augue, tempus non ultricies et, dapibus vel felis. Pellentesque at augue velit. Nulla erat nisi, posuere eu pellentesque id, pretium ac libero. Phasellus tincidunt sollicitudin sapien at mollis. Nullam et libero velit, nec tincidunt eros. Aliquam et sem elit. Quisque suscipit orci enim, vel aliquam nisi. Suspendisse in enim a ligula blandit volutpat in id velit.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nNam tempor neque nec ligula sollicitudin rhoncus. Etiam et lorem vel odio pharetra interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In imperdiet nisi sed diam rutrum gravida in vel massa. Nam ullamcorper ultrices diam, vitae consequat lacus consequat consequat. Curabitur laoreet leo sed tortor fringilla nec euismod libero lobortis. Donec non enim lectus. Suspendisse potenti. In hac habitasse platea dictumst. Fusce semper auctor neque nec lobortis. Praesent vitae mauris turpis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin sed pharetra odio. Suspendisse potenti. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis eget odio purus, quis dapibus massa.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nCurabitur ut dapibus eros. Donec tempor, felis ac facilisis bibendum, nisi purus pellentesque sem, sollicitudin tempor lectus nulla at mi. Maecenas quis urna ut ante pulvinar pellentesque. Duis auctor imperdiet suscipit. Pellentesque dui nulla, volutpat quis posuere a, gravida ornare augue. Proin nec felis pharetra magna pellentesque facilisis. Curabitur lacus libero, malesuada sed tincidunt ac, aliquet ut tortor. Etiam gravida lorem nulla, consectetur eleifend risus. Donec facilisis, turpis laoreet imperdiet laoreet, purus justo egestas nulla, et hendrerit leo eros at orci. Nunc vulputate mauris sit amet sapien accumsan nec euismod orci volutpat. Sed ultricies velit ut lorem venenatis in convallis tellus imperdiet. Aenean auctor ultrices est ultricies rhoncus. Phasellus non magna a leo luctus fermentum nec fermentum erat.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\n\\\\r\\\\nSed faucibus nisl quis diam mollis quis varius tortor tincidunt. Phasellus in turpis in tellus consectetur mollis. Donec a neque id metus condimentum dignissim. In hac habitasse platea dictumst. Pellentesque sem nisi, pulvinar nec sagittis vitae, lacinia non tellus. Aliquam dignissim dignissim volutpat. Pellentesque ut quam et mi tincidunt varius id vel quam. Duis consectetur elit ac ligula fringilla elementum. In elementum tellus viverra mi vehicula vitae tempus lectus laoreet. Nullam diam nibh, tincidunt vitae imperdiet a, luctus a felis. In posuere pulvinar volutpat. Pellentesque eget viverra justo.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nNullam nec sapien at felis molestie auctor. Sed dignissim erat eu nulla ullamcorper mattis. Curabitur felis sem, feugiat non semper ut, sollicitudin sed ipsum. Quisque cursus laoreet turpis, sit amet molestie neque consequat at. Vestibulum eu ligula quis nisl pulvinar rhoncus. Praesent faucibus, dolor in elementum ullamcorper, tellus ante mattis risus, ac imperdiet eros eros quis risus. Praesent luctus libero a diam pharetra eget placerat risus pulvinar. Donec sollicitudin pulvinar velit vel pellentesque. Quisque sagittis leo ac mauris congue adipiscing. In tempus facilisis facilisis. Aliquam erat volutpat. Suspendisse sagittis libero ipsum.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nAliquam at cursus ipsum. Vivamus purus mi, pretium at molestie id, dictum in quam. Proin egestas auctor iaculis. Maecenas sodales facilisis tellus eu bibendum. Vestibulum varius vehicula scelerisque. Praesent condimentum varius commodo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec sem nisl, sagittis eu euismod non, tempor nec magna. Fusce sed auctor nisl. Phasellus porttitor sagittis est, sit amet eleifend elit dignissim et. Nam consectetur elementum elit non egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum a ultricies neque. Integer hendrerit nisi id dolor porta quis venenatis lacus dignissim. In vitae fringilla magna.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nFusce ultrices scelerisque felis, id semper quam posuere a. Sed nec erat eget velit euismod condimentum a in enim. Maecenas bibendum aliquam tincidunt. Mauris vestibulum neque at nulla sagittis id lacinia enim fermentum. Quisque adipiscing risus nec massa auctor condimentum. Mauris venenatis lacus justo, eu varius odio. Fusce commodo luctus felis, vitae lobortis lectus facilisis id. Nunc faucibus vestibulum urna et lacinia. Cras ornare quam neque, non gravida sapien. Cras porta, diam sit amet laoreet rutrum, massa erat commodo diam, eu rhoncus nisl massa ac metus. In sem mauris, venenatis nec euismod ac, suscipit condimentum neque. Quisque pretium blandit lectus, ut aliquet neque rhoncus eu. Vivamus ultrices porttitor tincidunt. Curabitur ut ipsum non ipsum ultrices tincidunt. Integer scelerisque augue nec nisl varius tristique. Morbi condimentum rutrum sodales. Pellentesque odio mauris, porttitor ac sollicitudin in, ultrices ut diam.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nSed congue adipiscing orci a pellentesque. Etiam quis neque eu nulla viverra egestas. Ut ultricies dui non enim rhoncus laoreet. Nulla molestie nibh non erat venenatis gravida. Pellentesque faucibus sem sit amet risus tincidunt non ultrices diam auctor. Praesent quis libero et tellus tempor molestie. Mauris ullamcorper feugiat libero sed elementum. Donec eget nunc eget diam hendrerit pulvinar. Ut ut imperdiet enim. Vestibulum sed quam lorem. Nunc ipsum massa, venenatis eget condimentum at, ornare id ante. Vestibulum ornare volutpat tincidunt. Etiam a eros erat. Curabitur lobortis, nisi a malesuada tincidunt, nisi enim congue eros, in dictum elit odio at nunc. Nam hendrerit porta velit a viverra.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nEtiam vel velit urna. Donec commodo aliquet magna rhoncus pretium. Donec fermentum orci in diam dictum non pulvinar mi tristique. Morbi urna libero, sagittis vel facilisis nec, ornare vitae nunc. Pellentesque laoreet mi a mi condimentum sagittis. Donec eleifend, nisi sit amet tincidunt sollicitudin, leo magna accumsan elit, at adipiscing velit lacus id purus. Aenean nunc sapien, egestas vitae pretium viverra, bibendum vel tellus. Maecenas mattis dui ac justo facilisis sollicitudin. Proin in mi ac lacus hendrerit congue ac vitae elit. Aliquam erat volutpat. In hac habitasse platea dictumst. Phasellus dapibus diam vel velit consectetur tempor. Maecenas viverra suscipit bibendum. Sed non enim neque.\\\\r\\\\n<\\\/p>\\\\r\\\\n\\\\r\\\\n<p>\\\\r\\\\nCum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus at odio et odio volutpat egestas. Fusce non pellentesque felis. Nunc fermentum posuere sem quis egestas. Integer nec orci vel eros fringilla bibendum. Praesent placerat molestie elit at mattis. Nunc rutrum faucibus arcu non bibendum. Vestibulum at sapien sit amet sem iaculis congue. Morbi tempus, libero vitae interdum suscipit, lacus ipsum suscipit quam, non pretium nulla orci eget dui. Praesent et nisl turpis, ultricies convallis quam. In tempor urna et eros aliquet accumsan. Phasellus lobortis bibendum libero sit amet viverra. Aenean consectetur, neque eu cursus posuere, est leo molestie dui, sit amet vulputate mi erat eu tortor. Suspendisse arcu velit, porta sit amet adipiscing sed, ultrices id urna. In hendrerit iaculis massa in pretium. Vivamus eros augue, venenatis non hendrerit a, bibendum in tortor. Fusce et mauris lorem, vitae semper ligula. Nam iaculis, eros eu varius varius, orci sapien rhoncus arcu, et luctus urna lectus non quam. Donec gravida convallis justo at bibendum. Quisque non est velit, sed laoreet augue.\\\\r\\\\n<\\\/p>\\\\r\\\\n<\\\/div>\\\\r\\\\n\\\\r\\\\n<\\\/body>\\\\r\\\\n<\\\/html>\\\\r\\\\n\\\"\",\"kong_plugins_latency\":0,\"response_status_code\":200,\"total_elapsed\":0,\"response_headers\":{\"id\":\"a3a98b80-daf2-4d4b-8f27-946c4948c5a5\",\"content-type\":\"text\\\/html; charset=\\\"utf-8\\\"\",\"connection\":\"close\",\"content-length\":\"11375\"}},\"real_log_timestamp\":1634041132026.6,\"route_name\":\"sure-route-route\",\"context\":[],\"id\":\"a3a98b80-daf2-4d4b-8f27-946c4948c5a5\",\"msg\":\"response to client\",\"time\":\"2021-10-12T12:18:52.029Z\",\"v\":0}}" }
232
+ ]
233
+ expected = [
234
+ { :body => "{\"kubernetes\":{\"container_image\":\"docker-registry.gitlab.co:1234\\\/testing\\\/logging-service\\\/tags:v1.2.4\",\"container_name\":\"logging-service\",\"host\":\"ip-123-123-123-123.eu-central-2.compute.internal\",\"labels\":{\"app\":\"logging-gateway-service\",\"deployed_from_master\":\"false\",\"deployed_from_tag\":\"true\",\"deployment_tool_version\":\"k8s-tool-10.0.24\",\"instance_tag\":\"v1.2.4\",\"maskExclude\":\"email\",\"pod-template-hash\":\"6c74f7bdf6\",\"security.moti.io\\\/tlsMode\":\"moti\",\"service.moti.io\\\/canonical-name\":\"logging-gateway-service\",\"service.moti.io\\\/canonical-revision\":\"latest\"},\"namespace_name\":\"apps\",\"pod_id\":\"5f2474fd-d4ff-4842-b76f-143f240b0b28\",\"pod_name\":\"logging-gateway-service-deployment-6c74f7bdf6-lkbcq\"},\"message\":{\"name\":\"logging-gateway-logger\",\"hostname\":\"logging-gateway-service-deployment-88dd9f896-9bb8p\",\"pid\":1,\"level\":30,\"plugin_name\":\"some_plugin\",\"service_name\":\"sure-route-static-object\",\"gateway\":\"my-gateway\",\"original_request\":{\"method\":\"GET\",\"headers\":{\"host\":\"external.production.co\",\"x-forwarded-client-cert\":\"By=spiffe:\\\/\\\/cluster.local\\\/ns\\\/moti\\\/sa\\\/default;Hash=dfdsfdsfdsdsfdsdsdfdse9add38f1f99d9d022ef60a37d6269ec;Subject=\\\"\\\";URI=spiffe:\\\/\\\/cluster.local\\\/ns\\\/moti-system\\\/sa\\\/moti-ingressgateway-service-account\",\"x-moti-unique-id\":\"11111111\",\"moti-origin-hop\":\"2\",\"true-client-ip\":\"18.197.9.181\",\"x-b3-traceid\":\"e7f3b3bd9fc9d048886e2135a87af23a\",\"x-moti-server-time\":\"1634041132\",\"x-b3-spanid\":\"87b9c2d116f54ce9\",\"x-b3-sampled\":\"0\",\"x-request-id\":\"9989b2a9-408c-4ba2-ad15-2f11dd678ab6\",\"cookie\":\"*******\",\"strict-transport-security\":\"max-age=15768000; includeSubDomains\",\"via\":\"1.1 v1-moti.net(ghost) (moti), 1.1 moti.net(ghost) (moti)\",\"accept\":\"*\\\/*\",\"x-forwarded-for\":\"1.1.1.1, 1.1.1.1, 2.2.2.2\",\"x-moti-config-log-detail\":\"true\",\"cache-control\":\"no-cache, max-age=0\",\"x-forwarded-proto\":\"http\",\"content-length\":\"0\",\"pragma\":\"no-cache\",\"user-agent\":\"ELB-HealthChecker\\\/2.0\",\"x-guy-original-path\":\"\\\/admin-api-gateway-dbless\\\/sure-route\",\"x-guy-external-address\":\"11.28.29.60\",\"x-moti-edgescape\":\"georegion=125,country_code=DE,region_code=DE,city=FRANKFURT,lat=43.11,long=12.12,timezone=GMT+5,continent=EU,throughput=vhigh,bw=2000,network=aws,asnum=12345,network_type=hosted,location_id=0\",\"x-b3-parentspanid\":\"886e21mmmwwwa\"},\"uri\":\"\\\/sure-route\",\"body\":[]},\"stage\":\"log\",\"additional_info\":{\"response_body\":\"\\\"<!DOCTYPE html PUBLIC \\\\\\\"-\\\/\\\/W3C\\\/\\\/DTD HTML 4.01 Transitional\\\/\\\/EN\\\\\\\">\\\\r\\\\n<html>\\\\r\\\\n<head>\\\\r\\\\n\\\\r\\\\n <meta http-equiv=\\\\\\\"Content-Type\\\\\\\" content=\\\\\\\"text\\\/html; charset=ISO-8859-1\\\\\\\">\\\\r\\\\n <title>Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit<\\\/title>\\\\r\\\\n <style type=\\\\\\\"text\\\/css\\\\\\\">\\\\r\\\\n\\\/*<![CDATA[ XML blockout *\\\/\\\\r\\\\n\\\\r\\\\n\\\/* XML end ]]>*\\\/\\\\r\\\\n <\\\/style>\\\\r\\\\n<\\\/head>\\\\r\\\\n\\\\r\\\\n\\\\r\\\\n<body>\\\\r\\\\n\\\\r\\\\n<h2>Lorem Ipsum<\\\/h2>\\\\r\\\\n\\\\r\\\\n<h1>Ipsum, Lorem<\\\/h1>\\\\r\\\\n\\\\r\\\\n<div id=\\\\\\\"lipsum\\\\\\\">\\\\r\\\\n<p>\\\\r\\\\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam massa enim, tincidunt non hendrerit eget, malesuada et nisi. In hac habitasse platea dictumst. Praesent nec laoreet ante. Aenean tempus nisi in erat tempus tempus. Vestibulum imperdiet lobortis sapien eu tempus. Vivamus volutpat quam sed eros molestie vitae dignissim nulla ultricies. Vivamus dictum elit velit. Pellentesque pellentesque ornare ornare. Mauris vel gravida sapien. Praesent eleifend tristique ipsum nec tempor. Vestibulum cursus eleifend tellus, a egestas lectus euismod sed.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nDuis nec massa quam. Nulla porta, enim ut consequat tincidunt, quam tortor consequat enim, eu interdum eros lorem eu turpis. Cras vestibulum orci quis felis tristique quis semper sem imperdiet. Sed mattis tincidunt risus scelerisque scelerisque. Aliquam nisl quam, bibendum quis luctus eu, sodales ut felis. Integer id turpis nisi. Phasellus mattis nulla eu odio faucibus a auctor orci tristique. Nulla ullamcorper, risus nec semper accumsan, libero lacus aliquet elit, quis lacinia metus nunc vestibulum turpis. Suspendisse vel sapien vel magna auctor aliquam. Aenean fringilla fringilla metus non imperdiet. Aliquam nisl lacus, tempus vitae commodo non, accumsan ut lectus. Nam in urna eu neque pretium aliquam. Maecenas sit amet urna lectus. Donec vitae metus enim.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nSed lacus nulla, faucibus eget ullamcorper ut, mollis at metus. Vivamus tortor felis, tincidunt at tristique ut, tincidunt feugiat velit. Ut euismod felis non urna luctus luctus. Integer nec urna massa. Mauris vestibulum hendrerit auctor. Morbi at tellus nec arcu scelerisque rhoncus. Phasellus facilisis interdum lorem vulputate posuere. Nullam quis felis est. Aenean metus augue, tempus non ultricies et, dapibus vel felis. Pellentesque at augue velit. Nulla erat nisi, posuere eu pellentesque id, pretium ac libero. Phasellus tincidunt sollicitudin sapien at mollis. Nullam et libero velit, nec tincidunt eros. Aliquam et sem elit. Quisque suscipit orci enim, vel aliquam nisi. Suspendisse in enim a ligula blandit volutpat in id velit.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nNam tempor neque nec ligula sollicitudin rhoncus. Etiam et lorem vel odio pharetra interdum. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In imperdiet nisi sed diam rutrum gravida in vel massa. Nam ullamcorper ultrices diam, vitae consequat lacus consequat consequat. Curabitur laoreet leo sed tortor fringilla nec euismod libero lobortis. Donec non enim lectus. Suspendisse potenti. In hac habitasse platea dictumst. Fusce semper auctor neque nec lobortis. Praesent vitae mauris turpis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin sed pharetra odio. Suspendisse potenti. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis eget odio purus, quis dapibus massa.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nCurabitur ut dapibus eros. Donec tempor, felis ac facilisis bibendum, nisi purus pellentesque sem, sollicitudin tempor lectus nulla at mi. Maecenas quis urna ut ante pulvinar pellentesque. Duis auctor imperdiet suscipit. Pellentesque dui nulla, volutpat quis posuere a, gravida ornare augue. Proin nec felis pharetra magna pellentesque facilisis. Curabitur lacus libero, malesuada sed tincidunt ac, aliquet ut tortor. Etiam gravida lorem nulla, consectetur eleifend risus. Donec facilisis, turpis laoreet imperdiet laoreet, purus justo egestas nulla, et hendrerit leo eros at orci. Nunc vulputate mauris sit amet sapien accumsan nec euismod orci volutpat. Sed ultricies velit ut lorem venenatis in convallis tellus imperdiet. Aenean auctor ultrices est ultricies rhoncus. Phasellus non magna a leo luctus fermentum nec fermentum erat.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\n\\\\r\\\\nSed faucibus nisl quis diam mollis quis varius tortor tincidunt. Phasellus in turpis in tellus consectetur mollis. Donec a neque id metus condimentum dignissim. In hac habitasse platea dictumst. Pellentesque sem nisi, pulvinar nec sagittis vitae, lacinia non tellus. Aliquam dignissim dignissim volutpat. Pellentesque ut quam et mi tincidunt varius id vel quam. Duis consectetur elit ac ligula fringilla elementum. In elementum tellus viverra mi vehicula vitae tempus lectus laoreet. Nullam diam nibh, tincidunt vitae imperdiet a, luctus a felis. In posuere pulvinar volutpat. Pellentesque eget viverra justo.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nNullam nec sapien at felis molestie auctor. Sed dignissim erat eu nulla ullamcorper mattis. Curabitur felis sem, feugiat non semper ut, sollicitudin sed ipsum. Quisque cursus laoreet turpis, sit amet molestie neque consequat at. Vestibulum eu ligula quis nisl pulvinar rhoncus. Praesent faucibus, dolor in elementum ullamcorper, tellus ante mattis risus, ac imperdiet eros eros quis risus. Praesent luctus libero a diam pharetra eget placerat risus pulvinar. Donec sollicitudin pulvinar velit vel pellentesque. Quisque sagittis leo ac mauris congue adipiscing. In tempus facilisis facilisis. Aliquam erat volutpat. Suspendisse sagittis libero ipsum.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nAliquam at cursus ipsum. Vivamus purus mi, pretium at molestie id, dictum in quam. Proin egestas auctor iaculis. Maecenas sodales facilisis tellus eu bibendum. Vestibulum varius vehicula scelerisque. Praesent condimentum varius commodo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec sem nisl, sagittis eu euismod non, tempor nec magna. Fusce sed auctor nisl. Phasellus porttitor sagittis est, sit amet eleifend elit dignissim et. Nam consectetur elementum elit non egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum a ultricies neque. Integer hendrerit nisi id dolor porta quis venenatis lacus dignissim. In vitae fringilla magna.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nFusce ultrices scelerisque felis, id semper quam posuere a. Sed nec erat eget velit euismod condimentum a in enim. Maecenas bibendum aliquam tincidunt. Mauris vestibulum neque at nulla sagittis id lacinia enim fermentum. Quisque adipiscing risus nec massa auctor condimentum. Mauris venenatis lacus justo, eu varius odio. Fusce commodo luctus felis, vitae lobortis lectus facilisis id. Nunc faucibus vestibulum urna et lacinia. Cras ornare quam neque, non gravida sapien. Cras porta, diam sit amet laoreet rutrum, massa erat commodo diam, eu rhoncus nisl massa ac metus. In sem mauris, venenatis nec euismod ac, suscipit condimentum neque. Quisque pretium blandit lectus, ut aliquet neque rhoncus eu. Vivamus ultrices porttitor tincidunt. Curabitur ut ipsum non ipsum ultrices tincidunt. Integer scelerisque augue nec nisl varius tristique. Morbi condimentum rutrum sodales. Pellentesque odio mauris, porttitor ac sollicitudin in, ultrices ut diam.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nSed congue adipiscing orci a pellentesque. Etiam quis neque eu nulla viverra egestas. Ut ultricies dui non enim rhoncus laoreet. Nulla molestie nibh non erat venenatis gravida. Pellentesque faucibus sem sit amet risus tincidunt non ultrices diam auctor. Praesent quis libero et tellus tempor molestie. Mauris ullamcorper feugiat libero sed elementum. Donec eget nunc eget diam hendrerit pulvinar. Ut ut imperdiet enim. Vestibulum sed quam lorem. Nunc ipsum massa, venenatis eget condimentum at, ornare id ante. Vestibulum ornare volutpat tincidunt. Etiam a eros erat. Curabitur lobortis, nisi a malesuada tincidunt, nisi enim congue eros, in dictum elit odio at nunc. Nam hendrerit porta velit a viverra.\\\\r\\\\n<\\\/p>\\\\r\\\\n<p>\\\\r\\\\nEtiam vel velit urna. Donec commodo aliquet magna rhoncus pretium. Donec fermentum orci in diam dictum non pulvinar mi tristique. Morbi urna libero, sagittis vel facilisis nec, ornare vitae nunc. Pellentesque laoreet mi a mi condimentum sagittis. Donec eleifend, nisi sit amet tincidunt sollicitudin, leo magna accumsan elit, at adipiscing velit lacus id purus. Aenean nunc sapien, egestas vitae pretium viverra, bibendum vel tellus. Maecenas mattis dui ac justo facilisis sollicitudin. Proin in mi ac lacus hendrerit congue ac vitae elit. Aliquam erat volutpat. In hac habitasse platea dictumst. Phasellus dapibus diam vel velit consectetur tempor. Maecenas viverra suscipit bibendum. Sed non enim neque.\\\\r\\\\n<\\\/p>\\\\r\\\\n\\\\r\\\\n<p>\\\\r\\\\nCum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus at odio et odio volutpat egestas. Fusce non pellentesque felis. Nunc fermentum posuere sem quis egestas. Integer nec orci vel eros fringilla bibendum. Praesent placerat molestie elit at mattis. Nunc rutrum faucibus arcu non bibendum. Vestibulum at sapien sit amet sem iaculis congue. Morbi tempus, libero vitae interdum suscipit, lacus ipsum suscipit quam, non pretium nulla orci eget dui. Praesent et nisl turpis, ultricies convallis quam. In tempor urna et eros aliquet accumsan. Phasellus lobortis bibendum libero sit amet viverra. Aenean consectetur, neque eu cursus posuere, est leo molestie dui, sit amet vulputate mi erat eu tortor. Suspendisse arcu velit, porta sit amet adipiscing sed, ultrices id urna. In hendrerit iaculis massa in pretium. Vivamus eros augue, venenatis non hendrerit a, bibendum in tortor. Fusce et mauris lorem, vitae semper ligula. Nam iaculis, eros eu varius varius, orci sapien rhoncus arcu, et luctus urna lectus non quam. Donec gravida convallis justo at bibendum. Quisque non est velit, sed laoreet augue.\\\\r\\\\n<\\\/p>\\\\r\\\\n<\\\/div>\\\\r\\\\n\\\\r\\\\n<\\\/body>\\\\r\\\\n<\\\/html>\\\\r\\\\n\\\"\",\"kong_plugins_latency\":0,\"response_status_code\":200,\"total_elapsed\":0,\"response_headers\":{\"id\":\"a3a98b80-daf2-4d4b-8f27-946c4948c5a5\",\"content-type\":\"text\\\/html; charset=\\\"utf-8\\\"\",\"connection\":\"close\",\"content-length\":\"11375\"}},\"real_log_timestamp\":1634041132026.6,\"route_name\":\"sure-route-route\",\"context\":[],\"id\":\"a3a98b80-daf2-4d4b-8f27-946c4948c5a5\",\"msg\":\"response to client\",\"time\":\"2021-10-12T12:18:52.029Z\",\"v\":0}}" }
235
+ ]
236
+ filtered_records = filter(conf, messages)
237
+ assert_equal(expected, filtered_records)
238
+ end
239
+ end
147
240
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-masking
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shai Moria
8
8
  - Niv Lipetz
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-12-22 00:00:00.000000000 Z
12
+ date: 2021-10-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd
@@ -25,34 +25,6 @@ dependencies:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  version: 0.14.0
28
- - !ruby/object:Gem::Dependency
29
- name: bundler
30
- requirement: !ruby/object:Gem::Requirement
31
- requirements:
32
- - - '='
33
- - !ruby/object:Gem::Version
34
- version: 1.17.3
35
- type: :development
36
- prerelease: false
37
- version_requirements: !ruby/object:Gem::Requirement
38
- requirements:
39
- - - '='
40
- - !ruby/object:Gem::Version
41
- version: 1.17.3
42
- - !ruby/object:Gem::Dependency
43
- name: rake
44
- requirement: !ruby/object:Gem::Requirement
45
- requirements:
46
- - - "~>"
47
- - !ruby/object:Gem::Version
48
- version: '12.0'
49
- type: :development
50
- prerelease: false
51
- version_requirements: !ruby/object:Gem::Requirement
52
- requirements:
53
- - - "~>"
54
- - !ruby/object:Gem::Version
55
- version: '12.0'
56
28
  - !ruby/object:Gem::Dependency
57
29
  name: test-unit
58
30
  requirement: !ruby/object:Gem::Requirement
@@ -89,24 +61,23 @@ executables: []
89
61
  extensions: []
90
62
  extra_rdoc_files: []
91
63
  files:
64
+ - ".circleci/config.yml"
92
65
  - ".gitignore"
93
- - ".travis.yml"
94
66
  - Gemfile
95
- - Gemfile.lock
96
67
  - README.md
97
- - Rakefile
98
68
  - fluent-plugin-masking.gemspec
99
69
  - lib/fluent/plugin/filter_masking.rb
100
70
  - lib/fluent/plugin/helpers.rb
101
71
  - lib/fluent/plugin/version.rb
102
72
  - test/fields-to-mask
73
+ - test/fields-to-mask-insensitive
103
74
  - test/test_filter_masking.rb
104
75
  - test/test_helpers.rb
105
76
  homepage: https://github.com/PayU/fluent-plugin-masking
106
77
  licenses:
107
78
  - Apache-2.0
108
79
  metadata: {}
109
- post_install_message:
80
+ post_install_message:
110
81
  rdoc_options: []
111
82
  require_paths:
112
83
  - lib
@@ -114,21 +85,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
114
85
  requirements:
115
86
  - - ">="
116
87
  - !ruby/object:Gem::Version
117
- version: '2.1'
88
+ version: 2.5.0
118
89
  required_rubygems_version: !ruby/object:Gem::Requirement
119
90
  requirements:
120
91
  - - ">="
121
92
  - !ruby/object:Gem::Version
122
93
  version: '0'
123
94
  requirements: []
124
- rubyforge_project:
125
- rubygems_version: 2.5.2.3
126
- signing_key:
95
+ rubygems_version: 3.0.3
96
+ signing_key:
127
97
  specification_version: 4
128
98
  summary: Fluentd filter plugin to mask sensitive or privacy records with `*******`
129
99
  in place of the original value. This data masking plugin protects data such as name,
130
100
  email, phonenumber, address, and any other field you would like to mask.
131
101
  test_files:
132
102
  - test/fields-to-mask
103
+ - test/fields-to-mask-insensitive
133
104
  - test/test_filter_masking.rb
134
105
  - test/test_helpers.rb
data/.travis.yml DELETED
@@ -1,14 +0,0 @@
1
- sudo: false
2
- language: ruby
3
-
4
- rvm:
5
- - 2.6.4
6
- - 2.5.6
7
- - 2.4.7
8
- - 2.3.8
9
-
10
- before_install:
11
- - gem update bundler
12
-
13
- gemfile:
14
- - Gemfile
data/Gemfile.lock DELETED
@@ -1,55 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- fluent-plugin-masking (1.1.1)
5
- fluentd (>= 0.14.0)
6
-
7
- GEM
8
- remote: https://rubygems.org/
9
- specs:
10
- concurrent-ruby (1.1.5)
11
- cool.io (1.5.4)
12
- dig_rb (1.0.1)
13
- fluentd (1.8.0)
14
- cool.io (>= 1.4.5, < 2.0.0)
15
- dig_rb (~> 1.0.0)
16
- http_parser.rb (>= 0.5.1, < 0.7.0)
17
- msgpack (>= 1.2.0, < 2.0.0)
18
- serverengine (>= 2.0.4, < 3.0.0)
19
- sigdump (~> 0.2.2)
20
- strptime (>= 0.2.2, < 1.0.0)
21
- tzinfo (>= 1.0, < 3.0)
22
- tzinfo-data (~> 1.0)
23
- yajl-ruby (~> 1.0)
24
- http_parser.rb (0.6.0)
25
- msgpack (1.3.1)
26
- power_assert (1.1.5)
27
- rake (12.3.3)
28
- rr (1.2.1)
29
- serverengine (2.2.0)
30
- sigdump (~> 0.2.2)
31
- sigdump (0.2.4)
32
- strptime (0.2.3)
33
- test-unit (3.3.3)
34
- power_assert
35
- test-unit-rr (1.0.5)
36
- rr (>= 1.1.1)
37
- test-unit (>= 2.5.2)
38
- tzinfo (2.0.0)
39
- concurrent-ruby (~> 1.0)
40
- tzinfo-data (1.2019.3)
41
- tzinfo (>= 1.0.0)
42
- yajl-ruby (1.4.1)
43
-
44
- PLATFORMS
45
- ruby
46
-
47
- DEPENDENCIES
48
- bundler (= 1.17.3)
49
- fluent-plugin-masking!
50
- rake (~> 12.0)
51
- test-unit (>= 3.1.0)
52
- test-unit-rr
53
-
54
- BUNDLED WITH
55
- 1.17.3
data/Rakefile DELETED
@@ -1,9 +0,0 @@
1
- require "bundler/gem_tasks"
2
- require 'rake/testtask'
3
- Rake::TestTask.new(:test) do |test|
4
- test.libs << 'lib' << 'test'
5
- test.pattern = 'test/**/test_*.rb'
6
- test.verbose = true
7
- end
8
-
9
- task :default => :test