oximeter 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 509759d57a071639422d7abc7a47b97f2c59fa1e
4
- data.tar.gz: 699395f3143ff28680ea7708fd1e7f4015736ec7
3
+ metadata.gz: 2f6dc4e5f0e06752dd9ed73f9f518b87553b6d15
4
+ data.tar.gz: 334b9c25d483e07ac06d31b1d69ff73e4a7d9e81
5
5
  SHA512:
6
- metadata.gz: 0ab0af88050871fdafa96dd41330a2ec37dfe90dd16456ed8be862defbef65e5fcf718be0083369c1e4c42df4d19faff268fdcd2d7f385a4a92dc4b9afd5c88f
7
- data.tar.gz: a703134f22292c746a4f3715fb42aed2a3d6a521a1371314bbaca802afb7468b8a593626d959395fc0ed4680e702203bddeabc79de53d13f780b38b2a133a282
6
+ metadata.gz: 7a0637083b3c98a3b3d37ee88432fa952ca515cc18ff02648a7b43ccf447e9d570244a76d5b7e43baa315c3de42890bbfd9568779f14890b25909dc2c31bf3ef
7
+ data.tar.gz: f90496095e8db7226c53ebb1395fe77d76e2bbc403d9c726c5d6246b6de5f692f8752661ea014ce8585a0c64003825c881797b67c8e9f3dddac6c3c485f93767
@@ -0,0 +1,4 @@
1
+ module Oximeter
2
+ class BaseController < ActionController::Base
3
+ end
4
+ end
@@ -0,0 +1,32 @@
1
+ module Oximeter
2
+ module Configuration
3
+ class Model
4
+ attr_reader :entity, :setup
5
+
6
+ ATTRIBUTES = %w(
7
+ label
8
+ pull_last
9
+ period
10
+ group_field
11
+ ).freeze
12
+
13
+ def initialize(entity)
14
+ @entity = entity
15
+ @setup = {}
16
+ end
17
+
18
+ # Define methods for setting model section configuration setup
19
+ ATTRIBUTES.each do |attribute_name|
20
+ define_method(attribute_name) do |attribute_value = nil|
21
+ if attribute_value
22
+ @setup[attribute_name.to_sym] = attribute_value
23
+ else
24
+ @setup[attribute_name.to_sym]
25
+ end
26
+ end
27
+ end
28
+
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,5 @@
1
+ module Oximeter
2
+ class Engine < ::Rails::Engine
3
+ engine_name 'oximeter'
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ module Oximeter
2
+ class PulseController < Oximeter::BaseController
3
+ def index
4
+ @reports = Oximeter::Configuration.included_models.map { |model| Oximeter::Reports::Report.for_model(model.entity) }
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,6 @@
1
+ module Oximeter
2
+ module Reports
3
+ class Period < Struct.new(:time, :count)
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,68 @@
1
+ require 'groupdate'
2
+
3
+ module Oximeter
4
+ module Reports
5
+ class Report < Struct.new(:entity, :config)
6
+ include Math
7
+
8
+ def self.for_model(entity)
9
+ new(entity, Oximeter::Configuration::get_model(entity))
10
+ end
11
+
12
+ def has_data?
13
+ data.length > 0
14
+ end
15
+
16
+ def critical_value?
17
+ time_period_fraction = (Time.now - data.last.time).to_f / 1.send(config.period)
18
+
19
+ weighted_mean = time_period_fraction * mean
20
+ weighted_std_dev = time_period_fraction * std_dev
21
+
22
+ (data.last.count - weighted_mean).abs > weighted_std_dev
23
+ end
24
+
25
+ def data
26
+ @data ||= entity
27
+ .where('created_at BETWEEN ? AND ?', (config.pull_last + 1.minute).ago, Time.now)
28
+ .group_by_period(config.period, config.group_field)
29
+ .count
30
+ .map { |point| Period.new(point[0], point[1]) }
31
+ end
32
+
33
+ def time_view_window
34
+ [data.first.time - 1.hour, data.last.time + 1.hour]
35
+ end
36
+
37
+ def counts_view_window
38
+ times = data.map(&:time)
39
+ [times.min, times.max]
40
+ end
41
+
42
+ def mean
43
+ sum = data.sum(&:count).to_f / data.length
44
+ end
45
+
46
+ # 1. Work out the Mean (the simple average of the numbers)
47
+ # 2. Then for each number: subtract the Mean and square the result
48
+ # 3. Then work out the mean of those squared differences.
49
+ # 4. Take the square root of that
50
+ def std_dev
51
+ n = data.length
52
+ sqrt data.sum { |x| (x.count - mean) ** 2 } / n
53
+ end
54
+
55
+ def charts_json
56
+ {
57
+ entity_name: entity.to_s,
58
+ view_window: {
59
+ time: time_view_window,
60
+ counts: counts_view_window
61
+ },
62
+ rows: data
63
+ }
64
+ end
65
+
66
+ end
67
+ end
68
+ end
@@ -1,3 +1,3 @@
1
1
  module Oximeter
2
- VERSION = '0.0.0'
2
+ VERSION = '0.0.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oximeter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vlad Tsvang
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-26 00:00:00.000000000 Z
11
+ date: 2018-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -101,7 +101,13 @@ extensions: []
101
101
  extra_rdoc_files: []
102
102
  files:
103
103
  - lib/oximeter.rb
104
+ - lib/oximeter/base_controller.rb
104
105
  - lib/oximeter/configuration/configuration.rb
106
+ - lib/oximeter/configuration/model.rb
107
+ - lib/oximeter/engine.rb
108
+ - lib/oximeter/pulse_controller.rb
109
+ - lib/oximeter/reports/period.rb
110
+ - lib/oximeter/reports/report.rb
105
111
  - lib/oximeter/version.rb
106
112
  homepage: https://github.com/entelo/oximeter
107
113
  licenses: