Merge lp:~percona-toolkit-dev/percona-toolkit/pqd-json-anon into lp:~percona-toolkit-dev/percona-toolkit/release-2.2.4
- pqd-json-anon
- Merge into release-2.2.4
Proposed by
Daniel Nichter
Status: | Merged |
---|---|
Merged at revision: | 600 |
Proposed branch: | lp:~percona-toolkit-dev/percona-toolkit/pqd-json-anon |
Merge into: | lp:~percona-toolkit-dev/percona-toolkit/release-2.2.4 |
Diff against target: |
504 lines (+328/-51) 7 files modified
bin/pt-query-digest (+27/-21) lib/JSONReportFormatter.pm (+26/-22) t/pt-query-digest/json.t (+16/-4) t/pt-query-digest/samples/empty_report.txt (+0/-2) t/pt-query-digest/samples/json/slow002-anon.txt (+257/-0) t/pt-query-digest/samples/json/slow002.txt (+1/-1) t/pt-query-digest/samples/json/tcpdump021.txt (+1/-1) |
To merge this branch: | bzr merge lp:~percona-toolkit-dev/percona-toolkit/pqd-json-anon |
Related bugs: | |
Related blueprints: |
pt-query-digest anonymous JSON output
(Essential)
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Daniel Nichter | Approve | ||
Review via email:
|
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Daniel Nichter (daniel-nichter) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'bin/pt-query-digest' |
2 | --- bin/pt-query-digest 2013-06-27 19:06:24 +0000 |
3 | +++ bin/pt-query-digest 2013-07-01 21:05:30 +0000 |
4 | @@ -7900,10 +7900,12 @@ |
5 | distillate => $distill, |
6 | attribute => $groupby, |
7 | query_count => $times_seen, |
8 | - example => { |
9 | - query => substr($sample->{arg}, 0, $self->max_query_length), |
10 | - ts => $sample->{ts} ? parse_timestamp($sample->{ts}) : undef, |
11 | - }, |
12 | + $args{anon} ? () : ( |
13 | + example => { |
14 | + query => substr($sample->{arg}, 0, $self->max_query_length), |
15 | + ts => $sample->{ts} ? parse_timestamp($sample->{ts}) : undef, |
16 | + }, |
17 | + ), |
18 | }; |
19 | |
20 | my %metrics; |
21 | @@ -7981,19 +7983,21 @@ |
22 | push @tables, { status => $status, create => $create }; |
23 | } |
24 | |
25 | - if ( $item =~ m/^(?:[\(\s]*select|insert|replace)/ ) { |
26 | - if ( $item =~ m/^(?:insert|replace)/ ) { |
27 | + if ( !$args{anon} ) { |
28 | + if ( $item =~ m/^(?:[\(\s]*select|insert|replace)/ ) { |
29 | + if ( $item =~ m/^(?:insert|replace)/ ) { |
30 | + } |
31 | + else { |
32 | + |
33 | + } |
34 | } |
35 | else { |
36 | - |
37 | - } |
38 | - } |
39 | - else { |
40 | - my $converted = $qr->convert_to_select( |
41 | - $sample->{arg} || '', |
42 | - ); |
43 | - if ( $converted && $converted =~ m/^[\(\s]*select/i ) { |
44 | - $class->{example}->{as_select} = $converted; |
45 | + my $converted = $qr->convert_to_select( |
46 | + $sample->{arg} || '', |
47 | + ); |
48 | + if ( $converted && $converted =~ m/^[\(\s]*select/i ) { |
49 | + $class->{example}->{as_select} = $converted; |
50 | + } |
51 | } |
52 | } |
53 | } |
54 | @@ -14155,7 +14159,7 @@ |
55 | $print_header = 1; |
56 | } |
57 | |
58 | - my $report_class = $o->get('output') =~ m/\Ajson\z/i |
59 | + my $report_class = $o->get('output') =~ m/^json/i |
60 | ? 'JSONReportFormatter' |
61 | : 'QueryReportFormatter'; |
62 | my $qrf = $report_class->new( |
63 | @@ -14182,6 +14186,7 @@ |
64 | variations => $o->get('variations'), |
65 | group => { map { $_=>1 } qw(rusage date hostname files header) }, |
66 | resume => $resume, |
67 | + anon => $o->get('output') eq 'json-anon', |
68 | ); |
69 | } |
70 | |
71 | @@ -15611,11 +15616,12 @@ |
72 | |
73 | How to format and print the query analysis results. Accepted values are: |
74 | |
75 | - VALUE FORMAT |
76 | - ======= ============================== |
77 | - report Standard query analysis report |
78 | - slowlog MySQL slow log |
79 | - json JSON, on array per query class |
80 | + VALUE FORMAT |
81 | + ======= ============================== |
82 | + report Standard query analysis report |
83 | + slowlog MySQL slow log |
84 | + json JSON, on array per query class |
85 | + json-anon JSON without example queries |
86 | |
87 | The entire C<report> output can be disabled by specifying C<--no-report> |
88 | (see L<"--[no]report">), and its sections can be disabled or rearranged |
89 | |
90 | === modified file 'lib/JSONReportFormatter.pm' |
91 | --- lib/JSONReportFormatter.pm 2013-06-15 18:04:25 +0000 |
92 | +++ lib/JSONReportFormatter.pm 2013-07-01 21:05:30 +0000 |
93 | @@ -228,10 +228,12 @@ |
94 | distillate => $distill, |
95 | attribute => $groupby, |
96 | query_count => $times_seen, |
97 | - example => { |
98 | - query => substr($sample->{arg}, 0, $self->max_query_length), |
99 | - ts => $sample->{ts} ? parse_timestamp($sample->{ts}) : undef, |
100 | - }, |
101 | + $args{anon} ? () : ( |
102 | + example => { |
103 | + query => substr($sample->{arg}, 0, $self->max_query_length), |
104 | + ts => $sample->{ts} ? parse_timestamp($sample->{ts}) : undef, |
105 | + }, |
106 | + ), |
107 | }; |
108 | |
109 | my %metrics; |
110 | @@ -340,26 +342,28 @@ |
111 | push @tables, { status => $status, create => $create }; |
112 | } |
113 | |
114 | - # Convert possible non-SELECTs for EXPLAIN. |
115 | - if ( $item =~ m/^(?:[\(\s]*select|insert|replace)/ ) { |
116 | - if ( $item =~ m/^(?:insert|replace)/ ) { |
117 | - # Cannot convert or EXPLAIN INSERT or REPLACE queries. |
118 | + if ( !$args{anon} ) { |
119 | + # Convert possible non-SELECTs for EXPLAIN. |
120 | + if ( $item =~ m/^(?:[\(\s]*select|insert|replace)/ ) { |
121 | + if ( $item =~ m/^(?:insert|replace)/ ) { |
122 | + # Cannot convert or EXPLAIN INSERT or REPLACE queries. |
123 | + } |
124 | + else { |
125 | + # SELECT queries don't need to converted for EXPLAIN. |
126 | + |
127 | + # TODO: return the actual EXPLAIN plan |
128 | + # $self->explain_report($query, $vals->{default_db}); |
129 | + } |
130 | } |
131 | else { |
132 | - # SELECT queries don't need to converted for EXPLAIN. |
133 | - |
134 | - # TODO: return the actual EXPLAIN plan |
135 | - # $self->explain_report($query, $vals->{default_db}); |
136 | - } |
137 | - } |
138 | - else { |
139 | - # Query is not SELECT, INSERT, or REPLACE, so we can convert |
140 | - # it for EXPLAIN. |
141 | - my $converted = $qr->convert_to_select( |
142 | - $sample->{arg} || '', |
143 | - ); |
144 | - if ( $converted && $converted =~ m/^[\(\s]*select/i ) { |
145 | - $class->{example}->{as_select} = $converted; |
146 | + # Query is not SELECT, INSERT, or REPLACE, so we can convert |
147 | + # it for EXPLAIN. |
148 | + my $converted = $qr->convert_to_select( |
149 | + $sample->{arg} || '', |
150 | + ); |
151 | + if ( $converted && $converted =~ m/^[\(\s]*select/i ) { |
152 | + $class->{example}->{as_select} = $converted; |
153 | + } |
154 | } |
155 | } |
156 | } |
157 | |
158 | === modified file 't/pt-query-digest/json.t' |
159 | --- t/pt-query-digest/json.t 2013-05-20 23:44:44 +0000 |
160 | +++ t/pt-query-digest/json.t 2013-07-01 21:05:30 +0000 |
161 | @@ -20,12 +20,12 @@ |
162 | |
163 | my @args = qw(--output json); |
164 | my $sample = "$trunk/t/lib/samples"; |
165 | -my $results = "t/pt-query-digest/samples"; |
166 | +my $results = "t/pt-query-digest/samples/json"; |
167 | |
168 | ok( |
169 | no_diff( |
170 | sub { pt_query_digest::main(@args, "$sample/slowlogs/empty") }, |
171 | - "$results/empty_report.txt", |
172 | + "t/pt-query-digest/samples/empty_report.txt", |
173 | ), |
174 | 'json output for empty log' |
175 | ) or diag($test_diff); |
176 | @@ -33,18 +33,30 @@ |
177 | ok( |
178 | no_diff( |
179 | sub { pt_query_digest::main(@args, "$sample/slowlogs/slow002.txt") }, |
180 | - "$results/output_json_slow002.txt" |
181 | + "$results/slow002.txt", |
182 | + sed => [ qq/'s!$trunk!TRUNK!'/ ], |
183 | ), |
184 | 'json output for slow002' |
185 | ) or diag($test_diff); |
186 | |
187 | +ok( |
188 | + no_diff( |
189 | + sub { pt_query_digest::main(qw(--output json-anon), |
190 | + "$sample/slowlogs/slow002.txt") }, |
191 | + "$results/slow002-anon.txt", |
192 | + sed => [ qq/'s!$trunk!TRUNK!'/ ], |
193 | + ), |
194 | + 'json-anon output for slow002' |
195 | +) or diag($test_diff); |
196 | + |
197 | # --type tcpdump |
198 | |
199 | ok( |
200 | no_diff( |
201 | sub { pt_query_digest::main(qw(--type tcpdump --limit 10 --watch-server 127.0.0.1:12345), |
202 | @args, "$sample/tcpdump/tcpdump021.txt") }, |
203 | - "$results/output_json_tcpdump021.txt", |
204 | + "$results/tcpdump021.txt", |
205 | + sed => [ qq/'s!$trunk!TRUNK!'/ ], |
206 | ), |
207 | 'json output for for tcpdump021', |
208 | ) or diag($test_diff); |
209 | |
210 | === modified file 't/pt-query-digest/samples/empty_report.txt' |
211 | --- t/pt-query-digest/samples/empty_report.txt 2013-06-17 06:40:08 +0000 |
212 | +++ t/pt-query-digest/samples/empty_report.txt 2013-07-01 21:05:30 +0000 |
213 | @@ -1,2 +0,0 @@ |
214 | - |
215 | -# No events processed. |
216 | |
217 | === added directory 't/pt-query-digest/samples/json' |
218 | === added file 't/pt-query-digest/samples/json/slow002-anon.txt' |
219 | --- t/pt-query-digest/samples/json/slow002-anon.txt 1970-01-01 00:00:00 +0000 |
220 | +++ t/pt-query-digest/samples/json/slow002-anon.txt 2013-07-01 21:05:30 +0000 |
221 | @@ -0,0 +1,257 @@ |
222 | + |
223 | +{ |
224 | + "classes" : [ |
225 | + { |
226 | + "attribute" : "fingerprint", |
227 | + "checksum" : "66825DDC008FFA89", |
228 | + "distillate" : "UPDATE db?.tuningdetail_?_? db?.gonzo", |
229 | + "fingerprint" : "update d?tuningdetail_?_? n inner join d?gonzo a using(gonzo) set n.column? = a.column?, n.word? = a.word?", |
230 | + "metrics" : { |
231 | + "Filesort" : { |
232 | + "yes" : "0" |
233 | + }, |
234 | + "Filesort_on_disk" : { |
235 | + "yes" : "0" |
236 | + }, |
237 | + "Full_join" : { |
238 | + "yes" : "0" |
239 | + }, |
240 | + "Full_scan" : { |
241 | + "yes" : "1" |
242 | + }, |
243 | + "Lock_time" : { |
244 | + "avg" : "0.000091", |
245 | + "max" : "0.000091", |
246 | + "median" : "0.000091", |
247 | + "min" : "0.000091", |
248 | + "pct" : "0.125000", |
249 | + "pct_95" : "0.000091", |
250 | + "stddev" : "0.000000", |
251 | + "sum" : "0.000091" |
252 | + }, |
253 | + "Merge_passes" : { |
254 | + "avg" : "0", |
255 | + "max" : "0", |
256 | + "median" : "0", |
257 | + "min" : "0", |
258 | + "pct" : "0", |
259 | + "pct_95" : "0", |
260 | + "stddev" : "0", |
261 | + "sum" : "0" |
262 | + }, |
263 | + "QC_Hit" : { |
264 | + "yes" : "0" |
265 | + }, |
266 | + "Query_length" : { |
267 | + "avg" : "129", |
268 | + "max" : "129", |
269 | + "median" : "129", |
270 | + "min" : "129", |
271 | + "pct" : "0", |
272 | + "pct_95" : "129", |
273 | + "stddev" : "0", |
274 | + "sum" : "129" |
275 | + }, |
276 | + "Query_time" : { |
277 | + "avg" : "0.726052", |
278 | + "max" : "0.726052", |
279 | + "median" : "0.726052", |
280 | + "min" : "0.726052", |
281 | + "pct" : "0.125000", |
282 | + "pct_95" : "0.726052", |
283 | + "stddev" : "0.000000", |
284 | + "sum" : "0.726052" |
285 | + }, |
286 | + "Rows_examined" : { |
287 | + "avg" : "62951", |
288 | + "max" : "62951", |
289 | + "median" : "62951", |
290 | + "min" : "62951", |
291 | + "pct" : "0", |
292 | + "pct_95" : "62951", |
293 | + "stddev" : "0", |
294 | + "sum" : "62951" |
295 | + }, |
296 | + "Rows_sent" : { |
297 | + "avg" : "0", |
298 | + "max" : "0", |
299 | + "median" : "0", |
300 | + "min" : "0", |
301 | + "pct" : "0", |
302 | + "pct_95" : "0", |
303 | + "stddev" : "0", |
304 | + "sum" : "0" |
305 | + }, |
306 | + "Tmp_table" : { |
307 | + "yes" : "0" |
308 | + }, |
309 | + "Tmp_table_on_disk" : { |
310 | + "yes" : "0" |
311 | + }, |
312 | + "db" : { |
313 | + "value" : "db1" |
314 | + }, |
315 | + "host" : { |
316 | + "value" : "" |
317 | + }, |
318 | + "user" : { |
319 | + "value" : "[SQL_SLAVE]" |
320 | + } |
321 | + }, |
322 | + "query_count" : 1, |
323 | + "tables" : [ |
324 | + { |
325 | + "create" : "SHOW CREATE TABLE `db2`.`tuningdetail_21_265507`\\G", |
326 | + "status" : "SHOW TABLE STATUS FROM `db2` LIKE 'tuningdetail_21_265507'\\G" |
327 | + }, |
328 | + { |
329 | + "create" : "SHOW CREATE TABLE `db1`.`gonzo`\\G", |
330 | + "status" : "SHOW TABLE STATUS FROM `db1` LIKE 'gonzo'\\G" |
331 | + } |
332 | + ], |
333 | + "ts_max" : "2007-12-18 11:48:27", |
334 | + "ts_min" : "2007-12-18 11:48:27" |
335 | + } |
336 | + ], |
337 | + "global" : { |
338 | + "files" : [ |
339 | + { |
340 | + "name" : "TRUNK/t/lib/samples/slowlogs/slow002.txt", |
341 | + "size" : 3841 |
342 | + } |
343 | + ], |
344 | + "metrics" : { |
345 | + "Filesort" : { |
346 | + "cnt" : "0" |
347 | + }, |
348 | + "Filesort_on_disk" : { |
349 | + "cnt" : "0" |
350 | + }, |
351 | + "Full_join" : { |
352 | + "cnt" : "0" |
353 | + }, |
354 | + "Full_scan" : { |
355 | + "cnt" : "1" |
356 | + }, |
357 | + "InnoDB_IO_r_bytes" : { |
358 | + "avg" : "0", |
359 | + "max" : "0", |
360 | + "median" : "0", |
361 | + "min" : "0", |
362 | + "pct_95" : "0", |
363 | + "stddev" : "0", |
364 | + "sum" : "0" |
365 | + }, |
366 | + "InnoDB_IO_r_ops" : { |
367 | + "avg" : "0", |
368 | + "max" : "0", |
369 | + "median" : "0", |
370 | + "min" : "0", |
371 | + "pct_95" : "0", |
372 | + "stddev" : "0", |
373 | + "sum" : "0" |
374 | + }, |
375 | + "InnoDB_IO_r_wait" : { |
376 | + "avg" : "0.000000", |
377 | + "max" : "0.000000", |
378 | + "median" : "0.000000", |
379 | + "min" : "0.000000", |
380 | + "pct_95" : "0.000000", |
381 | + "stddev" : "0.000000", |
382 | + "sum" : "0.000000" |
383 | + }, |
384 | + "InnoDB_pages_distinct" : { |
385 | + "avg" : "17", |
386 | + "max" : "24", |
387 | + "median" : "17", |
388 | + "min" : "11", |
389 | + "pct_95" : "23", |
390 | + "stddev" : "3", |
391 | + "sum" : "107" |
392 | + }, |
393 | + "InnoDB_queue_wait" : { |
394 | + "avg" : "0.000000", |
395 | + "max" : "0.000000", |
396 | + "median" : "0.000000", |
397 | + "min" : "0.000000", |
398 | + "pct_95" : "0.000000", |
399 | + "stddev" : "0.000000", |
400 | + "sum" : "0.000000" |
401 | + }, |
402 | + "InnoDB_rec_lock_wait" : { |
403 | + "avg" : "0.000000", |
404 | + "max" : "0.000000", |
405 | + "median" : "0.000000", |
406 | + "min" : "0.000000", |
407 | + "pct_95" : "0.000000", |
408 | + "stddev" : "0.000000", |
409 | + "sum" : "0.000000" |
410 | + }, |
411 | + "Lock_time" : { |
412 | + "avg" : "0.000038", |
413 | + "max" : "0.000091", |
414 | + "median" : "0.000026", |
415 | + "min" : "0.000000", |
416 | + "pct_95" : "0.000089", |
417 | + "stddev" : "0.000028", |
418 | + "sum" : "0.000304" |
419 | + }, |
420 | + "Merge_passes" : { |
421 | + "avg" : "0", |
422 | + "max" : "0", |
423 | + "median" : "0", |
424 | + "min" : "0", |
425 | + "pct_95" : "0", |
426 | + "stddev" : "0", |
427 | + "sum" : "0" |
428 | + }, |
429 | + "QC_Hit" : { |
430 | + "cnt" : "0" |
431 | + }, |
432 | + "Query_length" : { |
433 | + "avg" : "62", |
434 | + "max" : "129", |
435 | + "median" : "62", |
436 | + "min" : "5", |
437 | + "pct_95" : "124", |
438 | + "stddev" : "34", |
439 | + "sum" : "502" |
440 | + }, |
441 | + "Query_time" : { |
442 | + "avg" : "0.095260", |
443 | + "max" : "0.726052", |
444 | + "median" : "0.000516", |
445 | + "min" : "0.000012", |
446 | + "pct_95" : "0.705093", |
447 | + "stddev" : "0.231765", |
448 | + "sum" : "0.762080" |
449 | + }, |
450 | + "Rows_examined" : { |
451 | + "avg" : "7868", |
452 | + "max" : "62951", |
453 | + "median" : "0", |
454 | + "min" : "0", |
455 | + "pct_95" : "61003", |
456 | + "stddev" : "20174", |
457 | + "sum" : "62951" |
458 | + }, |
459 | + "Rows_sent" : { |
460 | + "avg" : "0", |
461 | + "max" : "0", |
462 | + "median" : "0", |
463 | + "min" : "0", |
464 | + "pct_95" : "0", |
465 | + "stddev" : "0", |
466 | + "sum" : "0" |
467 | + }, |
468 | + "Tmp_table" : { |
469 | + "cnt" : "0" |
470 | + }, |
471 | + "Tmp_table_on_disk" : { |
472 | + "cnt" : "0" |
473 | + } |
474 | + }, |
475 | + "query_count" : 8, |
476 | + "unique_query_count" : 7 |
477 | + } |
478 | +} |
479 | |
480 | === renamed file 't/pt-query-digest/samples/output_json_slow002.txt' => 't/pt-query-digest/samples/json/slow002.txt' |
481 | --- t/pt-query-digest/samples/output_json_slow002.txt 2013-06-17 06:40:08 +0000 |
482 | +++ t/pt-query-digest/samples/json/slow002.txt 2013-07-01 21:05:30 +0000 |
483 | @@ -121,7 +121,7 @@ |
484 | "global" : { |
485 | "files" : [ |
486 | { |
487 | - "name" : "/Users/daniel/p/release-2.2.3/t/lib/samples/slowlogs/slow002.txt", |
488 | + "name" : "TRUNK/t/lib/samples/slowlogs/slow002.txt", |
489 | "size" : 3841 |
490 | } |
491 | ], |
492 | |
493 | === renamed file 't/pt-query-digest/samples/output_json_tcpdump021.txt' => 't/pt-query-digest/samples/json/tcpdump021.txt' |
494 | --- t/pt-query-digest/samples/output_json_tcpdump021.txt 2013-06-17 06:40:08 +0000 |
495 | +++ t/pt-query-digest/samples/json/tcpdump021.txt 2013-07-01 21:05:30 +0000 |
496 | @@ -187,7 +187,7 @@ |
497 | "global" : { |
498 | "files" : [ |
499 | { |
500 | - "name" : "/Users/daniel/p/release-2.2.3/t/lib/samples/tcpdump/tcpdump021.txt", |
501 | + "name" : "TRUNK/t/lib/samples/tcpdump/tcpdump021.txt", |
502 | "size" : 2827 |
503 | } |
504 | ], |