fluentd-server 0.1.0 → 0.2.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/.env +5 -2
- data/.gitignore +2 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.md +12 -0
- data/Procfile +2 -0
- data/README.md +19 -7
- data/Rakefile +7 -9
- data/db/migrate/{20140512203133_create_posts.rb → 0001_create_posts.rb} +0 -0
- data/db/migrate/0002_create_delayed_jobs.rb +22 -0
- data/db/migrate/0003_create_tasks.rb +14 -0
- data/db/schema.rb +25 -1
- data/fluentd-server.gemspec +4 -0
- data/jobs/.gitkeep +0 -0
- data/lib/fluentd_server/cli.rb +55 -5
- data/lib/fluentd_server/config.rb +12 -0
- data/lib/fluentd_server/decorator.rb +23 -1
- data/lib/fluentd_server/{environments.rb → environment.rb} +17 -1
- data/lib/fluentd_server/model.rb +59 -1
- data/lib/fluentd_server/task_runner.rb +88 -0
- data/lib/fluentd_server/version.rb +1 -1
- data/lib/fluentd_server/web.rb +68 -21
- data/lib/fluentd_server/web_helper.rb +14 -10
- data/public/css/bootstrap.min.css +4 -4
- data/public/js/bootstrap.min.js +4 -5
- data/{bench → spec/bench}/bench.rb +0 -0
- data/{bench → spec/bench}/result.md +1 -1
- data/spec/model_spec.rb +33 -0
- data/spec/spec_helper.rb +8 -3
- data/spec/task_runner_spec.rb +27 -0
- data/spec/tmp/.gitkeep +0 -0
- data/spec/web_helper_spec.rb +15 -0
- data/spec/web_spec.rb +103 -1
- data/views/_js.slim +30 -0
- data/views/_navbar.slim +6 -4
- data/views/_style.slim +4 -0
- data/views/layout.slim +8 -11
- data/views/posts/create.slim +3 -2
- data/views/posts/edit.slim +4 -3
- data/views/posts/layout.slim +8 -0
- data/views/posts/menu.slim +7 -0
- data/views/tasks/ajax.erb +21 -0
- data/views/tasks/show.slim +24 -0
- metadata +124 -53
- data/spec/api_spec.rb +0 -42
- data/views/posts/index.slim +0 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27858b7cd48db1e7cad5f4b2d1f10724b863f103
|
4
|
+
data.tar.gz: 0d0ed73cd1cc881632cafdcefb546b9a9071f3b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bfb1a7297aa0c1f929966fa330060ba52c0ddc207418abf9cf6de97c2b6ac00ad2fb7ef449c833531706f4008755c1fbca69466460d19131defbc9e1f99e9140
|
7
|
+
data.tar.gz: dc2dc999877f2f215d3ab65ee29823697e6429690a150b89ad8da5e12b273ce72519dff4299130f0aad8d93e94fe556a3328e00867e18aa98a5c0ec7b4fdbd36
|
data/.env
CHANGED
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,15 @@
|
|
1
|
+
# 0.2.0
|
2
|
+
|
3
|
+
Enhancements:
|
4
|
+
|
5
|
+
* Support restarting td-agent via serf
|
6
|
+
* Created serf-td-agent gem
|
7
|
+
* Introduce Resque
|
8
|
+
* Ajax reload of command result
|
9
|
+
* Save/load the content of configuration into/from a file (experimental)
|
10
|
+
* Created acts_as_file gem
|
11
|
+
|
1
12
|
# 0.1.0
|
2
13
|
|
3
14
|
First version
|
15
|
+
|
data/Procfile
CHANGED
data/README.md
CHANGED
@@ -47,7 +47,7 @@ The `include` directive of fluentd config supports `http`, so write just one lin
|
|
47
47
|
include http://fqdn.to.fluentd-server/api/:name?port=24224
|
48
48
|
```
|
49
49
|
|
50
|
-
|
50
|
+
so that it will download the real configuration from the Fluentd Server where :name is the name of your post.
|
51
51
|
|
52
52
|
## Installation
|
53
53
|
|
@@ -95,20 +95,32 @@ The default configuration is as follows:
|
|
95
95
|
PORT=5126
|
96
96
|
HOST=0.0.0.0
|
97
97
|
# DATABASE_URL=sqlite3:data/fluentd_server.db
|
98
|
-
#
|
99
|
-
#
|
98
|
+
# JOB_DIR=jobs
|
99
|
+
# LOG_PATH=STDOUT
|
100
|
+
# LOG_LEVEL=debug
|
101
|
+
# LOG_SHIFT_AGE=0
|
102
|
+
# LOG_SHIFT_SIZE=1048576
|
100
103
|
```
|
101
104
|
|
105
|
+
### DATA_DIR (experimental)
|
106
|
+
|
107
|
+
Configure `DATA_DIR` in `.env` file as:
|
108
|
+
|
109
|
+
```
|
110
|
+
DATA_DIR=data
|
111
|
+
```
|
112
|
+
|
113
|
+
to store and load Fluentd config contents not from DB, but from local files located at the directory `DATA_DIR`.
|
114
|
+
This would be useful when you want to manage your config files with git.
|
115
|
+
|
102
116
|
## HTTP API
|
103
117
|
|
104
118
|
See [API.md](API.md).
|
105
119
|
|
106
120
|
## ToDo
|
107
121
|
|
108
|
-
*
|
109
|
-
|
110
|
-
* Saving and loading conf from localfiles rather than DB would be nice because it makes possible to manage conf with git
|
111
|
-
* Fluentd Server should cache them on memory, and refresh caches by detecting files are updated
|
122
|
+
* Create a sync worker to synchronize local file existences with db (delete and create entries on db).
|
123
|
+
* Automatic deployment (restart) support like the one of chef-server
|
112
124
|
|
113
125
|
## ChangeLog
|
114
126
|
|
data/Rakefile
CHANGED
@@ -1,17 +1,16 @@
|
|
1
1
|
require "bundler/gem_tasks"
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'dotenv/tasks'
|
5
|
+
require 'fluentd_server/environment'
|
2
6
|
|
3
7
|
require 'rspec/core/rake_task'
|
4
8
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
5
9
|
t.rspec_opts = ["-c", "-f progress"] # '--format specdoc'
|
6
10
|
t.pattern = 'spec/**/*_spec.rb'
|
7
11
|
end
|
8
|
-
|
9
|
-
|
10
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
11
|
-
require 'dotenv/tasks'
|
12
|
-
require 'fluentd_server/config'
|
13
|
-
|
14
|
-
require 'sinatra/activerecord/rake'
|
12
|
+
task :test => :spec
|
13
|
+
task :default => :spec
|
15
14
|
|
16
15
|
task :console => :dotenv do
|
17
16
|
require "fluentd_server"
|
@@ -22,5 +21,4 @@ task :console => :dotenv do
|
|
22
21
|
end
|
23
22
|
task :c => :console
|
24
23
|
|
25
|
-
|
26
|
-
task :default => :spec
|
24
|
+
require 'sinatra/activerecord/rake'
|
File without changes
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class CreateDelayedJobs < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :delayed_jobs do |table|
|
4
|
+
table.integer :priority, :default => 0, :null => false # Allows some jobs to jump to the front of the queue
|
5
|
+
table.integer :attempts, :default => 0, :null => false # Provides for retries, but still fail eventually.
|
6
|
+
table.text :handler, :null => false # YAML-encoded string of the object that will do work
|
7
|
+
table.text :last_error # reason for last failure (See Note below)
|
8
|
+
table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future.
|
9
|
+
table.datetime :locked_at # Set when a client is working on this object
|
10
|
+
table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
|
11
|
+
table.string :locked_by # Who is working on this object (if locked)
|
12
|
+
table.string :queue # The name of the queue this job is in
|
13
|
+
table.timestamps
|
14
|
+
end
|
15
|
+
|
16
|
+
add_index :delayed_jobs, [:priority, :run_at], :name => 'delayed_jobs_priority'
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.down
|
20
|
+
drop_table :delayed_jobs
|
21
|
+
end
|
22
|
+
end
|
data/db/schema.rb
CHANGED
@@ -11,7 +11,23 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
14
|
+
ActiveRecord::Schema.define(version: 3) do
|
15
|
+
|
16
|
+
create_table "delayed_jobs", force: true do |t|
|
17
|
+
t.integer "priority", default: 0, null: false
|
18
|
+
t.integer "attempts", default: 0, null: false
|
19
|
+
t.text "handler", null: false
|
20
|
+
t.text "last_error"
|
21
|
+
t.datetime "run_at"
|
22
|
+
t.datetime "locked_at"
|
23
|
+
t.datetime "failed_at"
|
24
|
+
t.string "locked_by"
|
25
|
+
t.string "queue"
|
26
|
+
t.datetime "created_at"
|
27
|
+
t.datetime "updated_at"
|
28
|
+
end
|
29
|
+
|
30
|
+
add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority"
|
15
31
|
|
16
32
|
create_table "posts", force: true do |t|
|
17
33
|
t.string "name"
|
@@ -22,4 +38,12 @@ ActiveRecord::Schema.define(version: 20140512203133) do
|
|
22
38
|
|
23
39
|
add_index "posts", ["name"], name: "index_posts_on_name", unique: true
|
24
40
|
|
41
|
+
create_table "tasks", force: true do |t|
|
42
|
+
t.string "name"
|
43
|
+
t.text "body"
|
44
|
+
t.integer "exit_code"
|
45
|
+
t.datetime "created_at"
|
46
|
+
t.datetime "updated_at"
|
47
|
+
end
|
48
|
+
|
25
49
|
end
|
data/fluentd-server.gemspec
CHANGED
@@ -39,5 +39,9 @@ Gem::Specification.new do |spec|
|
|
39
39
|
spec.add_runtime_dependency 'slim'
|
40
40
|
spec.add_runtime_dependency "unicorn"
|
41
41
|
spec.add_runtime_dependency "unicorn-worker-killer"
|
42
|
+
spec.add_runtime_dependency "delayed_job_active_record"
|
43
|
+
spec.add_runtime_dependency "daemons"
|
44
|
+
spec.add_runtime_dependency "serf-td-agent"
|
45
|
+
spec.add_runtime_dependency "acts_as_file"
|
42
46
|
# spec.add_runtime_dependency 'sqlite3'
|
43
47
|
end
|
data/jobs/.gitkeep
ADDED
File without changes
|
data/lib/fluentd_server/cli.rb
CHANGED
@@ -7,54 +7,104 @@ class FluentdServer::CLI < Thor
|
|
7
7
|
BASE_DIR = File.join(Dir.pwd, "fluentd-server")
|
8
8
|
DATA_DIR = File.join(BASE_DIR, "data")
|
9
9
|
LOG_DIR = File.join(BASE_DIR, "log")
|
10
|
+
JOB_DIR = File.join(BASE_DIR, "jobs")
|
10
11
|
LOG_FILE = File.join(LOG_DIR, "application.log")
|
11
12
|
ENV_FILE = File.join(BASE_DIR, ".env")
|
12
13
|
PROCFILE = File.join(BASE_DIR, "Procfile")
|
13
14
|
CONFIGRU_FILE = File.join(BASE_DIR, "config.ru")
|
14
|
-
DB_DIR = File.join(BASE_DIR, "db")
|
15
15
|
CONFIG_DIR= File.join(BASE_DIR, "config")
|
16
16
|
|
17
17
|
DEFAULT_DOTENV =<<-EOS
|
18
18
|
PORT=5126
|
19
19
|
HOST=0.0.0.0
|
20
20
|
DATABASE_URL=sqlite3:#{DATA_DIR}/fluentd_server.db
|
21
|
+
JOB_DIR=#{JOB_DIR}
|
21
22
|
LOG_PATH=#{LOG_FILE}
|
22
23
|
LOG_LEVEL=warn
|
24
|
+
LOG_SHIFT_AGE=0
|
25
|
+
LOG_SHIFT_SIZE=1048576
|
23
26
|
EOS
|
24
27
|
|
25
28
|
DEFAULT_PROCFILE =<<-EOS
|
26
29
|
web: unicorn -E production -p $PORT -o $HOST -c config/unicorn.conf
|
30
|
+
job: fluentd-server job
|
31
|
+
serf: $(gem path serf-td-agent)/bin/serf agent
|
27
32
|
EOS
|
28
33
|
|
29
34
|
default_command :start
|
30
35
|
|
36
|
+
def initialize(args = [], opts = [], config = {})
|
37
|
+
super(args, opts, config)
|
38
|
+
end
|
39
|
+
|
31
40
|
desc "new", "Creates fluentd-server resource directory"
|
32
41
|
def new
|
33
42
|
FileUtils.mkdir_p(LOG_DIR)
|
43
|
+
FileUtils.mkdir_p(JOB_DIR)
|
34
44
|
File.write ENV_FILE, DEFAULT_DOTENV
|
35
45
|
File.write PROCFILE, DEFAULT_PROCFILE
|
36
46
|
FileUtils.cp(File.expand_path("../../../config.ru", __FILE__), CONFIGRU_FILE)
|
37
|
-
FileUtils.cp_r(File.expand_path("../../../db", __FILE__), DB_DIR)
|
38
47
|
FileUtils.cp_r(File.expand_path("../../../config", __FILE__), CONFIG_DIR)
|
39
48
|
puts 'fluentd-server new finished.'
|
40
49
|
end
|
41
50
|
|
42
51
|
desc "init", "Creates database schema"
|
43
52
|
def init
|
44
|
-
|
53
|
+
Dotenv.load
|
54
|
+
require 'fluentd_server/environment'
|
45
55
|
require 'rake'
|
46
56
|
require 'sinatra/activerecord/rake'
|
47
|
-
|
57
|
+
ActiveRecord::Tasks::DatabaseTasks.db_dir = File.expand_path("../../../db", __FILE__)
|
58
|
+
ActiveRecord::Tasks::DatabaseTasks.migrations_paths = [File.expand_path("../../../db/migrate", __FILE__)]
|
59
|
+
# ToDo: Fix that db:migrate raises an error in the case of sqlite3 like
|
60
|
+
# SQLite3::SQLException: database schema has changed: INSERT INTO "schema_migrations" ("version") VALUES (?)
|
61
|
+
# Rake::Task['db:migrate'].invoke
|
62
|
+
# Use db:schema:load after generating db/schema.rb by executing db:migrate several times for now
|
63
|
+
Rake::Task['db:schema:load'].invoke
|
48
64
|
puts 'fluentd-server init finished.'
|
49
65
|
end
|
50
66
|
|
67
|
+
desc "migrate", "Migrate database schema"
|
68
|
+
def migrate
|
69
|
+
Dotenv.load
|
70
|
+
require 'fluentd_server/environment'
|
71
|
+
require 'rake'
|
72
|
+
require 'sinatra/activerecord/rake'
|
73
|
+
ActiveRecord::Tasks::DatabaseTasks.db_dir = File.expand_path("../../../db", __FILE__)
|
74
|
+
ActiveRecord::Tasks::DatabaseTasks.migrations_paths = [File.expand_path("../../../db/migrate", __FILE__)]
|
75
|
+
Rake::Task['db:migrate'].invoke
|
76
|
+
end
|
77
|
+
|
51
78
|
desc "start", "Sartup fluentd_server"
|
52
79
|
def start
|
53
|
-
|
80
|
+
self.migrate # do migration before start not to forget on updation
|
54
81
|
require "foreman/cli"
|
55
82
|
Foreman::CLI.new.invoke(:start, [], {})
|
56
83
|
end
|
57
84
|
|
85
|
+
# reference: https://gist.github.com/robhurring/732327
|
86
|
+
desc "job", "Sartup fluentd_server job worker"
|
87
|
+
def job
|
88
|
+
Dotenv.load
|
89
|
+
require 'delayed_job'
|
90
|
+
require 'fluentd_server/model'
|
91
|
+
worker_options = {
|
92
|
+
:min_priority => ENV['MIN_PRIORITY'],
|
93
|
+
:max_priority => ENV['MAX_PRIORITY'],
|
94
|
+
:queues => (ENV['QUEUES'] || ENV['QUEUE'] || '').split(','),
|
95
|
+
:quiet => false
|
96
|
+
}
|
97
|
+
Delayed::Worker.new(worker_options).start
|
98
|
+
end
|
99
|
+
|
100
|
+
desc "job_clear", "Clear fluentd_server delayed_job queue"
|
101
|
+
def job_clear
|
102
|
+
Dotenv.load
|
103
|
+
require 'delayed_job'
|
104
|
+
require 'fluentd_server/model'
|
105
|
+
Delayed::Job.delete_all
|
106
|
+
end
|
107
|
+
|
58
108
|
no_tasks do
|
59
109
|
def abort(msg)
|
60
110
|
$stderr.puts msg
|
@@ -5,10 +5,18 @@ require 'dotenv'
|
|
5
5
|
Dotenv.load
|
6
6
|
|
7
7
|
module FluentdServer::Config
|
8
|
+
def self.data_dir
|
9
|
+
ENV['DATA_DIR'] == "" ? nil : ENV['DATA_DIR']
|
10
|
+
end
|
11
|
+
|
8
12
|
def self.database_url
|
9
13
|
ENV.fetch('DATABASE_URL', 'sqlite3:data/fluentd_server.db')
|
10
14
|
end
|
11
15
|
|
16
|
+
def self.job_dir
|
17
|
+
ENV.fetch('JOB_DIR', 'jobs')
|
18
|
+
end
|
19
|
+
|
12
20
|
def self.log_path
|
13
21
|
ENV.fetch('LOG_PATH', 'STDOUT')
|
14
22
|
end
|
@@ -24,4 +32,8 @@ module FluentdServer::Config
|
|
24
32
|
def self.log_shift_size
|
25
33
|
ENV.fetch('LOG_SHIFT_SIZE', '1048576')
|
26
34
|
end
|
35
|
+
|
36
|
+
def self.task_max_num
|
37
|
+
ENV.fetch('TASK_MAX_NUM', '20').to_i
|
38
|
+
end
|
27
39
|
end
|
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'sinatra/decorator'
|
2
|
+
require 'fluentd_server/web_helper'
|
2
3
|
|
3
4
|
class PostDecorator < Sinatra::Decorator::Base
|
4
|
-
include
|
5
|
+
include FluentdServer::WebHelper
|
5
6
|
|
6
7
|
def success_message
|
7
8
|
'Success!'
|
@@ -17,5 +18,26 @@ class PostDecorator < Sinatra::Decorator::Base
|
|
17
18
|
namespace = OpenStruct.new(locals)
|
18
19
|
ERB.new(self.body, nil, "-").result(namespace.instance_eval { binding })
|
19
20
|
end
|
21
|
+
|
22
|
+
def link_to
|
23
|
+
%Q[<a href="#{h("/posts/#{self.id}/edit")}">
|
24
|
+
<span class="label label-success"> </span> ##{h(self.id)} #{h(self.name)}
|
25
|
+
</a>]
|
26
|
+
end
|
27
|
+
|
28
|
+
def create_button
|
29
|
+
%Q[<div style="padding: 0 0 10px 10px;font-variant:small-caps;">
|
30
|
+
<a class="btn btn-default #{active_if(self.new?)}" role="button"
|
31
|
+
href="/posts/create">Create Config</a></div>]
|
32
|
+
end
|
20
33
|
end
|
21
34
|
|
35
|
+
class TaskDecorator < Sinatra::Decorator::Base
|
36
|
+
include FluentdServer::WebHelper
|
37
|
+
|
38
|
+
def link_to
|
39
|
+
%Q[<a href="#{h("/tasks/#{self.id}")}">
|
40
|
+
<span class="label label-success"> </span> ##{h(self.id)} #{h(self.name)}
|
41
|
+
</a>]
|
42
|
+
end
|
43
|
+
end
|
@@ -3,6 +3,8 @@ require 'sinatra/activerecord'
|
|
3
3
|
require 'fluentd_server/config'
|
4
4
|
require 'fluentd_server/logger'
|
5
5
|
|
6
|
+
ROOT = File.expand_path('../../..', __FILE__)
|
7
|
+
|
6
8
|
configure do
|
7
9
|
set :show_exceptions, true
|
8
10
|
ActiveRecord::Base.logger = FluentdServer.logger
|
@@ -29,6 +31,20 @@ end
|
|
29
31
|
configure :test do
|
30
32
|
ActiveRecord::Base.establish_connection(
|
31
33
|
:adapter => 'sqlite3',
|
32
|
-
:database => ':memory'
|
34
|
+
:database => ':memory:'
|
33
35
|
)
|
34
36
|
end
|
37
|
+
|
38
|
+
# Configure DelayedJob
|
39
|
+
require 'delayed_job'
|
40
|
+
configure do
|
41
|
+
Delayed::Worker.backend = :active_record # This defines Delayed::Job model
|
42
|
+
Delayed::Worker.logger = FluentdServer.logger
|
43
|
+
end
|
44
|
+
|
45
|
+
configure :development, :test do
|
46
|
+
Delayed::Worker.destroy_failed_jobs = true
|
47
|
+
Delayed::Worker.sleep_delay = 5
|
48
|
+
Delayed::Worker.max_attempts = 5
|
49
|
+
Delayed::Worker.max_run_time = 5.minutes
|
50
|
+
end
|
data/lib/fluentd_server/model.rb
CHANGED
@@ -1,10 +1,68 @@
|
|
1
1
|
require 'sinatra/activerecord'
|
2
2
|
require 'sinatra/decorator'
|
3
|
-
require 'fluentd_server/
|
3
|
+
require 'fluentd_server/environment'
|
4
|
+
require 'fluentd_server/task_runner'
|
5
|
+
require 'acts_as_file'
|
6
|
+
|
7
|
+
class Delayed::Job < ActiveRecord::Base; end
|
4
8
|
|
5
9
|
class Post < ActiveRecord::Base
|
6
10
|
include Sinatra::Decorator::Decoratable
|
11
|
+
include FluentdServer::Logger
|
7
12
|
|
8
13
|
validates :name, presence: true
|
9
14
|
validates :body, presence: true
|
15
|
+
|
16
|
+
if FluentdServer::Config.data_dir
|
17
|
+
include ActsAsFile
|
18
|
+
|
19
|
+
def filename
|
20
|
+
File.join(FluentdServer::Config.data_dir, "#{self.name}.erb") if self.name
|
21
|
+
end
|
22
|
+
|
23
|
+
acts_as_file :body => self.instance_method(:filename)
|
24
|
+
end
|
25
|
+
|
26
|
+
def new?
|
27
|
+
self.id.nil?
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
class Task < ActiveRecord::Base
|
32
|
+
include Sinatra::Decorator::Decoratable
|
33
|
+
include FluentdServer::Logger
|
34
|
+
include ActsAsFile
|
35
|
+
include TaskRunner # task runnable codes are here
|
36
|
+
|
37
|
+
def filename
|
38
|
+
prefix = "#{self.id.to_s.rjust(4, '0')}" if self.id
|
39
|
+
File.join(FluentdServer::Config.job_dir, "#{prefix}_result.txt") if prefix
|
40
|
+
end
|
41
|
+
|
42
|
+
acts_as_file :body => self.instance_method(:filename)
|
43
|
+
|
44
|
+
def finished?
|
45
|
+
!self.exit_code.nil?
|
46
|
+
end
|
47
|
+
|
48
|
+
def successful?
|
49
|
+
self.finished? and self.exit_code == 0
|
50
|
+
end
|
51
|
+
|
52
|
+
def error?
|
53
|
+
self.finished? and self.exit_code != 0
|
54
|
+
end
|
55
|
+
|
56
|
+
def new?
|
57
|
+
self.id.nil?
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.create_and_delete(*args)
|
61
|
+
created = self.create(*args)
|
62
|
+
if self.count > FluentdServer::Config.task_max_num
|
63
|
+
oldest = self.first
|
64
|
+
oldest.destroy_with_file
|
65
|
+
end
|
66
|
+
created
|
67
|
+
end
|
10
68
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# included by class Task
|
2
|
+
module TaskRunner
|
3
|
+
def self.included(klass)
|
4
|
+
require 'fileutils'
|
5
|
+
klass.extend(ClassMethods)
|
6
|
+
end
|
7
|
+
|
8
|
+
def restart
|
9
|
+
system(write_event_header('restart'))
|
10
|
+
cmd = serf_event('restart')
|
11
|
+
logger.debug "run #{cmd}"
|
12
|
+
self.exit_code = system(cmd)
|
13
|
+
self.save!
|
14
|
+
end
|
15
|
+
|
16
|
+
def status
|
17
|
+
system(write_query_header('status'))
|
18
|
+
self.delay.delayed_status
|
19
|
+
end
|
20
|
+
|
21
|
+
def delayed_status
|
22
|
+
cmd = serf_query('status')
|
23
|
+
logger.debug "run #{cmd}"
|
24
|
+
self.exit_code = system(cmd)
|
25
|
+
self.save!
|
26
|
+
end
|
27
|
+
|
28
|
+
def configtest
|
29
|
+
system(write_query_header('configtest'))
|
30
|
+
self.delay.delayed_configtest
|
31
|
+
end
|
32
|
+
|
33
|
+
def delayed_configtest
|
34
|
+
cmd = serf_query('configtest')
|
35
|
+
logger.debug "run #{cmd}"
|
36
|
+
self.exit_code = system(cmd)
|
37
|
+
self.save!
|
38
|
+
end
|
39
|
+
|
40
|
+
## delayed_job hooks
|
41
|
+
|
42
|
+
def before(job)
|
43
|
+
@job = job
|
44
|
+
end
|
45
|
+
|
46
|
+
def failure
|
47
|
+
logger.warn "job #{@job.attributes} failed"
|
48
|
+
end
|
49
|
+
|
50
|
+
## helpers
|
51
|
+
|
52
|
+
def write_event_header(cmd)
|
53
|
+
"echo '$ serf event td-agent-#{cmd}' > #{self.filename}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def write_query_header(cmd)
|
57
|
+
"echo '$ serf query td-agent-#{cmd}' > #{self.filename}"
|
58
|
+
end
|
59
|
+
|
60
|
+
# serf event works asynchronously, so it does not take time
|
61
|
+
def serf_event(cmd)
|
62
|
+
"#{self.class.serf_path} event td-agent-#{cmd} >> #{self.filename} 2>&1"
|
63
|
+
end
|
64
|
+
|
65
|
+
# serf query works synchronously, so it takes time
|
66
|
+
def serf_query(cmd)
|
67
|
+
"#{self.class.serf_path} query td-agent-#{cmd} >> #{self.filename} 2>&1"
|
68
|
+
end
|
69
|
+
|
70
|
+
module ClassMethods
|
71
|
+
def serf_path
|
72
|
+
@serf_path ||= "#{find_path_gem('serf-td-agent')}/bin/serf"
|
73
|
+
end
|
74
|
+
|
75
|
+
# from gem-path gem
|
76
|
+
def find_path_gem name
|
77
|
+
path_gem = Gem.path.find do |base|
|
78
|
+
path_gem = $LOAD_PATH.find do |path|
|
79
|
+
path_gem = path[%r{#{base}/gems/#{name}\-[^/-]+/}]
|
80
|
+
break path_gem if path_gem
|
81
|
+
end
|
82
|
+
break path_gem if path_gem
|
83
|
+
end
|
84
|
+
path_gem[0...-1] if path_gem
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|