def traced_init(wrapped, instance, args, kwargs): settings = kwargs.pop("settings", {}) service = config._get_service(default="pyramid") distributed_tracing = asbool( get_env("pyramid", "distributed_tracing", default=True)) # DEV: integration-specific analytics flag can be not set but still enabled # globally for web frameworks old_analytics_enabled = get_env("pyramid", "analytics_enabled") analytics_enabled = os.environ.get("DD_TRACE_PYRAMID_ANALYTICS_ENABLED", old_analytics_enabled) if analytics_enabled is not None: analytics_enabled = asbool(analytics_enabled) # TODO: why is analytics sample rate a string or a bool here? old_analytics_sample_rate = get_env("pyramid", "analytics_sample_rate", default=True) analytics_sample_rate = os.environ.get( "DD_TRACE_PYRAMID_ANALYTICS_SAMPLE_RATE", old_analytics_sample_rate) trace_settings = { SETTINGS_SERVICE: service, SETTINGS_DISTRIBUTED_TRACING: distributed_tracing, SETTINGS_ANALYTICS_ENABLED: analytics_enabled, SETTINGS_ANALYTICS_SAMPLE_RATE: analytics_sample_rate, } # Update over top of the defaults # DEV: If we did `settings.update(trace_settings)` then we would only ever # have the default values. trace_settings.update(settings) # If the tweens are explicitly set with 'pyramid.tweens', we need to # explicitly set our tween too since `add_tween` will be ignored. insert_tween_if_needed(trace_settings) kwargs["settings"] = trace_settings # `caller_package` works by walking a fixed amount of frames up the stack # to find the calling package. So if we let the original `__init__` # function call it, our wrapper will mess things up. if not kwargs.get("package", None): # Get the packge for the third frame up from this one. # - ddtrace.contrib.pyramid.path # - ddtrace.vendor.wrapt # - (this is the frame we want) # DEV: Default is `level=2` which will give us the package from `wrapt` kwargs["package"] = caller_package(level=3) wrapped(*args, **kwargs) trace_pyramid(instance)
def traced_init(wrapped, instance, args, kwargs): settings = kwargs.pop("settings", {}) service = config._get_service(default="pyramid") # DEV: integration-specific analytics flag can be not set but still enabled # globally for web frameworks old_analytics_enabled = get_env("pyramid", "analytics_enabled") analytics_enabled = os.environ.get("DD_TRACE_PYRAMID_ANALYTICS_ENABLED", old_analytics_enabled) if analytics_enabled is not None: analytics_enabled = asbool(analytics_enabled) # TODO: why is analytics sample rate a string or a bool here? old_analytics_sample_rate = get_env("pyramid", "analytics_sample_rate", default=True) analytics_sample_rate = os.environ.get( "DD_TRACE_PYRAMID_ANALYTICS_SAMPLE_RATE", old_analytics_sample_rate) trace_settings = { SETTINGS_SERVICE: service, SETTINGS_DISTRIBUTED_TRACING: config.pyramid.distributed_tracing, SETTINGS_ANALYTICS_ENABLED: analytics_enabled, SETTINGS_ANALYTICS_SAMPLE_RATE: analytics_sample_rate, } # Update over top of the defaults # DEV: If we did `settings.update(trace_settings)` then we would only ever # have the default values. trace_settings.update(settings) # If the tweens are explicitly set with 'pyramid.tweens', we need to # explicitly set our tween too since `add_tween` will be ignored. insert_tween_if_needed(trace_settings) # The original Configurator.__init__ looks up two levels to find the package # name if it is not provided. This has to be replicated here since this patched # call will occur at the same level in the call stack. if not kwargs.get("package", None): from pyramid.path import caller_package kwargs["package"] = caller_package(level=2) kwargs["settings"] = trace_settings wrapped(*args, **kwargs) trace_pyramid(instance)