Skip to content

Commit 944052a

Browse files
committed
Pass query_signature down into explain_statement
No need to recalculate this, and passing it down will allow trimmed SQL to reuse the original query's signature.
1 parent 23b84d3 commit 944052a

File tree

3 files changed

+20
-9
lines changed

3 files changed

+20
-9
lines changed

postgres/datadog_checks/postgres/explain_parameterized_queries.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import psycopg2
99

10-
from datadog_checks.base.utils.db.sql import compute_sql_signature
1110
from datadog_checks.base.utils.tracking import tracked_method
1211
from datadog_checks.postgres.cursor import CommenterDictCursor
1312

@@ -73,7 +72,7 @@ def __init__(self, check, config, explain_function):
7372
self._explain_function = explain_function
7473

7574
@tracked_method(agent_check_getter=agent_check_getter)
76-
def explain_statement(self, dbname, statement, obfuscated_statement):
75+
def explain_statement(self, dbname, statement, obfuscated_statement, query_signature):
7776
if self._check.version < V12:
7877
# if pg version < 12, skip explaining parameterized queries because
7978
# plan_cache_mode is not supported
@@ -85,7 +84,6 @@ def explain_statement(self, dbname, statement, obfuscated_statement):
8584
return None, DBExplainError.parameterized_query, '{}'.format(type(e))
8685
self._set_plan_cache_mode(dbname)
8786

88-
query_signature = compute_sql_signature(obfuscated_statement)
8987
try:
9088
self._create_prepared_statement(dbname, statement, obfuscated_statement, query_signature)
9189
except psycopg2.errors.IndeterminateDatatype as e:

postgres/datadog_checks/postgres/statement_samples.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,7 @@ def _run_explain_safe(self, dbname, statement, obfuscated_statement, query_signa
786786
if self._explain_parameterized_queries._is_parameterized_query(statement):
787787
if is_affirmative(self._config.statement_samples_config.get('explain_parameterized_queries', True)):
788788
return self._explain_parameterized_queries.explain_statement(
789-
dbname, statement, obfuscated_statement
789+
dbname, statement, obfuscated_statement, query_signature
790790
)
791791
e = psycopg2.errors.UndefinedParameter("Unable to explain parameterized query")
792792
self._log.debug(

postgres/tests/test_explain_parameterized_queries.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ def test_explain_parameterized_queries(integration_check, dbm_instance, query, e
5151
if check.version < V12:
5252
return
5353

54-
plan_dict, explain_err_code, err = check.statement_samples._run_and_track_explain(DB_NAME, query, query, query)
54+
plan_dict, explain_err_code, err = check.statement_samples._run_and_track_explain(
55+
DB_NAME, query, query, "7231596c8b5536d1"
56+
)
5557
assert plan_dict is not None
5658
assert explain_err_code == expected_explain_err_code
5759
assert err is None
@@ -111,7 +113,10 @@ def test_explain_parameterized_queries_version_below_12(integration_check, dbm_i
111113
return
112114

113115
plan_dict, explain_err_code, err = check.statement_samples._run_and_track_explain(
114-
DB_NAME, "SELECT * FROM pg_settings WHERE name = $1", "SELECT * FROM pg_settings WHERE name = $1", ""
116+
DB_NAME,
117+
"SELECT * FROM pg_settings WHERE name = $1",
118+
"SELECT * FROM pg_settings WHERE name = $1",
119+
"7231596c8b5536d1",
115120
)
116121
assert plan_dict is None
117122
assert explain_err_code == DBExplainError.parameterized_query
@@ -133,7 +138,10 @@ def test_explain_parameterized_queries_create_prepared_statement_exception(integ
133138
side_effect=psycopg2.errors.DatabaseError("unexpected exception"),
134139
):
135140
plan_dict, explain_err_code, err = check.statement_samples._run_and_track_explain(
136-
DB_NAME, "SELECT * FROM pg_settings WHERE name = $1", "SELECT * FROM pg_settings WHERE name = $1", ""
141+
DB_NAME,
142+
"SELECT * FROM pg_settings WHERE name = $1",
143+
"SELECT * FROM pg_settings WHERE name = $1",
144+
"7231596c8b5536d1",
137145
)
138146
assert plan_dict is None
139147
assert explain_err_code == DBExplainError.failed_to_explain_with_prepared_statement
@@ -155,7 +163,9 @@ def test_explain_parameterized_queries_explain_prepared_statement_exception(inte
155163
side_effect=psycopg2.errors.DatabaseError("unexpected exception"),
156164
):
157165
query = "SELECT * FROM pg_settings WHERE name = $1"
158-
plan_dict, explain_err_code, err = check.statement_samples._run_and_track_explain(DB_NAME, query, query, "")
166+
plan_dict, explain_err_code, err = check.statement_samples._run_and_track_explain(
167+
DB_NAME, query, query, "7231596c8b5536d1"
168+
)
159169
assert plan_dict is None
160170
assert explain_err_code == DBExplainError.failed_to_explain_with_prepared_statement
161171
assert err is not None
@@ -184,7 +194,10 @@ def test_explain_parameterized_queries_explain_prepared_statement_no_plan_return
184194
return_value=None,
185195
):
186196
plan_dict, explain_err_code, err = check.statement_samples._run_and_track_explain(
187-
DB_NAME, "SELECT * FROM pg_settings WHERE name = $1", "SELECT * FROM pg_settings WHERE name = $1", ""
197+
DB_NAME,
198+
"SELECT * FROM pg_settings WHERE name = $1",
199+
"SELECT * FROM pg_settings WHERE name = $1",
200+
"7231596c8b5536d1",
188201
)
189202
assert plan_dict is None
190203
assert explain_err_code == DBExplainError.no_plan_returned_with_prepared_statement

0 commit comments

Comments
 (0)