From cb3bfb7bdc9fa93bc1633f312403bf5f50dbacc3 Mon Sep 17 00:00:00 2001 From: Nikola Grcevski Date: Wed, 22 Jan 2025 15:26:36 -0500 Subject: [PATCH 1/6] add timeout for client calls --- test/integration/components/pingclient/pingclient.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/integration/components/pingclient/pingclient.go b/test/integration/components/pingclient/pingclient.go index 2bc282e11..1ad6d9a18 100644 --- a/test/integration/components/pingclient/pingclient.go +++ b/test/integration/components/pingclient/pingclient.go @@ -1,6 +1,7 @@ package main import ( + "context" "crypto/tls" "encoding/binary" "encoding/hex" @@ -13,7 +14,7 @@ var tr = &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, ForceAttemptHTTP2: true, } -var testHTTPClient = &http.Client{Transport: tr} +var testHTTPClient = &http.Client{Transport: tr, Timeout: 10 * time.Second} func regularGetRequest(url string, counter int) { req, err := http.NewRequest("GET", url, nil) @@ -42,6 +43,10 @@ func regularGetRequest(url string, counter int) { type MyRoundTripper struct{} func (rt *MyRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + ctx, cancel := context.WithTimeout(req.Context(), 10*time.Second) + defer cancel() + + req = req.WithContext(ctx) req.Header.Add("X-My-Header", "my-value") // send the request using the custom transport From 1ee69697219b40002f5b3a59ba6dc57dcb910ad1 Mon Sep 17 00:00:00 2001 From: Nikola Grcevski Date: Wed, 22 Jan 2025 17:04:42 -0500 Subject: [PATCH 2/6] Support URL full where possible for HTTP clients --- bpf/go_grpc.h | 4 +++ bpf/go_nethttp.h | 26 ++++++++++++++ bpf/go_offsets.h | 2 ++ bpf/tracer_common.h | 4 +++ configs/offsets/tracker_input.json | 4 ++- pkg/export/otel/traces.go | 9 +++-- pkg/internal/ebpf/common/bpf_arm64_bpfel.go | 4 ++- pkg/internal/ebpf/common/bpf_arm64_bpfel.o | 4 +-- pkg/internal/ebpf/common/bpf_x86_bpfel.go | 4 ++- pkg/internal/ebpf/common/bpf_x86_bpfel.o | 4 +-- pkg/internal/ebpf/common/spanner.go | 23 ++++--------- pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.go | 6 ++-- pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o | 4 +-- .../ebpf/gotracer/bpf_debug_arm64_bpfel.go | 6 ++-- .../ebpf/gotracer/bpf_debug_arm64_bpfel.o | 4 +-- .../ebpf/gotracer/bpf_debug_x86_bpfel.go | 6 ++-- .../ebpf/gotracer/bpf_debug_x86_bpfel.o | 4 +-- .../ebpf/gotracer/bpf_tp_arm64_bpfel.go | 6 ++-- .../ebpf/gotracer/bpf_tp_arm64_bpfel.o | 4 +-- .../ebpf/gotracer/bpf_tp_debug_arm64_bpfel.go | 6 ++-- .../ebpf/gotracer/bpf_tp_debug_arm64_bpfel.o | 4 +-- .../ebpf/gotracer/bpf_tp_debug_x86_bpfel.go | 6 ++-- .../ebpf/gotracer/bpf_tp_debug_x86_bpfel.o | 4 +-- .../ebpf/gotracer/bpf_tp_x86_bpfel.go | 6 ++-- pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.o | 4 +-- pkg/internal/ebpf/gotracer/bpf_x86_bpfel.go | 6 ++-- pkg/internal/ebpf/gotracer/bpf_x86_bpfel.o | 4 +-- pkg/internal/ebpf/gotracer/gotracer.go | 2 ++ pkg/internal/goexec/offsets.json | 24 +++++++++++++ pkg/internal/goexec/structmembers.go | 6 +++- pkg/internal/request/metric_attributes.go | 34 +++++++++++++++++++ pkg/internal/request/span_getters.go | 14 ++++++-- test/integration/red_test_client.go | 4 ++- test/integration/traces_test.go | 12 ++----- 34 files changed, 194 insertions(+), 70 deletions(-) diff --git a/bpf/go_grpc.h b/bpf/go_grpc.h index e096ba10e..d989ed707 100644 --- a/bpf/go_grpc.h +++ b/bpf/go_grpc.h @@ -238,6 +238,8 @@ int beyla_uprobe_server_handleStream_return(struct pt_regs *ctx) { trace->status = status; trace->content_length = 0; trace->method[0] = 0; + trace->host[0] = 0; + trace->scheme[0] = 0; trace->go_start_monotime_ns = invocation->start_monotime_ns; bpf_map_delete_elem(&ongoing_goroutines, &g_key); @@ -428,6 +430,8 @@ static __always_inline int grpc_connect_done(struct pt_regs *ctx, void *err) { trace->end_monotime_ns = bpf_ktime_get_ns(); trace->content_length = 0; trace->method[0] = 0; + trace->host[0] = 0; + trace->scheme[0] = 0; // Read arguments from the original set of registers diff --git a/bpf/go_nethttp.h b/bpf/go_nethttp.h index 98fa14d19..e262c57b2 100644 --- a/bpf/go_nethttp.h +++ b/bpf/go_nethttp.h @@ -27,6 +27,8 @@ typedef struct http_client_data { u8 method[METHOD_MAX_LEN]; u8 path[PATH_MAX_LEN]; + u8 host[HOST_MAX_LEN]; + u8 scheme[SCHEME_MAX_LEN]; s64 content_length; pid_info pid; @@ -320,6 +322,8 @@ int beyla_uprobe_ServeHTTPReturns(struct pt_regs *ctx) { trace->type = EVENT_HTTP_REQUEST; trace->start_monotime_ns = invocation->start_monotime_ns; trace->end_monotime_ns = bpf_ktime_get_ns(); + trace->host[0] = 0; + trace->scheme[0] = 0; goroutine_metadata *g_metadata = bpf_map_lookup_elem(&ongoing_goroutines, &g_key); if (g_metadata) { @@ -421,7 +425,27 @@ static __always_inline void roundTripStartHelper(struct pt_regs *ctx) { return; } + if (!url_ptr || !read_go_str("host", + url_ptr, + go_offset_of(ot, (go_offset){.v = _host_ptr_pos}), + &trace.host, + sizeof(trace.host))) { + bpf_dbg_printk("can't read http Request.URL.Host"); + return; + } + + if (!url_ptr || !read_go_str("scheme", + url_ptr, + go_offset_of(ot, (go_offset){.v = _scheme_ptr_pos}), + &trace.scheme, + sizeof(trace.scheme))) { + bpf_dbg_printk("can't read http Request.URL.Scheme"); + return; + } + bpf_dbg_printk("path: %s", trace.path); + bpf_dbg_printk("host: %s", trace.host); + bpf_dbg_printk("scheme: %s", trace.scheme); // Write event if (bpf_map_update_elem(&ongoing_http_client_requests, &g_key, &invocation, BPF_ANY)) { @@ -488,6 +512,8 @@ int beyla_uprobe_roundTripReturn(struct pt_regs *ctx) { // Copy the values read on request start __builtin_memcpy(trace->method, data->method, sizeof(trace->method)); __builtin_memcpy(trace->path, data->path, sizeof(trace->path)); + __builtin_memcpy(trace->host, data->host, sizeof(trace->host)); + __builtin_memcpy(trace->scheme, data->scheme, sizeof(trace->scheme)); trace->content_length = data->content_length; // Get request/response struct diff --git a/bpf/go_offsets.h b/bpf/go_offsets.h index 5baa576f0..e919cbdc3 100644 --- a/bpf/go_offsets.h +++ b/bpf/go_offsets.h @@ -17,6 +17,8 @@ typedef enum { // http _url_ptr_pos, _path_ptr_pos, + _host_ptr_pos, + _scheme_ptr_pos, _method_ptr_pos, _status_code_ptr_pos, _content_length_ptr_pos, diff --git a/bpf/tracer_common.h b/bpf/tracer_common.h index 2fcb6b2c7..606c73086 100644 --- a/bpf/tracer_common.h +++ b/bpf/tracer_common.h @@ -27,6 +27,8 @@ #define KAFKA_MAX_LEN 256 #define REDIS_MAX_LEN 256 #define MAX_TOPIC_NAME_LEN 64 +#define HOST_MAX_LEN 100 +#define SCHEME_MAX_LEN 10 // Trace of an HTTP call invocation. It is instantiated by the return uprobe and forwarded to the // user space through the events ringbuffer. @@ -37,6 +39,8 @@ typedef struct http_request_trace_t { u64 end_monotime_ns; u8 method[METHOD_MAX_LEN]; u8 path[PATH_MAX_LEN]; + u8 host[HOST_MAX_LEN]; + u8 scheme[SCHEME_MAX_LEN]; u16 status; connection_info_t conn __attribute__((aligned(8))); s64 content_length; diff --git a/configs/offsets/tracker_input.json b/configs/offsets/tracker_input.json index e2b4717e6..c33c98186 100644 --- a/configs/offsets/tracker_input.json +++ b/configs/offsets/tracker_input.json @@ -10,7 +10,9 @@ "Header" ], "net/url.URL": [ - "Path" + "Path", + "Host", + "Scheme" ], "net/http.Response": [ "StatusCode" diff --git a/pkg/export/otel/traces.go b/pkg/export/otel/traces.go index 4c1b4dc1b..7a9547dc3 100644 --- a/pkg/export/otel/traces.go +++ b/pkg/export/otel/traces.go @@ -602,11 +602,16 @@ func traceAttributes(span *request.Span, optionalAttrs map[attr.Name]struct{}) [ request.ServerPort(span.HostPort), } case request.EventTypeHTTPClient: + host := request.HTTPClientHost(span) + scheme := request.HTTPScheme(span) + url := request.URLFull(scheme, host, span.Path) + attrs = []attribute.KeyValue{ request.HTTPRequestMethod(span.Method), request.HTTPResponseStatusCode(span.Status), - request.HTTPUrlFull(span.Path), - request.ServerAddr(request.HostAsServer(span)), + request.HTTPUrlFull(url), + semconv.HTTPScheme(scheme), + request.ServerAddr(host), request.ServerPort(span.HostPort), request.HTTPRequestBodySize(int(span.RequestLength())), } diff --git a/pkg/internal/ebpf/common/bpf_arm64_bpfel.go b/pkg/internal/ebpf/common/bpf_arm64_bpfel.go index 716ffbf20..75b17e29f 100644 --- a/pkg/internal/ebpf/common/bpf_arm64_bpfel.go +++ b/pkg/internal/ebpf/common/bpf_arm64_bpfel.go @@ -85,8 +85,10 @@ type bpfHttpRequestTrace struct { EndMonotimeNs uint64 Method [7]uint8 Path [100]uint8 + Host [100]uint8 + Scheme [10]uint8 Status uint16 - _ [2]byte + _ [4]byte Conn bpfConnectionInfoT ContentLength int64 Tp struct { diff --git a/pkg/internal/ebpf/common/bpf_arm64_bpfel.o b/pkg/internal/ebpf/common/bpf_arm64_bpfel.o index dee72b0d2..784aef649 100644 --- a/pkg/internal/ebpf/common/bpf_arm64_bpfel.o +++ b/pkg/internal/ebpf/common/bpf_arm64_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:73302bb00ece4f200a40e33ef3d9a91d25b61b3a4048b048950e9a754fd872ab -size 4568 +oid sha256:c163dbc3b0affb0deab55cd8fedae0c69729f29ef440fab610ef0af13289a0fb +size 4632 diff --git a/pkg/internal/ebpf/common/bpf_x86_bpfel.go b/pkg/internal/ebpf/common/bpf_x86_bpfel.go index 9a5e18bc4..c6d28f191 100644 --- a/pkg/internal/ebpf/common/bpf_x86_bpfel.go +++ b/pkg/internal/ebpf/common/bpf_x86_bpfel.go @@ -85,8 +85,10 @@ type bpfHttpRequestTrace struct { EndMonotimeNs uint64 Method [7]uint8 Path [100]uint8 + Host [100]uint8 + Scheme [10]uint8 Status uint16 - _ [2]byte + _ [4]byte Conn bpfConnectionInfoT ContentLength int64 Tp struct { diff --git a/pkg/internal/ebpf/common/bpf_x86_bpfel.o b/pkg/internal/ebpf/common/bpf_x86_bpfel.o index dee72b0d2..784aef649 100644 --- a/pkg/internal/ebpf/common/bpf_x86_bpfel.o +++ b/pkg/internal/ebpf/common/bpf_x86_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:73302bb00ece4f200a40e33ef3d9a91d25b61b3a4048b048950e9a754fd872ab -size 4568 +oid sha256:c163dbc3b0affb0deab55cd8fedae0c69729f29ef440fab610ef0af13289a0fb +size 4632 diff --git a/pkg/internal/ebpf/common/spanner.go b/pkg/internal/ebpf/common/spanner.go index 43fad0cd6..18089224c 100644 --- a/pkg/internal/ebpf/common/spanner.go +++ b/pkg/internal/ebpf/common/spanner.go @@ -1,8 +1,8 @@ package ebpfcommon import ( - "bytes" "log/slog" + "strings" "unsafe" trace2 "go.opentelemetry.io/otel/trace" @@ -15,16 +15,10 @@ var log = slog.With("component", "goexec.spanner") func HTTPRequestTraceToSpan(trace *HTTPRequestTrace) request.Span { // From C, assuming 0-ended strings - methodLen := bytes.IndexByte(trace.Method[:], 0) - if methodLen < 0 { - methodLen = len(trace.Method) - } - method := string(trace.Method[:methodLen]) - pathLen := bytes.IndexByte(trace.Path[:], 0) - if pathLen < 0 { - pathLen = len(trace.Path) - } - path := string(trace.Path[:pathLen]) + method := cstr(trace.Method[:]) + path := cstr(trace.Path[:]) + scheme := cstr(trace.Scheme[:]) + origHost := cstr(trace.Host[:]) peer := "" hostname := "" @@ -58,6 +52,7 @@ func HTTPRequestTraceToSpan(trace *HTTPRequestTrace) request.Span { UserPID: trace.Pid.UserPid, Namespace: trace.Pid.Ns, }, + Statement: strings.Join([]string{scheme, origHost}, ";"), } } @@ -68,11 +63,7 @@ func SQLRequestTraceToSpan(trace *SQLRequestTrace) request.Span { } // From C, assuming 0-ended strings - sqlLen := bytes.IndexByte(trace.Sql[:], 0) - if sqlLen < 0 { - sqlLen = len(trace.Sql) - } - sql := string(trace.Sql[:sqlLen]) + sql := cstr(trace.Sql[:]) method, path := sqlprune.SQLParseOperationAndTable(sql) diff --git a/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.go b/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.go index 8dee9ea2e..f92cc7e49 100644 --- a/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.go +++ b/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.go @@ -60,7 +60,9 @@ type bpfGrpcTransportsT struct { type bpfHttpClientDataT struct { Method [7]uint8 Path [100]uint8 - _ [5]byte + Host [100]uint8 + Scheme [10]uint8 + _ [7]byte ContentLength int64 Pid struct { HostPid uint32 @@ -108,7 +110,7 @@ type bpfKafkaGoReqT struct { type bpfNewFuncInvocationT struct{ Parent uint64 } -type bpfOffTableT struct{ Table [44]uint64 } +type bpfOffTableT struct{ Table [46]uint64 } type bpfProduceReqT struct { MsgPtr uint64 diff --git a/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o index 466f17c0f..f05ebec1b 100644 --- a/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a93afec2fe8f3ed940424227b3b3cc1356dd279bdfe7e0793b7dc3236c5b8c4e -size 390656 +oid sha256:508ad9bf5e179e06fbdf74081b36ab9ecde186f9b405948c5652b50216ed23c7 +size 398408 diff --git a/pkg/internal/ebpf/gotracer/bpf_debug_arm64_bpfel.go b/pkg/internal/ebpf/gotracer/bpf_debug_arm64_bpfel.go index b623ba065..74e3ea04a 100644 --- a/pkg/internal/ebpf/gotracer/bpf_debug_arm64_bpfel.go +++ b/pkg/internal/ebpf/gotracer/bpf_debug_arm64_bpfel.go @@ -60,7 +60,9 @@ type bpf_debugGrpcTransportsT struct { type bpf_debugHttpClientDataT struct { Method [7]uint8 Path [100]uint8 - _ [5]byte + Host [100]uint8 + Scheme [10]uint8 + _ [7]byte ContentLength int64 Pid struct { HostPid uint32 @@ -108,7 +110,7 @@ type bpf_debugKafkaGoReqT struct { type bpf_debugNewFuncInvocationT struct{ Parent uint64 } -type bpf_debugOffTableT struct{ Table [44]uint64 } +type bpf_debugOffTableT struct{ Table [46]uint64 } type bpf_debugProduceReqT struct { MsgPtr uint64 diff --git a/pkg/internal/ebpf/gotracer/bpf_debug_arm64_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_debug_arm64_bpfel.o index 96435ab1b..78aa6601a 100644 --- a/pkg/internal/ebpf/gotracer/bpf_debug_arm64_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_debug_arm64_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:93ffe36b88f16f9a5073cfabb42456e7ad322d934c70916138d2a6a1a30084d7 -size 905616 +oid sha256:18e7b47a6a63e2621e137c162effe04e6137128dc6c08e64d2bbf302be1090e6 +size 941936 diff --git a/pkg/internal/ebpf/gotracer/bpf_debug_x86_bpfel.go b/pkg/internal/ebpf/gotracer/bpf_debug_x86_bpfel.go index 0acc204b6..b7a8866dc 100644 --- a/pkg/internal/ebpf/gotracer/bpf_debug_x86_bpfel.go +++ b/pkg/internal/ebpf/gotracer/bpf_debug_x86_bpfel.go @@ -60,7 +60,9 @@ type bpf_debugGrpcTransportsT struct { type bpf_debugHttpClientDataT struct { Method [7]uint8 Path [100]uint8 - _ [5]byte + Host [100]uint8 + Scheme [10]uint8 + _ [7]byte ContentLength int64 Pid struct { HostPid uint32 @@ -108,7 +110,7 @@ type bpf_debugKafkaGoReqT struct { type bpf_debugNewFuncInvocationT struct{ Parent uint64 } -type bpf_debugOffTableT struct{ Table [44]uint64 } +type bpf_debugOffTableT struct{ Table [46]uint64 } type bpf_debugProduceReqT struct { MsgPtr uint64 diff --git a/pkg/internal/ebpf/gotracer/bpf_debug_x86_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_debug_x86_bpfel.o index fcb7646b8..79fab90bf 100644 --- a/pkg/internal/ebpf/gotracer/bpf_debug_x86_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_debug_x86_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:44767d5ae9c1822caa7143a7431597feb3e93ec5503fd428c974af48757fb581 -size 907416 +oid sha256:6004ceeefaaf45a9eda4af2064e91547214d692357cf3d0440bc54b689285caf +size 943736 diff --git a/pkg/internal/ebpf/gotracer/bpf_tp_arm64_bpfel.go b/pkg/internal/ebpf/gotracer/bpf_tp_arm64_bpfel.go index c34f84214..c57e773c6 100644 --- a/pkg/internal/ebpf/gotracer/bpf_tp_arm64_bpfel.go +++ b/pkg/internal/ebpf/gotracer/bpf_tp_arm64_bpfel.go @@ -72,7 +72,9 @@ type bpf_tpGrpcTransportsT struct { type bpf_tpHttpClientDataT struct { Method [7]uint8 Path [100]uint8 - _ [5]byte + Host [100]uint8 + Scheme [10]uint8 + _ [7]byte ContentLength int64 Pid struct { HostPid uint32 @@ -120,7 +122,7 @@ type bpf_tpKafkaGoReqT struct { type bpf_tpNewFuncInvocationT struct{ Parent uint64 } -type bpf_tpOffTableT struct{ Table [44]uint64 } +type bpf_tpOffTableT struct{ Table [46]uint64 } type bpf_tpProduceReqT struct { MsgPtr uint64 diff --git a/pkg/internal/ebpf/gotracer/bpf_tp_arm64_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_tp_arm64_bpfel.o index cf9b63646..877b4cf62 100644 --- a/pkg/internal/ebpf/gotracer/bpf_tp_arm64_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_tp_arm64_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cd527914361b528790e34fecf40d655d2f66c19a12ca48bfd34c56725323d8dd -size 438520 +oid sha256:b362ffcaade630d82067a8d9810bd4f65328d14f8ccea3c1a707732892682a06 +size 446320 diff --git a/pkg/internal/ebpf/gotracer/bpf_tp_debug_arm64_bpfel.go b/pkg/internal/ebpf/gotracer/bpf_tp_debug_arm64_bpfel.go index f34cc64d8..b92928a86 100644 --- a/pkg/internal/ebpf/gotracer/bpf_tp_debug_arm64_bpfel.go +++ b/pkg/internal/ebpf/gotracer/bpf_tp_debug_arm64_bpfel.go @@ -72,7 +72,9 @@ type bpf_tp_debugGrpcTransportsT struct { type bpf_tp_debugHttpClientDataT struct { Method [7]uint8 Path [100]uint8 - _ [5]byte + Host [100]uint8 + Scheme [10]uint8 + _ [7]byte ContentLength int64 Pid struct { HostPid uint32 @@ -120,7 +122,7 @@ type bpf_tp_debugKafkaGoReqT struct { type bpf_tp_debugNewFuncInvocationT struct{ Parent uint64 } -type bpf_tp_debugOffTableT struct{ Table [44]uint64 } +type bpf_tp_debugOffTableT struct{ Table [46]uint64 } type bpf_tp_debugProduceReqT struct { MsgPtr uint64 diff --git a/pkg/internal/ebpf/gotracer/bpf_tp_debug_arm64_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_tp_debug_arm64_bpfel.o index 3181ffd36..b3bd10e20 100644 --- a/pkg/internal/ebpf/gotracer/bpf_tp_debug_arm64_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_tp_debug_arm64_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3b562bab73b54fa3d97ba34a4621357f370158197c0502a78098e86513e059a4 -size 1008592 +oid sha256:67c1e7f5d6dafe226e354250fbfe5e87bb0e535c3fd1aaf2d7d5c658c144c698 +size 1045080 diff --git a/pkg/internal/ebpf/gotracer/bpf_tp_debug_x86_bpfel.go b/pkg/internal/ebpf/gotracer/bpf_tp_debug_x86_bpfel.go index 2fd9dd8e1..03436ec81 100644 --- a/pkg/internal/ebpf/gotracer/bpf_tp_debug_x86_bpfel.go +++ b/pkg/internal/ebpf/gotracer/bpf_tp_debug_x86_bpfel.go @@ -72,7 +72,9 @@ type bpf_tp_debugGrpcTransportsT struct { type bpf_tp_debugHttpClientDataT struct { Method [7]uint8 Path [100]uint8 - _ [5]byte + Host [100]uint8 + Scheme [10]uint8 + _ [7]byte ContentLength int64 Pid struct { HostPid uint32 @@ -120,7 +122,7 @@ type bpf_tp_debugKafkaGoReqT struct { type bpf_tp_debugNewFuncInvocationT struct{ Parent uint64 } -type bpf_tp_debugOffTableT struct{ Table [44]uint64 } +type bpf_tp_debugOffTableT struct{ Table [46]uint64 } type bpf_tp_debugProduceReqT struct { MsgPtr uint64 diff --git a/pkg/internal/ebpf/gotracer/bpf_tp_debug_x86_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_tp_debug_x86_bpfel.o index 9ceff8797..5780f5cf3 100644 --- a/pkg/internal/ebpf/gotracer/bpf_tp_debug_x86_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_tp_debug_x86_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e05ed77385f2ec9908e1deb14708ad9914e12463d6b53438777d0632414e5fcc -size 1010384 +oid sha256:343149b17d7e51524f8ffc3e6fbaeb7a92a971c5fd1dd30728daa4b4c19ddf1d +size 1046872 diff --git a/pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.go b/pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.go index 2d5251a58..445f5e328 100644 --- a/pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.go +++ b/pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.go @@ -72,7 +72,9 @@ type bpf_tpGrpcTransportsT struct { type bpf_tpHttpClientDataT struct { Method [7]uint8 Path [100]uint8 - _ [5]byte + Host [100]uint8 + Scheme [10]uint8 + _ [7]byte ContentLength int64 Pid struct { HostPid uint32 @@ -120,7 +122,7 @@ type bpf_tpKafkaGoReqT struct { type bpf_tpNewFuncInvocationT struct{ Parent uint64 } -type bpf_tpOffTableT struct{ Table [44]uint64 } +type bpf_tpOffTableT struct{ Table [46]uint64 } type bpf_tpProduceReqT struct { MsgPtr uint64 diff --git a/pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.o index ba5a5f048..89171df19 100644 --- a/pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8165f1d9be32b790583f9e775844d92c375ec269ce5467a56a7ac95d89c44e04 -size 440288 +oid sha256:ebbcda36f7ff3d16f18610b91d9216aa8fc7793b0bb91f11189fe840bf34a1a9 +size 448120 diff --git a/pkg/internal/ebpf/gotracer/bpf_x86_bpfel.go b/pkg/internal/ebpf/gotracer/bpf_x86_bpfel.go index 68ff0994c..b650f9ccc 100644 --- a/pkg/internal/ebpf/gotracer/bpf_x86_bpfel.go +++ b/pkg/internal/ebpf/gotracer/bpf_x86_bpfel.go @@ -60,7 +60,9 @@ type bpfGrpcTransportsT struct { type bpfHttpClientDataT struct { Method [7]uint8 Path [100]uint8 - _ [5]byte + Host [100]uint8 + Scheme [10]uint8 + _ [7]byte ContentLength int64 Pid struct { HostPid uint32 @@ -108,7 +110,7 @@ type bpfKafkaGoReqT struct { type bpfNewFuncInvocationT struct{ Parent uint64 } -type bpfOffTableT struct{ Table [44]uint64 } +type bpfOffTableT struct{ Table [46]uint64 } type bpfProduceReqT struct { MsgPtr uint64 diff --git a/pkg/internal/ebpf/gotracer/bpf_x86_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_x86_bpfel.o index dbd503456..443303a36 100644 --- a/pkg/internal/ebpf/gotracer/bpf_x86_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_x86_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3b28714a5f05ac49e1706f2b6dab16c99bd3cdbb3bd4bb592cf605cdb398bc3f -size 392464 +oid sha256:ec3377547f868be69fdc52f96f1a897484ff5c7d736f78cc4c692ed8bf3c8dd5 +size 400256 diff --git a/pkg/internal/ebpf/gotracer/gotracer.go b/pkg/internal/ebpf/gotracer/gotracer.go index 1a96f5865..b84eb1878 100644 --- a/pkg/internal/ebpf/gotracer/gotracer.go +++ b/pkg/internal/ebpf/gotracer/gotracer.go @@ -111,6 +111,8 @@ func (p *Tracer) RegisterOffsets(fileInfo *exec.FileInfo, offsets *goexec.Offset // http goexec.URLPtrPos, goexec.PathPtrPos, + goexec.HostPtrPos, + goexec.SchemePtrPos, goexec.MethodPtrPos, goexec.StatusCodePtrPos, goexec.ContentLengthPtrPos, diff --git a/pkg/internal/goexec/offsets.json b/pkg/internal/goexec/offsets.json index 285202d21..15b7bcfbe 100755 --- a/pkg/internal/goexec/offsets.json +++ b/pkg/internal/goexec/offsets.json @@ -759,6 +759,18 @@ } }, "net/url.URL": { + "Host": { + "versions": { + "oldest": "1.17.0", + "newest": "1.23.5" + }, + "offsets": [ + { + "offset": 40, + "since": "1.17.0" + } + ] + }, "Path": { "versions": { "oldest": "1.17.0", @@ -770,6 +782,18 @@ "since": "1.17.0" } ] + }, + "Scheme": { + "versions": { + "oldest": "1.17.0", + "newest": "1.23.5" + }, + "offsets": [ + { + "offset": 0, + "since": "1.17.0" + } + ] } }, "vendor/golang.org/x/net/http2/hpack.Encoder": { diff --git a/pkg/internal/goexec/structmembers.go b/pkg/internal/goexec/structmembers.go index 90ea2e769..331ea8227 100644 --- a/pkg/internal/goexec/structmembers.go +++ b/pkg/internal/goexec/structmembers.go @@ -35,6 +35,8 @@ const ( // http URLPtrPos PathPtrPos + HostPtrPos + SchemePtrPos MethodPtrPos StatusCodePtrPos ContentLengthPtrPos @@ -105,7 +107,9 @@ var structMembers = map[string]structInfo{ "net/url.URL": { lib: "go", fields: map[string]GoOffset{ - "Path": PathPtrPos, + "Path": PathPtrPos, + "Host": HostPtrPos, + "Scheme": SchemePtrPos, }, }, "net/http.Response": { diff --git a/pkg/internal/request/metric_attributes.go b/pkg/internal/request/metric_attributes.go index 815c2f5ca..c681e161e 100644 --- a/pkg/internal/request/metric_attributes.go +++ b/pkg/internal/request/metric_attributes.go @@ -1,6 +1,8 @@ package request import ( + "strings" + "go.opentelemetry.io/otel/attribute" semconv "go.opentelemetry.io/otel/semconv/v1.19.0" @@ -119,6 +121,38 @@ func SpanPeer(span *Span) string { return span.Peer } +func HTTPClientHost(span *Span) string { + if strings.Index(span.Statement, ";") > 0 { + schemeHost := strings.Split(span.Statement, ";") + if schemeHost[1] != "" { + return schemeHost[1] + } + } + + return HostAsServer(span) +} + +func HTTPScheme(span *Span) string { + if strings.Index(span.Statement, ";") > 0 { + schemeHost := strings.Split(span.Statement, ";") + return schemeHost[0] + } + + return "" +} + +func URLFull(scheme, host, path string) string { + url := path + if len(host) > 0 { + url = host + url + if len(scheme) > 0 { + url = scheme + "://" + url + } + } + + return url +} + func HostAsServer(span *Span) string { if span.OtherNamespace != "" && span.OtherNamespace != span.Service.UID.Namespace && span.HostName != "" { if span.IsClientSpan() { diff --git a/pkg/internal/request/span_getters.go b/pkg/internal/request/span_getters.go index 3c1a2bd6d..419ab92fc 100644 --- a/pkg/internal/request/span_getters.go +++ b/pkg/internal/request/span_getters.go @@ -37,7 +37,12 @@ func SpanOTELGetters(name attr.Name) (attributes.Getter[*Span, attribute.KeyValu case attr.ClientAddr: getter = func(s *Span) attribute.KeyValue { return ClientAddr(PeerAsClient(s)) } case attr.ServerAddr: - getter = func(s *Span) attribute.KeyValue { return ServerAddr(HostAsServer(s)) } + getter = func(s *Span) attribute.KeyValue { + if s.Type == EventTypeHTTPClient { + return ServerAddr(HTTPClientHost(s)) + } + return ServerAddr(HostAsServer(s)) + } case attr.ServerPort: getter = func(s *Span) attribute.KeyValue { return ServerPort(s.HostPort) } case attr.RPCMethod: @@ -129,7 +134,12 @@ func SpanPromGetters(attrName attr.Name) (attributes.Getter[*Span, string], bool case attr.Client, attr.ClientAddr: getter = PeerAsClient case attr.Server, attr.ServerAddr: - getter = HostAsServer + getter = func(s *Span) string { + if s.Type == EventTypeHTTPClient { + return HTTPClientHost(s) + } + return HostAsServer(s) + } case attr.ServerPort: getter = func(s *Span) string { return strconv.Itoa(s.HostPort) } case attr.RPCMethod: diff --git a/test/integration/red_test_client.go b/test/integration/red_test_client.go index e59494e98..541e80cca 100644 --- a/test/integration/red_test_client.go +++ b/test/integration/red_test_client.go @@ -27,6 +27,7 @@ func testClientWithMethodAndStatusCode(t *testing.T, method string, statusCode i fmt.Sprintf(`http_request_method="%s",`, method) + fmt.Sprintf(`http_response_status_code="%d",`, statusCode) + `http_route="/oss/",` + + `server_address="grafana.com",` + `service_namespace="integration-test",` + `service_name="pingclient"}`) require.NoError(t, err) @@ -41,6 +42,7 @@ func testClientWithMethodAndStatusCode(t *testing.T, method string, statusCode i fmt.Sprintf(`http_request_method="%s",`, method) + fmt.Sprintf(`http_response_status_code="%d",`, statusCode) + `http_route="/oss/",` + + `server_address="grafana.com",` + `service_namespace="integration-test",` + `service_name="pingclient"}`) require.NoError(t, err) @@ -74,7 +76,7 @@ func testClientWithMethodAndStatusCode(t *testing.T, method string, statusCode i addr, ok := jaeger.FindIn(parent.Tags, "server.address") assert.True(t, ok) - assert.NotEqual(t, "", addr.Value) + assert.Equal(t, "grafana.com", addr.Value) addr, ok = jaeger.FindIn(parent.Tags, "server.port") assert.True(t, ok) diff --git a/test/integration/traces_test.go b/test/integration/traces_test.go index 459cd9806..02c464c17 100644 --- a/test/integration/traces_test.go +++ b/test/integration/traces_test.go @@ -419,15 +419,9 @@ func testHTTPTracesNestedCalls(t *testing.T, contextPropagation bool) { ) assert.Empty(t, sd, sd.String()) - numNested := 1 - - if contextPropagation { - numNested = 2 - } - // Check the information of the "in queue" span res = trace.FindByOperationName("in queue") - require.Equal(t, len(res), numNested) + require.GreaterOrEqual(t, len(res), 1) var queue *jaeger.Span @@ -452,7 +446,7 @@ func testHTTPTracesNestedCalls(t *testing.T, contextPropagation bool) { // Check the information of the "processing" span res = trace.FindByOperationName("processing") - require.Equal(t, len(res), numNested) + require.GreaterOrEqual(t, len(res), 1) var processing *jaeger.Span @@ -487,7 +481,7 @@ func testHTTPTracesNestedCalls(t *testing.T, contextPropagation bool) { sd = client.Diff( jaeger.Tag{Key: "http.request.method", Type: "string", Value: "GET"}, jaeger.Tag{Key: "http.response.status_code", Type: "int64", Value: float64(203)}, - jaeger.Tag{Key: "url.full", Type: "string", Value: "/echoBack"}, + jaeger.Tag{Key: "url.full", Type: "string", Value: "http://localhost:8080/echoBack"}, jaeger.Tag{Key: "server.port", Type: "int64", Value: float64(8080)}, // client call is to 8080 jaeger.Tag{Key: "span.kind", Type: "string", Value: "client"}, ) From e6542560ed6f32e682f1f7690fb33202e06575c7 Mon Sep 17 00:00:00 2001 From: Nikola Grcevski Date: Wed, 22 Jan 2025 20:06:08 -0500 Subject: [PATCH 3/6] fix bug setting IP/path for url.full --- pkg/export/otel/traces.go | 5 ++++- pkg/internal/ebpf/common/spanner.go | 2 +- pkg/internal/request/metric_attributes.go | 8 ++++---- pkg/internal/request/span.go | 9 +++++++++ 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/pkg/export/otel/traces.go b/pkg/export/otel/traces.go index 7a9547dc3..b578d162c 100644 --- a/pkg/export/otel/traces.go +++ b/pkg/export/otel/traces.go @@ -604,7 +604,10 @@ func traceAttributes(span *request.Span, optionalAttrs map[attr.Name]struct{}) [ case request.EventTypeHTTPClient: host := request.HTTPClientHost(span) scheme := request.HTTPScheme(span) - url := request.URLFull(scheme, host, span.Path) + url := span.Path + if span.HasOriginalHost() { + url = request.URLFull(scheme, host, span.Path) + } attrs = []attribute.KeyValue{ request.HTTPRequestMethod(span.Method), diff --git a/pkg/internal/ebpf/common/spanner.go b/pkg/internal/ebpf/common/spanner.go index 18089224c..78534cdb4 100644 --- a/pkg/internal/ebpf/common/spanner.go +++ b/pkg/internal/ebpf/common/spanner.go @@ -52,7 +52,7 @@ func HTTPRequestTraceToSpan(trace *HTTPRequestTrace) request.Span { UserPID: trace.Pid.UserPid, Namespace: trace.Pid.Ns, }, - Statement: strings.Join([]string{scheme, origHost}, ";"), + Statement: strings.Join([]string{scheme, origHost}, request.SchemeHostSeparator), } } diff --git a/pkg/internal/request/metric_attributes.go b/pkg/internal/request/metric_attributes.go index c681e161e..dd5a97bc5 100644 --- a/pkg/internal/request/metric_attributes.go +++ b/pkg/internal/request/metric_attributes.go @@ -122,8 +122,8 @@ func SpanPeer(span *Span) string { } func HTTPClientHost(span *Span) string { - if strings.Index(span.Statement, ";") > 0 { - schemeHost := strings.Split(span.Statement, ";") + if strings.Index(span.Statement, SchemeHostSeparator) > 0 { + schemeHost := strings.Split(span.Statement, SchemeHostSeparator) if schemeHost[1] != "" { return schemeHost[1] } @@ -133,8 +133,8 @@ func HTTPClientHost(span *Span) string { } func HTTPScheme(span *Span) string { - if strings.Index(span.Statement, ";") > 0 { - schemeHost := strings.Split(span.Statement, ";") + if strings.Index(span.Statement, SchemeHostSeparator) > 0 { + schemeHost := strings.Split(span.Statement, SchemeHostSeparator) return schemeHost[0] } diff --git a/pkg/internal/request/span.go b/pkg/internal/request/span.go index ca1aa2fdd..bd3679d87 100644 --- a/pkg/internal/request/span.go +++ b/pkg/internal/request/span.go @@ -44,6 +44,10 @@ const ( grpcTracesDetectPattern = "/opentelemetry.proto.collector.trace.v1.TraceService/Export" ) +const ( + SchemeHostSeparator = ";" +) + type SQLKind uint8 const ( @@ -536,3 +540,8 @@ func (s *Span) DBSystem() attribute.KeyValue { return semconv.DBSystemOtherSQL } + +func (s *Span) HasOriginalHost() bool { + schemeHost := strings.Split(s.Statement, SchemeHostSeparator) + return len(schemeHost) > 1 && schemeHost[1] != "" +} From a69c5880c682c1cd517b598ae5723b63bb2e4599 Mon Sep 17 00:00:00 2001 From: Nikola Grcevski Date: Wed, 22 Jan 2025 20:13:26 -0500 Subject: [PATCH 4/6] address PR feedback --- bpf/go_grpc.h | 12 ++--- bpf/go_nethttp.h | 52 ++++++++++--------- pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o | 4 +- .../ebpf/gotracer/bpf_debug_arm64_bpfel.o | 4 +- .../ebpf/gotracer/bpf_debug_x86_bpfel.o | 4 +- .../ebpf/gotracer/bpf_tp_arm64_bpfel.o | 4 +- .../ebpf/gotracer/bpf_tp_debug_arm64_bpfel.o | 4 +- .../ebpf/gotracer/bpf_tp_debug_x86_bpfel.o | 4 +- pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.o | 4 +- pkg/internal/ebpf/gotracer/bpf_x86_bpfel.o | 4 +- test/integration/traces_test.go | 6 +-- 11 files changed, 52 insertions(+), 50 deletions(-) diff --git a/bpf/go_grpc.h b/bpf/go_grpc.h index d989ed707..d17986626 100644 --- a/bpf/go_grpc.h +++ b/bpf/go_grpc.h @@ -237,9 +237,9 @@ int beyla_uprobe_server_handleStream_return(struct pt_regs *ctx) { trace->start_monotime_ns = invocation->start_monotime_ns; trace->status = status; trace->content_length = 0; - trace->method[0] = 0; - trace->host[0] = 0; - trace->scheme[0] = 0; + trace->method[0] = '\0'; + trace->host[0] = '\0'; + trace->scheme[0] = '\0'; trace->go_start_monotime_ns = invocation->start_monotime_ns; bpf_map_delete_elem(&ongoing_goroutines, &g_key); @@ -429,9 +429,9 @@ static __always_inline int grpc_connect_done(struct pt_regs *ctx, void *err) { trace->go_start_monotime_ns = invocation->start_monotime_ns; trace->end_monotime_ns = bpf_ktime_get_ns(); trace->content_length = 0; - trace->method[0] = 0; - trace->host[0] = 0; - trace->scheme[0] = 0; + trace->method[0] = '\0'; + trace->host[0] = '\0'; + trace->scheme[0] = '\0'; // Read arguments from the original set of registers diff --git a/bpf/go_nethttp.h b/bpf/go_nethttp.h index e262c57b2..5eafed7fe 100644 --- a/bpf/go_nethttp.h +++ b/bpf/go_nethttp.h @@ -322,8 +322,8 @@ int beyla_uprobe_ServeHTTPReturns(struct pt_regs *ctx) { trace->type = EVENT_HTTP_REQUEST; trace->start_monotime_ns = invocation->start_monotime_ns; trace->end_monotime_ns = bpf_ktime_get_ns(); - trace->host[0] = 0; - trace->scheme[0] = 0; + trace->host[0] = '\0'; + trace->scheme[0] = '\0'; goroutine_metadata *g_metadata = bpf_map_lookup_elem(&ongoing_goroutines, &g_key); if (g_metadata) { @@ -416,31 +416,33 @@ static __always_inline void roundTripStartHelper(struct pt_regs *ctx) { sizeof(url_ptr), (void *)(req + go_offset_of(ot, (go_offset){.v = _url_ptr_pos}))); - if (!url_ptr || !read_go_str("path", - url_ptr, - go_offset_of(ot, (go_offset){.v = _path_ptr_pos}), - &trace.path, - sizeof(trace.path))) { - bpf_dbg_printk("can't read http Request.URL.Path"); - return; - } + if (url_ptr) { + if (!read_go_str("path", + url_ptr, + go_offset_of(ot, (go_offset){.v = _path_ptr_pos}), + &trace.path, + sizeof(trace.path))) { + bpf_dbg_printk("can't read http Request.URL.Path"); + return; + } - if (!url_ptr || !read_go_str("host", - url_ptr, - go_offset_of(ot, (go_offset){.v = _host_ptr_pos}), - &trace.host, - sizeof(trace.host))) { - bpf_dbg_printk("can't read http Request.URL.Host"); - return; - } + if (!read_go_str("host", + url_ptr, + go_offset_of(ot, (go_offset){.v = _host_ptr_pos}), + &trace.host, + sizeof(trace.host))) { + bpf_dbg_printk("can't read http Request.URL.Host"); + return; + } - if (!url_ptr || !read_go_str("scheme", - url_ptr, - go_offset_of(ot, (go_offset){.v = _scheme_ptr_pos}), - &trace.scheme, - sizeof(trace.scheme))) { - bpf_dbg_printk("can't read http Request.URL.Scheme"); - return; + if (!read_go_str("scheme", + url_ptr, + go_offset_of(ot, (go_offset){.v = _scheme_ptr_pos}), + &trace.scheme, + sizeof(trace.scheme))) { + bpf_dbg_printk("can't read http Request.URL.Scheme"); + return; + } } bpf_dbg_printk("path: %s", trace.path); diff --git a/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o index f05ebec1b..56fbbff7a 100644 --- a/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_arm64_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:508ad9bf5e179e06fbdf74081b36ab9ecde186f9b405948c5652b50216ed23c7 -size 398408 +oid sha256:71eb00ca865500815233f19a0ade3ae0108ec7166541e0374e0c53b2d361108a +size 398192 diff --git a/pkg/internal/ebpf/gotracer/bpf_debug_arm64_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_debug_arm64_bpfel.o index 78aa6601a..b2dcec771 100644 --- a/pkg/internal/ebpf/gotracer/bpf_debug_arm64_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_debug_arm64_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:18e7b47a6a63e2621e137c162effe04e6137128dc6c08e64d2bbf302be1090e6 -size 941936 +oid sha256:38ae21f62b62facec671ea014e4425b44bd498b59b3db639a89bb91f1b4fbc59 +size 941672 diff --git a/pkg/internal/ebpf/gotracer/bpf_debug_x86_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_debug_x86_bpfel.o index 79fab90bf..e79fda777 100644 --- a/pkg/internal/ebpf/gotracer/bpf_debug_x86_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_debug_x86_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6004ceeefaaf45a9eda4af2064e91547214d692357cf3d0440bc54b689285caf -size 943736 +oid sha256:f77109cf9b4ebd2c64619c76405a381c1a3b529fb5a3f382f4b05110be50ef81 +size 943472 diff --git a/pkg/internal/ebpf/gotracer/bpf_tp_arm64_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_tp_arm64_bpfel.o index 877b4cf62..27fa4da0c 100644 --- a/pkg/internal/ebpf/gotracer/bpf_tp_arm64_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_tp_arm64_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b362ffcaade630d82067a8d9810bd4f65328d14f8ccea3c1a707732892682a06 -size 446320 +oid sha256:e43020967dad8519929821661f4602a1565b0e8003670e7ee91eae3b0adf159f +size 446096 diff --git a/pkg/internal/ebpf/gotracer/bpf_tp_debug_arm64_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_tp_debug_arm64_bpfel.o index b3bd10e20..9f24f7aa2 100644 --- a/pkg/internal/ebpf/gotracer/bpf_tp_debug_arm64_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_tp_debug_arm64_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:67c1e7f5d6dafe226e354250fbfe5e87bb0e535c3fd1aaf2d7d5c658c144c698 -size 1045080 +oid sha256:9b68fac88708140dbd97c3012d578f0820ee2ce9871049c92d028538ac1179b4 +size 1045008 diff --git a/pkg/internal/ebpf/gotracer/bpf_tp_debug_x86_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_tp_debug_x86_bpfel.o index 5780f5cf3..2116ca885 100644 --- a/pkg/internal/ebpf/gotracer/bpf_tp_debug_x86_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_tp_debug_x86_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:343149b17d7e51524f8ffc3e6fbaeb7a92a971c5fd1dd30728daa4b4c19ddf1d -size 1046872 +oid sha256:aba6bc6c0997a65b0dfe65a7f54d15caa9a30797e6639f6f46e1290d42780f4b +size 1046800 diff --git a/pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.o index 89171df19..7475f8b6b 100644 --- a/pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_tp_x86_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ebbcda36f7ff3d16f18610b91d9216aa8fc7793b0bb91f11189fe840bf34a1a9 -size 448120 +oid sha256:14fbcbc6bf36a59d153d1762cabed3f9293c2902c130b46b49a53507c643a5dd +size 447912 diff --git a/pkg/internal/ebpf/gotracer/bpf_x86_bpfel.o b/pkg/internal/ebpf/gotracer/bpf_x86_bpfel.o index 443303a36..11f26f524 100644 --- a/pkg/internal/ebpf/gotracer/bpf_x86_bpfel.o +++ b/pkg/internal/ebpf/gotracer/bpf_x86_bpfel.o @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ec3377547f868be69fdc52f96f1a897484ff5c7d736f78cc4c692ed8bf3c8dd5 -size 400256 +oid sha256:9083157c3f48cad4038fd040666089ac850119dfd014143192b10a01afe825dd +size 399992 diff --git a/test/integration/traces_test.go b/test/integration/traces_test.go index 02c464c17..e3982d393 100644 --- a/test/integration/traces_test.go +++ b/test/integration/traces_test.go @@ -366,7 +366,7 @@ func testHTTPTracesKProbes(t *testing.T) { assert.Empty(t, sd, sd.String()) } -func testHTTPTracesNestedCalls(t *testing.T, contextPropagation bool) { +func testHTTPTracesNestedCalls(t *testing.T) { var traceID string var parentID string @@ -489,11 +489,11 @@ func testHTTPTracesNestedCalls(t *testing.T, contextPropagation bool) { } func testHTTPTracesNestedClient(t *testing.T) { - testHTTPTracesNestedCalls(t, false) + testHTTPTracesNestedCalls(t) } func testHTTPTracesNestedClientWithContextPropagation(t *testing.T) { - testHTTPTracesNestedCalls(t, true) + testHTTPTracesNestedCalls(t) } //nolint:cyclop From eb420363d569898f6238e034bafb59a42777a662 Mon Sep 17 00:00:00 2001 From: Nikola Grcevski Date: Wed, 22 Jan 2025 20:21:59 -0500 Subject: [PATCH 5/6] improve span code --- pkg/internal/ebpf/common/httpfltr_transform.go | 6 ++++++ pkg/internal/ebpf/common/spanner.go | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/internal/ebpf/common/httpfltr_transform.go b/pkg/internal/ebpf/common/httpfltr_transform.go index 3aaebb9c6..54ad32923 100644 --- a/pkg/internal/ebpf/common/httpfltr_transform.go +++ b/pkg/internal/ebpf/common/httpfltr_transform.go @@ -16,6 +16,11 @@ import ( // misses serviceID func httpInfoToSpan(info *HTTPInfo) request.Span { + scheme := "http" + if info.Ssl == 1 { + scheme = "https" + } + return request.Span{ Type: request.EventType(info.Type), Method: info.Method, @@ -38,6 +43,7 @@ func httpInfoToSpan(info *HTTPInfo) request.Span { UserPID: info.Pid.UserPid, Namespace: info.Pid.Ns, }, + Statement: scheme + request.SchemeHostSeparator, } } diff --git a/pkg/internal/ebpf/common/spanner.go b/pkg/internal/ebpf/common/spanner.go index 78534cdb4..c8466d3aa 100644 --- a/pkg/internal/ebpf/common/spanner.go +++ b/pkg/internal/ebpf/common/spanner.go @@ -30,6 +30,11 @@ func HTTPRequestTraceToSpan(trace *HTTPRequestTrace) request.Span { hostPort = int(trace.Conn.D_port) } + schemeHost := "" + if scheme != "" || origHost != "" { + schemeHost = strings.Join([]string{scheme, origHost}, request.SchemeHostSeparator) + } + return request.Span{ Type: request.EventType(trace.Type), Method: method, @@ -52,7 +57,7 @@ func HTTPRequestTraceToSpan(trace *HTTPRequestTrace) request.Span { UserPID: trace.Pid.UserPid, Namespace: trace.Pid.Ns, }, - Statement: strings.Join([]string{scheme, origHost}, request.SchemeHostSeparator), + Statement: schemeHost, } } From 380c78632ee7c1326c285eb182e27df4eb5498f5 Mon Sep 17 00:00:00 2001 From: Nikola Grcevski Date: Thu, 23 Jan 2025 10:04:32 -0500 Subject: [PATCH 6/6] fix tests --- pkg/internal/ebpf/common/httpfltr_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pkg/internal/ebpf/common/httpfltr_test.go b/pkg/internal/ebpf/common/httpfltr_test.go index 2ca4443a7..50036fbb5 100644 --- a/pkg/internal/ebpf/common/httpfltr_test.go +++ b/pkg/internal/ebpf/common/httpfltr_test.go @@ -118,6 +118,7 @@ func TestToRequestTrace(t *testing.T) { End: 789012, HostPort: 1, Service: svc.Attrs{}, + Statement: "http;", } assert.Equal(t, expected, result) } @@ -154,6 +155,7 @@ func TestToRequestTraceNoConnection(t *testing.T) { Status: 200, HostPort: 7033, Service: svc.Attrs{}, + Statement: "http;", } assert.Equal(t, expected, result) } @@ -191,6 +193,7 @@ func TestToRequestTrace_BadHost(t *testing.T) { End: 789012, HostPort: 0, Service: svc.Attrs{}, + Statement: "http;", } assert.Equal(t, expected, result)