Ver código fonte

Fixed #TASK_GK-2944 go横向串联Header调整

Carl 1 ano atrás
pai
commit
e9c86e1bce

+ 1 - 1
containers/registry.go

@@ -255,7 +255,7 @@ func (r *Registry) handleEvents(ch <-chan ebpftracer.Event) {
 				//fmt.Println("ebpftracer.EventTypeConnectionOpen==================", e.Pid)
 				if c := r.getOrCreateContainer(e.Pid); c != nil {
 					c.onConnectionOpen(e.Pid, e.Fd, e.SrcAddr, e.DstAddr, e.Timestamp, false)
-					c.attachTlsUprobes(r.tracer, e.Pid)
+					//c.attachTlsUprobes(r.tracer, e.Pid)
 					c.attachJVMUprobes(r.tracer, e.Pid)
 				} else {
 					klog.Infoln("TCP connection from unknown container", e)

+ 7 - 1
ebpftracer/ebpf/include/apm_trace.h

@@ -27,9 +27,15 @@
 #define APM_SPAN_ID_SIZE 8
 
 // cwtrace
+
 #define CW_HEADER_KEY_LENGTH 7
+#define CW_HEADER_KEY_VAL "cwtrace"
+#define CW_HEADER_KEY_UFIRST_VAL "Cwtrace"
+#define CW_HEADER_VAL_LENGTH 123
+
 #define CW_HEADER_LENGTH 123
-#define CW_HEADER_LENGTH2 122
+
+#define CW_STREAM_HEADER_LEN CW_HEADER_KEY_LENGTH + 2 + CW_HEADER_VAL_LENGTH + 2
 
 /***********************************************************
  * Trace struct

+ 0 - 69
ebpftracer/ebpf/utrace/go/include/span_context.h

@@ -127,75 +127,6 @@ static __always_inline void span_context_to_cw_string(struct apm_span_context *c
 //	*out = '1';
 }
 
-static __always_inline void span_context_to_cw_string2(struct apm_span_context *ctx, char *buff) {
-	// W3C format: version (2 chars) - trace id (32 chars) - span id (16 chars) - sampled (2 chars)
-	//	[type_from]:[sample]:[host_id]:[app_id]:[instance_id]:[trace_id]:[assumed_app_i d]:[span_id]
-	//	2           2         16        16      16            32         16                16
-	char *out = buff;
-
-	// Write type_from
-	*out++ = 'G';
-	*out++ = 'O';
-	*out++ = ':';
-
-	// Write sample
-//	*out++ = '0';
-	*out++ = '0';
-	*out++ = ':';
-
-	// Write host_id
-	bytes_to_hex_string(ctx->host_id, APM_HOST_ID_SIZE, out);
-	out += APM_HOST_ID_STRING_SIZE;
-	*out++ = ':';
-
-	// Write app_id
-	bytes_to_hex_string(ctx->app_id, APM_APP_ID_SIZE, out);
-	out += APM_APP_ID_STRING_SIZE;
-	*out++ = ':';
-
-
-	// Write instance_id
-	bytes_to_hex_string(ctx->instance_id, APM_INSTANCE_ID_SIZE, out);
-	out += APM_INSTANCE_ID_STRING_SIZE;
-	*out++ = ':';
-
-	// Write trace_id
-	bytes_to_hex_string(ctx->trace_id, APM_TRACE_ID_SIZE, out);
-	out += APM_TRACE_ID_STRING_SIZE;
-	*out++ = ':';
-	// Write assumed_app_id
-	bytes_to_hex_string(ctx->assumed_app_id, APM_ASSUMED_APP_ID_SIZE, out);
-	out += APM_ASSUMED_APP_ID_STRING_SIZE;
-	*out++ = ':';
-
-	// Write span_id
-	bytes_to_hex_string(ctx->span_id, APM_SPAN_ID_SIZE, out);
-	out += APM_SPAN_ID_STRING_SIZE;
-//	*out++ = ':';
-
-//	// Write trace id
-//	bytes_to_hex_string(ctx->TraceID, TRACE_ID_SIZE, out);
-//	out += TRACE_ID_STRING_SIZE;
-//	*out++ = '-';
-//	// Write trace id
-//	bytes_to_hex_string(ctx->TraceID, TRACE_ID_SIZE, out);
-//	out += TRACE_ID_STRING_SIZE;
-//	*out++ = '-';
-//	// Write trace id
-//	bytes_to_hex_string(ctx->TraceID, TRACE_ID_SIZE, out);
-//	out += TRACE_ID_STRING_SIZE;
-//	*out++ = '-';
-//
-//	// Write span id
-//	bytes_to_hex_string(ctx->SpanID, SPAN_ID_SIZE, out);
-//	out += SPAN_ID_STRING_SIZE;
-//	*out++ = '-';
-
-	// Write sampled
-//	*out++ = '0';
-//	*out = '1';
-}
-
 #define MAX_SIZE 120
 #define MAX_TOKENS 8
 

+ 6 - 6
ebpftracer/ebpf/utrace/go/net/client.probe.bpf.c

@@ -317,18 +317,18 @@ static __always_inline long cw_inject_header2(void* headers_ptr, struct apm_span
     bucket_map_value->tophash[bucket_index] = traceparent_tophash;
 
     // Prepare the key string for the user
-    char key[9] = "CLOUDWISE";
-    void *ptr = write_target_data(key, 9);
+    char key[CW_HEADER_KEY_LENGTH] = CW_HEADER_KEY_VAL;
+    void *ptr = write_target_data(key, CW_HEADER_KEY_LENGTH);
     if (ptr == NULL) {
         cw_bpf_debug("inject_header: Failed to write key to user");
         return -1;
     }
-    bucket_map_value->keys[bucket_index] = (struct go_string_ot) {.len = 9, .str = ptr};
+    bucket_map_value->keys[bucket_index] = (struct go_string_ot) {.len = CW_HEADER_KEY_LENGTH, .str = ptr};
 
     // Prepare the value string slice
     // First the value string which constains the span context
-    char val[CW_HEADER_LENGTH2];
-	span_context_to_cw_string2(propagated_ctx, val);
+    char val[CW_HEADER_VAL_LENGTH];
+	span_context_to_cw_string(propagated_ctx, val);
     ptr = write_target_data(val, sizeof(val));
     if(ptr == NULL) {
         cw_bpf_debug("inject_header: Failed to write value to user");
@@ -336,7 +336,7 @@ static __always_inline long cw_inject_header2(void* headers_ptr, struct apm_span
     }
 
     // The go string pointing to the above val
-    struct go_string_ot header_value = {.len = CW_HEADER_LENGTH2, .str = ptr};
+    struct go_string_ot header_value = {.len = CW_HEADER_VAL_LENGTH, .str = ptr};
     ptr = write_target_data((void*)&header_value, sizeof(header_value));
     if(ptr == NULL) {
         cw_bpf_debug("inject_header: Failed to write go_string to user");

+ 29 - 29
ebpftracer/ebpf/utrace/go/net/server.probe.bpf.c

@@ -157,13 +157,13 @@ static __always_inline struct span_context *extract_context_from_req_headers(voi
 			if (map_value->tophash[i] == 0) {
 				continue;
 			}
-			if (map_value->keys[i].len != W3C_KEY_LENGTH) {
+			if (map_value->keys[i].len != CW_HEADER_KEY_LENGTH) {
 				continue;
 			}
-			char current_header_key[W3C_KEY_LENGTH];
+			char current_header_key[CW_HEADER_KEY_LENGTH];
 			bpf_probe_read(current_header_key, sizeof(current_header_key), map_value->keys[i].str);
-			for (int i = 0; i < W3C_KEY_LENGTH; i++) {
-				if (current_header_key[i] != "Traceparent"[i] && current_header_key[i] != "traceparent"[i]) {
+			for (int i = 0; i < CW_HEADER_KEY_LENGTH; i++) {
+				if (current_header_key[i] != CW_HEADER_KEY_VAL[i] && current_header_key[i] != CW_HEADER_KEY_UFIRST_VAL[i]) {
 					goto outer_loop;
 				}
 			}
@@ -349,7 +349,7 @@ void read_go_string(void *base, int offset, char *output, int maxLen, const char
 SEC("uprobe/HandlerFunc_ServeHTTP")
 int uprobe_HandlerFunc_ServeHTTP_Returns(struct pt_regs *ctx) {
 	cw_bpf_debug("[uprobe_HandlerFunc_ServeHTTP_Returns]");
-	u64 end_time = bpf_ktime_get_ns();
+//	u64 end_time = bpf_ktime_get_ns();
 	void *req_ctx_ptr = get_Go_context(ctx, 4, ctx_ptr_pos, false);
 	void *key = get_consistent_key(ctx, req_ctx_ptr);
 
@@ -361,30 +361,30 @@ int uprobe_HandlerFunc_ServeHTTP_Returns(struct pt_regs *ctx) {
 	bpf_map_delete_elem(&http_server_uprobes, &key);
 
 	struct http_server_span_t *http_server_span = &uprobe_data->span;
-	void *resp_ptr = (void *) uprobe_data->resp_ptr;
-	void *req_ptr = NULL;
-	bpf_probe_read(&req_ptr, sizeof(req_ptr), (void *) (resp_ptr + req_ptr_pos));
-
-	http_server_span->end_time = end_time;
-
-	void *url_ptr = 0;
-	bpf_probe_read(&url_ptr, sizeof(url_ptr), (void *) (req_ptr + url_ptr_pos));
-	// Collect fields from response
-	read_go_string(req_ptr, method_ptr_pos, http_server_span->method, sizeof(http_server_span->method),
-	               "method from request");
-	read_go_string(url_ptr, path_ptr_pos, http_server_span->path, sizeof(http_server_span->path),
-	               "path from Request.URL");
-	read_go_string(req_ptr, remote_addr_pos, http_server_span->remote_addr, sizeof(http_server_span->remote_addr),
-	               "remote addr from Request.RemoteAddr");
-	read_go_string(req_ptr, host_pos, http_server_span->host, sizeof(http_server_span->host), "host from Request.Host");
-	read_go_string(req_ptr, proto_pos, http_server_span->proto, sizeof(http_server_span->proto),
-	               "proto from Request.Proto");
-
-	// status code
-	bpf_probe_read(&http_server_span->status_code, sizeof(http_server_span->status_code),
-	               (void *) (resp_ptr + status_code_pos));
-
-	bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, http_server_span, sizeof(*http_server_span));
+//	void *resp_ptr = (void *) uprobe_data->resp_ptr;
+//	void *req_ptr = NULL;
+//	bpf_probe_read(&req_ptr, sizeof(req_ptr), (void *) (resp_ptr + req_ptr_pos));
+
+//	http_server_span->end_time = end_time;
+//
+//	void *url_ptr = 0;
+//	bpf_probe_read(&url_ptr, sizeof(url_ptr), (void *) (req_ptr + url_ptr_pos));
+//	// Collect fields from response
+//	read_go_string(req_ptr, method_ptr_pos, http_server_span->method, sizeof(http_server_span->method),
+//	               "method from request");
+//	read_go_string(url_ptr, path_ptr_pos, http_server_span->path, sizeof(http_server_span->path),
+//	               "path from Request.URL");
+//	read_go_string(req_ptr, remote_addr_pos, http_server_span->remote_addr, sizeof(http_server_span->remote_addr),
+//	               "remote addr from Request.RemoteAddr");
+//	read_go_string(req_ptr, host_pos, http_server_span->host, sizeof(http_server_span->host), "host from Request.Host");
+//	read_go_string(req_ptr, proto_pos, http_server_span->proto, sizeof(http_server_span->proto),
+//	               "proto from Request.Proto");
+//
+//	// status code
+//	bpf_probe_read(&http_server_span->status_code, sizeof(http_server_span->status_code),
+//	               (void *) (resp_ptr + status_code_pos));
+//
+//	bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, http_server_span, sizeof(*http_server_span));
 	stop_tracking_span(&http_server_span->sc, &http_server_span->psc);
 
 

+ 7 - 7
ebpftracer/ebpf/utrace/java/net/client.probe.bpf.c

@@ -79,7 +79,7 @@ static __inline struct sock_t* buildHeader(struct sock_t *map_data) {
 //	__builtin_memset(map_data_res, 0, sizeof(struct sock_t));
 //	char header[5] = "cwt\r\n";
 
-//	char header[HEADER_LEN] = "cwtrace: 00:00:1015481350055581:5450531005555981:5610250100539899:304775019cd3218a304775019cd3218a:1001025098564810:140acc88cde8773f\r\n";
+//	char header[CW_STREAM_HEADER_LEN] = "cwtrace: 00:00:1015481350055581:5450531005555981:5610250100539899:304775019cd3218a304775019cd3218a:1001025098564810:140acc88cde8773f\r\n";
 	struct apm_span_context *cw_span_context = bpf_map_lookup_elem(&apm_span_context_heap, &key);
 
 	if (cw_span_context == NULL){
@@ -119,7 +119,7 @@ static __inline struct sock_t* buildHeader(struct sock_t *map_data) {
 	set_assumed_app_id_arrays("111", cw_span_context->assumed_app_id, APM_ASSUMED_APP_ID_STRING_SIZE);
 	cw_save_current_tracking_span(cw_span_context);
 
-	char header[HEADER_LEN];
+	char header[CW_STREAM_HEADER_LEN];
 	span_context_to_cw_string_stream(cw_span_context, header, '1');
 	bpf_printk("Successfully HEADER  %s\n", header);
 
@@ -133,14 +133,14 @@ static __inline struct sock_t* buildHeader(struct sock_t *map_data) {
 		} else {
 			if (i == map_data->header_offset_idx) {
 #pragma unroll
-				for (int k = 0; k < HEADER_LEN; k++) {
+				for (int k = 0; k < CW_STREAM_HEADER_LEN; k++) {
 					int tmp_len = i + k;
 					if (tmp_len < MAX_LEN) {
 						map_data_res->payload[tmp_len] = header[k];
 					}
 				}
 			}
-			int tmp_len = i + HEADER_LEN;
+			int tmp_len = i + CW_STREAM_HEADER_LEN;
 			if (tmp_len < MAX_LEN) {
 				map_data_res->payload[tmp_len] = map_data->payload[i];
 				if (map_data->payload[i] == '\0')
@@ -149,7 +149,7 @@ static __inline struct sock_t* buildHeader(struct sock_t *map_data) {
 			}
 		}
 	}
-	map_data_res->size = map_data->size + HEADER_LEN;
+	map_data_res->size = map_data->size + CW_STREAM_HEADER_LEN;
 
 	return map_data_res;
 }
@@ -281,7 +281,7 @@ int uprobe_Java_java_net_SocketOutputStream_socketWrite0(struct pt_regs *ctx) {
 	// 挪动数据以腾出空间插入子串
 	int insert_pos = map_data->header_offset_idx;
 
-	char subs[HEADER_LEN+1] = "cwtrace: 00:00:1015481350055581:5450531005555981:5610250100539899:304775019cd3218a304775019cd3218a:1001025098564810:140acc88cde8773f\r\n\0";
+	char subs[CW_STREAM_HEADER_LEN+1] = "cwtrace: 00:00:1015481350055581:5450531005555981:5610250100539899:304775019cd3218a304775019cd3218a:1001025098564810:140acc88cde8773f\r\n\0";
 	if (insert_pos >= 0 && insert_pos <= MAX_BUFFER_SIZE - sizeof(subs)) {
 		__builtin_memcpy(data + insert_pos, subs, sizeof(subs));
 	}
@@ -329,7 +329,7 @@ int uprobe_Java_java_net_SocketOutputStream_socketWrite0(struct pt_regs *ctx) {
 	}
 
 	unsigned long new_val2;
-	new_val2 = map_data->size + HEADER_LEN;
+	new_val2 = map_data->size + CW_STREAM_HEADER_LEN;
 	bpf_printk("Successfully %d\n", new_val2);
 
 	res = bpf_probe_write_user((void *) len_from_rbp_ptr, &new_val2, sizeof(new_val2));

+ 2 - 0
pkg/go.opentelemetry.io/otel/exporters/otlp/otlptrace/apm_exporter.go

@@ -295,6 +295,8 @@ func buildAppMap(mNode *MapInfoT, traceRoot *TraceMapT, sd apmTraceSpan) {
 			traceRoot.RootData.AppIdFrom = attr.Value.AsInt64()
 		case "server.span_id_from":
 			traceRoot.RootData.SpanIdFrom = attr.Value.AsString()
+		case "server.type_from":
+			traceRoot.RootData.TypeFrom = attr.Value.AsString()
 		}
 	}