1
1
# (c) Copyright IBM Corp. 2024
2
2
3
+ from typing import TYPE_CHECKING , Any , Dict
4
+
5
+ from opentelemetry .semconv .trace import SpanAttributes
6
+ from opentelemetry .trace import SpanKind
7
+
3
8
from instana .log import logger
4
9
from instana .span .base_span import BaseSpan
5
- from instana .span .kind import ENTRY_SPANS , EXIT_SPANS , HTTP_SPANS , LOCAL_SPANS
10
+ from instana .span .kind import (
11
+ ENTRY_SPANS ,
12
+ EXIT_SPANS ,
13
+ HTTP_SPANS ,
14
+ LOCAL_SPANS ,
15
+ )
6
16
7
- from opentelemetry . trace import SpanKind
8
- from opentelemetry . semconv . trace import SpanAttributes
17
+ if TYPE_CHECKING :
18
+ from instana . span . span import InstanaSpan
9
19
10
20
11
21
class RegisteredSpan (BaseSpan ):
12
- def __init__ (self , span , source , service_name , ** kwargs ) -> None :
22
+ def __init__ (
23
+ self ,
24
+ span : "InstanaSpan" ,
25
+ source : Dict [str , Any ],
26
+ service_name : str ,
27
+ ** kwargs : Dict [str , Any ],
28
+ ) -> None :
13
29
# pylint: disable=invalid-name
14
30
super (RegisteredSpan , self ).__init__ (span , source , ** kwargs )
15
31
self .n = span .name
@@ -34,13 +50,17 @@ def __init__(self, span, source, service_name, **kwargs) -> None:
34
50
if "gcps" in span .name :
35
51
self .n = "gcps"
36
52
53
+ # unify the span name for kafka-producer and kafka-consumer
54
+ if "kafka" in span .name :
55
+ self .n = "kafka"
56
+
37
57
# Logic to store custom attributes for registered spans (not used yet)
38
58
if len (span .attributes ) > 0 :
39
59
self .data ["sdk" ]["custom" ]["tags" ] = self ._validate_attributes (
40
60
span .attributes
41
61
)
42
62
43
- def _populate_entry_span_data (self , span ) -> None :
63
+ def _populate_entry_span_data (self , span : "InstanaSpan" ) -> None :
44
64
if span .name in HTTP_SPANS :
45
65
self ._collect_http_attributes (span )
46
66
@@ -127,10 +147,14 @@ def _populate_entry_span_data(self, span) -> None:
127
147
self .data ["rpc" ]["params" ] = span .attributes .pop ("rpc.params" , None )
128
148
# self.data["rpc"]["baggage"] = span.attributes.pop("rpc.baggage", None)
129
149
self .data ["rpc" ]["error" ] = span .attributes .pop ("rpc.error" , None )
150
+
151
+ elif span .name .startswith ("kafka" ):
152
+ self ._collect_kafka_attributes (span )
153
+
130
154
else :
131
155
logger .debug ("SpanRecorder: Unknown entry span: %s" % span .name )
132
156
133
- def _populate_local_span_data (self , span ) -> None :
157
+ def _populate_local_span_data (self , span : "InstanaSpan" ) -> None :
134
158
if span .name == "render" :
135
159
self .data ["render" ]["name" ] = span .attributes .pop ("name" , None )
136
160
self .data ["render" ]["type" ] = span .attributes .pop ("type" , None )
@@ -139,7 +163,7 @@ def _populate_local_span_data(self, span) -> None:
139
163
else :
140
164
logger .debug ("SpanRecorder: Unknown local span: %s" % span .name )
141
165
142
- def _populate_exit_span_data (self , span ) -> None :
166
+ def _populate_exit_span_data (self , span : "InstanaSpan" ) -> None :
143
167
if span .name in HTTP_SPANS :
144
168
self ._collect_http_attributes (span )
145
169
@@ -239,8 +263,12 @@ def _populate_exit_span_data(self, span) -> None:
239
263
self .data ["mysql" ]["host" ] = span .attributes .pop ("host" , None )
240
264
self .data ["mysql" ]["port" ] = span .attributes .pop ("port" , None )
241
265
self .data ["mysql" ]["db" ] = span .attributes .pop (SpanAttributes .DB_NAME , None )
242
- self .data ["mysql" ]["user" ] = span .attributes .pop (SpanAttributes .DB_USER , None )
243
- self .data ["mysql" ]["stmt" ] = span .attributes .pop (SpanAttributes .DB_STATEMENT , None )
266
+ self .data ["mysql" ]["user" ] = span .attributes .pop (
267
+ SpanAttributes .DB_USER , None
268
+ )
269
+ self .data ["mysql" ]["stmt" ] = span .attributes .pop (
270
+ SpanAttributes .DB_STATEMENT , None
271
+ )
244
272
self .data ["mysql" ]["error" ] = span .attributes .pop ("mysql.error" , None )
245
273
246
274
elif span .name == "postgres" :
@@ -303,10 +331,14 @@ def _populate_exit_span_data(self, span) -> None:
303
331
self .data ["log" ]["parameters" ] = event .attributes .pop (
304
332
"parameters" , None
305
333
)
334
+
335
+ elif span .name .startswith ("kafka" ):
336
+ self ._collect_kafka_attributes (span )
337
+
306
338
else :
307
339
logger .debug ("SpanRecorder: Unknown exit span: %s" % span .name )
308
340
309
- def _collect_http_attributes (self , span ) -> None :
341
+ def _collect_http_attributes (self , span : "InstanaSpan" ) -> None :
310
342
self .data ["http" ]["host" ] = span .attributes .pop ("http.host" , None )
311
343
self .data ["http" ]["url" ] = span .attributes .pop ("http.url" , None )
312
344
self .data ["http" ]["path" ] = span .attributes .pop ("http.path" , None )
@@ -325,3 +357,7 @@ def _collect_http_attributes(self, span) -> None:
325
357
for key in custom_headers :
326
358
trimmed_key = key [12 :]
327
359
self .data ["http" ]["header" ][trimmed_key ] = span .attributes .pop (key )
360
+
361
+ def _collect_kafka_attributes (self , span : "InstanaSpan" ) -> None :
362
+ self .data ["kafka" ]["service" ] = span .attributes .pop ("kafka.service" , None )
363
+ self .data ["kafka" ]["access" ] = span .attributes .pop ("kafka.access" , None )
0 commit comments