Skip to content

Commit 53d40c5

Browse files
committed
Update grpc probe to support 1.77.0
1 parent 43b0f75 commit 53d40c5

File tree

4 files changed

+63
-2
lines changed

4 files changed

+63
-2
lines changed

internal/pkg/instrumentation/bpf/google.golang.org/grpc/server/bpf/probe.bpf.c

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ UPROBE_RETURN(server_handleStream, struct grpc_request_t, grpc_events)
226226
// func (s *Server) handleStream(t transport.ServerTransport, stream *transport.ServerStream)
227227
// https://github.com/grpc/grpc-go/blob/317271b232677b7869576a49855b01b9f4775d67/server.go#L1735
228228
//
229-
// This is only compatible with versions > 1.69.0 of the Server.
229+
// This is only compatible with versions > 1.69.0 and < 1.77.0 of the Server.
230230
SEC("uprobe/server_handleStream2")
231231
int uprobe_server_handleStream2(struct pt_regs *ctx) {
232232
u64 server_stream_pos = 4;
@@ -301,6 +301,40 @@ int uprobe_server_handleStream2_Returns(struct pt_regs *ctx) {
301301
return 0;
302302
}
303303

304+
// This instrumentation attaches uprobe to the following function:
305+
// func (s *Server) handleStream(t transport.ServerTransport, stream *transport.ServerStream)
306+
// https://github.com/grpc/grpc-go/blob/805b1f88c5fb9419e3837c72e1deb9c2ec677ffe/server.go#L1767
307+
//
308+
// This is only compatible with versions >= 1.77.0 of the Server.
309+
SEC("uprobe/server_handleStream3")
310+
int uprobe_server_handleStream3(struct pt_regs *ctx) {
311+
u64 server_stream_pos = 4;
312+
// Stream is embedded in ServerStream.
313+
void *stream_pos = get_argument(ctx, server_stream_pos);
314+
if (stream_pos == NULL) {
315+
bpf_printk("grpc:server:uprobe/server_handleStream3: failed to get ServerStream.Stream arg");
316+
return -1;
317+
}
318+
319+
struct go_iface go_context = {0};
320+
long rc = bpf_probe_read_user(
321+
&go_context.type, sizeof(go_context.type), (void *)(stream_pos + stream_ctx_pos));
322+
if (rc != 0) {
323+
bpf_printk("grpc:server:uprobe/server_handleStream3: failed to read context type");
324+
return -2;
325+
}
326+
327+
rc = bpf_probe_read_user(&go_context.data,
328+
sizeof(go_context.data),
329+
get_go_interface_instance(stream_pos + stream_ctx_pos));
330+
if (rc != 0) {
331+
bpf_printk("grpc:server:uprobe/server_handleStream3: failed to read context data");
332+
return -3;
333+
}
334+
335+
return handleStream(ctx, stream_pos, &go_context);
336+
}
337+
304338
// func (d *http2Server) operateHeader(frame *http2.MetaHeadersFrame) error
305339
// for version 1.60 and above:
306340
// func (t *http2Server) operateHeaders(ctx context.Context, frame *http2.MetaHeadersFrame, handle func(*Stream)) error

internal/pkg/instrumentation/bpf/google.golang.org/grpc/server/bpf_arm64_bpfel.go

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/pkg/instrumentation/bpf/google.golang.org/grpc/server/bpf_x86_bpfel.go

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/pkg/instrumentation/bpf/google.golang.org/grpc/server/probe.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ var (
4141
// handleStream methods changed to accept a *transport.ServerStream instead
4242
// of a *transport.Stream.
4343
serverStreamVersion = semver.New(1, 69, 0, "", "")
44+
// embeddedStreamVersion is the version *transport.ServerStream embeds a
45+
// Stream instead of a *Stream.
46+
embeddedStreamVersion = semver.New(1, 77, 0, "", "")
4447
)
4548

4649
// New returns a new [probe.Probe].
@@ -191,11 +194,29 @@ func New(logger *slog.Logger, ver string) probe.Probe {
191194
Sym: "google.golang.org/grpc.(*Server).handleStream",
192195
EntryProbe: "uprobe_server_handleStream2",
193196
ReturnProbe: "uprobe_server_handleStream2_Returns",
197+
PackageConstraints: []probe.PackageConstraints{
198+
{
199+
Package: "google.golang.org/grpc",
200+
Constraints: must(semver.NewConstraint(
201+
fmt.Sprintf(
202+
"> %s, < %s",
203+
serverStreamVersion,
204+
embeddedStreamVersion,
205+
),
206+
)),
207+
FailureMode: probe.FailureModeIgnore,
208+
},
209+
},
210+
},
211+
{
212+
Sym: "google.golang.org/grpc.(*Server).handleStream",
213+
EntryProbe: "uprobe_server_handleStream3",
214+
ReturnProbe: "uprobe_server_handleStream_Returns",
194215
PackageConstraints: []probe.PackageConstraints{
195216
{
196217
Package: "google.golang.org/grpc",
197218
Constraints: must(
198-
semver.NewConstraint(">= " + serverStreamVersion.String()),
219+
semver.NewConstraint(">= " + embeddedStreamVersion.String()),
199220
),
200221
FailureMode: probe.FailureModeIgnore,
201222
},

0 commit comments

Comments
 (0)