ocular 0.1.8 → 0.1.9

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f9744f295fb350d3864ab65a80a3506281f776f3
4
- data.tar.gz: 453713667fc0c6c7eec8b359dbab2b49d4523b25
3
+ metadata.gz: 3121ebd021fce075c9b4232f8980fa3bec3bde96
4
+ data.tar.gz: ecaf0bb7bbf9ae725f1f29ea179c786a3a3d40b8
5
5
  SHA512:
6
- metadata.gz: c4efd125317945bc07ae03513116e087884895988bfa2d2d92f61326aa9da7d2d9f1d0418b18f005c6c25f5e779c0bd6ebda18c0281b86c5e9ea8a17518bfcbe
7
- data.tar.gz: 456e9158a506e24382c8a1fa03c6d17ab87ea2fa2b0a8afe11689c7170ab9b267724dff8a1b823506d89d08f3d6c9b6a0c10b07b4e601aa3dd8a0d453ea91210
6
+ metadata.gz: afdd0c1d5d190f029099fe21572c2bbd9d755c908b64f8d704955c2b2544ffcfb41fc885f4bfa7aade66350398907a172d134ee1ccbce78695d1bebd1f472ad3
7
+ data.tar.gz: 5b826d61d4609aa6e26b6d56eed01db1c64c38898ce72ce3ff87ca9f5b625f51cf1f1a998ea70fe2904d64eeb1061134d0ee6ac048d13d1b08e16a4c46af850c
data/bin/ocular CHANGED
@@ -23,6 +23,7 @@ class OptparseExample
23
23
  options.server = false
24
24
  options.settings = nil
25
25
  options.root = nil
26
+ options.check = nil
26
27
 
27
28
  opt_parser = OptionParser.new do |opts|
28
29
  opts.banner = "Usage in shell mode: \"ocular [options] <script file>\" or server mode: \"ocular --server [options]\""
@@ -59,6 +60,10 @@ class OptparseExample
59
60
  options.settings = path
60
61
  end
61
62
 
63
+ opts.on("--check", "Do only syntax check") do
64
+ options.check = true
65
+ end
66
+
62
67
  end
63
68
 
64
69
  opt_parser.parse!(args)
@@ -95,7 +100,24 @@ inputs:
95
100
  exit -1
96
101
  end
97
102
 
98
- if options.server
103
+ logger = Ocular::Logging::MultiLogger.new
104
+
105
+ if Ocular::Settings.get(:loggers)
106
+ Ocular::Settings.get(:loggers).each do |name, settings|
107
+ name = name.to_s
108
+ if name == "console"
109
+ logger.add_logger(Ocular::Logging::ConsoleLogger.new(settings))
110
+ elsif name == "kafka"
111
+ logger.add_logger(Ocular::Logging::KafkaLogger.new(settings))
112
+ else
113
+ puts "Unknown logging engine #{name}"
114
+ end
115
+ end
116
+ else
117
+ logger.add_logger(Ocular::Logging::ConsoleLogger.new)
118
+ end
119
+
120
+ if options.server or options.syntax
99
121
  if !options.root && !Ocular::Settings.get(:script_root)
100
122
  puts "Please specify --root or set script_root in the settings.yaml"
101
123
  exit
@@ -103,6 +125,11 @@ if options.server
103
125
 
104
126
  daemon = Ocular::Daemon.new(options.root || Ocular::Settings.get(:script_root))
105
127
  daemon.load_script_files()
128
+
129
+ if options.syntax
130
+ exit 0
131
+ end
132
+
106
133
  daemon.start_input_handlers()
107
134
 
108
135
  puts "server started"
@@ -151,7 +178,7 @@ else
151
178
 
152
179
  ef = Ocular::Event::EventFactory.new
153
180
 
154
- context = Ocular::DSL::REPLRunContext.new(ef.handlers)
181
+ context = Ocular::DSL::REPLRunContext.new(ef.handlers, logger)
155
182
 
156
183
  irb = IRB::Irb.new(IRB::WorkSpace.new(context))
157
184
  IRB.conf[:MAIN_CONTEXT] = irb.context
@@ -174,7 +201,7 @@ else
174
201
  ef = Ocular::Event::EventFactory.new
175
202
  proxy = ef.load_from_file(ARGV.shift)
176
203
 
177
- context = Ocular::DSL::RunContext.new
204
+ context = Ocular::DSL::RunContext.new(logger)
178
205
  eventbase = proxy.events["onEvent"]["cli"]
179
206
  eventbase.exec(context)
180
207
 
@@ -44,6 +44,18 @@ class Ocular
44
44
  return instances
45
45
  end
46
46
 
47
+ add_help "find_server_by_ip", "Returns Fog::Compute::AWS::Server or nil"
48
+ def find_server_by_ip(ip)
49
+ ret = aws().servers.all("private-ip-address" => ip)
50
+ if ret.length > 1
51
+ raise "Too many matching servers by just one ip #{ip}"
52
+ end
53
+ if ret.length == 0
54
+ return nil
55
+ end
56
+ return ret.first
57
+ end
58
+
47
59
  end
48
60
 
49
61
  end
@@ -5,112 +5,39 @@ class Ocular
5
5
  module Logging
6
6
 
7
7
  def debug(message = nil, &block)
8
- @logger.add(Logger::Severity::DEBUG, message, @run_id, &block)
8
+ @logger.add(::Ocular::Logging::Severity::DEBUG, message, @run_id, &block)
9
9
  end
10
10
  alias log debug
11
11
 
12
12
  def info(message = nil, &block)
13
- @logger.add(Logger::Severity::INFO, message, @run_id, &block)
13
+ @logger.add(::Ocular::Logging::Severity::INFO, message, @run_id, &block)
14
14
  end
15
15
 
16
16
  def warn(message = nil, &block)
17
- @logger.add(Logger::Severity::WARN, message, @run_id, &block)
17
+ @logger.add(::Ocular::Logging::Severity::WARN, message, @run_id, &block)
18
18
  end
19
19
 
20
20
  def error(message = nil, &block)
21
- @logger.add(Logger::Severity::ERROR, message, @run_id, &block)
21
+ @logger.add(::Ocular::Logging::Severity::ERROR, message, @run_id, &block)
22
22
  end
23
23
 
24
24
  def fatal(message = nil, &block)
25
- @logger.add(Logger::Severity::FATAL, message, @run_id, &block)
25
+ @logger.add(::Ocular::Logging::Severity::FATAL, message, @run_id, &block)
26
26
  end
27
27
 
28
-
29
- end
30
-
31
- # Most of the Logger class is copied from the Ruby Logger class source code.
32
- class Logger
33
-
34
- # Logging severity.
35
- module Severity
36
- # Low-level information, mostly for developers.
37
- DEBUG = 0
38
- # Generic (useful) information about system operation.
39
- INFO = 1
40
- # A warning.
41
- WARN = 2
42
- # A handleable error condition.
43
- ERROR = 3
44
- # An unhandleable error that results in a program crash.
45
- FATAL = 4
46
- # An unknown message that should always be logged.
47
- UNKNOWN = 5
28
+ def log_event(property, value)
29
+ @logger.log_event(property, value, @run_id)
48
30
  end
49
31
 
50
- def initialize()
51
- @level = Severity::DEBUG
52
- @formatter = Logger::Formatter.new
53
- end
54
-
55
- def add(severity, message = nil, run_id = nil, &block)
56
- severity ||= Severity::UNKNOWN
57
- if severity < @level
58
- return true
59
- end
60
-
61
- if message.nil?
62
- if block_given?
63
- message = yield
64
- else
65
- message = progname
66
- end
67
- end
68
-
69
- puts format_message(format_severity(severity), Time.now, run_id, message)
70
- true
32
+ def log_cause(type, environment)
33
+ @logger.log_cause(type, environment, @run_id)
71
34
  end
72
35
 
73
- SEV_LABEL = %w(DEBUG INFO WARN ERROR FATAL ANY).each(&:freeze).freeze
74
-
75
- def format_severity(severity)
76
- SEV_LABEL[severity] || 'ANY'
77
- end
78
-
79
- def format_message(severity, datetime, progname, msg)
80
- @formatter.call(severity, datetime, progname, msg)
81
- end
82
-
83
- # Default formatter for log messages.
84
- class Formatter
85
- Format = "%s, [%s#%d] %5s -- %s: %s\n".freeze
86
-
87
- attr_accessor :datetime_format
88
-
89
- def initialize
90
- @datetime_format = nil
91
- end
92
-
93
- def call(severity, time, progname, msg)
94
- Format % [severity[0..0], format_datetime(time), $$, severity, progname, msg2str(msg)]
95
- end
96
-
97
- private
98
-
99
- def format_datetime(time)
100
- time.strftime(@datetime_format || "%Y-%m-%dT%H:%M:%S.%6N ".freeze)
101
- end
102
-
103
- def msg2str(msg)
104
- case msg
105
- when ::String
106
- msg
107
- when ::Exception
108
- "#{ msg.message } (#{ msg.class })\n" <<
109
- (msg.backtrace || []).join("\n")
110
- else
111
- msg.inspect
112
- end
36
+ def log_timing(name, value)
37
+ if value.is_a? Time
38
+ value = (Time.now - value) * 1000 # report in milliseconds
113
39
  end
40
+ @logger.log_timing(name, value, @run_id)
114
41
  end
115
42
  end
116
43
  end
@@ -18,9 +18,9 @@ class Ocular
18
18
 
19
19
  include Ocular::Inputs::Cron::DSL
20
20
 
21
- def initialize
21
+ def initialize(logger)
22
22
  @run_id = SecureRandom.uuid()
23
- @logger = Ocular::DSL::Logger.new
23
+ @logger = logger
24
24
  @cleanups = []
25
25
  end
26
26
 
@@ -47,9 +47,10 @@ class Ocular
47
47
  attr_reader :handlers
48
48
  attr_reader :events
49
49
  attr_reader :do_fork
50
+ attr_reader :logger
50
51
 
51
- def initialize(handlers)
52
- super()
52
+ def initialize(handlers, logger)
53
+ super(logger)
53
54
  @events = {}
54
55
  @handlers = handlers
55
56
  @do_fork = false
@@ -1,5 +1,6 @@
1
1
  require 'ocular/mixin/from_file'
2
2
  require 'ocular/dsl/logging'
3
+ require 'time'
3
4
 
4
5
  class Ocular
5
6
  module DSL
@@ -13,16 +14,22 @@ class Ocular
13
14
 
14
15
  attr_accessor :proxy
15
16
 
16
- def initialize(&block)
17
+ def initialize(proxy, &block)
17
18
  @callback = block
19
+ @proxy = proxy
18
20
  end
19
21
 
20
22
  def exec(context, do_fork = self.proxy.do_fork)
21
- context.proxy = self.proxy
22
- if do_fork
23
- return exec_fork(context)
24
- else
25
- return exec_nofork(context)
23
+ start = Time.now
24
+ begin
25
+ context.proxy = self.proxy
26
+ if do_fork
27
+ return exec_fork(context)
28
+ else
29
+ return exec_nofork(context)
30
+ end
31
+ ensure
32
+ context.log_timing("execution_time", start)
26
33
  end
27
34
  end
28
35
 
@@ -2,18 +2,19 @@ require 'ocular/inputs/handlers.rb'
2
2
  require 'ocular/event/eventbase.rb'
3
3
  require 'ocular/inputs/http_input.rb'
4
4
  require 'ocular/inputs/cron_input.rb'
5
+ require 'ocular/inputs/trigger_input.rb'
5
6
 
6
7
  class Ocular
7
8
  module Event
8
9
  class DefinitionProxy
9
10
  attr_accessor :events
10
- attr_reader :script_name, :do_fork
11
+ attr_reader :script_name, :do_fork, :logger
11
12
  attr_accessor :handlers, :events
12
13
 
13
14
  def initialize(script_name, handlers)
14
15
  @script_name = script_name
15
16
  @events = {}
16
- @logger = Ocular::DSL::Logger.new
17
+ @logger = Ocular::Logging::ConsoleLogger.new
17
18
  @handlers = handlers
18
19
  @do_fork = true
19
20
  end
@@ -26,14 +27,14 @@ class Ocular
26
27
 
27
28
  include Ocular::Inputs::HTTP::DSL
28
29
  include Ocular::Inputs::Cron::DSL
30
+ include Ocular::Inputs::Trigger::DSL
29
31
 
30
32
  def fork(value)
31
33
  @do_fork = value
32
34
  end
33
35
 
34
36
  def onEvent(type, &block)
35
- eventbase = Ocular::DSL::EventBase.new(&block)
36
- eventbase.proxy = self
37
+ eventbase = Ocular::DSL::EventBase.new(self, &block)
37
38
  (@events["onEvent"] ||= {})[type] = eventbase
38
39
  end
39
40
  end
@@ -17,7 +17,7 @@ class Ocular
17
17
  add_event_help "cron.cron(rule)", "Schedule event with cron syntax. eg: '5 0 * * *'"
18
18
  def cron()
19
19
  handler = handlers.get(::Ocular::Inputs::Cron::Input)
20
- return Input::DSLProxy.new(self, handler)
20
+ return Input::DSLProxy.new(self, handler, logger)
21
21
  end
22
22
 
23
23
  end
@@ -43,17 +43,18 @@ class Ocular
43
43
  end
44
44
 
45
45
  class DSLProxy
46
- def initialize(proxy, handler)
46
+ def initialize(proxy, handler, logger)
47
47
  @proxy = proxy
48
48
  @handler = handler
49
+ @logger = logger
49
50
  end
50
51
 
51
52
  def in(rule, &block)
52
- eventbase = Ocular::DSL::EventBase.new(&block)
53
- eventbase.proxy = @proxy
53
+ eventbase = Ocular::DSL::EventBase.new(@proxy, &block)
54
54
 
55
55
  id = @handler.scheduler.in(rule) do
56
- context = ::Ocular::DSL::RunContext.new
56
+ context = ::Ocular::DSL::RunContext.new(@logger)
57
+ context.log_cause("cron.in", {:rule => rule})
57
58
  eventbase.exec(context)
58
59
  end
59
60
 
@@ -63,11 +64,11 @@ class Ocular
63
64
  end
64
65
 
65
66
  def at(rule, &block)
66
- eventbase = Ocular::DSL::EventBase.new(&block)
67
- eventbase.proxy = @proxy
67
+ eventbase = Ocular::DSL::EventBase.new(@proxy, &block)
68
68
 
69
69
  id = @handler.scheduler.at(rule) do
70
- context = ::Ocular::DSL::RunContext.new
70
+ context = ::Ocular::DSL::RunContext.new(@logger)
71
+ context.log_cause("cron.at", {:rule => rule})
71
72
  eventbase.exec(context)
72
73
  end
73
74
 
@@ -77,11 +78,11 @@ class Ocular
77
78
  end
78
79
 
79
80
  def every(rule, &block)
80
- eventbase = Ocular::DSL::EventBase.new(&block)
81
- eventbase.proxy = @proxy
81
+ eventbase = Ocular::DSL::EventBase.new(@proxy, &block)
82
82
 
83
83
  id = @handler.scheduler.every(rule) do
84
- context = ::Ocular::DSL::RunContext.new
84
+ context = ::Ocular::DSL::RunContext.new(@logger)
85
+ context.log_cause("cron.every", {:rule => rule})
85
86
  eventbase.exec(context)
86
87
  end
87
88
 
@@ -91,11 +92,11 @@ class Ocular
91
92
  end
92
93
 
93
94
  def cron(rule, &block)
94
- eventbase = Ocular::DSL::EventBase.new(&block)
95
- eventbase.proxy = @proxy
95
+ eventbase = Ocular::DSL::EventBase.new(@proxy, &block)
96
96
 
97
97
  id = @handler.scheduler.cron(rule) do
98
- context = ::Ocular::DSL::RunContext.new
98
+ context = ::Ocular::DSL::RunContext.new(@logger)
99
+ context.log_cause("cron.cron", {:rule => rule})
99
100
  eventbase.exec(context)
100
101
  end
101
102
 
@@ -43,7 +43,7 @@ class Ocular
43
43
  attr_accessor :request, :response, :params, :env
44
44
 
45
45
  def initialize()
46
- super()
46
+ super(Ocular::Logging::ConsoleLogger.new)
47
47
  @headers = {}
48
48
  end
49
49
 
@@ -268,15 +268,25 @@ class Ocular
268
268
  end
269
269
 
270
270
  def route(verb, path, options, proxy, &block)
271
- eventbase = Ocular::DSL::EventBase.new(&block)
272
- eventbase.proxy = proxy
271
+ eventbase = Ocular::DSL::EventBase.new(proxy, &block)
273
272
  (proxy.events[verb] ||= {})[path] = eventbase
274
273
 
275
274
  pattern, keys = compile(path)
276
275
 
277
276
  (@routes[verb] ||= []) << build_signature(pattern, keys) do |context|
278
- context.event_signature = [verb, path]
279
- eventbase.exec(context)
277
+ context.event_signature = [verb, path]
278
+ response = eventbase.exec(context)
279
+ environment = {
280
+ :path => path,
281
+ :options => options,
282
+ :request => context.request,
283
+ :params => context.params,
284
+ :env => context.env,
285
+ :response => response
286
+ }
287
+ context.log_cause("on#{verb}", environment)
288
+
289
+ response
280
290
  end
281
291
  end
282
292
 
@@ -0,0 +1,55 @@
1
+
2
+ require 'ocular/inputs/base.rb'
3
+ require 'ocular/dsl/dsl.rb'
4
+ require 'ocular/dsl/runcontext.rb'
5
+ require 'rufus/scheduler'
6
+
7
+ class Ocular
8
+ module Inputs
9
+
10
+ module Trigger
11
+
12
+ module DSL
13
+
14
+ def onTrigger(evaluator, &block)
15
+ handler = handlers.get(::Ocular::Inputs::Trigger::Input)
16
+
17
+ eventbase = Ocular::DSL::EventBase.new(@proxy, &block)
18
+
19
+ id = handler.add_evaluator(evaluator) do
20
+ context = ::Ocular::DSL::RunContext.new(@logger)
21
+ eventbase.exec(context)
22
+ end
23
+
24
+ @proxy.events[id] = eventbase
25
+
26
+ return id
27
+ end
28
+
29
+ end
30
+
31
+ class Input < ::Ocular::Inputs::Base
32
+
33
+ attr_reader :routes
34
+ attr_reader :scheduler
35
+
36
+ def initialize(settings_factory)
37
+ settings = settings_factory[:http]
38
+ @scheduler = ::Rufus::Scheduler.new
39
+ end
40
+
41
+ def start()
42
+
43
+ end
44
+
45
+ def add_evaluator(evaluator, &block)
46
+
47
+ end
48
+
49
+ def stop()
50
+ @scheduler.shutdown
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,97 @@
1
+
2
+ class Ocular
3
+ module Logging
4
+
5
+ # Most of the Logger class is copied from the Ruby Logger class source code.
6
+ class ConsoleLogger
7
+
8
+ def initialize(settings=nil)
9
+ @level = Severity::INFO
10
+ @formatter = Formatter.new
11
+ end
12
+
13
+ def add(severity, message = nil, run_id = nil, &block)
14
+ severity ||= Severity::UNKNOWN
15
+ if severity < @level
16
+ return true
17
+ end
18
+
19
+ if message.nil?
20
+ if block_given?
21
+ message = yield
22
+ else
23
+ message = progname
24
+ end
25
+ end
26
+
27
+ puts @formatter.format_message(severity, Time.now, message)
28
+ true
29
+ end
30
+
31
+ def log_event(property, value, run_id = nil)
32
+ puts @formatter.format_event(property, value, Time.now)
33
+ true
34
+ end
35
+
36
+ def log_cause(type, environment, run_id = nil)
37
+ if @level == Severity::DEBUG
38
+ puts @formatter.format_cause(type, environment, Time.now)
39
+ end
40
+ true
41
+ end
42
+
43
+ def log_timing(key, value, run_id = nil)
44
+ puts @formatter.format_timing(key, value, Time.now)
45
+ true
46
+ end
47
+
48
+ # Default formatter for log messages.
49
+ class Formatter
50
+ Format = "[%s#%d] %s -- %s\n".freeze
51
+ EventFormat = "[%s#%d] -- %s: %s\n".freeze
52
+ CauseFormat = "[%s#%d] -- %s triggered processing with environment: %s\n".freeze
53
+ TimingFormat = "[%s#%d] -- %s took %s ms\n".freeze
54
+
55
+ attr_accessor :datetime_format
56
+
57
+ def initialize
58
+ @datetime_format = nil
59
+ end
60
+
61
+ def format_message(severity, time, msg)
62
+ Format % [format_datetime(time), $$, Ocular::Logging::Severity::LABELS[severity], msg2str(msg)]
63
+ end
64
+
65
+ def format_event(property, value, time)
66
+ EventFormat % [format_datetime(time), $$, property, value]
67
+ end
68
+
69
+ def format_cause(type, environment, time)
70
+ CauseFormat % [format_datetime(time), $$, type, environment.to_json]
71
+ end
72
+
73
+ def format_timing(key, value, time)
74
+ TimingFormat % [format_datetime(time), $$, key, value]
75
+ end
76
+
77
+ private
78
+
79
+ def format_datetime(time)
80
+ time.strftime(@datetime_format || "%Y-%m-%dT%H:%M:%S.%6N ".freeze)
81
+ end
82
+
83
+ def msg2str(msg)
84
+ case msg
85
+ when ::String
86
+ msg
87
+ when ::Exception
88
+ "#{ msg.message } (#{ msg.class })\n" <<
89
+ (msg.backtrace || []).join("\n")
90
+ else
91
+ msg.inspect
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,112 @@
1
+ require "kafka"
2
+
3
+ class Ocular
4
+ module Logging
5
+
6
+ # Most of the Logger class is copied from the Ruby Logger class source code.
7
+ class KafkaLogger
8
+
9
+ def initialize(settings=nil, kafka=nil)
10
+ @level = Severity::DEBUG
11
+ @formatter = Formatter.new
12
+
13
+ if kafka != nil
14
+ @kafka = kafka
15
+ else
16
+ @kafka = Kafka.new(settings)
17
+ end
18
+ @settings = settings
19
+
20
+ @producer = @kafka.producer
21
+ end
22
+
23
+ def add(severity, message = nil, run_id = nil, &block)
24
+ severity ||= Severity::UNKNOWN
25
+ if severity < @level
26
+ return true
27
+ end
28
+
29
+ if message.nil?
30
+ if block_given?
31
+ message = yield
32
+ else
33
+ message = progname
34
+ end
35
+ end
36
+
37
+ @producer.produce(@formatter.format_message(severity, Time.now, run_id, message), topic: @settings[:topic], partition_key: run_id)
38
+ end
39
+
40
+ def log_event(property, value, run_id = nil)
41
+ @producer.produce(@formatter.format_event(property, value, Time.now, run_id), topic: @settings[:topic], partition_key: run_id)
42
+ end
43
+
44
+ def log_cause(type, environment, run_id = nil)
45
+ @producer.produce(@formatter.format_cause(type, environment, Time.now, run_id), topic: @settings[:topic], partition_key: run_id)
46
+ end
47
+
48
+ def log_timing(key, value, run_id = nil)
49
+ @producer.produce(@formatter.format_event("timing:" + key, value, Time.now, run_id), topic: @settings[:topic], partition_key: run_id)
50
+ end
51
+
52
+ # Default formatter for log messages.
53
+ class Formatter
54
+ Format = "%s, [%s#%d] %5s -- %s: %s\n".freeze
55
+
56
+ attr_accessor :datetime_format
57
+
58
+ def initialize
59
+ @datetime_format = nil
60
+ end
61
+
62
+ def format_message(severity, time, progname, msg)
63
+ data = {
64
+ "level" => Ocular::Logging::Severity::LABELS[severity],
65
+ "ts" => format_datetime(time),
66
+ "run_id" => progname,
67
+ "msg" => msg2str(msg)
68
+ }
69
+ return data.to_json
70
+ end
71
+
72
+ def format_event(property, value, time, progname)
73
+ data = {
74
+ "ts" => format_datetime(time),
75
+ "run_id" => progname,
76
+ }
77
+ data[property] = value
78
+ return data.to_json
79
+ end
80
+
81
+ def format_cause(type, environment, time, progname)
82
+ data = {
83
+ "ts" => format_datetime(time),
84
+ "run_id" => progname,
85
+ "triggered_by" => type,
86
+ "environment" => environment
87
+ }
88
+
89
+ return data.to_json
90
+ end
91
+
92
+ private
93
+
94
+ def format_datetime(time)
95
+ time.strftime(@datetime_format || "%Y-%m-%dT%H:%M:%S.%6N ".freeze)
96
+ end
97
+
98
+ def msg2str(msg)
99
+ case msg
100
+ when ::String
101
+ msg
102
+ when ::Exception
103
+ "#{ msg.message } (#{ msg.class })\n" <<
104
+ (msg.backtrace || []).join("\n")
105
+ else
106
+ msg.inspect
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,4 @@
1
+ require 'ocular/logging/severity.rb'
2
+ require 'ocular/logging/multilogger.rb'
3
+ require 'ocular/logging/console_logger.rb'
4
+ require 'ocular/logging/kafka_logger.rb'
@@ -0,0 +1,52 @@
1
+
2
+ require 'pp'
3
+
4
+ class Ocular
5
+ module Logging
6
+ class MultiLogger
7
+ attr_reader :loggers
8
+
9
+ def initialize
10
+ @loggers = []
11
+ end
12
+
13
+ def add_logger(logger)
14
+ @loggers << logger
15
+ end
16
+
17
+ def add(severity, message = nil, run_id = nil, &block)
18
+
19
+ if message.nil?
20
+ if block_given?
21
+ message = yield
22
+ else
23
+ message = "N/A"
24
+ end
25
+ end
26
+
27
+ @loggers.each do |logger|
28
+ logger.add(severity, message, run_id)
29
+ end
30
+
31
+ end
32
+
33
+ def log_event(property, value, run_id)
34
+ @loggers.each do |logger|
35
+ logger.log_event(property, value, run_id)
36
+ end
37
+ end
38
+
39
+ def log_cause(type, environment, run_id)
40
+ @loggers.each do |logger|
41
+ logger.log_cause(type, environment, run_id)
42
+ end
43
+ end
44
+
45
+ def log_timing(key, value, run_id)
46
+ @loggers.each do |logger|
47
+ logger.log_timing(key, value, run_id)
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,23 @@
1
+ require 'logger'
2
+
3
+ class Ocular
4
+ module Logging
5
+ # Logging severity.
6
+ module Severity
7
+ LABELS = %w(DEBUG INFO WARN ERROR FATAL ANY).each(&:freeze).freeze
8
+
9
+ # Low-level information, mostly for developers.
10
+ DEBUG = 0
11
+ # Generic (useful) information about system operation.
12
+ INFO = 1
13
+ # A warning.
14
+ WARN = 2
15
+ # A handleable error condition.
16
+ ERROR = 3
17
+ # An unhandleable error that results in a program crash.
18
+ FATAL = 4
19
+ # An unknown message that should always be logged.
20
+ UNKNOWN = 5
21
+ end
22
+ end
23
+ end
data/lib/ocular/ocular.rb CHANGED
@@ -1,6 +1,7 @@
1
1
 
2
2
  require 'ocular/version'
3
3
  require 'ocular/settings'
4
+ require 'ocular/logging/logging'
4
5
  require 'ocular/event/eventbase'
5
6
  require 'ocular/event/eventfactory'
6
7
  require 'ocular/dsl/dsl'
@@ -1,3 +1,3 @@
1
1
  class Ocular
2
- Version = "0.1.8"
2
+ Version = "0.1.9"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ocular
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Juho Mäkinen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-15 00:00:00.000000000 Z
11
+ date: 2016-03-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rye
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - '='
123
123
  - !ruby/object:Gem::Version
124
124
  version: 3.2.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: ruby-kafka
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '='
130
+ - !ruby/object:Gem::Version
131
+ version: 0.3.2
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '='
137
+ - !ruby/object:Gem::Version
138
+ version: 0.3.2
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: rspec
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -169,6 +183,12 @@ files:
169
183
  - lib/ocular/inputs/cron_input.rb
170
184
  - lib/ocular/inputs/handlers.rb
171
185
  - lib/ocular/inputs/http_input.rb
186
+ - lib/ocular/inputs/trigger_input.rb
187
+ - lib/ocular/logging/console_logger.rb
188
+ - lib/ocular/logging/kafka_logger.rb
189
+ - lib/ocular/logging/logging.rb
190
+ - lib/ocular/logging/multilogger.rb
191
+ - lib/ocular/logging/severity.rb
172
192
  - lib/ocular/mixin/from_file.rb
173
193
  - lib/ocular/ocular.rb
174
194
  - lib/ocular/settings.rb