Class: GraphQL::Tracing::DetailedTrace::RedisBackend

Inherits:
Object
  • Object
show all
Defined in:
lib/graphql/tracing/detailed_trace/redis_backend.rb

Constant Summary collapse

KEY_PREFIX =
"gql:trace:"

Instance Method Summary collapse

Constructor Details

#initialize(redis:, limit: nil) ⇒ RedisBackend

Returns a new instance of RedisBackend.



8
9
10
11
12
# File 'lib/graphql/tracing/detailed_trace/redis_backend.rb', line 8

def initialize(redis:, limit: nil)
  @redis = redis
  @key = KEY_PREFIX + "traces"
  @remrangebyrank_limit = limit ? -limit - 1 : nil
end

Instance Method Details

#delete_all_tracesObject



32
33
34
# File 'lib/graphql/tracing/detailed_trace/redis_backend.rb', line 32

def delete_all_traces
  @redis.del(@key)
end

#delete_trace(id) ⇒ Object



27
28
29
30
# File 'lib/graphql/tracing/detailed_trace/redis_backend.rb', line 27

def delete_trace(id)
  @redis.zremrangebyscore(@key, id, id)
  nil
end

#find_trace(id) ⇒ Object



36
37
38
39
40
41
42
43
# File 'lib/graphql/tracing/detailed_trace/redis_backend.rb', line 36

def find_trace(id)
  str_data = @redis.zrange(@key, id, id, byscore: true).first
  if str_data.nil?
    nil
  else
    entry_to_trace(id, str_data)
  end
end

#save_trace(operation_name, duration_ms, begin_ms, trace_data) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
# File 'lib/graphql/tracing/detailed_trace/redis_backend.rb', line 45

def save_trace(operation_name, duration_ms, begin_ms, trace_data)
  id = begin_ms
  data = JSON.dump({ "o" => operation_name, "d" => duration_ms, "b" => begin_ms, "t" => Base64.encode64(trace_data) })
  @redis.pipelined do |pipeline|
    pipeline.zadd(@key, id, data)
    if @remrangebyrank_limit
      pipeline.zremrangebyrank(@key, 0, @remrangebyrank_limit)
    end
  end
  id
end

#traces(last:, before:) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/graphql/tracing/detailed_trace/redis_backend.rb', line 14

def traces(last:, before:)
  before = case before
  when Numeric
    "(#{before}"
  when nil
    "+inf"
  end
  str_pairs = @redis.zrange(@key, before, 0, byscore: true, rev: true, limit: [0, last || 100], withscores: true)
  str_pairs.map do |(str_data, score)|
    entry_to_trace(score, str_data)
  end
end