Skip to content

Commit 297ce83

Browse files
authoredFeb 13, 2025··
Add support for exemplars in metrics (OTEL) (#1655)
1 parent f800f2f commit 297ce83

File tree

257 files changed

+9961
-2996
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

257 files changed

+9961
-2996
lines changed
 

‎bpf/go_grpc.h

+31-17
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
typedef struct grpc_srv_func_invocation {
2323
u64 start_monotime_ns;
2424
u64 stream;
25+
u64 st;
2526
tp_info_t tp;
2627
} grpc_srv_func_invocation_t;
2728

@@ -87,25 +88,43 @@ int beyla_uprobe_server_handleStream(struct pt_regs *ctx) {
8788
go_addr_key_from_id(&g_key, goroutine_addr);
8889

8990
void *stream_ptr = GO_PARAM4(ctx);
91+
void *stream_stream_ptr = stream_ptr;
9092
off_table_t *ot = get_offsets_table();
9193

94+
u64 st_offset = go_offset_of(ot, (go_offset){.v = _grpc_stream_st_ptr_pos});
95+
96+
u64 new_handle_stream = go_offset_of(ot, (go_offset){.v = _grpc_one_six_nine});
97+
bpf_dbg_printk("stream pointer %llx, new_handle_stream %d", stream_ptr, new_handle_stream);
98+
if (new_handle_stream == 1) {
99+
// Read the embedded object ptr
100+
bpf_probe_read(
101+
&stream_stream_ptr,
102+
sizeof(stream_stream_ptr),
103+
(void *)(stream_ptr + go_offset_of(ot, (go_offset){.v = _grpc_server_stream_stream})));
104+
105+
bpf_dbg_printk("new stream pointer %llx", stream_stream_ptr);
106+
if (!stream_stream_ptr) {
107+
bpf_dbg_printk("Error loading embedded server stream pointer from %llx", stream_ptr);
108+
return 0;
109+
}
110+
st_offset = go_offset_of(ot, (go_offset){.v = _grpc_server_stream_st_ptr_pos});
111+
}
112+
92113
grpc_srv_func_invocation_t invocation = {
93114
.start_monotime_ns = bpf_ktime_get_ns(),
94-
.stream = (u64)stream_ptr,
115+
.stream = (u64)stream_stream_ptr,
116+
.st = 0,
95117
.tp = {0},
96118
};
97119

98120
if (stream_ptr) {
99121
void *st_ptr = 0;
100122
void *tp_ptr = 0;
101123
// Read the embedded object ptr
102-
bpf_probe_read(&st_ptr,
103-
sizeof(st_ptr),
104-
(void *)(stream_ptr +
105-
go_offset_of(ot, (go_offset){.v = _grpc_stream_st_ptr_pos}) +
106-
sizeof(void *)));
124+
bpf_probe_read(&st_ptr, sizeof(st_ptr), (void *)(stream_ptr + st_offset + sizeof(void *)));
107125

108126
bpf_dbg_printk("st_ptr %llx", st_ptr);
127+
invocation.st = (u64)st_ptr;
109128
if (st_ptr) {
110129
grpc_transports_t *t = bpf_map_lookup_elem(&ongoing_grpc_transports, &st_ptr);
111130

@@ -136,7 +155,7 @@ int beyla_uprobe_http2Server_operateHeaders(struct pt_regs *ctx) {
136155
void *frame = GO_PARAM2(ctx);
137156
off_table_t *ot = get_offsets_table();
138157

139-
u64 new_offset_version = go_offset_of(ot, (go_offset){.v = _operate_headers_new});
158+
u64 new_offset_version = go_offset_of(ot, (go_offset){.v = _grpc_one_six_zero});
140159

141160
// After grpc version 1.60, they added extra context argument to the
142161
// function call, which adds two extra arguments.
@@ -223,9 +242,13 @@ int beyla_uprobe_server_handleStream_return(struct pt_regs *ctx) {
223242
}
224243

225244
void *stream_ptr = (void *)invocation->stream;
245+
void *st_ptr = (void *)invocation->st;
226246
u64 grpc_stream_method_ptr_pos =
227247
go_offset_of(ot, (go_offset){.v = _grpc_stream_method_ptr_pos});
228-
bpf_dbg_printk("stream_ptr %lx, method pos %lx", stream_ptr, grpc_stream_method_ptr_pos);
248+
bpf_dbg_printk("stream_ptr %lx, st_ptr %lx, method pos %lx",
249+
stream_ptr,
250+
st_ptr,
251+
grpc_stream_method_ptr_pos);
229252

230253
http_request_trace *trace = bpf_ringbuf_reserve(&events, sizeof(http_request_trace), 0);
231254
if (!trace) {
@@ -254,16 +277,7 @@ int beyla_uprobe_server_handleStream_return(struct pt_regs *ctx) {
254277
goto done;
255278
}
256279

257-
void *st_ptr = 0;
258280
u8 found_conn = 0;
259-
// Read the embedded object ptr
260-
bpf_probe_read(&st_ptr,
261-
sizeof(st_ptr),
262-
(void *)(stream_ptr +
263-
go_offset_of(ot, (go_offset){.v = _grpc_stream_st_ptr_pos}) +
264-
sizeof(void *)));
265-
266-
bpf_dbg_printk("st_ptr %llx", st_ptr);
267281
if (st_ptr) {
268282
grpc_transports_t *t = bpf_map_lookup_elem(&ongoing_grpc_transports, &st_ptr);
269283

‎bpf/go_offsets.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,11 @@ typedef enum {
5959
_sarama_broker_conn_pos,
6060
_sarama_bufconn_conn_pos,
6161
// grpc versioning
62-
_operate_headers_new,
62+
_grpc_one_six_zero,
63+
_grpc_one_six_nine,
64+
// grpc 1.69
65+
_grpc_server_stream_stream,
66+
_grpc_server_stream_st_ptr_pos,
6367
_last_go_offset,
6468
} go_offset_const;
6569

0 commit comments

Comments
 (0)
Please sign in to comment.