14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# File 'lib/legion/extensions/synapse/actors/homeostasis.rb', line 14
def action(**_opts)
return { status: :skipped, reason: :no_data } unless defined?(Legion::Data)
results = { spikes: 0, droughts: 0, updated: 0 }
return results unless defined?(Legion::Extensions::Synapse::Data::Model::Synapse)
cutoff = Time.now - 60
active_synapses = Legion::Extensions::Synapse::Data::Model::Synapse
.where(status: 'active')
.where { baseline_throughput > 0 } .all
return results if active_synapses.empty?
signal_counts = Legion::Extensions::Synapse::Data::Model::SynapseSignal
.where(synapse_id: active_synapses.map(&:id))
.where { created_at > cutoff }
.group_and_count(:synapse_id)
.as_hash(:synapse_id, :count)
active_synapses.each do |synapse|
baseline = synapse.baseline_throughput
current = signal_counts.fetch(synapse.id, 0).to_f
if Helpers::Homeostasis.spike?(current, baseline, duration_seconds: 60)
results[:spikes] += 1
elsif Helpers::Homeostasis.drought?(current, baseline, silent_seconds: 60)
results[:droughts] += 1
end
new_baseline = Helpers::Homeostasis.update_baseline(baseline, current)
synapse.update(baseline_throughput: new_baseline)
results[:updated] += 1
end
results
end
|