Class: Labkit::Context
- Inherits:
-
Object
- Object
- Labkit::Context
- 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
- .correlation_id ⇒ Object
- .current ⇒ Object
- .known_log_keys ⇒ Object
- .log_key(key) ⇒ Object
- .pop(context) ⇒ Object
- .push(new_attributes = {}) ⇒ Object
- .with_context(attributes = {}) ⇒ Object
Instance Method Summary collapse
- #correlation_id ⇒ Object
- #get_attribute(attribute) ⇒ Object
-
#initialize(values = {}) ⇒ Context
constructor
A new instance of Context.
- #merge(new_attributes) ⇒ Object
- #to_h ⇒ Object
Constructor Details
#initialize(values = {}) ⇒ Context
Returns a new instance of Context.
80 81 82 83 84 |
# File 'lib/labkit/context.rb', line 80 def initialize(values = {}) @data = {} assign_attributes(values) end |
Class Method Details
.correlation_id ⇒ Object
53 54 55 |
# File 'lib/labkit/context.rb', line 53 def correlation_id contexts.last&.correlation_id end |
.current ⇒ Object
57 58 59 |
# File 'lib/labkit/context.rb', line 57 def current contexts.last end |
.known_log_keys ⇒ Object
69 70 71 |
# File 'lib/labkit/context.rb', line 69 def known_log_keys @known_log_keys ||= (KNOWN_KEYS.map(&method(:log_key)) + RAW_KEYS).freeze 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_id ⇒ Object
97 98 99 |
# File 'lib/labkit/context.rb', line 97 def correlation_id data[CORRELATION_ID_KEY] end |
#get_attribute(attribute) ⇒ Object
101 102 103 104 105 |
# File 'lib/labkit/context.rb', line 101 def get_attribute(attribute) raw = call_or_value(data[log_key(attribute)]) call_or_value(raw) end |
#merge(new_attributes) ⇒ Object
86 87 88 89 90 91 |
# File 'lib/labkit/context.rb', line 86 def merge(new_attributes) new_context = self.class.new(data.dup) new_context.assign_attributes(new_attributes) new_context end |
#to_h ⇒ Object
93 94 95 |
# File 'lib/labkit/context.rb', line 93 def to_h end |