1#!/usr/bin/python 2# 3# mysqld_query Trace MySQL server queries. Example of USDT tracing. 4# For Linux, uses BCC, BPF. Embedded C. 5# 6# USAGE: mysqld_query PID 7# 8# This uses USDT probes, and needs a MySQL server with -DENABLE_DTRACE=1. 9# 10# Copyright 2016 Netflix, Inc. 11# Licensed under the Apache License, Version 2.0 (the "License") 12 13from __future__ import print_function 14from bcc import BPF, USDT 15from bcc.utils import printb 16import sys 17 18if len(sys.argv) < 2: 19 print("USAGE: mysqld_latency PID") 20 exit() 21pid = sys.argv[1] 22debug = 0 23 24# load BPF program 25bpf_text = """ 26#include <uapi/linux/ptrace.h> 27int do_trace(struct pt_regs *ctx) { 28 uint64_t addr; 29 char query[128]; 30 /* 31 * Read the first argument from the query-start probe, which is the query. 32 * The format of this probe is: 33 * query-start(query, connectionid, database, user, host) 34 * see: https://dev.mysql.com/doc/refman/5.7/en/dba-dtrace-ref-query.html 35 */ 36 bpf_usdt_readarg(1, ctx, &addr); 37 bpf_probe_read_user(&query, sizeof(query), (void *)addr); 38 bpf_trace_printk("%s\\n", query); 39 return 0; 40}; 41""" 42 43# enable USDT probe from given PID 44u = USDT(pid=int(pid)) 45u.enable_probe(probe="query__start", fn_name="do_trace") 46if debug: 47 print(u.get_text()) 48 print(bpf_text) 49 50# initialize BPF 51b = BPF(text=bpf_text, usdt_contexts=[u]) 52 53# header 54print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "QUERY")) 55 56# format output 57while 1: 58 try: 59 (task, pid, cpu, flags, ts, msg) = b.trace_fields() 60 except ValueError: 61 print("value error") 62 continue 63 except KeyboardInterrupt: 64 exit() 65 printb(b"%-18.9f %-16s %-6d %s" % (ts, task, pid, msg)) 66