xref: /aosp_15_r20/external/bcc/examples/tracing/nodejs_http_server.py (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1#!/usr/bin/python
2#
3# nodejs_http_server    Basic example of node.js USDT tracing.
4#                       For Linux, uses BCC, BPF. Embedded C.
5#
6# USAGE: nodejs_http_server PID
7#
8# Copyright 2016 Netflix, Inc.
9# Licensed under the Apache License, Version 2.0 (the "License")
10
11from __future__ import print_function
12from bcc import BPF, USDT
13from bcc.utils import printb
14import sys
15
16if len(sys.argv) < 2:
17    print("USAGE: nodejs_http_server PID")
18    exit()
19pid = sys.argv[1]
20debug = 0
21
22# load BPF program
23bpf_text = """
24#include <uapi/linux/ptrace.h>
25int do_trace(struct pt_regs *ctx) {
26    uint64_t addr;
27    char path[128]={0};
28    bpf_usdt_readarg(6, ctx, &addr);
29    bpf_probe_read_user(&path, sizeof(path), (void *)addr);
30    bpf_trace_printk("path:%s\\n", path);
31    return 0;
32};
33"""
34
35# enable USDT probe from given PID
36u = USDT(pid=int(pid))
37u.enable_probe(probe="http__server__request", fn_name="do_trace")
38if debug:
39    print(u.get_text())
40    print(bpf_text)
41
42# initialize BPF
43b = BPF(text=bpf_text, usdt_contexts=[u])
44
45# header
46print("%-18s %-16s %-6s %s" % ("TIME(s)", "COMM", "PID", "ARGS"))
47
48# format output
49while 1:
50    try:
51        (task, pid, cpu, flags, ts, msg) = b.trace_fields()
52    except ValueError:
53        print("value error")
54        continue
55    except KeyboardInterrupt:
56        exit()
57    printb(b"%-18.9f %-16s %-6d %s" % (ts, task, pid, msg))
58