一,mysqld_query简介

我们首先来看USDT,USDT即Userland Statically Defined Tracing,它是一种静态定义的跟踪技术,用于在用户空间应用程序中添加自定义的跟踪点。USDT利用DTrace(动态跟踪)框架,允许开发者在代码中定义跟踪点,并在需要时启用它们。这样,开发人员可以在不改变程序代码的情况下,对程序的运行时行为进行详细的分析和调试。

而我们的mysqld_query就利用了USDT来跟踪MySQL server查询操作。那么我们的MySQL server(或任何其他支持 DTrace 的软件)在编译时需要开启-DENABLE_DTRACE编译选项,以启用 DTrace 支持。

二,代码示例

#!/usr/bin/python

from __future__ import print_function
from bcc import BPF, USDT
from bcc.utils import printb
import sys

if len(sys.argv) < 2:
    print("USAGE: mysqld_latency PID")
    exit()
pid = sys.argv[1]
debug = 0

# 加载BPF程序
bpf_text = """
#include <uapi/linux/ptrace.h>
int do_trace(struct pt_regs *ctx) {
    uint64_t addr;
    char query[128];
    /* 
     * 从query-start探测器读取第一个参数,也就是查询。
     * 探针的格式如下:
     * query-start(query, connectionid, data
02-17 08:16