Module: Datadog::Tracing::Contrib::ActiveSupport::Cache::Redis::Patcher

Included in:
Datadog::Tracing::Contrib::ActiveSupport::Cache::Redis
Defined in:
lib/datadog/tracing/contrib/active_support/cache/redis.rb

Overview

Patching behavior for Redis with ActiveSupport

Instance Method Summary collapse

Instance Method Details

#cache_store_class(meth) ⇒ Object



31
32
33
34
35
36
37
38
39
40
# File 'lib/datadog/tracing/contrib/active_support/cache/redis.rb', line 31

def cache_store_class(meth)
  if patch_redis?(meth)
    [::ActiveSupport::Cache::RedisStore, ::ActiveSupport::Cache::Store]
  elsif Gem.loaded_specs['redis'] && defined?(::ActiveSupport::Cache::RedisCacheStore) \
      && ::ActiveSupport::Cache::RedisCacheStore.instance_methods(false).include?(meth)
    [::ActiveSupport::Cache::RedisCacheStore, ::ActiveSupport::Cache::Store]
  else
    super
  end
end

#patch_redis?(meth) ⇒ Boolean

For Rails < 5.2 w/ redis-activesupport… When Redis is used, we can’t only patch Cache::Store as it is Cache::RedisStore, a sub-class of it that is used, in practice. We need to do a per-method monkey patching as some of them might be redefined, and some of them not. The latest version of redis-activesupport redefines write but leaves untouched read and delete: github.com/redis-store/redis-activesupport/blob/v4.1.5/lib/active_support/cache/redis_store.rb

For Rails >= 5.2 w/o redis-activesupport… ActiveSupport includes a Redis cache store internally, and does not require these overrides. github.com/rails/rails/blob/master/activesupport/lib/active_support/cache/redis_cache_store.rb

Returns:

  • (Boolean)


25
26
27
28
29
# File 'lib/datadog/tracing/contrib/active_support/cache/redis.rb', line 25

def patch_redis?(meth)
  !Gem.loaded_specs['redis-activesupport'].nil? \
    && defined?(::ActiveSupport::Cache::RedisStore) \
    && ::ActiveSupport::Cache::RedisStore.instance_methods(false).include?(meth)
end