Class: A2A::Monitoring::StructuredLogger

Inherits:
Object
  • Object
show all
Defined in:
lib/a2a/monitoring.rb

Overview

Structured logger with correlation ID support

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ StructuredLogger

Initialize structured logger

Parameters:



196
197
198
199
200
# File 'lib/a2a/monitoring.rb', line 196

def initialize(config)
  @config = config
  @base_logger = config.logger
  @correlation_ids = {}
end

Instance Method Details

#clear_correlation_idObject

Clear correlation ID for current thread



235
236
237
# File 'lib/a2a/monitoring.rb', line 235

def clear_correlation_id
  @correlation_ids.delete(Thread.current.object_id)
end

#current_correlation_idString

Get correlation ID for current thread

Returns:

  • (String)

    Correlation ID



230
231
232
# File 'lib/a2a/monitoring.rb', line 230

def current_correlation_id
  @correlation_ids[Thread.current.object_id] || generate_correlation_id
end

#generate_correlation_idObject (private)



257
258
259
# File 'lib/a2a/monitoring.rb', line 257

def generate_correlation_id
  SecureRandom.hex(8)
end

#log(level, message, **context) ⇒ Object

Log with structured format

Parameters:

  • level (Symbol)

    Log level

  • message (String)

    Log message

  • **context (Hash)

    Additional context



206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'lib/a2a/monitoring.rb', line 206

def log(level, message, **context)
  return unless @base_logger

  correlation_id = current_correlation_id

  structured_data = {
    timestamp: Time.now.iso8601,
    level: level.to_s.upcase,
    message: message,
    correlation_id: correlation_id,
    component: "a2a-ruby"
  }.merge(context)

  @base_logger.send(level, structured_data.to_json)
end

#set_correlation_id(id) ⇒ Object

Set correlation ID for current thread

Parameters:

  • id (String)

    Correlation ID



224
225
226
# File 'lib/a2a/monitoring.rb', line 224

def set_correlation_id(id)
  @correlation_ids[Thread.current.object_id] = id
end

#with_correlation_id(id) { ... } ⇒ Object

Execute block with correlation ID

Parameters:

  • id (String)

    Correlation ID

Yields:

  • Block to execute

Returns:

  • (Object)

    Block result



243
244
245
246
247
248
249
250
251
252
253
# File 'lib/a2a/monitoring.rb', line 243

def with_correlation_id(id)
  old_id = current_correlation_id
  set_correlation_id(id)
  yield
ensure
  if old_id
    set_correlation_id(old_id)
  else
    clear_correlation_id
  end
end