Class: Labkit::Context

Inherits:
Object
  • Object
show all
Defined in:
lib/labkit/context.rb

Overview

A context can be used to provide structured information on what resources GitLab is working on within a service.

Values can be provided by passing a hash. If one of the values is a Proc the proc will only be called when the value is actually needed.

Multiple contexts can be nested, the nested context will inherit the values from the closest outer one. All contexts will have the same correlation id.

Usage:

Labkit::Context.with_context(user: 'username', root_namespace: -> { get_root_namespace } do |context|
  logger.info(context.to_h)
end

Constant Summary collapse

LOG_KEY =
"meta"
CORRELATION_ID_KEY =
"correlation_id"
RAW_KEYS =
[CORRELATION_ID_KEY].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(values = {}) ⇒ Context

Returns a new instance of Context.



76
77
78
79
80
# File 'lib/labkit/context.rb', line 76

def initialize(values = {})
  @data = {}

  assign_attributes(values)
end

Class Method Details

.correlation_idObject



53
54
55
# File 'lib/labkit/context.rb', line 53

def correlation_id
  contexts.last&.correlation_id
end

.currentObject



57
58
59
# File 'lib/labkit/context.rb', line 57

def current
  contexts.last
end

.log_key(key) ⇒ Object



61
62
63
64
65
66
67
# File 'lib/labkit/context.rb', line 61

def log_key(key)
  key = key.to_s
  return key if RAW_KEYS.include?(key)
  return key if key.starts_with?("#{LOG_KEY}.")

  "#{LOG_KEY}.#{key}"
end

.pop(context) ⇒ Object



49
50
51
# File 'lib/labkit/context.rb', line 49

def pop(context)
  contexts.pop while contexts.include?(context)
end

.push(new_attributes = {}) ⇒ Object



41
42
43
44
45
46
47
# File 'lib/labkit/context.rb', line 41

def push(new_attributes = {})
  new_context = current&.merge(new_attributes) || new(new_attributes)

  contexts.push(new_context)

  new_context
end

.with_context(attributes = {}) ⇒ Object



31
32
33
34
35
36
37
38
39
# File 'lib/labkit/context.rb', line 31

def with_context(attributes = {})
  context = push(attributes)

  begin
    yield(context)
  ensure
    pop(context)
  end
end

Instance Method Details

#correlation_idObject



93
94
95
# File 'lib/labkit/context.rb', line 93

def correlation_id
  data[CORRELATION_ID_KEY]
end

#get_attribute(attribute) ⇒ Object



97
98
99
100
101
# File 'lib/labkit/context.rb', line 97

def get_attribute(attribute)
  raw = call_or_value(data[log_key(attribute)])

  call_or_value(raw)
end

#merge(new_attributes) ⇒ Object



82
83
84
85
86
87
# File 'lib/labkit/context.rb', line 82

def merge(new_attributes)
  new_context = self.class.new(data.dup)
  new_context.assign_attributes(new_attributes)

  new_context
end

#to_hObject



89
90
91
# File 'lib/labkit/context.rb', line 89

def to_h
  expand_data
end