|
@@ -64,7 +64,7 @@ struct {
|
|
|
__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
|
|
__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
|
|
|
__uint(key_size, sizeof(u32));
|
|
__uint(key_size, sizeof(u32));
|
|
|
__uint(value_size, sizeof(struct cw_header_token));
|
|
__uint(value_size, sizeof(struct cw_header_token));
|
|
|
- __uint(max_entries, 1);
|
|
|
|
|
|
|
+ __uint(max_entries, MAX_CONCURRENT);
|
|
|
} header_range SEC(".maps");
|
|
} header_range SEC(".maps");
|
|
|
|
|
|
|
|
struct {
|
|
struct {
|
|
@@ -74,6 +74,13 @@ struct {
|
|
|
__uint(max_entries, 1);
|
|
__uint(max_entries, 1);
|
|
|
} parent_span_context_storage_map SEC(".maps");
|
|
} parent_span_context_storage_map SEC(".maps");
|
|
|
|
|
|
|
|
|
|
+struct {
|
|
|
|
|
+ __uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
|
|
|
|
|
+ __uint(key_size, sizeof(u32));
|
|
|
|
|
+ __uint(value_size, sizeof(struct apm_span_context));
|
|
|
|
|
+ __uint(max_entries, 1);
|
|
|
|
|
+} cw_parent_span_context_storage_map SEC(".maps");
|
|
|
|
|
+
|
|
|
struct {
|
|
struct {
|
|
|
__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
|
|
__uint(type, BPF_MAP_TYPE_PERCPU_ARRAY);
|
|
|
__uint(key_size, sizeof(u32));
|
|
__uint(key_size, sizeof(u32));
|
|
@@ -179,7 +186,7 @@ static __always_inline struct span_context *extract_context_from_req_headers(voi
|
|
|
res = bpf_probe_read(&traceparent_header_value_go_str, sizeof(traceparent_header_value_go_str),
|
|
res = bpf_probe_read(&traceparent_header_value_go_str, sizeof(traceparent_header_value_go_str),
|
|
|
traceparent_header_value_ptr);
|
|
traceparent_header_value_ptr);
|
|
|
// 00-95b5ec2b81e2374a4a27ce36ab71d349-18f65a5a3ab22213-02
|
|
// 00-95b5ec2b81e2374a4a27ce36ab71d349-18f65a5a3ab22213-02
|
|
|
-// bpf_printk("traceparent_header_value_go_str.str:%s", traceparent_header_value_go_str.str);
|
|
|
|
|
|
|
+ bpf_printk("traceparent_header_value_go_str.str:%s", traceparent_header_value_go_str.str);
|
|
|
|
|
|
|
|
if (res < 0) {
|
|
if (res < 0) {
|
|
|
return NULL;
|
|
return NULL;
|
|
@@ -187,7 +194,7 @@ static __always_inline struct span_context *extract_context_from_req_headers(voi
|
|
|
// if (traceparent_header_value_go_str.len != W3C_VAL_LENGTH) {
|
|
// if (traceparent_header_value_go_str.len != W3C_VAL_LENGTH) {
|
|
|
// continue;
|
|
// continue;
|
|
|
// }
|
|
// }
|
|
|
- char traceparent_header_value[120];
|
|
|
|
|
|
|
+ char traceparent_header_value[130];
|
|
|
res = bpf_probe_read(&traceparent_header_value, sizeof(traceparent_header_value),
|
|
res = bpf_probe_read(&traceparent_header_value, sizeof(traceparent_header_value),
|
|
|
traceparent_header_value_go_str.str);
|
|
traceparent_header_value_go_str.str);
|
|
|
// 00-95b5ec2b81e2374a4a27ce36ab71d349-18f65a5a3ab22213-02��c�����c����@c;
|
|
// 00-95b5ec2b81e2374a4a27ce36ab71d349-18f65a5a3ab22213-02��c�����c����@c;
|
|
@@ -202,108 +209,52 @@ static __always_inline struct span_context *extract_context_from_req_headers(voi
|
|
|
|
|
|
|
|
struct span_context *parent_span_context = bpf_map_lookup_elem(&parent_span_context_storage_map, &map_id);
|
|
struct span_context *parent_span_context = bpf_map_lookup_elem(&parent_span_context_storage_map, &map_id);
|
|
|
if (!parent_span_context) {
|
|
if (!parent_span_context) {
|
|
|
-// bpf_printk("no parent_span_context");
|
|
|
|
|
|
|
+ bpf_printk("no parent_span_context");
|
|
|
return NULL;
|
|
return NULL;
|
|
|
}
|
|
}
|
|
|
-// bpf_printk("parent_span_context-TraceID1:%s", parent_span_context->TraceID);
|
|
|
|
|
-// bpf_printk("parent_span_context-SpanID1:%s", parent_span_context->SpanID);
|
|
|
|
|
-// struct cw_header_token *header_range_data = bpf_map_lookup_elem(&header_range, &map_id);
|
|
|
|
|
-// if (!header_range_data) {
|
|
|
|
|
-// return NULL;
|
|
|
|
|
-// }
|
|
|
|
|
-// u32 idx = 0;
|
|
|
|
|
-// u32 str_len = 0;
|
|
|
|
|
-// struct cw_header_token tmp = *header_range_data;
|
|
|
|
|
-// tmp.a = 4;
|
|
|
|
|
-//// struct Token t = {.start=1,.len=2};
|
|
|
|
|
-// for (int k = 0; k < MAX_TOKENS; ++k) {
|
|
|
|
|
-//// header_range_data->token[k] = t ;
|
|
|
|
|
-// header_range_data->start[k] = 1 ;
|
|
|
|
|
-//
|
|
|
|
|
-//// tmp.token[k] = t ;
|
|
|
|
|
-// }
|
|
|
|
|
-// for (int k = 0; k < MAX_TOKENS; ++k) {
|
|
|
|
|
-//// struct Token t = {.start=1, .len=2};
|
|
|
|
|
-//// header_range_data->token[k] = t;
|
|
|
|
|
-// bpf_printk("header_range_data->token---%d", header_range_data->token[k].len);
|
|
|
|
|
-//
|
|
|
|
|
-// }
|
|
|
|
|
-//
|
|
|
|
|
-//// header_range_data->token[0].len = 1;
|
|
|
|
|
-//
|
|
|
|
|
-// bpf_printk("header_range_data->token---%d", header_range_data->token[0].len);
|
|
|
|
|
-//
|
|
|
|
|
-// for (u32 k = 0; k < MAX_SIZE; ++k) {
|
|
|
|
|
-// if (traceparent_header_value[k] == '\0') {
|
|
|
|
|
-//// bpf_map_update_elem(&header_range, &map_id, &tmp, BPF_ANY);
|
|
|
|
|
-// break;
|
|
|
|
|
-// }
|
|
|
|
|
-// bpf_printk("k---%d", k);
|
|
|
|
|
-// if (traceparent_header_value[k] == ':') {
|
|
|
|
|
-// str_len = 0;
|
|
|
|
|
-// tmp.token[idx].start = k + 1;
|
|
|
|
|
-// header_range_data->start[idx] = k + 1;
|
|
|
|
|
-// bpf_printk("range.start:%d", tmp.token[idx].start);
|
|
|
|
|
-// idx++;
|
|
|
|
|
-// }
|
|
|
|
|
-//// else {
|
|
|
|
|
-//// str_len++;
|
|
|
|
|
-//// }
|
|
|
|
|
-//// tmp.token[idx].len = str_len;
|
|
|
|
|
-// bpf_printk("range.len token[%d]:[%d]", idx, str_len);
|
|
|
|
|
|
|
+ struct apm_span_context *cw_parent_span_context = bpf_map_lookup_elem(&cw_parent_span_context_storage_map, &map_id);
|
|
|
|
|
+ if (!cw_parent_span_context) {
|
|
|
|
|
+ bpf_printk("no cw_parent_span_context");
|
|
|
|
|
+ return NULL;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ w3c_string_to_span_context(traceparent_header_value, parent_span_context);
|
|
|
|
|
+
|
|
|
|
|
+ cw_string_to_span_context(traceparent_header_value, cw_parent_span_context);
|
|
|
|
|
+
|
|
|
|
|
+ // 保存sc
|
|
|
|
|
+ cw_save_parent_tracking_span(cw_parent_span_context);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+// for (int i = 0; i < TRACE_ID_SIZE; i++) {
|
|
|
|
|
+// bpf_printk("%02x", parent_span_context->TraceID[i]);
|
|
|
|
|
+// }
|
|
|
|
|
+// char val[10];
|
|
|
|
|
+// char *out = val;
|
|
|
|
|
+// // Write trace id
|
|
|
|
|
+// bytes_to_hex_string(cw_parent_span_context->type_from, 5, out);
|
|
|
|
|
+// for (int i = 0; i < 10; ++i) {
|
|
|
|
|
+// bpf_printk("traceid--%c",val[i]);
|
|
|
// }
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
-// for (int k = 0; k < MAX_TOKENS; ++k) {
|
|
|
|
|
|
|
+
|
|
|
//
|
|
//
|
|
|
-//// struct Token tt[8] = tmp.token;
|
|
|
|
|
-//// header_range_data->token[k] = t;
|
|
|
|
|
-// bpf_printk("header_range_data->token---%d", header_range_data->token[k].len);
|
|
|
|
|
-//// bpf_printk("header_range_data->token---%d", tmp.token[k].len);
|
|
|
|
|
|
|
+// for (int i = 0; i < 1; i++) {
|
|
|
|
|
+// bpf_printk("type_from------%02x", cw_parent_span_context->type_from[i]);
|
|
|
// }
|
|
// }
|
|
|
-// for (int k = 0; k < MAX_TOKENS; ++k) {
|
|
|
|
|
//
|
|
//
|
|
|
-//// struct Token tt[8] = tmp.token;
|
|
|
|
|
-//// header_range_data->token[k] = t;
|
|
|
|
|
-// bpf_printk("header_range_data->token---%d", header_range_data->token[k].len);
|
|
|
|
|
-//// bpf_printk("header_range_data->token---%d", tmp.token[k].len);
|
|
|
|
|
-// }
|
|
|
|
|
-
|
|
|
|
|
-// if (idx == MAX_TOKENS) {
|
|
|
|
|
-// for (int k = 0; k < idx; ++k) {
|
|
|
|
|
-//// struct Token t = {.start=1, .len=2};
|
|
|
|
|
-//// header_range_data->token[k] = t;
|
|
|
|
|
-// bpf_printk("header_range_data->token---%d", header_range_data->token[k].len);
|
|
|
|
|
|
|
+// char val[2];
|
|
|
|
|
+// char *out = val;
|
|
|
|
|
+//// // Write trace id
|
|
|
|
|
+// bytes_to_hex_string(cw_parent_span_context->type_from, 1, out);
|
|
|
//
|
|
//
|
|
|
-// }
|
|
|
|
|
-// }
|
|
|
|
|
-// for (int k = 0; k < idx ; ++k) {
|
|
|
|
|
-// struct Token t = {.start=1,.len=2};
|
|
|
|
|
-// header_range_data->token[k]= t;
|
|
|
|
|
-// }
|
|
|
|
|
-// header_range_data = &tmp;
|
|
|
|
|
|
|
+// bpf_printk("type_from1--%s", out);
|
|
|
|
|
|
|
|
-
|
|
|
|
|
-// bpf_printk("header_range_data---%d", header_range_data->a);
|
|
|
|
|
-// bpf_printk("header_range_data->token---%d", header_range_data->token[0].len);
|
|
|
|
|
-// __builtin_memcpy(&header_range_data->token, &tmp.token, sizeof(header_range_data->token));
|
|
|
|
|
-// struct cw_header_token *header_range_data2 = bpf_map_lookup_elem(&header_range, &map_id);
|
|
|
|
|
-// if (!header_range_data2) {
|
|
|
|
|
-// return NULL;
|
|
|
|
|
|
|
+// for (int i = 0; i < 10; ++i) {
|
|
|
|
|
+// bpf_printk("traceid--%c",val[i]);
|
|
|
// }
|
|
// }
|
|
|
-// bpf_printk("header_range_data2---%d", header_range_data2->a);
|
|
|
|
|
|
|
|
|
|
-// for (int kl = 0; kl < idx; ++kl) {
|
|
|
|
|
-// u32 start = tmp.token[kl].start;
|
|
|
|
|
-// u32 len = tmp.token[kl].len;
|
|
|
|
|
-// bpf_printk("Token [%d][%d]", kl,start);
|
|
|
|
|
-// }
|
|
|
|
|
- w3c_string_to_span_context(traceparent_header_value, parent_span_context);
|
|
|
|
|
-// bpf_printk("traceparent_header_value2:%s", traceparent_header_value);
|
|
|
|
|
-// bpf_printk("parent_span_context-TraceID: ");
|
|
|
|
|
-// for (int i = 0; i < TRACE_ID_SIZE; i++) {
|
|
|
|
|
-// bpf_printk("%02x", parent_span_context->TraceID[i]);
|
|
|
|
|
-// }
|
|
|
|
|
// bpf_printk("parent_span_context-TraceID2:%s", parent_span_context->TraceID);
|
|
// bpf_printk("parent_span_context-TraceID2:%s", parent_span_context->TraceID);
|
|
|
// bpf_printk("parent_span_context-SpanID2:%s", parent_span_context->SpanID);
|
|
// bpf_printk("parent_span_context-SpanID2:%s", parent_span_context->SpanID);
|
|
|
return parent_span_context;
|
|
return parent_span_context;
|
|
@@ -349,7 +300,9 @@ int uprobe_HandlerFunc_ServeHTTP(struct pt_regs *ctx) {
|
|
|
if (parent_ctx != NULL) {
|
|
if (parent_ctx != NULL) {
|
|
|
// found parent context in http headers
|
|
// found parent context in http headers
|
|
|
http_server_span->psc = *parent_ctx;
|
|
http_server_span->psc = *parent_ctx;
|
|
|
|
|
+ // copy traceID
|
|
|
copy_byte_arrays(http_server_span->psc.TraceID, http_server_span->sc.TraceID, TRACE_ID_SIZE);
|
|
copy_byte_arrays(http_server_span->psc.TraceID, http_server_span->sc.TraceID, TRACE_ID_SIZE);
|
|
|
|
|
+ // 生成随机SpanID
|
|
|
generate_random_bytes(http_server_span->sc.SpanID, SPAN_ID_SIZE);
|
|
generate_random_bytes(http_server_span->sc.SpanID, SPAN_ID_SIZE);
|
|
|
} else {
|
|
} else {
|
|
|
http_server_span->sc = generate_span_context();
|
|
http_server_span->sc = generate_span_context();
|
|
@@ -377,8 +330,6 @@ int uprobe_HandlerFunc_ServeHTTP(struct pt_regs *ctx) {
|
|
|
// start_tracking_span(req_ctx_ptr, &http_server_span->sc);
|
|
// start_tracking_span(req_ctx_ptr, &http_server_span->sc);
|
|
|
|
|
|
|
|
// void save_tracking_span(struct apm_span_context *sc)
|
|
// void save_tracking_span(struct apm_span_context *sc)
|
|
|
- struct apm_span_context apm_sc = *(struct apm_span_context *) &http_server_span->sc;
|
|
|
|
|
- save_tracking_span(&apm_sc);
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
@@ -434,9 +385,8 @@ int uprobe_HandlerFunc_ServeHTTP_Returns(struct pt_regs *ctx) {
|
|
|
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, http_server_span, sizeof(*http_server_span));
|
|
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);
|
|
stop_tracking_span(&http_server_span->sc, &http_server_span->psc);
|
|
|
|
|
|
|
|
- struct apm_trace_key_t trace_key = get_apm_trace_key(120 * NS_PER_SEC, true);
|
|
|
|
|
- bpf_map_delete_elem(&apm_span_context_map, &trace_key);
|
|
|
|
|
|
|
|
|
|
|
|
+ clear_span_context();
|
|
|
bpf_printk("HTTP_END");
|
|
bpf_printk("HTTP_END");
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|