Module: BrainzLab::Signal

Defined in:
lib/brainzlab/signal.rb,
lib/brainzlab/signal/client.rb,
lib/brainzlab/signal/provisioner.rb

Defined Under Namespace

Classes: Client, Provisioner

Constant Summary collapse

SEVERITIES =
%i[info warning error critical].freeze

Class Method Summary collapse

Class Method Details

.alert(name, message, severity: :warning, channels: nil, data: {}) ⇒ Object

Send an alert with a message

Parameters:

  • name (String)

    Alert name (e.g., ‘high_error_rate’, ‘low_disk_space’)

  • message (String)

    Alert message

  • severity (Symbol) (defaults to: :warning)

    Alert severity (:info, :warning, :error, :critical)

  • channels (Array<String>) (defaults to: nil)

    Channels to send alert to (e.g., [‘slack’, ‘email’])

  • data (Hash) (defaults to: {})

    Additional data to include with the alert



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/brainzlab/signal.rb', line 17

def alert(name, message, severity: :warning, channels: nil, data: {})
  return unless enabled?

  ensure_provisioned!
  return unless BrainzLab.configuration.signal_valid?

  payload = {
    type: 'alert',
    name: name,
    message: message,
    severity: severity.to_s,
    channels: channels,
    data: data,
    timestamp: Time.now.utc.iso8601(3),
    environment: BrainzLab.configuration.environment,
    service: BrainzLab.configuration.service,
    host: BrainzLab.configuration.host,
    context: context_data
  }

  client.send_alert(payload)
end

.clientObject



110
111
112
# File 'lib/brainzlab/signal.rb', line 110

def client
  @client ||= Client.new(BrainzLab.configuration)
end

.ensure_provisioned!Object

INTERNAL ===



99
100
101
102
103
104
# File 'lib/brainzlab/signal.rb', line 99

def ensure_provisioned!
  return if @provisioned

  @provisioned = true
  provisioner.ensure_project!
end

.notify(channel, message, title: nil, data: {}) ⇒ Object

Send a notification to specific channels

Parameters:

  • channel (String, Array<String>)

    Channel(s) to send to (‘slack’, ‘email’, ‘webhook’)

  • message (String)

    Notification message

  • title (String) (defaults to: nil)

    Optional notification title

  • data (Hash) (defaults to: {})

    Additional data



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/brainzlab/signal.rb', line 45

def notify(channel, message, title: nil, data: {})
  return unless enabled?

  ensure_provisioned!
  return unless BrainzLab.configuration.signal_valid?

  channels = Array(channel)
  payload = {
    type: 'notification',
    channels: channels,
    message: message,
    title: title,
    data: data,
    timestamp: Time.now.utc.iso8601(3),
    environment: BrainzLab.configuration.environment,
    service: BrainzLab.configuration.service
  }

  client.send_notification(payload)
end

.provisionerObject



106
107
108
# File 'lib/brainzlab/signal.rb', line 106

def provisioner
  @provisioner ||= Provisioner.new(BrainzLab.configuration)
end

.reset!Object



114
115
116
117
118
# File 'lib/brainzlab/signal.rb', line 114

def reset!
  @client = nil
  @provisioner = nil
  @provisioned = false
end

.test!Object

Send a test alert to verify configuration



88
89
90
91
92
93
94
95
# File 'lib/brainzlab/signal.rb', line 88

def test!
  alert(
    'test_alert',
    'This is a test alert from BrainzLab Signal SDK',
    severity: :info,
    data: { test: true, sdk_version: BrainzLab::VERSION }
  )
end

.trigger(rule_name, context = {}) ⇒ Object

Trigger a predefined alert rule

Parameters:

  • rule_name (String)

    Name of the alert rule to trigger

  • context (Hash) (defaults to: {})

    Context data to pass to the rule



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/brainzlab/signal.rb', line 69

def trigger(rule_name, context = {})
  return unless enabled?

  ensure_provisioned!
  return unless BrainzLab.configuration.signal_valid?

  payload = {
    type: 'trigger',
    rule: rule_name,
    context: context,
    timestamp: Time.now.utc.iso8601(3),
    environment: BrainzLab.configuration.environment,
    service: BrainzLab.configuration.service
  }

  client.trigger_rule(payload)
end