fluentd-server 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|