Skip to content

Commit 6f88253

Browse files
authored
Merge pull request #5 from szvasas/escape_dot_notation
Introduce escaping of '.' characters in labels
2 parents 977a7a0 + c244c60 commit 6f88253

File tree

2 files changed

+79
-5
lines changed

2 files changed

+79
-5
lines changed

lib/fluent/plugin/out_tag_normaliser.rb

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,20 +72,67 @@ def render_tag(record)
7272

7373
def get_key_accessors
7474
key_accessors = {}
75-
keywords = @format.scan(/\$\{([\w\.\/\-]+)}/)
75+
keywords = @format.scan(/\$\{([\w\.\/\-\\]+)}/)
7676
keywords.each do |key|
7777
placeholder = "${#{key[0]}}"
78-
if @key_prefix != ""
79-
path = @key_prefix + "." + key[0]
78+
if contains_escaped_period?(key[0])
79+
path = create_path_with_bracket_notation(key[0])
8080
else
81-
path = key[0]
81+
path = create_path(key[0])
8282
end
83-
path = "$." + path
8483
key_accessors[placeholder] = record_accessor_create(path)
8584
end
8685
return key_accessors
8786
end
8887

88+
private
89+
90+
def contains_escaped_period?(key)
91+
key.include?('\.')
92+
end
93+
94+
def create_path(key)
95+
if @key_prefix != ""
96+
path = @key_prefix + "." + key
97+
else
98+
path = key
99+
end
100+
path = "$." + path
101+
end
102+
103+
# Produces the output in bracket notation, e.g. $['kubernetes']['labels']['app.tier']"
104+
def create_path_with_bracket_notation(key)
105+
path = split_by_unescaped_dots(key)
106+
.map { |elem| "['#{elem}']" }
107+
.join("")
108+
if @key_prefix != ""
109+
path = "['#{@key_prefix}']" + path
110+
end
111+
path = "$" + path
112+
end
113+
114+
# Splits the input string by the . character if it is not escaped by \
115+
def split_by_unescaped_dots(text)
116+
result = []
117+
current_part = ""
118+
escaped = false
119+
120+
text.each_char do |char|
121+
if char == "\\" && !escaped
122+
escaped = true
123+
elsif char == "." && !escaped
124+
result << current_part
125+
current_part = ""
126+
else
127+
current_part += char
128+
escaped = false
129+
end
130+
end
131+
132+
result << current_part
133+
result
134+
end
135+
89136
end
90137
end
91138
end

test/plugin/test_out_tag_normaliser.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,37 @@ class TagNormaliserOutputTest < Test::Unit::TestCase
2121
d = create_driver(config)
2222
d.run(default_tag: 'test') do
2323
d.feed("tag1", event_time, record.dup)
24+
end
25+
events = d.events
26+
puts events
27+
28+
assert_equal("cluster.default.understood-butterfly-nginx-logging-demo-7dcdcfdcd7-h7p9n.nginx", events[0][0])
29+
end
30+
31+
test "escape_test" do
32+
config = %[
33+
format cluster.${namespace_name}.${labels.app}.${labels.app\\.tier}.${labels.app\\.kubernetes\\.io/managed-by}
34+
]
35+
record = {
36+
"log" => "Example",
37+
"kubernetes" => {
38+
"pod_name" => "understood-butterfly-nginx-logging-demo-7dcdcfdcd7-h7p9n",
39+
"namespace_name" => "default",
40+
"labels" => {
41+
"app" => "nginx",
42+
"app.tier" => "frontend",
43+
"app.kubernetes.io/managed-by" => "helm"
44+
}
45+
}
46+
}
47+
d = create_driver(config)
48+
d.run(default_tag: 'test') do
2449
d.feed("tag1", event_time, record.dup)
2550
end
2651
events = d.events
2752
puts events
53+
54+
assert_equal("cluster.default.nginx.frontend.helm", events[0][0])
2855
end
2956

3057
private

0 commit comments

Comments
 (0)