Skip to content

Commit 7614234

Browse files
committed
(PDB-5216) query-eng: provide query-id, whether logging or not
Rework the code to always have query-id, whether or not log-queries is true in preparation for adding the query origin and query-id the MDC of all threads handling the query.
1 parent 168e3e3 commit 7614234

File tree

1 file changed

+59
-49
lines changed

1 file changed

+59
-49
lines changed

src/puppetlabs/puppetdb/query_eng.clj

Lines changed: 59 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@
145145
"Converts a vector-structured `query` to a corresponding SQL query which will
146146
return nodes matching the `query`."
147147
([query entity version options]
148-
(query->sql query entity version options {}))
148+
(query->sql query entity version options nil))
149149
([query entity version options context]
150150
{:pre [((some-fn nil? sequential?) query)]
151151
:post [(map? %)
@@ -163,13 +163,14 @@
163163
(events/legacy-query->sql false version query options)
164164

165165
:else (regular-query->sql query entity options))]
166-
(when-let [log-id (:log-id context)]
166+
(when (:log-queries context)
167167
(let [{[sql & params] :results-query} result]
168168
(log/infof "PDBQuery:%s:%s"
169-
log-id (-> (sorted-map :origin (:origin options)
170-
:sql sql
171-
:params (vec params))
172-
json/generate-string))))
169+
(:query-id context)
170+
(-> (sorted-map :origin (:origin options)
171+
:sql sql
172+
:params (vec params))
173+
json/generate-string))))
173174
result)))
174175

175176
(defn get-munge-fn
@@ -194,7 +195,8 @@
194195
:add-agent-report-filter Boolean
195196
(s/optional-key :warn-experimental) Boolean
196197
(s/optional-key :pretty-print) (s/maybe Boolean)
197-
(s/optional-key :log-queries) Boolean})
198+
(s/optional-key :log-queries) Boolean
199+
(s/optional-key :query-id) s/Str})
198200

199201
(pls/defn-validated stream-query-result
200202
"Given a query, and database connection, return a Ring response with the query
@@ -207,26 +209,30 @@
207209
options
208210
context :- query-context-schema
209211
row-fn]
210-
(let [{:keys [scf-read-db url-prefix warn-experimental pretty-print log-queries]
211-
:or {warn-experimental true}} context
212-
log-id (when log-queries (str (java.util.UUID/randomUUID)))
213-
{:keys [remaining-query entity]} (eng/parse-query-context version query warn-experimental)
214-
munge-fn (get-munge-fn entity version options url-prefix)]
212+
;; For now, generate the ids here; perhaps later, higher up
213+
(assert (not (:query-id context)))
214+
(let [query-id (str (java.util.UUID/randomUUID))
215+
context (assoc context :query-id query-id)]
216+
(let [{:keys [scf-read-db url-prefix warn-experimental pretty-print log-queries]
217+
:or {warn-experimental true}} context
218+
{:keys [remaining-query entity]} (eng/parse-query-context version query warn-experimental)
219+
munge-fn (get-munge-fn entity version options url-prefix)]
215220

216-
(when log-queries
217-
;; Log origin and AST of incoming query
218-
(log/infof "PDBQuery:%s:%s"
219-
log-id (-> (sorted-map :origin (:origin options) :ast query)
220-
json/generate-string)))
221+
(when log-queries
222+
;; Log origin and AST of incoming query
223+
(log/infof "PDBQuery:%s:%s"
224+
query-id (-> (sorted-map :origin (:origin options) :ast query)
225+
json/generate-string)))
221226

222-
(let [f #(let [{:keys [results-query]}
223-
(query->sql remaining-query entity version
224-
options {:log-id log-id})]
225-
(jdbc/call-with-array-converted-query-rows results-query
226-
(comp row-fn munge-fn)))]
227-
(if use-preferred-streaming-method?
228-
(jdbc/with-db-connection scf-read-db (jdbc/with-db-transaction [] (f)))
229-
(jdbc/with-transacted-connection scf-read-db (f)))))))
227+
(let [f #(let [{:keys [results-query]}
228+
(query->sql remaining-query entity version
229+
options
230+
(select-keys context [:log-queries :query-id]))]
231+
(jdbc/call-with-array-converted-query-rows results-query
232+
(comp row-fn munge-fn)))]
233+
(if use-preferred-streaming-method?
234+
(jdbc/with-db-connection scf-read-db (jdbc/with-db-transaction [] (f)))
235+
(jdbc/with-transacted-connection scf-read-db (f))))))))
230236

231237
;; Do we still need this, i.e. do we need the pass-through, and the
232238
;; strict selectivity in the caller below?
@@ -298,7 +304,8 @@
298304
if an exception happens before then. An exception thrown by the
299305
future after that point will produce an exception from the next call
300306
to the InputStream read or close methods."
301-
[db query entity version query-options log-id munge-fn pretty-print]
307+
[db query entity version query-options munge-fn
308+
{:keys [log-queries pretty-print query-id] :as context}]
302309
;; Client disconnects present as generic IOExceptions from the
303310
;; output writer (via stream-json), and we just log them at debug
304311
;; level. For now, after the first row, there's nothing we can do
@@ -323,8 +330,7 @@
323330
(jdbc/with-db-connection db
324331
(jdbc/with-db-transaction []
325332
(let [{:keys [results-query count-query]}
326-
(query->sql query entity version query-options
327-
{:log-id log-id})
333+
(query->sql query entity version query-options context)
328334
st (when count-query
329335
{:count (jdbc/get-result-count count-query)})
330336
stream-row (fn [row]
@@ -361,9 +367,9 @@
361367

362368
(defn preferred-produce-streaming-body
363369
[version query-map context]
364-
(let [{:keys [scf-read-db url-prefix warn-experimental pretty-print log-queries]
370+
(let [{:keys [scf-read-db url-prefix warn-experimental pretty-print
371+
log-queries query-id]
365372
:or {warn-experimental true}} context
366-
log-id (when log-queries (str (java.util.UUID/randomUUID)))
367373
query-config (select-keys context [:node-purge-ttl :add-agent-report-filter])
368374
{:keys [query remaining-query entity query-options]}
369375
(user-query->engine-query version query-map query-config warn-experimental)]
@@ -372,41 +378,43 @@
372378
;; Log origin and AST of incoming query
373379
(let [{:keys [origin query]} query-map]
374380
(log/infof "PDBQuery:%s:%s"
375-
log-id (-> (sorted-map :origin origin :ast query)
376-
json/generate-string))))
381+
query-id (-> (sorted-map :origin origin :ast query)
382+
json/generate-string))))
377383

378384
(try
379385
(let [munge-fn (get-munge-fn entity version query-options url-prefix)
386+
stream-ctx (select-keys context [:log-queries :pretty-print :query-id])
380387
{:keys [status stream]} (body-stream scf-read-db
381388
(coerce-from-json remaining-query)
382389
entity version query-options
383-
log-id munge-fn pretty-print)]
390+
munge-fn
391+
stream-ctx)]
384392
(let [{:keys [count error]} @status]
385393
(when error
386394
(throw error))
387395
(cond-> (http/json-response* stream)
388396
count (http/add-headers {:count count}))))
389397
(catch JsonParseException ex
390-
(log/error ex (trs "Unparsable query: {0} {1} {2}" log-id query query-options))
398+
(log/error ex (trs "Unparsable query: {0} {1} {2}" query-id query query-options))
391399
(http/error-response ex))
392400
(catch IllegalArgumentException ex ;; thrown by (at least) munge-fn
393-
(log/error ex (trs "Invalid query: {0} {1} {2}" log-id query query-options))
401+
(log/error ex (trs "Invalid query: {0} {1} {2}" query-id query query-options))
394402
(http/error-response ex))
395403
(catch PSQLException ex
396404
(when-not (= (.getSQLState ex) (jdbc/sql-state :invalid-regular-expression))
397405
(throw ex))
398406
(do
399-
(log/debug ex (trs "Invalid query regex: {0} {1} {2}" log-id query query-options))
407+
(log/debug ex (trs "Invalid query regex: {0} {1} {2}" query-id query query-options))
400408
(http/error-response ex))))))
401409

402410
;; for testing via with-redefs
403411
(def munge-fn-hook identity)
404412

405413
(defn- deprecated-produce-streaming-body
406414
[version query-map context]
407-
(let [{:keys [scf-read-db url-prefix warn-experimental pretty-print log-queries]
415+
(let [{:keys [scf-read-db url-prefix warn-experimental pretty-print
416+
log-queries query-id]
408417
:or {warn-experimental true}} context
409-
log-id (when log-queries (str (java.util.UUID/randomUUID)))
410418
query-config (select-keys context [:node-purge-ttl :add-agent-report-filter])
411419
{:keys [query remaining-query entity query-options]}
412420
(user-query->engine-query version query-map query-config warn-experimental)]
@@ -415,18 +423,17 @@
415423
;; Log origin and AST of incoming query
416424
(let [{:keys [origin query]} query-map]
417425
(log/infof "PDBQuery:%s:%s"
418-
log-id (-> (sorted-map :origin origin :ast query)
419-
json/generate-string))))
426+
query-id (-> (sorted-map :origin origin :ast query)
427+
json/generate-string))))
420428

421429
(try
422430
(jdbc/with-transacted-connection scf-read-db
423431
(let [munge-fn (get-munge-fn entity version query-options url-prefix)
424-
{:keys [results-query count-query]} (-> remaining-query
425-
coerce-from-json
426-
(query->sql entity
427-
version
428-
query-options
429-
{:log-id log-id}))
432+
{:keys [results-query count-query]}
433+
(-> remaining-query
434+
coerce-from-json
435+
(query->sql entity version query-options
436+
(select-keys context [:log-queries :query-id])))
430437
query-error (promise)
431438
resp (http/streamed-response
432439
buffer
@@ -474,9 +481,12 @@
474481
[version :- s/Keyword
475482
query-map
476483
context :- query-context-schema]
477-
(if use-preferred-streaming-method?
478-
(preferred-produce-streaming-body version query-map context)
479-
(deprecated-produce-streaming-body version query-map context)))
484+
;; For now, generate the ids here; perhaps later, higher up
485+
(assert (not (:query-id context)))
486+
(let [context (assoc context :query-id (str (java.util.UUID/randomUUID)))]
487+
(if use-preferred-streaming-method?
488+
(preferred-produce-streaming-body version query-map context)
489+
(deprecated-produce-streaming-body version query-map context))))
480490

481491
(pls/defn-validated object-exists? :- s/Bool
482492
"Returns true if an object exists."

0 commit comments

Comments
 (0)