@@ -141,6 +141,13 @@ def response_hook(span, instance, response):
141141from wrapt import wrap_function_wrapper
142142
143143from opentelemetry import trace
144+ from opentelemetry .instrumentation ._semconv import (
145+ _get_schema_url_for_signal_types ,
146+ _get_semconv_opt_in_modes ,
147+ _OpenTelemetrySemanticConventionStability ,
148+ _OpenTelemetryStabilitySignalType ,
149+ _set_db_statement ,
150+ )
144151from opentelemetry .instrumentation .instrumentor import BaseInstrumentor
145152from opentelemetry .instrumentation .redis .package import _instruments
146153from opentelemetry .instrumentation .redis .util import (
@@ -156,9 +163,6 @@ def response_hook(span, instance, response):
156163 is_instrumentation_enabled ,
157164 unwrap ,
158165)
159- from opentelemetry .semconv ._incubating .attributes .db_attributes import (
160- DB_STATEMENT ,
161- )
162166from opentelemetry .trace import (
163167 StatusCode ,
164168 Tracer ,
@@ -211,6 +215,19 @@ def _traced_execute_factory(
211215 request_hook : RequestHook | None = None ,
212216 response_hook : ResponseHook | None = None ,
213217):
218+ sem_conv_opt_in_modes = _get_semconv_opt_in_modes (
219+ (
220+ _OpenTelemetryStabilitySignalType .DATABASE ,
221+ _OpenTelemetryStabilitySignalType .HTTP ,
222+ )
223+ )
224+ db_sem_conv_opt_in_mode = sem_conv_opt_in_modes [
225+ _OpenTelemetryStabilitySignalType .DATABASE
226+ ]
227+ http_sem_conv_opt_in_mode = sem_conv_opt_in_modes [
228+ _OpenTelemetryStabilitySignalType .HTTP
229+ ]
230+
214231 def _traced_execute_command (
215232 func : Callable [..., R ],
216233 instance : RedisInstance ,
@@ -226,9 +243,20 @@ def _traced_execute_command(
226243 name , kind = trace .SpanKind .CLIENT
227244 ) as span :
228245 if span .is_recording ():
229- span .set_attribute (DB_STATEMENT , query )
230- _set_connection_attributes (span , instance )
231- span .set_attribute ("db.redis.args_length" , len (args ))
246+ span_attrs = {}
247+ _set_db_statement (span_attrs , query , db_sem_conv_opt_in_mode )
248+ span_attrs ["db.redis.args_length" ] = len (args )
249+
250+ # Set all DB attributes
251+ for key , value in span_attrs .items ():
252+ span .set_attribute (key , value )
253+
254+ _set_connection_attributes (
255+ span ,
256+ instance ,
257+ db_sem_conv_opt_in_mode ,
258+ http_sem_conv_opt_in_mode ,
259+ )
232260 if span .name == "redis.create_index" :
233261 _add_create_attributes (span , args )
234262 if callable (request_hook ):
@@ -249,6 +277,19 @@ def _traced_execute_pipeline_factory(
249277 request_hook : RequestHook | None = None ,
250278 response_hook : ResponseHook | None = None ,
251279):
280+ sem_conv_opt_in_modes = _get_semconv_opt_in_modes (
281+ (
282+ _OpenTelemetryStabilitySignalType .DATABASE ,
283+ _OpenTelemetryStabilitySignalType .HTTP ,
284+ )
285+ )
286+ db_sem_conv_opt_in_mode = sem_conv_opt_in_modes [
287+ _OpenTelemetryStabilitySignalType .DATABASE
288+ ]
289+ http_sem_conv_opt_in_mode = sem_conv_opt_in_modes [
290+ _OpenTelemetryStabilitySignalType .HTTP
291+ ]
292+
252293 def _traced_execute_pipeline (
253294 func : Callable [..., R ],
254295 instance : PipelineInstance ,
@@ -268,10 +309,21 @@ def _traced_execute_pipeline(
268309 span_name , kind = trace .SpanKind .CLIENT
269310 ) as span :
270311 if span .is_recording ():
271- span .set_attribute (DB_STATEMENT , resource )
272- _set_connection_attributes (span , instance )
273- span .set_attribute (
274- "db.redis.pipeline_length" , len (command_stack )
312+ span_attrs = {}
313+ _set_db_statement (
314+ span_attrs , resource , db_sem_conv_opt_in_mode
315+ )
316+ span_attrs ["db.redis.pipeline_length" ] = len (command_stack )
317+
318+ # Set all DB attributes
319+ for key , value in span_attrs .items ():
320+ span .set_attribute (key , value )
321+
322+ _set_connection_attributes (
323+ span ,
324+ instance ,
325+ db_sem_conv_opt_in_mode ,
326+ http_sem_conv_opt_in_mode ,
275327 )
276328
277329 response = None
@@ -297,6 +349,19 @@ def _async_traced_execute_factory(
297349 request_hook : RequestHook | None = None ,
298350 response_hook : ResponseHook | None = None ,
299351):
352+ sem_conv_opt_in_modes = _get_semconv_opt_in_modes (
353+ (
354+ _OpenTelemetryStabilitySignalType .DATABASE ,
355+ _OpenTelemetryStabilitySignalType .HTTP ,
356+ )
357+ )
358+ db_sem_conv_opt_in_mode = sem_conv_opt_in_modes [
359+ _OpenTelemetryStabilitySignalType .DATABASE
360+ ]
361+ http_sem_conv_opt_in_mode = sem_conv_opt_in_modes [
362+ _OpenTelemetryStabilitySignalType .HTTP
363+ ]
364+
300365 async def _async_traced_execute_command (
301366 func : Callable [..., Awaitable [R ]],
302367 instance : AsyncRedisInstance ,
@@ -313,9 +378,20 @@ async def _async_traced_execute_command(
313378 name , kind = trace .SpanKind .CLIENT
314379 ) as span :
315380 if span .is_recording ():
316- span .set_attribute (DB_STATEMENT , query )
317- _set_connection_attributes (span , instance )
318- span .set_attribute ("db.redis.args_length" , len (args ))
381+ span_attrs = {}
382+ _set_db_statement (span_attrs , query , db_sem_conv_opt_in_mode )
383+ span_attrs ["db.redis.args_length" ] = len (args )
384+
385+ # Set all DB attributes
386+ for key , value in span_attrs .items ():
387+ span .set_attribute (key , value )
388+
389+ _set_connection_attributes (
390+ span ,
391+ instance ,
392+ db_sem_conv_opt_in_mode ,
393+ http_sem_conv_opt_in_mode ,
394+ )
319395 if callable (request_hook ):
320396 request_hook (span , instance , args , kwargs )
321397 response = await func (* args , ** kwargs )
@@ -331,6 +407,19 @@ def _async_traced_execute_pipeline_factory(
331407 request_hook : RequestHook | None = None ,
332408 response_hook : ResponseHook | None = None ,
333409):
410+ sem_conv_opt_in_modes = _get_semconv_opt_in_modes (
411+ (
412+ _OpenTelemetryStabilitySignalType .DATABASE ,
413+ _OpenTelemetryStabilitySignalType .HTTP ,
414+ )
415+ )
416+ db_sem_conv_opt_in_mode = sem_conv_opt_in_modes [
417+ _OpenTelemetryStabilitySignalType .DATABASE
418+ ]
419+ http_sem_conv_opt_in_mode = sem_conv_opt_in_modes [
420+ _OpenTelemetryStabilitySignalType .HTTP
421+ ]
422+
334423 async def _async_traced_execute_pipeline (
335424 func : Callable [..., Awaitable [R ]],
336425 instance : AsyncPipelineInstance ,
@@ -352,10 +441,21 @@ async def _async_traced_execute_pipeline(
352441 span_name , kind = trace .SpanKind .CLIENT
353442 ) as span :
354443 if span .is_recording ():
355- span .set_attribute (DB_STATEMENT , resource )
356- _set_connection_attributes (span , instance )
357- span .set_attribute (
358- "db.redis.pipeline_length" , len (command_stack )
444+ span_attrs = {}
445+ _set_db_statement (
446+ span_attrs , resource , db_sem_conv_opt_in_mode
447+ )
448+ span_attrs ["db.redis.pipeline_length" ] = len (command_stack )
449+
450+ # Set all DB attributes
451+ for key , value in span_attrs .items ():
452+ span .set_attribute (key , value )
453+
454+ _set_connection_attributes (
455+ span ,
456+ instance ,
457+ db_sem_conv_opt_in_mode ,
458+ http_sem_conv_opt_in_mode ,
359459 )
360460
361461 response = None
@@ -529,12 +629,20 @@ def _pipeline_wrapper(func, instance, args, kwargs):
529629class RedisInstrumentor (BaseInstrumentor ):
530630 @staticmethod
531631 def _get_tracer (** kwargs ):
632+ # Initialize semantic conventions opt-in if needed
633+ _OpenTelemetrySemanticConventionStability ._initialize ()
634+ # Redis instrumentation supports both DATABASE and HTTP signal types
635+ signal_types = [
636+ _OpenTelemetryStabilitySignalType .DATABASE ,
637+ _OpenTelemetryStabilitySignalType .HTTP ,
638+ ]
639+
532640 tracer_provider = kwargs .get ("tracer_provider" )
533641 return get_tracer (
534642 __name__ ,
535643 __version__ ,
536644 tracer_provider = tracer_provider ,
537- schema_url = "https://opentelemetry.io/schemas/1.11.0" ,
645+ schema_url = _get_schema_url_for_signal_types ( signal_types ) ,
538646 )
539647
540648 def instrument (
0 commit comments