@@ -59,16 +59,22 @@ struct otel_span_t {
5959 tracer_id_t tracer_id ;
6060};
6161
62- typedef struct go_tracer_id {
62+ typedef struct go_tracer_id_partial {
6363 struct go_string name ;
6464 struct go_string version ;
65- // struct go_string schema_url;
66- } go_tracer_id_t ;
65+ } go_tracer_id_partial_t ;
66+
67+ typedef struct go_tracer_id_full {
68+ struct go_string name ;
69+ struct go_string version ;
70+ struct go_string schema_url ;
71+ } go_tracer_id_full_t ;
6772
6873typedef void * go_tracer_ptr ;
6974
7075// tracerProvider contains a map of tracers
71- MAP_BUCKET_DEFINITION (go_tracer_id_t , go_tracer_ptr )
76+ MAP_BUCKET_DEFINITION (go_tracer_id_partial_t , go_tracer_ptr )
77+ MAP_BUCKET_DEFINITION (go_tracer_id_full_t , go_tracer_ptr )
7278
7379struct {
7480 __uint (type , BPF_MAP_TYPE_HASH );
@@ -103,7 +109,7 @@ struct
103109{
104110 __uint (type , BPF_MAP_TYPE_PERCPU_ARRAY );
105111 __uint (key_size , sizeof (u32 ));
106- __uint (value_size , sizeof (MAP_BUCKET_TYPE (go_tracer_id_t , go_tracer_ptr )));
112+ __uint (value_size , sizeof (MAP_BUCKET_TYPE (go_tracer_id_full_t , go_tracer_ptr )));
107113 __uint (max_entries , 1 );
108114} golang_mapbucket_storage_map SEC (".maps" );
109115
@@ -136,14 +142,16 @@ volatile const u64 tracer_provider_pos;
136142volatile const u64 tracer_provider_tracers_pos ;
137143volatile const u64 buckets_ptr_pos ;
138144
145+ volatile const bool tracer_id_contains_schemaURL ;
146+
139147// read_span_name reads the span name from the provided span_name_ptr and stores the result in
140148// span_name.buf.
141149static __always_inline void read_span_name (struct span_name_t * span_name , const u64 span_name_len , void * span_name_ptr ) {
142150 const u64 span_name_size = MAX_SPAN_NAME_LEN < span_name_len ? MAX_SPAN_NAME_LEN : span_name_len ;
143151 bpf_probe_read (span_name -> buf , span_name_size , span_name_ptr );
144152}
145153
146- static __always_inline long fill_tracer_id_from_tracers_map (void * tracers_map , go_tracer_ptr tracer , tracer_id_t * tracer_id ) {
154+ static __always_inline long fill_partial_tracer_id_from_tracers_map (void * tracers_map , go_tracer_ptr tracer , tracer_id_t * tracer_id ) {
147155 u64 tracers_count = 0 ;
148156 long res = 0 ;
149157 res = bpf_probe_read (& tracers_count , sizeof (tracers_count ), tracers_map );
@@ -169,7 +177,7 @@ static __always_inline long fill_tracer_id_from_tracers_map(void *tracers_map, g
169177 return -1 ;
170178 }
171179 u32 map_id = 0 ;
172- MAP_BUCKET_TYPE (go_tracer_id_t , go_tracer_ptr ) * map_bucket = bpf_map_lookup_elem (& golang_mapbucket_storage_map , & map_id );
180+ MAP_BUCKET_TYPE (go_tracer_id_partial_t , go_tracer_ptr ) * map_bucket = bpf_map_lookup_elem (& golang_mapbucket_storage_map , & map_id );
173181 if (!map_bucket )
174182 {
175183 return -1 ;
@@ -181,7 +189,7 @@ static __always_inline long fill_tracer_id_from_tracers_map(void *tracers_map, g
181189 {
182190 break ;
183191 }
184- res = bpf_probe_read (map_bucket , sizeof (MAP_BUCKET_TYPE (go_tracer_id_t , go_tracer_ptr )), buckets_array + (j * sizeof (MAP_BUCKET_TYPE (go_tracer_id_t , go_tracer_ptr ))));
192+ res = bpf_probe_read (map_bucket , sizeof (MAP_BUCKET_TYPE (go_tracer_id_partial_t , go_tracer_ptr )), buckets_array + (j * sizeof (MAP_BUCKET_TYPE (go_tracer_id_partial_t , go_tracer_ptr ))));
185193 if (res < 0 )
186194 {
187195 continue ;
@@ -207,6 +215,71 @@ static __always_inline long fill_tracer_id_from_tracers_map(void *tracers_map, g
207215 return 0 ;
208216}
209217
218+ static __always_inline long fill_full_tracer_id_from_tracers_map (void * tracers_map , go_tracer_ptr tracer , tracer_id_t * tracer_id ) {
219+ u64 tracers_count = 0 ;
220+ long res = 0 ;
221+ res = bpf_probe_read (& tracers_count , sizeof (tracers_count ), tracers_map );
222+ if (res < 0 )
223+ {
224+ return -1 ;
225+ }
226+ if (tracers_count == 0 )
227+ {
228+ return -1 ;
229+ }
230+ unsigned char log_2_bucket_count ;
231+ res = bpf_probe_read (& log_2_bucket_count , sizeof (log_2_bucket_count ), tracers_map + 9 );
232+ if (res < 0 )
233+ {
234+ return -1 ;
235+ }
236+ u64 bucket_count = 1 << log_2_bucket_count ;
237+ void * buckets_array ;
238+ res = bpf_probe_read (& buckets_array , sizeof (buckets_array ), (void * )(tracers_map + buckets_ptr_pos ));
239+ if (res < 0 )
240+ {
241+ return -1 ;
242+ }
243+ u32 map_id = 0 ;
244+ MAP_BUCKET_TYPE (go_tracer_id_full_t , go_tracer_ptr ) * map_bucket = bpf_map_lookup_elem (& golang_mapbucket_storage_map , & map_id );
245+ if (!map_bucket )
246+ {
247+ return -1 ;
248+ }
249+
250+ for (u64 j = 0 ; j < MAX_BUCKETS ; j ++ )
251+ {
252+ if (j >= bucket_count )
253+ {
254+ break ;
255+ }
256+ res = bpf_probe_read (map_bucket , sizeof (MAP_BUCKET_TYPE (go_tracer_id_full_t , go_tracer_ptr )), buckets_array + (j * sizeof (MAP_BUCKET_TYPE (go_tracer_id_full_t , go_tracer_ptr ))));
257+ if (res < 0 )
258+ {
259+ continue ;
260+ }
261+ for (u64 i = 0 ; i < 8 ; i ++ )
262+ {
263+ if (map_bucket -> tophash [i ] == 0 )
264+ {
265+ continue ;
266+ }
267+ if (map_bucket -> values [i ] == NULL )
268+ {
269+ continue ;
270+ }
271+ if (map_bucket -> values [i ] != tracer )
272+ {
273+ continue ;
274+ }
275+ get_go_string_from_user_ptr (& map_bucket -> keys [i ].version , tracer_id -> version , MAX_TRACER_VERSION_LEN );
276+ get_go_string_from_user_ptr (& map_bucket -> keys [i ].schema_url , tracer_id -> schema_url , MAX_TRACER_SCHEMA_URL_LEN );
277+ return 0 ;
278+ }
279+ }
280+ return 0 ;
281+ }
282+
210283static __always_inline long fill_tracer_id (tracer_id_t * tracer_id , go_tracer_ptr tracer ) {
211284 // Check if the tracer id is already cached
212285 tracer_id_t * cached_tracer_id = bpf_map_lookup_elem (& tracer_ptr_to_id_map , & tracer );
@@ -232,7 +305,11 @@ static __always_inline long fill_tracer_id(tracer_id_t *tracer_id, go_tracer_ptr
232305 return res ;
233306 }
234307
235- res = fill_tracer_id_from_tracers_map (tracers_map , tracer , tracer_id );
308+ if (tracer_id_contains_schemaURL ) {
309+ res = fill_full_tracer_id_from_tracers_map (tracers_map , tracer , tracer_id );
310+ } else {
311+ res = fill_partial_tracer_id_from_tracers_map (tracers_map , tracer , tracer_id );
312+ }
236313 if (res < 0 ) {
237314 return res ;
238315 }
0 commit comments