From 07170a73d998f1048999a729dc24f15b08812deb Mon Sep 17 00:00:00 2001 From: Nicolas Savoire Date: Mon, 26 Aug 2024 02:53:01 +0000 Subject: [PATCH] Allocation profiling POC --- host/host.go | 2 + main.go | 6 + reporter/datadog_reporter.go | 21 +++- reporter/iface.go | 2 +- reporter/otlp_reporter.go | 5 +- support/ebpf/dotnet_tracer.ebpf.c | 46 ++++++++ support/ebpf/extmaps.h | 1 + support/ebpf/hotspot_tracer.ebpf.c | 38 +++++++ support/ebpf/interpreter_dispatcher.ebpf.c | 74 +++++++++++++ support/ebpf/native_stack_trace.ebpf.c | 122 +++++++++++++++++++++ support/ebpf/perl_tracer.ebpf.c | 71 ++++++++++++ support/ebpf/php_tracer.ebpf.c | 58 ++++++++++ support/ebpf/python_tracer.ebpf.c | 43 ++++++++ support/ebpf/ruby_tracer.ebpf.c | 58 ++++++++++ support/ebpf/tracemgmt.h | 27 +++++ support/ebpf/tracer.ebpf.x86 | Bin 296832 -> 460136 bytes support/ebpf/types.h | 3 + support/ebpf/v8_tracer.ebpf.c | 46 ++++++++ tracehandler/tracehandler.go | 2 +- tracer/tracepoints.go | 11 ++ tracer/tracer.go | 27 ++++- 21 files changed, 650 insertions(+), 13 deletions(-) diff --git a/host/host.go b/host/host.go index 218d931..53f60a6 100644 --- a/host/host.go +++ b/host/host.go @@ -58,4 +58,6 @@ type Trace struct { TID util.TID APMTraceID libpf.APMTraceID APMTransactionID libpf.APMTransactionID + AllocSize uint64 + AllocAddress libpf.Address } diff --git a/main.go b/main.go index 913d93d..c3095fb 100644 --- a/main.go +++ b/main.go @@ -403,6 +403,12 @@ func mainWithExitCode() exitCode { return exitFailure } + if err := trc.AttachAllocationHook(); err != nil { + msg := fmt.Sprintf("Failed to attach allocation hook: %v", err) + log.Error(msg) + return exitFailure + } + // This log line is used in our system tests to verify if that the agent has started. So if you // change this log line update also the system test. log.Printf("Attached sched monitor") diff --git a/reporter/datadog_reporter.go b/reporter/datadog_reporter.go index d05d740..b67fa64 100644 --- a/reporter/datadog_reporter.go +++ b/reporter/datadog_reporter.go @@ -78,12 +78,19 @@ type DatadogReporter struct { // ReportTraceEvent enqueues reported trace events for the Datadog reporter. func (r *DatadogReporter) ReportTraceEvent(trace *libpf.Trace, timestamp libpf.UnixTime64, comm, podName, containerID, containerName, apmServiceName string, - pid util.PID, tid util.TID) { + pid util.PID, tid util.TID, allocSize uint64, allocAddress libpf.Address) { traceEvents := r.traceEvents.WLock() defer r.traceEvents.WUnlock(&traceEvents) + allocCount := uint64(0) + if allocSize != 0 { + allocCount = 1 + } + if tr, exists := (*traceEvents)[trace.Hash]; exists { tr.timestamps = append(tr.timestamps, uint64(timestamp)) + tr.allocCount += allocCount + tr.allocSize += allocSize (*traceEvents)[trace.Hash] = tr return } @@ -100,6 +107,8 @@ func (r *DatadogReporter) ReportTraceEvent(trace *libpf.Trace, timestamp libpf.U pid: pid, tid: tid, timestamps: []uint64{uint64(timestamp)}, + allocSize: allocSize, + allocCount: allocCount, } } @@ -369,8 +378,11 @@ func (r *DatadogReporter) getPprofProfile() (profile *pprofile.Profile, funcMap := make(map[funcInfo]*pprofile.Function) profile = &pprofile.Profile{ - SampleType: []*pprofile.ValueType{{Type: "cpu-samples", Unit: "count"}, - {Type: "cpu-time", Unit: "nanoseconds"}}, + SampleType: []*pprofile.ValueType{ + {Type: "cpu-samples", Unit: "count"}, + {Type: "cpu-time", Unit: "nanoseconds"}, + {Type: "alloc-samples", Unit: "count"}, + {Type: "alloc-space", Unit: "bytes"}}, Sample: make([]*pprofile.Sample, 0, numSamples), PeriodType: &pprofile.ValueType{Type: "cpu-time", Unit: "nanoseconds"}, Period: int64(r.samplingPeriod), @@ -515,7 +527,8 @@ func (r *DatadogReporter) getPprofProfile() (profile *pprofile.Profile, addTraceLabels(sample.Label, traceInfo) count := int64(len(traceInfo.timestamps)) - sample.Value = append(sample.Value, count, count*int64(r.samplingPeriod)) + sample.Value = append(sample.Value, count, count*int64(r.samplingPeriod), + int64(traceInfo.allocCount), int64(traceInfo.allocSize)) profile.Sample = append(profile.Sample, sample) totalSampleCount += len(traceInfo.timestamps) } diff --git a/reporter/iface.go b/reporter/iface.go index 23d7b94..8cd551e 100644 --- a/reporter/iface.go +++ b/reporter/iface.go @@ -42,7 +42,7 @@ type TraceReporter interface { // enqueued for reporting, and false if the event was ignored. ReportTraceEvent(trace *libpf.Trace, timestamp libpf.UnixTime64, comm, podName, containerID, containerName, apmServiceName string, - pid util.PID, tid util.TID) + pid util.PID, tid util.TID, allocSize uint64, allocAddress libpf.Address) // SupportsReportTraceEvent returns true if the reporter supports reporting trace events // via ReportTraceEvent(). diff --git a/reporter/otlp_reporter.go b/reporter/otlp_reporter.go index 7e52b76..090304f 100644 --- a/reporter/otlp_reporter.go +++ b/reporter/otlp_reporter.go @@ -69,6 +69,8 @@ type traceFramesCounts struct { pid util.PID tid util.TID timestamps []uint64 // in nanoseconds + allocCount uint64 + allocSize uint64 } // OTLPReporter receives and transforms information to be OTLP/profiles compliant. @@ -126,7 +128,8 @@ func (r *OTLPReporter) SupportsReportTraceEvent() bool { return true } // ReportTraceEvent enqueues reported trace events for the OTLP reporter. func (r *OTLPReporter) ReportTraceEvent(trace *libpf.Trace, timestamp libpf.UnixTime64, comm, podName, containerID, - containerName, apmServiceName string, pid util.PID, tid util.TID) { + containerName, apmServiceName string, pid util.PID, tid util.TID, + allocSize uint64, allocAddress libpf.Address) { traceEvents := r.traceEvents.WLock() defer r.traceEvents.WUnlock(&traceEvents) diff --git a/support/ebpf/dotnet_tracer.ebpf.c b/support/ebpf/dotnet_tracer.ebpf.c index 84b3ebc..212d400 100644 --- a/support/ebpf/dotnet_tracer.ebpf.c +++ b/support/ebpf/dotnet_tracer.ebpf.c @@ -288,3 +288,49 @@ int unwind_dotnet(struct pt_regs *ctx) { DEBUG_PRINT("dotnet: tail call for next frame unwinder (%d) failed", unwinder); return -1; } + +SEC("uprobe/unwind_dotnet") +int unwind_dotnet_uprobe(struct pt_regs *ctx) { + PerCPURecord *record = get_per_cpu_record(); + if (!record) { + return -1; + } + + Trace *trace = &record->trace; + u32 pid = trace->pid; + DEBUG_PRINT("==== unwind_dotnet %d ====", trace->stack_len); + + int unwinder = PROG_UNWIND_STOP; + ErrorCode error = ERR_OK; + DotnetProcInfo *vi = bpf_map_lookup_elem(&dotnet_procs, &pid); + if (!vi) { + DEBUG_PRINT("dotnet: no DotnetProcInfo for this pid"); + error = ERR_DOTNET_NO_PROC_INFO; + increment_metric(metricID_UnwindDotnetErrNoProcInfo); + goto exit; + } + + record->ratelimitAction = RATELIMIT_ACTION_FAST; + increment_metric(metricID_UnwindDotnetAttempts); + +#pragma unroll + for (int i = 0; i < DOTNET_FRAMES_PER_PROGRAM; i++) { + unwinder = PROG_UNWIND_STOP; + + error = unwind_one_dotnet_frame(record, vi, i == 0); + if (error) { + break; + } + + error = get_next_unwinder_after_native_frame(record, &unwinder); + if (error || unwinder != PROG_UNWIND_DOTNET) { + break; + } + } + +exit: + record->state.unwind_error = error; + tail_call_uprobe(ctx, unwinder); + DEBUG_PRINT("dotnet: tail call for next frame unwinder (%d) failed", unwinder); + return -1; +} diff --git a/support/ebpf/extmaps.h b/support/ebpf/extmaps.h index 76a83f5..c794dec 100644 --- a/support/ebpf/extmaps.h +++ b/support/ebpf/extmaps.h @@ -7,6 +7,7 @@ // References to map definitions in *.ebpf.c. extern bpf_map_def progs; +extern bpf_map_def progs_uprobe; extern bpf_map_def per_cpu_records; extern bpf_map_def pid_page_to_mapping_info; extern bpf_map_def metrics; diff --git a/support/ebpf/hotspot_tracer.ebpf.c b/support/ebpf/hotspot_tracer.ebpf.c index 11847e4..e3df9f5 100644 --- a/support/ebpf/hotspot_tracer.ebpf.c +++ b/support/ebpf/hotspot_tracer.ebpf.c @@ -861,3 +861,41 @@ int unwind_hotspot(struct pt_regs *ctx) { DEBUG_PRINT("jvm: tail call for next frame unwinder (%d) failed", unwinder); return -1; } + +SEC("uprobe/unwind_hotspot") +int unwind_hotspot_uprobe(struct pt_regs *ctx) { + PerCPURecord *record = get_per_cpu_record(); + if (!record) + return -1; + + Trace *trace = &record->trace; + pid_t pid = trace->pid; + DEBUG_PRINT("==== jvm: unwind %d ====", trace->stack_len); + + HotspotProcInfo *ji = bpf_map_lookup_elem(&hotspot_procs, &pid); + if (!ji) { + DEBUG_PRINT("jvm: no HotspotProcInfo for this pid"); + return 0; + } + + int unwinder = PROG_UNWIND_STOP; + ErrorCode error = ERR_OK; +#pragma unroll + for (int i = 0; i < HOTSPOT_FRAMES_PER_PROGRAM; i++) { + unwinder = PROG_UNWIND_STOP; + error = hotspot_unwind_one_frame(record, ji); + if (error) { + break; + } + + error = get_next_unwinder_after_native_frame(record, &unwinder); + if (error || unwinder != PROG_UNWIND_HOTSPOT) { + break; + } + } + + record->state.unwind_error = error; + tail_call_uprobe(ctx, unwinder); + DEBUG_PRINT("jvm: tail call for next frame unwinder (%d) failed", unwinder); + return -1; +} diff --git a/support/ebpf/interpreter_dispatcher.ebpf.c b/support/ebpf/interpreter_dispatcher.ebpf.c index e2c062d..e6a18f9 100644 --- a/support/ebpf/interpreter_dispatcher.ebpf.c +++ b/support/ebpf/interpreter_dispatcher.ebpf.c @@ -33,6 +33,14 @@ bpf_map_def SEC("maps") progs = { .max_entries = NUM_TRACER_PROGS, }; +// progs maps from a program ID to an eBPF program +bpf_map_def SEC("maps") progs_uprobe = { + .type = BPF_MAP_TYPE_PROG_ARRAY, + .key_size = sizeof(u32), + .value_size = sizeof(u32), + .max_entries = NUM_TRACER_PROGS, +}; + // report_events notifies user space about events (GENERIC_PID and TRACES_FOR_SYMBOLIZATION). // // As a key the CPU number is used and the value represents a perf event file descriptor. @@ -238,6 +246,72 @@ int unwind_stop(struct pt_regs *ctx) { return 0; } +SEC("uprobe/unwind_stop") +int unwind_stop_uprobe(struct pt_regs *ctx) { + PerCPURecord *record = get_per_cpu_record(); + if (!record) + return -1; + Trace *trace = &record->trace; + UnwindState *state = &record->state; + + maybe_add_apm_info(trace); + + // If the stack is otherwise empty, push an error for that: we should + // never encounter empty stacks for successful unwinding. + if (trace->stack_len == 0 && trace->kernel_stack_id < 0) { + DEBUG_PRINT("unwind_stop called but the stack is empty"); + increment_metric(metricID_ErrEmptyStack); + if (!state->unwind_error) { + state->unwind_error = ERR_EMPTY_STACK; + } + } + + // If unwinding was aborted due to a critical error, push an error frame. + if (state->unwind_error) { + push_error(&record->trace, state->unwind_error); + } + + switch (state->error_metric) { + case -1: + // No Error + break; + case metricID_UnwindNativeErrWrongTextSection:; + if (report_pid(ctx, trace->pid, record->ratelimitAction)) { + increment_metric(metricID_NumUnknownPC); + } + // Fallthrough to report the error + default: + increment_metric(state->error_metric); + } + + // TEMPORARY HACK + // + // If we ended up with a trace that consists of only a single error frame, drop it. + // This is required as long as the process manager provides the option to filter out + // error frames, to prevent empty traces from being sent. While it might seem that this + // filtering should belong into the HA code that does the filtering, it is actually + // surprisingly hard to implement that way: since traces and their counts are reported + // through different data structures, we'd have to keep a list of known empty traces to + // also prevent the corresponding trace counts to be sent out. OTOH, if we do it here, + // this is trivial. + if (trace->stack_len == 1 && trace->kernel_stack_id < 0 && state->unwind_error) { + u32 syscfg_key = 0; + SystemConfig* syscfg = bpf_map_lookup_elem(&system_config, &syscfg_key); + if (!syscfg) { + return -1; // unreachable + } + + if (syscfg->drop_error_only_traces) { + return 0; + } + } + // TEMPORARY HACK END + + send_trace(ctx, trace); + + return 0; +} + char _license[] SEC("license") = "GPL"; // this number will be interpreted by the elf loader // to set the current running kernel version diff --git a/support/ebpf/native_stack_trace.ebpf.c b/support/ebpf/native_stack_trace.ebpf.c index bba57bb..c25bdf0 100644 --- a/support/ebpf/native_stack_trace.ebpf.c +++ b/support/ebpf/native_stack_trace.ebpf.c @@ -801,6 +801,58 @@ int unwind_native(struct pt_regs *ctx) { return -1; } +SEC("uprobe/unwind_native") +int unwind_native_uprobe(struct pt_regs *ctx) { + PerCPURecord *record = get_per_cpu_record(); + if (!record) + return -1; + + Trace *trace = &record->trace; + int unwinder; + ErrorCode error; +#pragma unroll + for (int i = 0; i < NATIVE_FRAMES_PER_PROGRAM; i++) { + unwinder = PROG_UNWIND_STOP; + + // Unwind native code + u32 frame_idx = trace->stack_len; + DEBUG_PRINT("==== unwind_native %d ====", frame_idx); + increment_metric(metricID_UnwindNativeAttempts); + + // Push frame first. The PC is valid because a text section mapping was found. + DEBUG_PRINT("Pushing %llx %llx to position %u on stack", + record->state.text_section_id, record->state.text_section_offset, + trace->stack_len); + error = push_native(trace, record->state.text_section_id, record->state.text_section_offset, + record->state.return_address); + if (error) { + DEBUG_PRINT("failed to push native frame"); + break; + } + + // Unwind the native frame using stack deltas. Stop if no next frame. + bool stop; + error = unwind_one_frame(trace->pid, frame_idx, &record->state, &stop); + if (error || stop) { + break; + } + + // Continue unwinding + DEBUG_PRINT(" pc: %llx sp: %llx fp: %llx", record->state.pc, record->state.sp, record->state.fp); + error = get_next_unwinder_after_native_frame(record, &unwinder); + if (error || unwinder != PROG_UNWIND_NATIVE) { + break; + } + } + + // Tail call needed for recursion, switching to interpreter unwinder, or reporting + // trace due to end-of-trace or error. The unwinder program index is set accordingly. + record->state.unwind_error = error; + tail_call_uprobe(ctx, unwinder); + DEBUG_PRINT("bpf_tail call failed for %d in unwind_native", unwinder); + return -1; +} + static inline int collect_trace(struct pt_regs *ctx) { // Get the PID and TGID register. @@ -859,7 +911,77 @@ int collect_trace(struct pt_regs *ctx) { return -1; } +static inline +int collect_allocation_trace(struct pt_regs *ctx) { + // Get the PID and TGID register. + u64 id = bpf_get_current_pid_tgid(); + u64 tid = id & 0xFFFFFFFF; + u64 pid = id >> 32; + + if (pid == 0) { + return 0; + } + + u64 ktime = bpf_ktime_get_ns(); + + DEBUG_PRINT("==== do_perf_event ===="); + + // The trace is reused on each call to this function so we have to reset the + // variables used to maintain state. + DEBUG_PRINT("Resetting CPU record"); + PerCPURecord *record = get_pristine_per_cpu_record(); + if (!record) { + return -1; + } + + Trace *trace = &record->trace; + trace->tid = tid; + trace->pid = pid; + trace->ktime = ktime; + trace->alloc_addr = ctx->si; + trace->alloc_size = ctx->dx; + + if (bpf_get_current_comm(&(trace->comm), sizeof(trace->comm)) < 0) { + increment_metric(metricID_ErrBPFCurrentComm); + } + + // Get the kernel mode stack trace first + trace->kernel_stack_id = bpf_get_stackid(ctx, &kernel_stackmap, BPF_F_REUSE_STACKID); + DEBUG_PRINT("kernel stack id = %d", trace->kernel_stack_id); + + // Recursive unwind frames + int unwinder = PROG_UNWIND_STOP; + bool has_usermode_regs = false; + ErrorCode error = get_usermode_regs(ctx, &record->state, &has_usermode_regs); + if (error || !has_usermode_regs) { + goto exit; + } + + if (!pid_information_exists(ctx, pid)) { + if (report_pid(ctx, pid, RATELIMIT_ACTION_DEFAULT)) { + increment_metric(metricID_NumProcNew); + } + return 0; + } + error = get_next_unwinder_after_native_frame(record, &unwinder); + +exit: + record->state.unwind_error = error; + tail_call_uprobe(ctx, unwinder); + DEBUG_PRINT("bpf_tail call failed for %d in native_tracer_entry", unwinder); + return -1; +} + SEC("perf_event/native_tracer_entry") int native_tracer_entry(struct bpf_perf_event_data *ctx) { return collect_trace((struct pt_regs*) &ctx->regs); } + +SEC("uprobe/native_tracer_entry") +int native_tracer_entry_uprobe(struct pt_regs *ctx) { + u64 allocated_size = ctx->dx; + u64 addr = ctx->si; + printt("allocation_tracer_entry, addr:%llx size:%llx\n", addr, allocated_size); + return collect_allocation_trace(ctx); +} + diff --git a/support/ebpf/perl_tracer.ebpf.c b/support/ebpf/perl_tracer.ebpf.c index c498341..2ed6565 100644 --- a/support/ebpf/perl_tracer.ebpf.c +++ b/support/ebpf/perl_tracer.ebpf.c @@ -426,3 +426,74 @@ int unwind_perl(struct pt_regs *ctx) { tail_call(ctx, unwinder); return -1; } + +SEC("uprobe/unwind_perl") +int unwind_perl_uprobe(struct pt_regs *ctx) { + PerCPURecord *record = get_per_cpu_record(); + if (!record) { + return -1; + } + + Trace *trace = &record->trace; + u32 pid = trace->pid; + DEBUG_PRINT("unwind_perl()"); + + PerlProcInfo *perlinfo = bpf_map_lookup_elem(&perl_procs, &pid); + if (!perlinfo) { + DEBUG_PRINT("Can't build Perl stack, no address info"); + return 0; + } + + int unwinder = get_next_unwinder_after_interpreter(record); + DEBUG_PRINT("Building Perl stack for 0x%x", perlinfo->version); + + if (!record->perlUnwindState.stackinfo) { + // First Perl main loop encountered. Extract first the Interpreter state. + increment_metric(metricID_UnwindPerlAttempts); + + void *interpreter; + if (perlinfo->stateInTSD) { + void *tsd_base; + if (tsd_get_base(&tsd_base)) { + DEBUG_PRINT("Failed to get TSD base address"); + goto err_tsd; + } + + int tsd_key; + if (bpf_probe_read_user(&tsd_key, sizeof(tsd_key), (void*)perlinfo->stateAddr)) { + DEBUG_PRINT("Failed to read tsdKey from 0x%lx", (unsigned long)perlinfo->stateAddr); + goto err_tsd; + } + + if (tsd_read(&perlinfo->tsdInfo, tsd_base, tsd_key, &interpreter)) { + err_tsd: + increment_metric(metricID_UnwindPerlTSD); + goto exit; + } + + DEBUG_PRINT("TSD Base 0x%lx, TSD Key %d", (unsigned long) tsd_base, tsd_key); + } else { + interpreter = (void*)perlinfo->stateAddr; + } + DEBUG_PRINT("PerlInterpreter 0x%lx", (unsigned long)interpreter); + + if (bpf_probe_read_user(&record->perlUnwindState.stackinfo, sizeof(record->perlUnwindState.stackinfo), + (void*)interpreter + perlinfo->interpreter_curstackinfo) || + bpf_probe_read_user(&record->perlUnwindState.cop, sizeof(record->perlUnwindState.cop), + (void*)interpreter + perlinfo->interpreter_curcop)) { + DEBUG_PRINT("Failed to read interpreter state"); + increment_metric(metricID_UnwindPerlReadStackInfo); + goto exit; + } + DEBUG_PRINT("COP from interpreter state 0x%lx", (unsigned long)record->perlUnwindState.cop); + + prepare_perl_stack(record, perlinfo); + } + + // Unwind one call stack or unrolled length, and continue + unwinder = walk_perl_stack(record, perlinfo); + +exit: + tail_call_uprobe(ctx, unwinder); + return -1; +} diff --git a/support/ebpf/php_tracer.ebpf.c b/support/ebpf/php_tracer.ebpf.c index 3d5d528..169773a 100644 --- a/support/ebpf/php_tracer.ebpf.c +++ b/support/ebpf/php_tracer.ebpf.c @@ -239,3 +239,61 @@ int unwind_php(struct pt_regs *ctx) { tail_call(ctx, unwinder); return -1; } + +SEC("uprobe/unwind_php") +int unwind_php_uprobe(struct pt_regs *ctx) { + PerCPURecord *record = get_per_cpu_record(); + if (!record) + return -1; + + int unwinder = get_next_unwinder_after_interpreter(record); + u32 pid = record->trace.pid; + PHPProcInfo *phpinfo = bpf_map_lookup_elem(&php_procs, &pid); + if (!phpinfo) { + DEBUG_PRINT("No PHP introspection data"); + goto exit; + } + + // The section id and bias are zeroes if matched via JIT page mapping. + // Otherwise its the native code interpreter range match and these are + // set to the native code's values. + bool is_jitted = record->state.text_section_id == 0 && + record->state.text_section_bias == 0; + + increment_metric(metricID_UnwindPHPAttempts); + + if (!record->phpUnwindState.zend_execute_data) { + // Get executor_globals.current_execute_data + if (bpf_probe_read_user(&record->phpUnwindState.zend_execute_data, sizeof(void *), + (void*) phpinfo->current_execute_data)) { + DEBUG_PRINT("Failed to read executor_globals.current_execute data (0x%lx)", + (unsigned long) phpinfo->current_execute_data); + increment_metric(metricID_UnwindPHPErrBadCurrentExecuteData); + goto exit; + } + } + +#if defined(__aarch64__) + // On ARM we need to adjust the stack pointer if we entered from JIT code + // This is only a problem on ARM where the SP/FP are used for unwinding. + // This is necessary because: + // a) The PHP VM jumps into code by default. This is equivalent to having an inner frame. + // b) The PHP VM allocates some space for alignment purposes and saving registers. + // c) The amount and alignment of this space can change in hard-to-detect ways. + // Given that there's no guarantess that anything pushed to the stack is useful we + // simply ignore it. There may be a return address in some modes, but this is hard to detect + // consistently. + if (is_jitted) { + record->state.sp = record->state.fp; + } +#endif + + DEBUG_PRINT("Building PHP stack (execute_data = 0x%lx)", (unsigned long) record->phpUnwindState.zend_execute_data); + + // Unwind one call stack or unrolled length, and continue + unwinder = walk_php_stack(record, phpinfo, is_jitted); + +exit: + tail_call_uprobe(ctx, unwinder); + return -1; +} diff --git a/support/ebpf/python_tracer.ebpf.c b/support/ebpf/python_tracer.ebpf.c index d99147b..c848da6 100644 --- a/support/ebpf/python_tracer.ebpf.c +++ b/support/ebpf/python_tracer.ebpf.c @@ -318,3 +318,46 @@ int unwind_python(struct pt_regs *ctx) { tail_call(ctx, unwinder); return -1; } + +SEC("uprobe/unwind_python") +int unwind_python_uprobe(struct pt_regs *ctx) { + PerCPURecord *record = get_per_cpu_record(); + if (!record) + return -1; + + ErrorCode error = ERR_OK; + int unwinder = get_next_unwinder_after_interpreter(record); + Trace *trace = &record->trace; + u32 pid = trace->pid; + + DEBUG_PRINT("unwind_python()"); + + const PyProcInfo *pyinfo = bpf_map_lookup_elem(&py_procs, &pid); + if (!pyinfo) { + // Not a Python process that we have info on + DEBUG_PRINT("Can't build Python stack, no address info"); + increment_metric(metricID_UnwindPythonErrNoProcInfo); + return ERR_PYTHON_NO_PROC_INFO; + } + + DEBUG_PRINT("Building Python stack for 0x%x", pyinfo->version); + if (!record->pythonUnwindState.py_frame) { + increment_metric(metricID_UnwindPythonAttempts); + error = get_PyFrame(pyinfo, &record->pythonUnwindState.py_frame); + if (error) { + goto exit; + } + } + if (!record->pythonUnwindState.py_frame) { + DEBUG_PRINT(" -> Python frames are handled"); + unwinder_mark_done(record, PROG_UNWIND_PYTHON); + goto exit; + } + + error = walk_python_stack(record, pyinfo, &unwinder); + +exit: + record->state.unwind_error = error; + tail_call_uprobe(ctx, unwinder); + return -1; +} diff --git a/support/ebpf/ruby_tracer.ebpf.c b/support/ebpf/ruby_tracer.ebpf.c index 41ecaca..173bc18 100644 --- a/support/ebpf/ruby_tracer.ebpf.c +++ b/support/ebpf/ruby_tracer.ebpf.c @@ -273,3 +273,61 @@ int unwind_ruby(struct pt_regs *ctx) { tail_call(ctx, unwinder); return -1; } + +SEC("uprobe/unwind_ruby") +int unwind_ruby_uprobe(struct pt_regs *ctx) { + PerCPURecord *record = get_per_cpu_record(); + if (!record) + return -1; + + int unwinder = get_next_unwinder_after_interpreter(record); + ErrorCode error = ERR_OK; + u32 pid = record->trace.pid; + RubyProcInfo *rubyinfo = bpf_map_lookup_elem(&ruby_procs, &pid); + if (!rubyinfo) { + DEBUG_PRINT("No Ruby introspection data"); + error = ERR_RUBY_NO_PROC_INFO; + increment_metric(metricID_UnwindRubyErrNoProcInfo); + goto exit; + } + + increment_metric(metricID_UnwindRubyAttempts); + + + // Pointer for an address to a rb_execution_context_struct struct. + void *current_ctx_addr = NULL; + + if (rubyinfo->version >= 0x30000) { + // With Ruby 3.x and its internal change of the execution model, we can no longer + // access rb_execution_context_struct directly. Therefore we have to first lookup + // ruby_single_main_ractor and get access to the current execution context via + // the offset to running_ec. + + void *single_main_ractor = NULL; + if (bpf_probe_read_user(&single_main_ractor, sizeof(single_main_ractor), + (void *)rubyinfo->current_ctx_ptr)) { + goto exit; + } + + if (bpf_probe_read_user(¤t_ctx_addr, sizeof(current_ctx_addr), + (void *)(single_main_ractor + rubyinfo->running_ec))) { + goto exit; + } + } else { + if (bpf_probe_read_user(¤t_ctx_addr, sizeof(current_ctx_addr), + (void *)rubyinfo->current_ctx_ptr)) { + goto exit; + } + } + + if (!current_ctx_addr) { + goto exit; + } + + error = walk_ruby_stack(record, rubyinfo, current_ctx_addr, &unwinder); + +exit: + record->state.unwind_error = error; + tail_call_uprobe(ctx, unwinder); + return -1; +} diff --git a/support/ebpf/tracemgmt.h b/support/ebpf/tracemgmt.h index e1f0bed..b3c561e 100644 --- a/support/ebpf/tracemgmt.h +++ b/support/ebpf/tracemgmt.h @@ -221,6 +221,8 @@ static inline PerCPURecord *get_pristine_per_cpu_record() trace->apm_trace_id.as_int.hi = 0; trace->apm_trace_id.as_int.lo = 0; trace->apm_transaction_id.as_int = 0; + trace->alloc_addr = 0; + trace->alloc_size = 0; return record; } @@ -445,4 +447,29 @@ void tail_call(void *ctx, int next) { bpf_tail_call(ctx, &progs, next); } +static inline __attribute__((__always_inline__)) +void tail_call_uprobe(void *ctx, int next) { + PerCPURecord *record = get_per_cpu_record(); + if (!record) { + bpf_tail_call(ctx, &progs_uprobe, PROG_UNWIND_STOP); + // In theory bpf_tail_call() should never return. But due to instruction reordering by the + // compiler we have to place return here to bribe the verifier to accept this. + return; + } + + if (record->tailCalls >= 29 ) { + // The maximum tail call count we need to support on older kernels is 32. At this point + // there is a chance that continuing unwinding the stack would further increase the number of + // tail calls. As a result we might lose the unwound stack as no further tail calls are left + // to report it to user space. To make sure we do not run into this issue we stop unwinding + // the stack at this point and report it to userspace. + next = PROG_UNWIND_STOP; + record->state.unwind_error = ERR_MAX_TAIL_CALLS; + increment_metric(metricID_MaxTailCalls); + } + record->tailCalls += 1 ; + + bpf_tail_call(ctx, &progs_uprobe, next); +} + #endif diff --git a/support/ebpf/tracer.ebpf.x86 b/support/ebpf/tracer.ebpf.x86 index f3d665f2598b0e8d2f0634d7a93d10afd7d362af..7d97e5a73dbd577eab28bebabe91a6a5c5095332 100644 GIT binary patch literal 460136 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 ZL{yXUyy^Pa{!5D0#|JEQt^Y+^|1TJtDWCuV literal 296832 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�~$F`R5B=tX=8vR(Pkv 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

    XPi-spgBD-kX{9S?Zt4Ekm+t>cxNRHD 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 I$9tLOH-C2N1poj5 diff --git a/support/ebpf/types.h b/support/ebpf/types.h index 4e989e0..ff847d8 100644 --- a/support/ebpf/types.h +++ b/support/ebpf/types.h @@ -530,6 +530,9 @@ typedef struct Trace { s32 kernel_stack_id; // The number of frames in the stack. u32 stack_len; + u64 alloc_addr; + u64 alloc_size; + // The frames of the stack trace. Frame frames[MAX_FRAME_UNWINDS]; diff --git a/support/ebpf/v8_tracer.ebpf.c b/support/ebpf/v8_tracer.ebpf.c index 9928b51..22f7c15 100644 --- a/support/ebpf/v8_tracer.ebpf.c +++ b/support/ebpf/v8_tracer.ebpf.c @@ -328,3 +328,49 @@ int unwind_v8(struct pt_regs *ctx) { DEBUG_PRINT("v8: tail call for next frame unwinder (%d) failed", unwinder); return -1; } + + +SEC("uprobe/unwind_v8") +int unwind_v8_uprobe(struct pt_regs *ctx) { + PerCPURecord *record = get_per_cpu_record(); + if (!record) { + return -1; + } + + Trace *trace = &record->trace; + u32 pid = trace->pid; + DEBUG_PRINT("==== unwind_v8 %d ====", trace->stack_len); + + int unwinder = PROG_UNWIND_STOP; + ErrorCode error = ERR_OK; + V8ProcInfo *vi = bpf_map_lookup_elem(&v8_procs, &pid); + if (!vi) { + DEBUG_PRINT("v8: no V8ProcInfo for this pid"); + error = ERR_V8_NO_PROC_INFO; + increment_metric(metricID_UnwindV8ErrNoProcInfo); + goto exit; + } + + increment_metric(metricID_UnwindV8Attempts); + +#pragma unroll + for (int i = 0; i < V8_FRAMES_PER_PROGRAM; i++) { + unwinder = PROG_UNWIND_STOP; + + error = unwind_one_v8_frame(record, vi, i == 0); + if (error) { + break; + } + + error = get_next_unwinder_after_native_frame(record, &unwinder); + if (error || unwinder != PROG_UNWIND_V8) { + break; + } + } + +exit: + record->state.unwind_error = error; + tail_call_uprobe(ctx, unwinder); + DEBUG_PRINT("v8: tail call for next frame unwinder (%d) failed", unwinder); + return -1; +} diff --git a/tracehandler/tracehandler.go b/tracehandler/tracehandler.go index e3165e0..fde5816 100644 --- a/tracehandler/tracehandler.go +++ b/tracehandler/tracehandler.go @@ -159,7 +159,7 @@ func (m *traceHandler) HandleTrace(bpfTrace *host.Trace) { if m.reporter.SupportsReportTraceEvent() { m.reporter.ReportTraceEvent(umTrace, timestamp, bpfTrace.Comm, meta.PodName, meta.ContainerID, meta.ContainerName, - svcName, bpfTrace.PID, bpfTrace.TID) + svcName, bpfTrace.PID, bpfTrace.TID, bpfTrace.AllocSize, bpfTrace.AllocAddress) return } m.reporter.ReportCountForTrace(umTrace.Hash, timestamp, 1, diff --git a/tracer/tracepoints.go b/tracer/tracepoints.go index a13a905..e5d340a 100644 --- a/tracer/tracepoints.go +++ b/tracer/tracepoints.go @@ -42,3 +42,14 @@ func (t *Tracer) AttachSchedMonitor() error { prog := t.ebpfProgs["tracepoint__sched_process_exit"] return t.attachToTracepoint("sched", "sched_process_exit", prog) } + +func (t *Tracer) AttachAllocationHook() error { + restoreRlimit, err := rlimit.MaximizeMemlock() + if err != nil { + return fmt.Errorf("failed to adjust rlimit: %v", err) + } + defer restoreRlimit() + + prog := t.ebpfProgs["native_tracer_entry_uprobe"] + return t.attachToTracepoint("sdt_ddprof", "allocation", prog) +} diff --git a/tracer/tracer.go b/tracer/tracer.go index 1962f20..b85619f 100644 --- a/tracer/tracer.go +++ b/tracer/tracer.go @@ -395,7 +395,11 @@ func initializeMapsAndPrograms(includeTracers config.IncludedTracers, } } - if err = loadUnwinders(coll, ebpfProgs, ebpfMaps["progs"], includeTracers); err != nil { + if err = loadUnwinders(coll, ebpfProgs, ebpfMaps["progs"], includeTracers, false); err != nil { + return nil, nil, fmt.Errorf("failed to load eBPF programs: %v", err) + } + + if err = loadUnwinders(coll, ebpfProgs, ebpfMaps["progs_uprobe"], includeTracers, true); err != nil { return nil, nil, fmt.Errorf("failed to load eBPF programs: %v", err) } @@ -472,7 +476,7 @@ func loadAllMaps(coll *cebpf.CollectionSpec, ebpfMaps map[string]*cebpf.Map) err // loadUnwinders just satisfies the proof of concept and loads all eBPF programs func loadUnwinders(coll *cebpf.CollectionSpec, ebpfProgs map[string]*cebpf.Program, - tailcallMap *cebpf.Map, includeTracers config.IncludedTracers) error { + tailcallMap *cebpf.Map, includeTracers config.IncludedTracers, uprobe bool) error { restoreRlimit, err := rlimit.MaximizeMemlock() if err != nil { return fmt.Errorf("failed to adjust rlimit: %v", err) @@ -553,13 +557,19 @@ func loadUnwinders(coll *cebpf.CollectionSpec, ebpfProgs map[string]*cebpf.Progr enable: true, }, } { - if !unwindProg.enable { + if !unwindProg.enable || (uprobe && strings.HasPrefix(unwindProg.name, "tracepoint_")) { continue } // Load the eBPF program into the kernel. If no error is returned, // the eBPF program can be used/called/triggered from now on. - unwinder, err := cebpf.NewProgramWithOptions(coll.Programs[unwindProg.name], + progName := unwindProg.name + if uprobe { + progName = fmt.Sprintf("%s_uprobe", progName) + } + // fmt.Printf("Loading %s\n", progName) + // fmt.Printf("type: %v, attach_type: %v, attach_target: %v\n", coll.Programs[progName].Type, coll.Programs[progName].AttachType, coll.Programs[unwindProg.name].AttachTarget) + unwinder, err := cebpf.NewProgramWithOptions(coll.Programs[progName], programOptions) if err != nil { // These errors tend to have hundreds of lines, so we print each line individually. @@ -567,10 +577,11 @@ func loadUnwinders(coll *cebpf.CollectionSpec, ebpfProgs map[string]*cebpf.Progr for scanner.Scan() { log.Error(scanner.Text()) } - return fmt.Errorf("failed to load %s", unwindProg.name) + fmt.Print(err) + return fmt.Errorf("failed to load %s", progName) } - ebpfProgs[unwindProg.name] = unwinder + ebpfProgs[progName] = unwinder fd := uint32(unwinder.FD()) if unwindProg.noTailCallTarget { continue @@ -857,6 +868,8 @@ func (t *Tracer) loadBpfTrace(raw []byte) *host.Trace { PID: util.PID(ptr.pid), TID: util.TID(ptr.tid), KTime: util.KTime(ptr.ktime), + AllocAddress: libpf.Address(ptr.alloc_addr), + AllocSize: uint64(ptr.alloc_size), } // Trace fields included in the hash: @@ -867,6 +880,8 @@ func (t *Tracer) loadBpfTrace(raw []byte) *host.Trace { ptr.apm_trace_id = C.ApmTraceID{} ptr.apm_transaction_id = C.ApmSpanID{} ptr.ktime = 0 + ptr.alloc_addr = 0 + ptr.alloc_size = 0 trace.Hash = host.TraceHash(xxh3.Hash128(raw).Lo) userFrameOffs := 0