| #!/usr/bin/python |
| # |
| # nodejs_http_server Basic example of node.js USDT tracing. |
| # For Linux, uses BCC, BPF. Embedded C. |
| # |
| # USAGE: nodejs_http_server PID |
| # |
| # Copyright 2016 Netflix, Inc. |
| # Licensed under the Apache License, Version 2.0 (the "License") |
| |
| from __future__ import print_function |
| from bcc import BPF, USDT |
| import sys |
| |
| if len(sys.argv) < 2: |
| print("USAGE: nodejs_http_server PID") |
| exit() |
| pid = sys.argv[1] |
| debug = 0 |
| |
| # load BPF program |
| bpf_text = """ |
| #include <uapi/linux/ptrace.h> |
| int do_trace(struct pt_regs *ctx) { |
| uint64_t addr; |
| char path[128]={0}; |
| bpf_usdt_readarg(6, ctx, &addr); |
| bpf_probe_read(&path, sizeof(path), (void *)addr); |
| bpf_trace_printk("path:%s\\n", path); |
| return 0; |
| }; |
| """ |
| |
| # enable USDT probe from given PID |
| u = USDT(pid=int(pid)) |
| u.enable_probe(probe="http__server__request", fn_name="do_trace") |
| if debug: |
| print(u.get_text()) |
| print(bpf_text) |
| |
| # initialize BPF |
| b = BPF(text=bpf_text, usdt_contexts=[u]) |
| |
| # header |
| print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "ARGS")) |
| |
| # format output |
| while 1: |
| try: |
| (task, pid, cpu, flags, ts, msg) = b.trace_fields() |
| except ValueError: |
| print("value error") |
| continue |
| print("%-18.9f %-16s %-6d %s" % (ts, task, pid, msg)) |