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
- .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.
76 77 78 79 80 |
# File 'lib/labkit/context.rb', line 76 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 |
.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
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_h ⇒ Object
89 90 91 |
# File 'lib/labkit/context.rb', line 89 def to_h end |