aeternitas 0.2.0 → 2.0.0
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 +4 -4
- data/.gitattributes +1 -0
- data/.github/workflows/lint.yml +25 -0
- data/.github/workflows/tests.yml +28 -0
- data/.gitignore +2 -5
- data/.ruby-version +1 -1
- data/CHANGELOG.md +36 -0
- data/CODE_OF_CONDUCT.md +0 -0
- data/Gemfile +1 -1
- data/LICENSE.txt +0 -0
- data/README.md +104 -145
- data/Rakefile +1 -1
- data/aeternitas.gemspec +23 -34
- data/lib/aeternitas/aeternitas_job.rb +7 -0
- data/lib/aeternitas/cleanup_old_metrics_job.rb +12 -0
- data/lib/aeternitas/cleanup_stale_locks_job.rb +12 -0
- data/lib/aeternitas/errors.rb +1 -2
- data/lib/aeternitas/guard.rb +76 -109
- data/lib/aeternitas/guard_lock.rb +19 -0
- data/lib/aeternitas/maintenance.rb +35 -0
- data/lib/aeternitas/metric.rb +12 -0
- data/lib/aeternitas/metrics.rb +54 -136
- data/lib/aeternitas/poll_job.rb +139 -0
- data/lib/aeternitas/pollable/configuration.rb +21 -22
- data/lib/aeternitas/pollable/dsl.rb +16 -17
- data/lib/aeternitas/pollable.rb +19 -18
- data/lib/aeternitas/pollable_meta_data.rb +18 -9
- data/lib/aeternitas/polling_frequency.rb +4 -4
- data/lib/aeternitas/source.rb +5 -5
- data/lib/aeternitas/storage_adapter/file.rb +9 -12
- data/lib/aeternitas/storage_adapter.rb +1 -3
- data/lib/aeternitas/test.rb +13 -0
- data/lib/aeternitas/unique_job_lock.rb +15 -0
- data/lib/aeternitas/version.rb +1 -1
- data/lib/aeternitas.rb +36 -26
- data/lib/generators/aeternitas/install_generator.rb +14 -8
- data/lib/generators/aeternitas/templates/add_aeternitas.rb.erb +34 -2
- data/lib/generators/aeternitas/templates/initializer.rb +10 -7
- metadata +39 -123
- data/.idea/.rakeTasks +0 -7
- data/.idea/misc.xml +0 -4
- data/.idea/modules.xml +0 -8
- data/.idea/vcs.xml +0 -6
- data/.rspec +0 -2
- data/.rubocop.yml +0 -2
- data/.travis.yml +0 -8
- data/lib/aeternitas/metrics/counter.rb +0 -18
- data/lib/aeternitas/metrics/ratio.rb +0 -67
- data/lib/aeternitas/metrics/ten_minutes_resolution.rb +0 -40
- data/lib/aeternitas/metrics/values.rb +0 -18
- data/lib/aeternitas/sidekiq/middleware.rb +0 -31
- data/lib/aeternitas/sidekiq/poll_job.rb +0 -30
- data/lib/aeternitas/sidekiq.rb +0 -5
- data/logo.png +0 -0
- data/logo.svg +0 -198
data/lib/aeternitas.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
|
+
require "ostruct"
|
1
2
|
require "active_support/all"
|
2
|
-
require "redis"
|
3
|
-
require "connection_pool"
|
4
|
-
require "sidekiq-unique-jobs"
|
5
|
-
require "tabs_tabs"
|
6
3
|
require "aeternitas/version"
|
7
4
|
require "aeternitas/guard"
|
8
5
|
require "aeternitas/pollable"
|
@@ -11,18 +8,19 @@ require "aeternitas/source"
|
|
11
8
|
require "aeternitas/polling_frequency"
|
12
9
|
require "aeternitas/errors"
|
13
10
|
require "aeternitas/storage_adapter"
|
14
|
-
require "aeternitas/
|
11
|
+
require "aeternitas/metric"
|
15
12
|
require "aeternitas/metrics"
|
13
|
+
require "aeternitas/maintenance"
|
14
|
+
require "aeternitas/unique_job_lock"
|
15
|
+
require "aeternitas/guard_lock"
|
16
|
+
require "aeternitas/aeternitas_job"
|
17
|
+
require "aeternitas/poll_job"
|
18
|
+
require "aeternitas/cleanup_stale_locks_job"
|
19
|
+
require "aeternitas/cleanup_old_metrics_job"
|
20
|
+
require "aeternitas/test"
|
16
21
|
|
17
22
|
# Aeternitas
|
18
23
|
module Aeternitas
|
19
|
-
|
20
|
-
# Get the configured redis connection
|
21
|
-
# @return [ConnectionPool::Wrapper] returns a redis connection from the pool
|
22
|
-
def self.redis
|
23
|
-
@redis ||= ConnectionPool::Wrapper.new(size: 5, timeout: 3) { Redis.new(self.config.redis) }
|
24
|
-
end
|
25
|
-
|
26
24
|
# Access the configuration
|
27
25
|
# @return [Aeternitas::Configuration] the Aeternitas configuration
|
28
26
|
def self.config
|
@@ -33,36 +31,54 @@ module Aeternitas
|
|
33
31
|
# @see Aeternitas::Configuration
|
34
32
|
# @yieldparam [Aeternitas::Configuration] config the aeternitas configuration
|
35
33
|
def self.configure
|
36
|
-
yield(
|
34
|
+
yield(config)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returns true if aeternitas is in test mode.
|
38
|
+
# @return [Boolean]
|
39
|
+
def self.test_mode?
|
40
|
+
@test_mode == true
|
41
|
+
end
|
42
|
+
|
43
|
+
# Sets the test mode.
|
44
|
+
# @param [Boolean] value
|
45
|
+
def self.test_mode=(value)
|
46
|
+
@test_mode = value
|
37
47
|
end
|
38
48
|
|
39
49
|
# Enqueues all active pollables for which next polling is lower than the current time
|
40
50
|
def self.enqueue_due_pollables
|
41
51
|
Aeternitas::PollableMetaData.due.find_each do |pollable_meta_data|
|
42
|
-
Aeternitas::
|
52
|
+
Aeternitas::PollJob
|
43
53
|
.set(queue: pollable_meta_data.pollable.pollable_configuration.queue)
|
44
|
-
.
|
54
|
+
.perform_later(pollable_meta_data.id)
|
45
55
|
pollable_meta_data.enqueue
|
46
56
|
pollable_meta_data.save
|
47
57
|
end
|
48
58
|
end
|
49
59
|
|
50
60
|
# Stores the global Aeternitas configuration
|
51
|
-
# @!attribute [rw] redis
|
52
|
-
# Redis configuration hash, Default: nil
|
53
61
|
# @!attribute [rw] storage_adapter_config
|
54
62
|
# Storage adapter configuration, See {Aeternitas::StorageAdapter} for configuration options
|
55
63
|
# @!attribute [rw] storage_adapter
|
56
64
|
# Storage adapter class. Default: {Aeternitas::StorageAdapter::File}
|
65
|
+
# @!attribute [rw] metrics_enabled
|
66
|
+
# Whether to log metrics to the database. Default: false
|
67
|
+
# @!attribute [rw] metric_retention_period
|
68
|
+
# How long to keep metric data before it can be cleaned up. Default: 90.days
|
57
69
|
class Configuration
|
58
|
-
attr_accessor :
|
70
|
+
attr_accessor :storage_adapter,
|
71
|
+
:storage_adapter_config,
|
72
|
+
:metrics_enabled,
|
73
|
+
:metric_retention_period
|
59
74
|
|
60
75
|
def initialize
|
61
|
-
@redis = nil
|
62
76
|
@storage_adapter = Aeternitas::StorageAdapter::File
|
63
77
|
@storage_adapter_config = {
|
64
|
-
directory: defined?(Rails) ?
|
78
|
+
directory: defined?(Rails) ? Rails.root.join("storage", "aeternitas") : File.join(Dir.getwd, "aeternitas_data")
|
65
79
|
}
|
80
|
+
@metrics_enabled = false
|
81
|
+
@metric_retention_period = 90.days
|
66
82
|
end
|
67
83
|
|
68
84
|
# Creates a new StorageAdapter instance with the given options
|
@@ -70,11 +86,5 @@ module Aeternitas
|
|
70
86
|
def get_storage_adapter
|
71
87
|
@storage_adapter.new(storage_adapter_config)
|
72
88
|
end
|
73
|
-
|
74
|
-
def redis=(redis_config)
|
75
|
-
@redis = redis_config
|
76
|
-
TabsTabs.configure { |tabstabs_config| tabstabs_config.redis = redis_config }
|
77
|
-
end
|
78
89
|
end
|
79
90
|
end
|
80
|
-
|
@@ -8,28 +8,34 @@ module Aeternitas
|
|
8
8
|
|
9
9
|
source_root File.expand_path("../templates", __FILE__)
|
10
10
|
|
11
|
-
desc
|
12
|
-
|
11
|
+
desc "Generates (but does not run) a migration to add all tables needed by Aeternitas." \
|
12
|
+
" Also generates an initializer file for configuring Aeternitas"
|
13
13
|
|
14
14
|
def create_migration_file
|
15
15
|
migration_dir = File.expand_path("db/migrate")
|
16
|
-
if self.class.migration_exists?(migration_dir,
|
17
|
-
::Kernel.warn "Migration already exists
|
16
|
+
if self.class.migration_exists?(migration_dir, "add_aeternitas")
|
17
|
+
::Kernel.warn "Migration 'add_aeternitas' already exists. Skipping."
|
18
18
|
else
|
19
|
-
migration_template(
|
19
|
+
migration_template("add_aeternitas.rb.erb", "db/migrate/add_aeternitas.rb")
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
23
|
def copy_initializer
|
24
|
-
copy_file(
|
24
|
+
copy_file("initializer.rb", "config/initializers/aeternitas.rb")
|
25
25
|
end
|
26
26
|
|
27
27
|
def reminder
|
28
|
-
say "
|
28
|
+
say "\nDon't forget to regularly run 'Aeternitas.enqueue_due_pollables', e.g., using 'whenever'", :red
|
29
|
+
say "You should also schedule maintenance jobs:\n", :yellow
|
30
|
+
say "To clean up old metrics (if metrics are enabled):\n"
|
31
|
+
say " Aeternitas::CleanupOldMetricsJob.perform_later\n", :white
|
32
|
+
say "To clean up stale locks from crashed workers:\n"
|
33
|
+
say " Aeternitas::CleanupStaleLocksJob.perform_later\n", :white
|
34
|
+
say "Schedule these to run periodically, for example, once a week.\n"
|
29
35
|
end
|
30
36
|
|
31
37
|
def self.next_migration_number(dirname)
|
32
38
|
::ActiveRecord::Generators::Base.next_migration_number(dirname)
|
33
39
|
end
|
34
40
|
end
|
35
|
-
end
|
41
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
# This migration creates the tables needed by Aeternitas
|
2
|
-
class AddAeternitas < ActiveRecord::Migration
|
2
|
+
class AddAeternitas < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
|
3
3
|
def change
|
4
4
|
create_table :aeternitas_pollable_meta_data do |t|
|
5
5
|
t.string :pollable_type, null: false
|
6
6
|
t.integer :pollable_id, null: false
|
7
7
|
t.string :pollable_class, null: false
|
8
|
-
t.datetime :next_polling, null: false, default: "1970-01-01 00:00:00
|
8
|
+
t.datetime :next_polling, null: false, default: "1970-01-01 00:00:00"
|
9
9
|
t.datetime :last_polling
|
10
10
|
t.string :state
|
11
11
|
t.text :deactivation_reason
|
@@ -21,5 +21,37 @@ class AddAeternitas < ActiveRecord::Migration
|
|
21
21
|
t.datetime :created_at
|
22
22
|
end
|
23
23
|
add_index :aeternitas_sources, [:pollable_id, :pollable_type], name: 'aeternitas_pollable_source'
|
24
|
+
|
25
|
+
create_table :aeternitas_unique_job_locks do |t|
|
26
|
+
t.string :lock_digest, null: false
|
27
|
+
t.string :guard_key_digest
|
28
|
+
t.string :job_id
|
29
|
+
t.datetime :expires_at, null: false
|
30
|
+
|
31
|
+
t.timestamps
|
32
|
+
end
|
33
|
+
add_index :aeternitas_unique_job_locks, :lock_digest, unique: true
|
34
|
+
add_index :aeternitas_unique_job_locks, :guard_key_digest
|
35
|
+
add_index :aeternitas_unique_job_locks, :expires_at
|
36
|
+
|
37
|
+
create_table :aeternitas_guard_locks do |t|
|
38
|
+
t.string :lock_key, null: false
|
39
|
+
t.string :state, null: false
|
40
|
+
t.string :token, null: false, limit: 20
|
41
|
+
t.datetime :locked_until, null: false
|
42
|
+
t.text :reason
|
43
|
+
|
44
|
+
t.timestamps
|
45
|
+
end
|
46
|
+
add_index :aeternitas_guard_locks, :lock_key, unique: true
|
47
|
+
add_index :aeternitas_guard_locks, :locked_until
|
48
|
+
|
49
|
+
create_table :aeternitas_metrics do |t|
|
50
|
+
t.string :name, null: false
|
51
|
+
t.string :pollable_class, null: false
|
52
|
+
t.float :value, null: false
|
53
|
+
t.datetime :created_at, null: false
|
54
|
+
end
|
55
|
+
add_index :aeternitas_metrics, [:name, :pollable_class, :created_at], name: 'idx_aeternitas_metrics'
|
24
56
|
end
|
25
57
|
end
|
@@ -1,10 +1,13 @@
|
|
1
|
-
#
|
1
|
+
# Aeternitas is configured with sensible defaults. You can override them here if needed.
|
2
2
|
Aeternitas.configure do |config|
|
3
|
-
|
4
|
-
|
3
|
+
# Configure source storage (default is Rails.root.join("storage", "aeternitas"))
|
4
|
+
# config.storage_adapter_config = {
|
5
|
+
# directory: File.join(Rails.root, 'public', 'sources')
|
6
|
+
# }
|
7
|
+
|
8
|
+
# Configure metrics collection (default is disabled)
|
9
|
+
# config.metrics_enabled = true
|
5
10
|
|
6
|
-
|
7
|
-
config.
|
8
|
-
chain.add Aeternitas::Sidekiq::Middleware
|
9
|
-
end
|
11
|
+
# Change how long metric data is kept (default is 90 days)
|
12
|
+
# config.metric_retention_period = 180.days
|
10
13
|
end
|
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aeternitas
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Prilop
|
8
8
|
- Max Kießling
|
9
|
-
-
|
10
|
-
autorequire:
|
9
|
+
- Louis Franzke
|
10
|
+
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2025-08-11 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activerecord
|
@@ -18,42 +18,28 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '7.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: '
|
28
|
+
version: '7.0'
|
29
29
|
- !ruby/object:Gem::Dependency
|
30
|
-
name:
|
30
|
+
name: activejob
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
33
|
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
|
-
version: '0'
|
36
|
-
type: :runtime
|
37
|
-
prerelease: false
|
38
|
-
version_requirements: !ruby/object:Gem::Requirement
|
39
|
-
requirements:
|
40
|
-
- - ">="
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: '0'
|
43
|
-
- !ruby/object:Gem::Dependency
|
44
|
-
name: connection_pool
|
45
|
-
requirement: !ruby/object:Gem::Requirement
|
46
|
-
requirements:
|
47
|
-
- - ">="
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: '0'
|
35
|
+
version: '7.0'
|
50
36
|
type: :runtime
|
51
37
|
prerelease: false
|
52
38
|
version_requirements: !ruby/object:Gem::Requirement
|
53
39
|
requirements:
|
54
40
|
- - ">="
|
55
41
|
- !ruby/object:Gem::Version
|
56
|
-
version: '0'
|
42
|
+
version: '7.0'
|
57
43
|
- !ruby/object:Gem::Dependency
|
58
44
|
name: aasm
|
59
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -68,54 +54,6 @@ dependencies:
|
|
68
54
|
- - ">="
|
69
55
|
- !ruby/object:Gem::Version
|
70
56
|
version: '0'
|
71
|
-
- !ruby/object:Gem::Dependency
|
72
|
-
name: sidekiq
|
73
|
-
requirement: !ruby/object:Gem::Requirement
|
74
|
-
requirements:
|
75
|
-
- - ">"
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: '4'
|
78
|
-
- - "<"
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
version: '6'
|
81
|
-
type: :runtime
|
82
|
-
prerelease: false
|
83
|
-
version_requirements: !ruby/object:Gem::Requirement
|
84
|
-
requirements:
|
85
|
-
- - ">"
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version: '4'
|
88
|
-
- - "<"
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
version: '6'
|
91
|
-
- !ruby/object:Gem::Dependency
|
92
|
-
name: sidekiq-unique-jobs
|
93
|
-
requirement: !ruby/object:Gem::Requirement
|
94
|
-
requirements:
|
95
|
-
- - "~>"
|
96
|
-
- !ruby/object:Gem::Version
|
97
|
-
version: '5.0'
|
98
|
-
type: :runtime
|
99
|
-
prerelease: false
|
100
|
-
version_requirements: !ruby/object:Gem::Requirement
|
101
|
-
requirements:
|
102
|
-
- - "~>"
|
103
|
-
- !ruby/object:Gem::Version
|
104
|
-
version: '5.0'
|
105
|
-
- !ruby/object:Gem::Dependency
|
106
|
-
name: tabstabs
|
107
|
-
requirement: !ruby/object:Gem::Requirement
|
108
|
-
requirements:
|
109
|
-
- - ">="
|
110
|
-
- !ruby/object:Gem::Version
|
111
|
-
version: '0'
|
112
|
-
type: :runtime
|
113
|
-
prerelease: false
|
114
|
-
version_requirements: !ruby/object:Gem::Requirement
|
115
|
-
requirements:
|
116
|
-
- - ">="
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
version: '0'
|
119
57
|
- !ruby/object:Gem::Dependency
|
120
58
|
name: bundler
|
121
59
|
requirement: !ruby/object:Gem::Requirement
|
@@ -145,63 +83,49 @@ dependencies:
|
|
145
83
|
- !ruby/object:Gem::Version
|
146
84
|
version: '0'
|
147
85
|
- !ruby/object:Gem::Dependency
|
148
|
-
name: rspec
|
86
|
+
name: rspec-rails
|
149
87
|
requirement: !ruby/object:Gem::Requirement
|
150
88
|
requirements:
|
151
89
|
- - "~>"
|
152
90
|
- !ruby/object:Gem::Version
|
153
|
-
version: '
|
91
|
+
version: '7.0'
|
154
92
|
type: :development
|
155
93
|
prerelease: false
|
156
94
|
version_requirements: !ruby/object:Gem::Requirement
|
157
95
|
requirements:
|
158
96
|
- - "~>"
|
159
97
|
- !ruby/object:Gem::Version
|
160
|
-
version: '
|
98
|
+
version: '7.0'
|
161
99
|
- !ruby/object:Gem::Dependency
|
162
100
|
name: sqlite3
|
163
101
|
requirement: !ruby/object:Gem::Requirement
|
164
102
|
requirements:
|
165
|
-
- - "
|
103
|
+
- - "~>"
|
166
104
|
- !ruby/object:Gem::Version
|
167
|
-
version: '
|
105
|
+
version: '2.1'
|
168
106
|
type: :development
|
169
107
|
prerelease: false
|
170
108
|
version_requirements: !ruby/object:Gem::Requirement
|
171
109
|
requirements:
|
172
|
-
- - "
|
110
|
+
- - "~>"
|
173
111
|
- !ruby/object:Gem::Version
|
174
|
-
version: '
|
112
|
+
version: '2.1'
|
175
113
|
- !ruby/object:Gem::Dependency
|
176
114
|
name: database_cleaner
|
177
115
|
requirement: !ruby/object:Gem::Requirement
|
178
116
|
requirements:
|
179
117
|
- - "~>"
|
180
118
|
- !ruby/object:Gem::Version
|
181
|
-
version: '
|
119
|
+
version: '2.0'
|
182
120
|
type: :development
|
183
121
|
prerelease: false
|
184
122
|
version_requirements: !ruby/object:Gem::Requirement
|
185
123
|
requirements:
|
186
124
|
- - "~>"
|
187
125
|
- !ruby/object:Gem::Version
|
188
|
-
version: '
|
189
|
-
- !ruby/object:Gem::Dependency
|
190
|
-
name: rspec-sidekiq
|
191
|
-
requirement: !ruby/object:Gem::Requirement
|
192
|
-
requirements:
|
193
|
-
- - ">="
|
194
|
-
- !ruby/object:Gem::Version
|
195
|
-
version: '0'
|
196
|
-
type: :development
|
197
|
-
prerelease: false
|
198
|
-
version_requirements: !ruby/object:Gem::Requirement
|
199
|
-
requirements:
|
200
|
-
- - ">="
|
201
|
-
- !ruby/object:Gem::Version
|
202
|
-
version: '0'
|
126
|
+
version: '2.0'
|
203
127
|
- !ruby/object:Gem::Dependency
|
204
|
-
name:
|
128
|
+
name: standard
|
205
129
|
requirement: !ruby/object:Gem::Requirement
|
206
130
|
requirements:
|
207
131
|
- - ">="
|
@@ -214,27 +138,19 @@ dependencies:
|
|
214
138
|
- - ">="
|
215
139
|
- !ruby/object:Gem::Version
|
216
140
|
version: '0'
|
217
|
-
description:
|
218
|
-
Æternitas provides means to regularly 'poll' resources (i.e. a website, twitter feed or API) and to permanently
|
219
|
-
store retrieved results. By default æternitas avoids putting too much load on external servers and stores raw
|
220
|
-
results as compressed files on disk. It can be configured to a wide variety of polling strategies (e.g. frequencies,
|
221
|
-
cooldown periods, ignoring exceptions, deactivating resources, ...)."
|
141
|
+
description: æternitas is a tool support polling resources (webpages, APIs).
|
222
142
|
email:
|
223
|
-
-
|
224
|
-
- michael.prilop@imw.fraunhofer.de
|
143
|
+
- prilop@infai.org
|
225
144
|
executables: []
|
226
145
|
extensions: []
|
227
146
|
extra_rdoc_files: []
|
228
147
|
files:
|
148
|
+
- ".gitattributes"
|
149
|
+
- ".github/workflows/lint.yml"
|
150
|
+
- ".github/workflows/tests.yml"
|
229
151
|
- ".gitignore"
|
230
|
-
- ".idea/.rakeTasks"
|
231
|
-
- ".idea/misc.xml"
|
232
|
-
- ".idea/modules.xml"
|
233
|
-
- ".idea/vcs.xml"
|
234
|
-
- ".rspec"
|
235
|
-
- ".rubocop.yml"
|
236
152
|
- ".ruby-version"
|
237
|
-
-
|
153
|
+
- CHANGELOG.md
|
238
154
|
- CODE_OF_CONDUCT.md
|
239
155
|
- Gemfile
|
240
156
|
- LICENSE.txt
|
@@ -244,35 +160,35 @@ files:
|
|
244
160
|
- bin/console
|
245
161
|
- bin/setup
|
246
162
|
- lib/aeternitas.rb
|
163
|
+
- lib/aeternitas/aeternitas_job.rb
|
164
|
+
- lib/aeternitas/cleanup_old_metrics_job.rb
|
165
|
+
- lib/aeternitas/cleanup_stale_locks_job.rb
|
247
166
|
- lib/aeternitas/errors.rb
|
248
167
|
- lib/aeternitas/guard.rb
|
168
|
+
- lib/aeternitas/guard_lock.rb
|
169
|
+
- lib/aeternitas/maintenance.rb
|
170
|
+
- lib/aeternitas/metric.rb
|
249
171
|
- lib/aeternitas/metrics.rb
|
250
|
-
- lib/aeternitas/
|
251
|
-
- lib/aeternitas/metrics/ratio.rb
|
252
|
-
- lib/aeternitas/metrics/ten_minutes_resolution.rb
|
253
|
-
- lib/aeternitas/metrics/values.rb
|
172
|
+
- lib/aeternitas/poll_job.rb
|
254
173
|
- lib/aeternitas/pollable.rb
|
255
174
|
- lib/aeternitas/pollable/configuration.rb
|
256
175
|
- lib/aeternitas/pollable/dsl.rb
|
257
176
|
- lib/aeternitas/pollable_meta_data.rb
|
258
177
|
- lib/aeternitas/polling_frequency.rb
|
259
|
-
- lib/aeternitas/sidekiq.rb
|
260
|
-
- lib/aeternitas/sidekiq/middleware.rb
|
261
|
-
- lib/aeternitas/sidekiq/poll_job.rb
|
262
178
|
- lib/aeternitas/source.rb
|
263
179
|
- lib/aeternitas/storage_adapter.rb
|
264
180
|
- lib/aeternitas/storage_adapter/file.rb
|
181
|
+
- lib/aeternitas/test.rb
|
182
|
+
- lib/aeternitas/unique_job_lock.rb
|
265
183
|
- lib/aeternitas/version.rb
|
266
184
|
- lib/generators/aeternitas/install_generator.rb
|
267
185
|
- lib/generators/aeternitas/templates/add_aeternitas.rb.erb
|
268
186
|
- lib/generators/aeternitas/templates/initializer.rb
|
269
|
-
|
270
|
-
- logo.svg
|
271
|
-
homepage: https://github.com/FHG-IMW/aeternitas
|
187
|
+
homepage: https://github.com/Dietech-Group/aeternitas
|
272
188
|
licenses:
|
273
189
|
- MIT
|
274
190
|
metadata: {}
|
275
|
-
post_install_message:
|
191
|
+
post_install_message:
|
276
192
|
rdoc_options: []
|
277
193
|
require_paths:
|
278
194
|
- lib
|
@@ -287,8 +203,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
287
203
|
- !ruby/object:Gem::Version
|
288
204
|
version: '0'
|
289
205
|
requirements: []
|
290
|
-
rubygems_version: 3.
|
291
|
-
signing_key:
|
206
|
+
rubygems_version: 3.4.19
|
207
|
+
signing_key:
|
292
208
|
specification_version: 4
|
293
|
-
summary: æternitas -
|
209
|
+
summary: æternitas - version 2
|
294
210
|
test_files: []
|
data/.idea/.rakeTasks
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<Settings><!--This file was automatically generated by Ruby plugin.
|
3
|
-
You are allowed to:
|
4
|
-
1. Remove rake task
|
5
|
-
2. Add existing rake tasks
|
6
|
-
To add existing rake tasks automatically delete this file and reload the project.
|
7
|
-
--><RakeGroup description="" fullCmd="" taksId="rake"><RakeTask description="Build aeternitas-0.1.0.gem into the pkg directory" fullCmd="build" taksId="build" /><RakeTask description="Remove any temporary products" fullCmd="clean" taksId="clean" /><RakeTask description="Remove any generated files" fullCmd="clobber" taksId="clobber" /><RakeTask description="Build and install aeternitas-0.1.0.gem into system gems" fullCmd="install" taksId="install" /><RakeGroup description="" fullCmd="" taksId="install"><RakeTask description="Build and install aeternitas-0.1.0.gem into system gems without network access" fullCmd="install:local" taksId="local" /></RakeGroup><RakeTask description="Create tag v0.1.0 and build and push aeternitas-0.1.0.gem to Rubygems" fullCmd="release[remote]" taksId="release[remote]" /><RakeTask description="Run RSpec code examples" fullCmd="spec" taksId="spec" /><RakeTask description="" fullCmd="default" taksId="default" /><RakeTask description="" fullCmd="release" taksId="release" /><RakeGroup description="" fullCmd="" taksId="release"><RakeTask description="" fullCmd="release:guard_clean" taksId="guard_clean" /><RakeTask description="" fullCmd="release:rubygem_push" taksId="rubygem_push" /><RakeTask description="" fullCmd="release:source_control_push" taksId="source_control_push" /></RakeGroup></RakeGroup></Settings>
|
data/.idea/misc.xml
DELETED
data/.idea/modules.xml
DELETED
@@ -1,8 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<project version="4">
|
3
|
-
<component name="ProjectModuleManager">
|
4
|
-
<modules>
|
5
|
-
<module fileurl="file://$PROJECT_DIR$/.idea/aeternitas.iml" filepath="$PROJECT_DIR$/.idea/aeternitas.iml" />
|
6
|
-
</modules>
|
7
|
-
</component>
|
8
|
-
</project>
|
data/.idea/vcs.xml
DELETED
data/.rspec
DELETED
data/.rubocop.yml
DELETED
data/.travis.yml
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
module Aeternitas
|
2
|
-
module Metrics
|
3
|
-
# Wrapper for {TabsTabs::Metrics::Counter::Stats}.
|
4
|
-
# It is for Counter metrics.
|
5
|
-
class Counter
|
6
|
-
include Enumerable
|
7
|
-
extend Forwardable
|
8
|
-
|
9
|
-
def_delegators :@tabstabs_stats, :min, :max, :avg, :each, :to_a, :first, :last
|
10
|
-
|
11
|
-
# Create a new Wrapper
|
12
|
-
# @param [TabsTabs::Metrics::Counter::Stats] tabstabs_stats the wrapped stats.
|
13
|
-
def initialize(tabstabs_stats)
|
14
|
-
@tabstabs_stats = tabstabs_stats
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
@@ -1,67 +0,0 @@
|
|
1
|
-
module Aeternitas
|
2
|
-
module Metrics
|
3
|
-
# Stores time series data for ratios
|
4
|
-
# @!attribute [r] from
|
5
|
-
# @return [DateTime] start of the time series
|
6
|
-
# @!attribute [r] to
|
7
|
-
# @return [DateTime] end of the time series
|
8
|
-
# @!attribute [r] resolution
|
9
|
-
# @return [Symbol] resolution of the time series
|
10
|
-
# @!attribute [r] values
|
11
|
-
# @return [Array] time series data
|
12
|
-
# The time series values have the following format:
|
13
|
-
# {
|
14
|
-
# timestamp: DateTime("2000-01-01 00:00:00 UTC"),
|
15
|
-
# ratio: 0.01
|
16
|
-
# }
|
17
|
-
class Ratio
|
18
|
-
include Enumerable
|
19
|
-
|
20
|
-
attr_reader :from, :to, :resolution, :values
|
21
|
-
|
22
|
-
# Create a new ratio time series
|
23
|
-
# @param [DateTime] from start of the time series
|
24
|
-
# @param [DateTime] to end of the time series
|
25
|
-
# @param [Symbol] resolution time series resolution
|
26
|
-
# @param [Array] values time series data
|
27
|
-
def initialize(from, to, resolution, values)
|
28
|
-
@from = from
|
29
|
-
@to = to
|
30
|
-
@resolution = resolution
|
31
|
-
@values = values
|
32
|
-
end
|
33
|
-
|
34
|
-
def each(&block)
|
35
|
-
@values.each(&block)
|
36
|
-
end
|
37
|
-
|
38
|
-
def to_a
|
39
|
-
@values.to_a
|
40
|
-
end
|
41
|
-
|
42
|
-
# Computes the minimum ration within the time series.
|
43
|
-
# @return [Float] the minimum ratio
|
44
|
-
def min
|
45
|
-
@values.min_by { |v| v['ratio'] }['ratio']
|
46
|
-
end
|
47
|
-
|
48
|
-
# Computes the maximum ration within the time series.
|
49
|
-
# @return [Float] the maximum ratio
|
50
|
-
def max
|
51
|
-
@values.max_by { |v| v['ratio'] }['ratio']
|
52
|
-
end
|
53
|
-
|
54
|
-
# Computes the average ration within the time series.
|
55
|
-
# @return [Float] the average ratio
|
56
|
-
def avg
|
57
|
-
return 0 if count.zero?
|
58
|
-
p @values
|
59
|
-
@values.inject(0) { |sum, v| sum + v[:ratio] } / @values.count
|
60
|
-
end
|
61
|
-
|
62
|
-
def to_s
|
63
|
-
values.to_s
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|