Skip to content

Commit 9d4fb30

Browse files
committed
Fix values sanitizer handling queries with keys that contain dots
1 parent 4e992dd commit 9d4fb30

File tree

3 files changed

+31
-30
lines changed

3 files changed

+31
-30
lines changed

instrumentation/opentelemetry-instrumentation-elasticsearch/src/opentelemetry/instrumentation/elasticsearch/utils.py

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -25,40 +25,22 @@
2525
sanitized_value = "?"
2626

2727

28-
# pylint: disable=C0103
29-
def _flatten_dict(d, parent_key=""):
30-
items = []
31-
for k, v in d.items():
32-
new_key = parent_key + "." + k if parent_key else k
33-
# recursive call _flatten_dict for a non-empty dict value
34-
if isinstance(v, dict) and v:
35-
items.extend(_flatten_dict(v, new_key).items())
36-
else:
37-
items.append((new_key, v))
38-
return dict(items)
39-
4028

41-
def _unflatten_dict(d):
42-
res = {}
43-
for k, v in d.items():
44-
keys = k.split(".")
45-
d = res
46-
for key in keys[:-1]:
47-
if key not in d:
48-
d[key] = {}
49-
d = d[key]
50-
d[keys[-1]] = v
51-
return res
29+
def sanitize_dict(d):
30+
sanitized_copy = {}
31+
for key, value in d.items():
32+
if isinstance(value, dict):
33+
sanitized_copy[key] = sanitize_dict(value)
34+
elif key in sanitized_keys:
35+
sanitized_copy[key] = sanitized_value
36+
else:
37+
sanitized_copy[key] = value
38+
return sanitized_copy
5239

5340

5441
def sanitize_body(body) -> str:
5542
if isinstance(body, str):
5643
body = json.loads(body)
5744

58-
flatten_body = _flatten_dict(body)
59-
60-
for key in flatten_body:
61-
if key.endswith(sanitized_keys):
62-
flatten_body[key] = sanitized_value
63-
64-
return str(_unflatten_dict(flatten_body))
45+
sanitized_body = sanitize_dict(body)
46+
return str(sanitized_body)

instrumentation/opentelemetry-instrumentation-elasticsearch/tests/sanitization_queries.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@
4444
}
4545
}
4646

47+
_field_opts = {}
48+
highlight_query = {
49+
"query": {
50+
"match": {"content": "search"},
51+
},
52+
"highlight": {
53+
"fields": {"content": _field_opts, "content.morph": _field_opts},
54+
},
55+
}
56+
4757
interval_query_sanitized = {
4858
"query": {
4959
"intervals": {
@@ -63,3 +73,8 @@
6373
}
6474
}
6575
}
76+
77+
highlight_query_sanitized = {
78+
"query": {"match": {"content": "search"}},
79+
"highlight": {"fields": {"content": {}, "content.morph": {}}},
80+
}

instrumentation/opentelemetry-instrumentation-elasticsearch/tests/test_elasticsearch.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,10 @@ def test_body_sanitization(self, _):
579579
sanitize_body(json.dumps(sanitization_queries.interval_query)),
580580
str(sanitization_queries.interval_query_sanitized),
581581
)
582+
self.assertEqual(
583+
sanitize_body(sanitization_queries.highlight_query),
584+
str(sanitization_queries.highlight_query_sanitized),
585+
)
582586

583587
def test_bulk(self, request_mock):
584588
request_mock.return_value = helpers.mock_response("{}")

0 commit comments

Comments
 (0)