From 0af92d66e9c8ef73cdc24276239658c35a528ebc Mon Sep 17 00:00:00 2001 From: Ron Federman Date: Wed, 5 Mar 2025 11:10:00 +0200 Subject: [PATCH 1/3] zero each kafka span before populating --- .../kafka-go/producer/bpf/probe.bpf.c | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/internal/pkg/instrumentation/bpf/github.com/segmentio/kafka-go/producer/bpf/probe.bpf.c b/internal/pkg/instrumentation/bpf/github.com/segmentio/kafka-go/producer/bpf/probe.bpf.c index 278ccf14a..f811c59f8 100644 --- a/internal/pkg/instrumentation/bpf/github.com/segmentio/kafka-go/producer/bpf/probe.bpf.c +++ b/internal/pkg/instrumentation/bpf/github.com/segmentio/kafka-go/producer/bpf/probe.bpf.c @@ -52,7 +52,7 @@ struct __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY); __uint(key_size, sizeof(u32)); __uint(value_size, sizeof(struct kafka_request_t)); - __uint(max_entries, 1); + __uint(max_entries, 2); } kafka_request_storage_map SEC(".maps"); // https://github.com/segmentio/kafka-go/blob/main/protocol/record.go#L48 @@ -144,13 +144,24 @@ int uprobe_WriteMessages(struct pt_regs *ctx) { return 0; } - u32 map_id = 0; - struct kafka_request_t *kafka_request = bpf_map_lookup_elem(&kafka_request_storage_map, &map_id); - if (kafka_request == NULL) + u32 zero_id = 0; + struct kafka_request_t *zero_kafka_request = bpf_map_lookup_elem(&kafka_request_storage_map, &zero_id); + if (zero_kafka_request == NULL) { - bpf_printk("uuprobe/WriteMessages: kafka_request is NULL"); + bpf_printk("uuprobe/WriteMessages: zero_kafka_request is NULL"); return 0; } + + u32 actual_id = 1; + // Zero the span we are about to build, eBPF doesn't support memset of large structs (more than 1024 bytes) + bpf_map_update_elem(&kafka_request_storage_map, &actual_id, zero_kafka_request, 0); + // Get a pointer to the zeroed span + struct kafka_request_t *kafka_request = bpf_map_lookup_elem(&kafka_request_storage_map, &actual_id); + if (kafka_request == NULL) { + bpf_printk("uprobe/WriteMessages: Failed to get kafka_request"); + return 0; + } + kafka_request->start_time = bpf_ktime_get_ns(); start_span_params_t start_span_params = { From c90dab799b34c458f7b3c58e58dd1cf56188004c Mon Sep 17 00:00:00 2001 From: Ron Federman Date: Fri, 14 Mar 2025 14:22:33 +0200 Subject: [PATCH 2/3] use BPF_ANY when zero the map entry --- .../bpf/github.com/segmentio/kafka-go/producer/bpf/probe.bpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/pkg/instrumentation/bpf/github.com/segmentio/kafka-go/producer/bpf/probe.bpf.c b/internal/pkg/instrumentation/bpf/github.com/segmentio/kafka-go/producer/bpf/probe.bpf.c index f811c59f8..0b3b8ac7a 100644 --- a/internal/pkg/instrumentation/bpf/github.com/segmentio/kafka-go/producer/bpf/probe.bpf.c +++ b/internal/pkg/instrumentation/bpf/github.com/segmentio/kafka-go/producer/bpf/probe.bpf.c @@ -154,7 +154,7 @@ int uprobe_WriteMessages(struct pt_regs *ctx) { u32 actual_id = 1; // Zero the span we are about to build, eBPF doesn't support memset of large structs (more than 1024 bytes) - bpf_map_update_elem(&kafka_request_storage_map, &actual_id, zero_kafka_request, 0); + bpf_map_update_elem(&kafka_request_storage_map, &actual_id, zero_kafka_request, BPF_ANY); // Get a pointer to the zeroed span struct kafka_request_t *kafka_request = bpf_map_lookup_elem(&kafka_request_storage_map, &actual_id); if (kafka_request == NULL) { From c1026540b046ff88b5d7b90c8befcec86f96e3e2 Mon Sep 17 00:00:00 2001 From: Ron Federman Date: Fri, 14 Mar 2025 14:25:08 +0200 Subject: [PATCH 3/3] add changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3afaca3ff..cb27f211c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -36,6 +36,7 @@ OpenTelemetry Go Automatic Instrumentation adheres to [Semantic Versioning](http ### Fixed - Fix spans parsing from eBPF for the legacy (go version < 1.24 otel-go < 1.33) otel global instrumentation. ([#1960](https://github.com/open-telemetry/opentelemetry-go-instrumentation/pull/1960)) +- Reset Kafka producer span underlying memory before each span. ([#1937](https://github.com/open-telemetry/opentelemetry-go-instrumentation/pull/1937)) ## [v0.21.0] - 2025-02-18