Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions bpf/common/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#define K_TCP_RES_LEN 128

#define PATH_MAX_LEN 100
#define PATTERN_MAX_LEN 96
#define METHOD_MAX_LEN 7 // Longest method: OPTIONS
#define REMOTE_ADDR_MAX_LEN \
50 // We need 48: 39(ip v6 max) + 1(: separator) + 7(port length max value 65535) + 1(null terminator)
Expand Down Expand Up @@ -69,6 +70,7 @@ typedef struct http_request_trace {
s64 content_length;
s64 response_length;
unsigned char path[PATH_MAX_LEN];
unsigned char pattern[PATTERN_MAX_LEN];
unsigned char host[HOST_MAX_LEN];
tp_info_t tp;
connection_info_t conn;
Expand Down
2 changes: 1 addition & 1 deletion bpf/gotracer/go_grpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,7 @@ static __always_inline int grpc_connect_done(struct pt_regs *ctx, void *err) {
bpf_dbg_printk("method ptr = %lx, method_len = %d", method_ptr, method_len);

// Get method from the incoming call arguments
if (!read_go_str_n("method", method_ptr, (u64)method_len, &trace->path, sizeof(trace->path))) {
if (!read_go_str_n("method", method_ptr, (u64)method_len, trace->path, sizeof(trace->path))) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice catch!

bpf_dbg_printk("can't read grpc client method");
bpf_ringbuf_discard(trace, 0);
goto done;
Expand Down
119 changes: 113 additions & 6 deletions bpf/gotracer/go_nethttp.c
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ typedef struct server_http_func_invocation {
tp_info_t tp;
u8 method[METHOD_MAX_LEN];
u8 path[PATH_MAX_LEN];
u8 pattern[PATTERN_MAX_LEN];
u8 _pad[5];
} server_http_func_invocation_t;

Expand Down Expand Up @@ -127,6 +128,7 @@ int obi_uprobe_ServeHTTP(struct pt_regs *ctx) {

invocation.method[0] = 0;
invocation.path[0] = 0;
invocation.pattern[0] = 0;

if (req) {
server_trace_parent(goroutine_addr, &invocation.tp, decoded_tp);
Expand All @@ -137,7 +139,7 @@ int obi_uprobe_ServeHTTP(struct pt_regs *ctx) {
if (!read_go_str("method",
req,
go_offset_of(ot, (go_offset){.v = _method_ptr_pos}),
&invocation.method,
invocation.method,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

man, how come this was working? nice catch

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

madness :) I have no idea, address of an address.

sizeof(invocation.method))) {
bpf_dbg_printk("can't read http Request.Method");
goto done;
Expand All @@ -153,7 +155,7 @@ int obi_uprobe_ServeHTTP(struct pt_regs *ctx) {
!read_go_str("path",
url_ptr,
go_offset_of(ot, (go_offset){.v = _path_ptr_pos}),
&invocation.path,
invocation.path,
sizeof(invocation.path))) {
bpf_dbg_printk("can't read http Request.URL.Path");
goto done;
Expand Down Expand Up @@ -182,6 +184,108 @@ int obi_uprobe_ServeHTTP(struct pt_regs *ctx) {
return 0;
}

SEC("uprobe/findHandler")
int obi_uprobe_findHandlerRet(struct pt_regs *ctx) {
bpf_dbg_printk("=== uprobe/proc findHandler returns === ");

void *goroutine_addr = GOROUTINE_PTR(ctx);
go_addr_key_t g_key = {};
go_addr_key_from_id(&g_key, goroutine_addr);

server_http_func_invocation_t *invocation =
bpf_map_lookup_elem(&ongoing_http_server_requests, &g_key);

bpf_dbg_printk("goroutine_addr %lx, inv %llx", goroutine_addr, invocation);

if (invocation) {
u64 len = (u64)GO_PARAM4(ctx);
void *ptr = GO_PARAM3(ctx);
if (ptr) {
bpf_dbg_printk("reading pattern information with len %d", len);
read_go_str_n("pattern", ptr, len, invocation->pattern, PATTERN_MAX_LEN);
}
}

return 0;
}

SEC("uprobe/muxSetMatch")
int obi_uprobe_muxSetMatch(struct pt_regs *ctx) {
bpf_dbg_printk("=== uprobe/proc gorilla mux setMatch === ");

void *goroutine_addr = GOROUTINE_PTR(ctx);
go_addr_key_t g_key = {};
go_addr_key_from_id(&g_key, goroutine_addr);

server_http_func_invocation_t *invocation =
bpf_map_lookup_elem(&ongoing_http_server_requests, &g_key);

bpf_dbg_printk("goroutine_addr %lx, inv %llx", goroutine_addr, invocation);

if (invocation && !invocation->pattern[0]) {
off_table_t *ot = get_offsets_table();

void *path = GO_PARAM2(ctx);
if (path) {
bpf_dbg_printk("reading template from %llx", path);
u64 templ_off = go_offset_of(ot, (go_offset){.v = _mux_template_pos});
read_go_str("pattern", path, templ_off, invocation->pattern, PATTERN_MAX_LEN);
bpf_dbg_printk("pattern %s", invocation->pattern);
}
}

return 0;
}

SEC("uprobe/ginGetValue")
int obi_uprobe_ginGetValueRet(struct pt_regs *ctx) {
bpf_dbg_printk("=== uprobe/proc gin getValue returns === ");

void *goroutine_addr = GOROUTINE_PTR(ctx);
go_addr_key_t g_key = {};
go_addr_key_from_id(&g_key, goroutine_addr);

server_http_func_invocation_t *invocation =
bpf_map_lookup_elem(&ongoing_http_server_requests, &g_key);

off_table_t *ot = get_offsets_table();
u64 fullpath_off = go_offset_of(ot, (go_offset){.v = _gin_fullpath_pos});

bpf_dbg_printk(
"goroutine_addr %lx, inv %llx, fullpath_off %d", goroutine_addr, invocation, fullpath_off);

if (fullpath_off == _gin_fullpath_off_pre_17 || fullpath_off == _gin_fullpath_off_post_17) {
if (invocation && !invocation->pattern[0]) {
void *handlers = GO_PARAM1(ctx);
if (handlers) {
// duplicated because of verifier complaints with choosing one or the other
// registers
if (fullpath_off == _gin_fullpath_off_pre_17) {
void *ptr = GO_PARAM8(ctx);
u64 len = (u64)GO_PARAM9(ctx);

if (ptr) {
bpf_dbg_printk("pre gin 1.7.0 fullPath from %llx", ptr);
read_go_str_n("pattern", ptr, len, invocation->pattern, PATTERN_MAX_LEN);
bpf_dbg_printk("pattern %s", invocation->pattern);
}
} else {
void *ptr = GO_PARAM6(ctx);
u64 len = (u64)GO_PARAM7(ctx);

if (ptr) {
bpf_dbg_printk("post gin 1.7.0 fullPath from %llx", ptr);
read_go_str_n("pattern", ptr, len, invocation->pattern, PATTERN_MAX_LEN);
bpf_dbg_printk("pattern %s", invocation->pattern);
}
}
}
}
}

return 0;
}

SEC("uprobe/readRequest")
int obi_uprobe_readRequestStart(struct pt_regs *ctx) {
bpf_dbg_printk("=== uprobe/proc readRequest === ");
Expand Down Expand Up @@ -391,6 +495,7 @@ static __always_inline int serve_http_returns(struct pt_regs *ctx) {
trace->end_monotime_ns = bpf_ktime_get_ns();
trace->host[0] = '\0';
trace->scheme[0] = '\0';
trace->pattern[0] = '\0';

goroutine_metadata *g_metadata = bpf_map_lookup_elem(&ongoing_goroutines, &g_key);
if (g_metadata) {
Expand Down Expand Up @@ -418,13 +523,15 @@ static __always_inline int serve_http_returns(struct pt_regs *ctx) {
trace->content_length = invocation->content_length;
__builtin_memcpy(trace->method, invocation->method, sizeof(trace->method));
__builtin_memcpy(trace->path, invocation->path, sizeof(trace->path));
__builtin_memcpy(trace->pattern, invocation->pattern, sizeof(trace->pattern));
trace->status = (u16)invocation->status;
trace->response_length = invocation->response_length;

make_tp_string(tp_buf, &invocation->tp);
bpf_dbg_printk("tp: %s", tp_buf);
bpf_dbg_printk("method: %s", trace->method);
bpf_dbg_printk("path: %s", trace->path);
bpf_dbg_printk("pattern: %s", trace->pattern);

// submit the completed trace via ringbuffer
bpf_ringbuf_submit(trace, get_flags());
Expand Down Expand Up @@ -473,7 +580,7 @@ static __always_inline void roundTripStartHelper(struct pt_regs *ctx) {
if (!read_go_str("method",
req,
go_offset_of(ot, (go_offset){.v = _method_ptr_pos}),
&trace.method,
trace.method,
sizeof(trace.method))) {
bpf_dbg_printk("can't read http Request.Method");
return;
Expand All @@ -493,7 +600,7 @@ static __always_inline void roundTripStartHelper(struct pt_regs *ctx) {
if (!read_go_str("path",
url_ptr,
go_offset_of(ot, (go_offset){.v = _path_ptr_pos}),
&trace.path,
trace.path,
sizeof(trace.path))) {
bpf_dbg_printk("can't read http Request.URL.Path");
return;
Expand All @@ -502,7 +609,7 @@ static __always_inline void roundTripStartHelper(struct pt_regs *ctx) {
if (!read_go_str("host",
url_ptr,
go_offset_of(ot, (go_offset){.v = _host_ptr_pos}),
&trace.host,
trace.host,
sizeof(trace.host))) {
bpf_dbg_printk("can't read http Request.URL.Host");
return;
Expand All @@ -511,7 +618,7 @@ static __always_inline void roundTripStartHelper(struct pt_regs *ctx) {
if (!read_go_str("scheme",
url_ptr,
go_offset_of(ot, (go_offset){.v = _scheme_ptr_pos}),
&trace.scheme,
trace.scheme,
sizeof(trace.scheme))) {
bpf_dbg_printk("can't read http Request.URL.Scheme");
return;
Expand Down
8 changes: 8 additions & 0 deletions bpf/gotracer/go_offsets.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,17 @@ typedef enum {
_mongo_op_name_pos,
_mongo_db_name_pos,
_mongo_op_name_new,
// route resolution
_mux_template_pos,
_gin_fullpath_pos,
_last_go_offset,
} go_offset_const;

enum {
_gin_fullpath_off_pre_17 = 56,
_gin_fullpath_off_post_17 = 40,
};

typedef struct go_offset_t {
go_offset_const v;
} go_offset;
Expand Down
39 changes: 39 additions & 0 deletions configs/offsets/gin/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
module go.opentelemetry.io/obi/configs/offsets/gin

go 1.25.0

require github.com/gin-gonic/gin v1.11.0

require (
github.com/bytedance/sonic v1.14.0 // indirect
github.com/bytedance/sonic/loader v0.3.0 // indirect
github.com/cloudwego/base64x v0.1.6 // indirect
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
github.com/gin-contrib/sse v1.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.27.0 // indirect
github.com/goccy/go-json v0.10.2 // indirect
github.com/goccy/go-yaml v1.18.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/quic-go/qpack v0.5.1 // indirect
github.com/quic-go/quic-go v0.54.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.3.0 // indirect
go.uber.org/mock v0.5.0 // indirect
golang.org/x/arch v0.20.0 // indirect
golang.org/x/crypto v0.40.0 // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.42.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.27.0 // indirect
golang.org/x/tools v0.34.0 // indirect
google.golang.org/protobuf v1.36.9 // indirect
)
88 changes: 88 additions & 0 deletions configs/offsets/gin/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk=
github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4=
github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c=
golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
Loading
Loading