herdst_worker 0.2.18 → 0.2.20
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
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 3ce5fcef880ba98bfb395902e833adb341b994af3ad88075578e63e00ee44323
|
|
4
|
+
data.tar.gz: b7a9f4fc95c34e96fbcc07efb82ef57ad67744fd645dfe95866685c7ab0ec478
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 73f8e2525c067e07115e0e67b4d55937983a185d98fb682c70f9b3ff7738ee0821602c38c7c786d1ef9b03b3696bb30cd2c234fe5fb8fe0cc8f1ead6fec2b233
|
|
7
|
+
data.tar.gz: 3a084a98cd4d0da4cd8bd2e2116585512f358d0fdd8787528e3ebd38a632e8defa240475554d1169c56c8dd5b6800c6f2e578173b41e81d69d969b9bbef19bba
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
tmp_path = Dir.pwd + "/tmp"
|
|
4
|
+
process_id = File.new(tmp_path + "/process_id").read rescue nil
|
|
5
|
+
process_status = File.new(tmp_path + "/process_status").read rescue nil
|
|
6
|
+
unhealthy = process_id == nil || ["stopped"].include?(process_status)
|
|
7
|
+
|
|
8
|
+
Kernel.exit(unhealthy ? 1 : 0)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require "concurrent-ruby"
|
|
2
|
+
require "aws-sdk-ecs"
|
|
2
3
|
|
|
3
4
|
require_relative '../configuration/facade'
|
|
4
5
|
require_relative '../log/facade'
|
|
@@ -73,12 +74,14 @@ module HerdstWorker
|
|
|
73
74
|
|
|
74
75
|
Kernel.exit(exit_code)
|
|
75
76
|
end
|
|
76
|
-
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
|
|
79
|
+
def force_stop(delay = nil)
|
|
80
|
+
delay = 600 if delay == nil # 10 minutes
|
|
80
81
|
process_id = "#{$$}"
|
|
81
|
-
|
|
82
|
+
|
|
83
|
+
self.logger.warn "Application force stopping in #{delay} seconds."
|
|
84
|
+
|
|
82
85
|
Concurrent::ScheduledTask.execute(delay) do
|
|
83
86
|
self.logger.warn "Application force stopping."
|
|
84
87
|
|
|
@@ -86,7 +89,51 @@ module HerdstWorker
|
|
|
86
89
|
end
|
|
87
90
|
end
|
|
88
91
|
|
|
89
|
-
|
|
92
|
+
|
|
93
|
+
def register_new_task
|
|
94
|
+
# info = self.config.metadata.get_service_config
|
|
95
|
+
# credentials = self.config.metadata.get_aws_credentials!
|
|
96
|
+
# ecs_client = Aws::ECS::Client.new(
|
|
97
|
+
# :region => info[:region],
|
|
98
|
+
# :credentials => credentials
|
|
99
|
+
# )
|
|
100
|
+
|
|
101
|
+
# resp = ecs_client.update_service({
|
|
102
|
+
# :cluster => info[:cluster],
|
|
103
|
+
# :service => info[:service_name],
|
|
104
|
+
|
|
105
|
+
# # :task_definition => "amazon-ecs-sample",
|
|
106
|
+
|
|
107
|
+
# :desired_count => desired_count,
|
|
108
|
+
# })
|
|
109
|
+
|
|
110
|
+
# puts "info"
|
|
111
|
+
# puts info.inspect
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def deregister_task
|
|
116
|
+
begin
|
|
117
|
+
info = self.config.metadata.get_service_config
|
|
118
|
+
credentials = self.config.metadata.get_aws_credentials!
|
|
119
|
+
ecs_client = Aws::ECS::Client.new(
|
|
120
|
+
:region => info[:region],
|
|
121
|
+
:credentials => credentials
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
ecs_client.stop_task({
|
|
125
|
+
cluster: info[:cluster],
|
|
126
|
+
reason: "Task expired.",
|
|
127
|
+
task: info[:task_id]
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
rescue Exception => ex
|
|
131
|
+
self.stop
|
|
132
|
+
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
|
|
90
137
|
def config_for(name)
|
|
91
138
|
self.config.config_for(name)
|
|
92
139
|
end
|
|
@@ -85,13 +85,13 @@ module HerdstWorker
|
|
|
85
85
|
|
|
86
86
|
|
|
87
87
|
def get_tasks_info
|
|
88
|
-
metadata = make_request!(get_task_metadata_uri)
|
|
88
|
+
metadata = make_request!(self.get_task_metadata_uri)
|
|
89
89
|
|
|
90
90
|
ecs_client = Aws::ECS::Client.new(
|
|
91
91
|
:region => self.secrets["AWS_REGION"],
|
|
92
92
|
:credentials => self.aws_credentials
|
|
93
93
|
)
|
|
94
|
-
|
|
94
|
+
|
|
95
95
|
ecs_client.describe_tasks(
|
|
96
96
|
:cluster => metadata["Cluster"],
|
|
97
97
|
:tasks => [
|
|
@@ -120,6 +120,20 @@ module HerdstWorker
|
|
|
120
120
|
end
|
|
121
121
|
|
|
122
122
|
|
|
123
|
+
def get_service_config
|
|
124
|
+
metadata = make_request!(self.get_task_metadata_uri_v4)
|
|
125
|
+
|
|
126
|
+
{
|
|
127
|
+
:task_id => metadata["TaskARN"].split("/").last,
|
|
128
|
+
:task_arn => metadata["TaskARN"],
|
|
129
|
+
:cluster => metadata["Cluster"].split("/").last,
|
|
130
|
+
:service_name => metadata["ServiceName"],
|
|
131
|
+
:region => self.secrets["AWS_REGION"],
|
|
132
|
+
:task_definition => metadata["Family"] + ":" + metadata["Revision"]
|
|
133
|
+
}
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
|
|
123
137
|
def get_aws_credentials!
|
|
124
138
|
credentials = self.is_prod? ?
|
|
125
139
|
make_request!(get_credentials_uri) :
|
|
@@ -230,6 +244,10 @@ module HerdstWorker
|
|
|
230
244
|
def get_task_metadata_uri
|
|
231
245
|
ENV["ECS_CONTAINER_METADATA_URI"].to_s + "/task"
|
|
232
246
|
end
|
|
247
|
+
|
|
248
|
+
def get_task_metadata_uri_v4
|
|
249
|
+
ENV["ECS_CONTAINER_METADATA_URI_V4"].to_s + "/task"
|
|
250
|
+
end
|
|
233
251
|
|
|
234
252
|
def get_credentials_uri
|
|
235
253
|
"http://169.254.170.2" + ENV["AWS_CONTAINER_CREDENTIALS_RELATIVE_URI"].to_s
|
|
@@ -9,7 +9,7 @@ module HerdstWorker
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
attr_accessor :app, :enabled, :queue_url, :queue_wait_time, :poller
|
|
12
|
-
attr_accessor :start_time, :
|
|
12
|
+
attr_accessor :start_time, :stop_processing_at, :stop_at, :run_duration, :stop_suration
|
|
13
13
|
attr_accessor :processor_status, :job_count, :max_jobs
|
|
14
14
|
attr_accessor :attempt_threshold, :visibility_timeout, :ignored_notifications
|
|
15
15
|
|
|
@@ -29,8 +29,8 @@ module HerdstWorker
|
|
|
29
29
|
]
|
|
30
30
|
|
|
31
31
|
# Set the start time
|
|
32
|
-
self.
|
|
33
|
-
self.
|
|
32
|
+
self.run_duration = (3600 * 4) + (rand * 900).floor # Four hours + bit more (< 15 minutes)
|
|
33
|
+
self.stop_suration = 300 # 5 minutes
|
|
34
34
|
self.reset_time
|
|
35
35
|
|
|
36
36
|
# Start the processor as working
|
|
@@ -49,10 +49,8 @@ module HerdstWorker
|
|
|
49
49
|
self.poller.poll(:wait_time_seconds => self.queue_wait_time, :skip_delete => false) do |msg|
|
|
50
50
|
process_message(msg)
|
|
51
51
|
end
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
self.app.stop(0)
|
|
55
|
-
end
|
|
52
|
+
|
|
53
|
+
self.app.deregister_task
|
|
56
54
|
else
|
|
57
55
|
raise "Cannot start a queue which is not enabled"
|
|
58
56
|
end
|
|
@@ -77,7 +75,7 @@ module HerdstWorker
|
|
|
77
75
|
# Sets the processor status to finishing. The sqs before action will
|
|
78
76
|
# take care of setting the idle state once all jobs have finished.
|
|
79
77
|
def halt
|
|
80
|
-
return if self.processor_status
|
|
78
|
+
return if self.processor_status == "finishing"
|
|
81
79
|
set_status "finishing"
|
|
82
80
|
end
|
|
83
81
|
|
|
@@ -120,12 +118,15 @@ module HerdstWorker
|
|
|
120
118
|
# After hours of running terminate application.
|
|
121
119
|
# The app will automatically restart in production
|
|
122
120
|
current_time = Time.now.utc.to_i
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
self.app.
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
121
|
+
|
|
122
|
+
if (self.processor_status == "stopping") && (current_time >= self.stop_at)
|
|
123
|
+
self.app.deregister_task
|
|
124
|
+
|
|
125
|
+
elsif (self.processor_status == "working") && (current_time >= self.stop_processing_at)
|
|
126
|
+
self.app.force_stop(900)
|
|
127
|
+
self.app.register_new_task
|
|
128
|
+
|
|
129
|
+
set_status "stopping"
|
|
129
130
|
|
|
130
131
|
# On finishing wait for jobs to complete and then set status to idle
|
|
131
132
|
elsif self.processor_status == "finishing"
|
|
@@ -133,7 +134,7 @@ module HerdstWorker
|
|
|
133
134
|
self.app.logger.queue.warn "Setting processor status to idle"
|
|
134
135
|
set_status "idle"
|
|
135
136
|
end
|
|
136
|
-
|
|
137
|
+
|
|
137
138
|
end
|
|
138
139
|
|
|
139
140
|
# On stopping wait for jobs to complete and then set status
|
|
@@ -222,7 +223,7 @@ module HerdstWorker
|
|
|
222
223
|
self.job_count -= 1
|
|
223
224
|
}.execute
|
|
224
225
|
else
|
|
225
|
-
self.poller.change_message_visibility_timeout(msg,
|
|
226
|
+
self.poller.change_message_visibility_timeout(msg, 5)
|
|
226
227
|
throw :skip_delete
|
|
227
228
|
end
|
|
228
229
|
end
|
|
@@ -231,7 +232,8 @@ module HerdstWorker
|
|
|
231
232
|
private
|
|
232
233
|
def reset_time
|
|
233
234
|
self.start_time = Time.now.utc.to_i
|
|
234
|
-
self.
|
|
235
|
+
self.stop_processing_at = self.start_time + self.run_duration
|
|
236
|
+
self.stop_at = self.stop_processing_at + self.stop_suration
|
|
235
237
|
end
|
|
236
238
|
|
|
237
239
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: herdst_worker
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.20
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Herd.St
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-01-
|
|
11
|
+
date: 2026-01-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -240,6 +240,7 @@ email:
|
|
|
240
240
|
executables:
|
|
241
241
|
- herdst_worker
|
|
242
242
|
- herdst_worker_console
|
|
243
|
+
- herdst_worker_health
|
|
243
244
|
extensions: []
|
|
244
245
|
extra_rdoc_files: []
|
|
245
246
|
files:
|
|
@@ -247,6 +248,7 @@ files:
|
|
|
247
248
|
- ReadMe.md
|
|
248
249
|
- bin/herdst_worker
|
|
249
250
|
- bin/herdst_worker_console
|
|
251
|
+
- bin/herdst_worker_health
|
|
250
252
|
- lib/herdst_worker.rb
|
|
251
253
|
- lib/herdst_worker/adapters/database.rb
|
|
252
254
|
- lib/herdst_worker/adapters/facade.rb
|