anschel 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Readme.md +36 -23
- data/VERSION +1 -1
- data/lib/anschel/filter.rb +3 -0
- data/lib/anschel/main.rb +9 -4
- data/lib/anschel/mjolnir.rb +23 -4
- data/lib/anschel/stats.rb +6 -2
- data/lib/anschel.rb +5 -20
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6effb5e9164bcf730b5bab24484ad5af1259021b
|
4
|
+
data.tar.gz: 1ba0f0a949a64850aa81eb80ed6852eb896fb824
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 461945890b911f2d2d1f4a341c0d76d6d38eb484614f01ed4195d7cbb173f1309d95024a06d7f03e1709411418a6d9a50b0556850ae6e0e5c9676a39f77a0298
|
7
|
+
data.tar.gz: 541b50a3e3cb82fed6d195b5efbaf2d366bfb8c74bf5f5240eaad548ff09d5a4b4028be56b354d0ff63f9152f232f46cf6546e311f6402dc6b4159143e10a623
|
data/Readme.md
CHANGED
@@ -11,13 +11,13 @@ Logstash-like for moving events from Kafka into Elasticsearch.
|
|
11
11
|
Download the jarfile from the [GitHub releases page](https://github.com/sczizzo/anschel/releases)
|
12
12
|
and run like so:
|
13
13
|
|
14
|
-
$ java -jar anschel-
|
14
|
+
$ java -jar anschel-x.y.z.jar
|
15
15
|
|
16
16
|
### Usage
|
17
17
|
|
18
18
|
Just call for help!
|
19
19
|
|
20
|
-
$ java -jar anschel-
|
20
|
+
$ java -jar anschel-x.y.z.jar help
|
21
21
|
Commands:
|
22
22
|
anschel agent # Run application
|
23
23
|
anschel art # Show application art
|
@@ -26,7 +26,7 @@ Just call for help!
|
|
26
26
|
|
27
27
|
Probably you're most interested in the `agent` command:
|
28
28
|
|
29
|
-
$ java -jar anschel-
|
29
|
+
$ java -jar anschel-x.y.z.jar help agent
|
30
30
|
Usage:
|
31
31
|
anschel agent
|
32
32
|
|
@@ -35,9 +35,9 @@ Probably you're most interested in the `agent` command:
|
|
35
35
|
# Default: /etc/anschel.json
|
36
36
|
-i, [--stats-interval=N] # Interval for reporting stats (seconds)
|
37
37
|
# Default: 30
|
38
|
-
-
|
39
|
-
-
|
40
|
-
-
|
38
|
+
-l, [--log=LOG] # Log to file instead of STDOUT
|
39
|
+
-v, [--debug], [--no-debug] # Enable DEBUG-level logging
|
40
|
+
-z, [--trace], [--no-trace] # Enable TRACE-level logging (overrides DEBUG)
|
41
41
|
|
42
42
|
Run application
|
43
43
|
|
@@ -48,10 +48,14 @@ Probably you're most interested in the `agent` command:
|
|
48
48
|
It's kinda like a JSON version of the Logstash config language:
|
49
49
|
|
50
50
|
{
|
51
|
+
// Anschel requires JRuby, and some libraries log via Log4j
|
51
52
|
"log4j": {
|
52
53
|
"path": "/path/to/anschel4j.log",
|
53
54
|
"pattern": "[%d] %p %m (%c)%n"
|
54
55
|
},
|
56
|
+
|
57
|
+
// Kafka is the only supported input; see the `jruby-kafka` homepage for
|
58
|
+
// more details: https://github.com/joekiller/jruby-kafka
|
55
59
|
"kafka": {
|
56
60
|
"queue_size": 2000,
|
57
61
|
"zk_connect": "localhost:2181",
|
@@ -76,6 +80,9 @@ It's kinda like a JSON version of the Logstash config language:
|
|
76
80
|
"consumer_timeout_ms": -1,
|
77
81
|
"consumer_restart_sleep_ms": 0
|
78
82
|
},
|
83
|
+
|
84
|
+
// There's only one output, Elasticsearch; see the `elasticsearch-ruby`
|
85
|
+
// homepage for more: https://github.com/elastic/elasticsearch-ruby
|
79
86
|
"elasticsearch": {
|
80
87
|
"queue_size": 2000,
|
81
88
|
"bulk_size": 200,
|
@@ -85,31 +92,37 @@ It's kinda like a JSON version of the Logstash config language:
|
|
85
92
|
"reload_on_failure": true,
|
86
93
|
"sniffer_timeout": 5
|
87
94
|
},
|
95
|
+
|
96
|
+
// Just like Logstash, Anschel has a notion of filters
|
88
97
|
"filter": {
|
89
|
-
|
98
|
+
|
99
|
+
// "_before" is a special set of filters executed on every event before
|
100
|
+
// the main type-specific filters are applied
|
101
|
+
"_before": [
|
90
102
|
{
|
91
|
-
"
|
92
|
-
"field": "
|
93
|
-
"
|
94
|
-
"
|
103
|
+
"gsub": {
|
104
|
+
"field": "type",
|
105
|
+
"match": "-.*",
|
106
|
+
"replace": ""
|
95
107
|
}
|
96
|
-
}
|
108
|
+
}
|
109
|
+
],
|
110
|
+
|
111
|
+
// Each type is allowed any number of filters; see `lib/anschel/filter`
|
112
|
+
// for configuration options and available filters
|
113
|
+
"some-type": [
|
97
114
|
{
|
98
115
|
"scan": {
|
99
|
-
"field": "
|
116
|
+
"field": "message",
|
100
117
|
"pattern": "[A-Fa-f0-9]{8}-(?:[A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}",
|
101
118
|
"target": "guids"
|
102
119
|
}
|
103
120
|
}
|
104
121
|
],
|
122
|
+
|
123
|
+
// Any "_after" filters will be applied to all events, like "_before"
|
124
|
+
// (but, you know, like after the main filters)
|
105
125
|
"_after": [
|
106
|
-
{
|
107
|
-
"gsub": {
|
108
|
-
"field": "type",
|
109
|
-
"match": "-.*",
|
110
|
-
"replace": ""
|
111
|
-
}
|
112
|
-
},
|
113
126
|
{
|
114
127
|
"index": {}
|
115
128
|
}
|
@@ -133,14 +146,14 @@ You might deploy Anschel with Upstart. Here's a minimal config:
|
|
133
146
|
stop on shutdown
|
134
147
|
respawn
|
135
148
|
|
136
|
-
exec java -jar anschel-
|
149
|
+
exec java -jar anschel-x.y.z.jar \
|
137
150
|
--config /etc/anschel.json --log /var/log/anschel.log
|
138
151
|
|
139
152
|
|
140
153
|
|
141
|
-
|
154
|
+
## Changelog
|
142
155
|
|
143
|
-
|
156
|
+
### v1.0
|
144
157
|
|
145
158
|
_In devlopment_
|
146
159
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/lib/anschel/filter.rb
CHANGED
@@ -13,6 +13,7 @@ module Anschel
|
|
13
13
|
|
14
14
|
def initialize config, stats, log
|
15
15
|
log.trace event: 'filter', config: config
|
16
|
+
config ||= {} # Allow for nil config
|
16
17
|
@filters = Hash.new { |h,k| h[k] = [] }
|
17
18
|
config.each do |event_type, filter_defns|
|
18
19
|
filter_defns.each do |filter_defn|
|
@@ -35,6 +36,8 @@ module Anschel
|
|
35
36
|
end
|
36
37
|
|
37
38
|
|
39
|
+
private
|
40
|
+
|
38
41
|
def filtered event, options
|
39
42
|
if remove_field = options[:remove_field]
|
40
43
|
event.delete remove_field
|
data/lib/anschel/main.rb
CHANGED
@@ -40,7 +40,12 @@ module Anschel
|
|
40
40
|
default: 30
|
41
41
|
include_common_options
|
42
42
|
def agent
|
43
|
-
log.info
|
43
|
+
log.info \
|
44
|
+
event: 'hello',
|
45
|
+
version: VERSION,
|
46
|
+
options: options.to_hash,
|
47
|
+
num_cpus: num_cpus
|
48
|
+
|
44
49
|
config = JrJackson::Json.load File.read(options.config), symbolize_keys: true
|
45
50
|
setup_log4j config[:log4j]
|
46
51
|
|
@@ -49,8 +54,8 @@ module Anschel
|
|
49
54
|
filter = Filter.new config[:filter], stats, log
|
50
55
|
output = Output.new config[:elasticsearch], stats, log
|
51
56
|
|
52
|
-
stats.create '
|
53
|
-
stats.get '
|
57
|
+
stats.create 'event'
|
58
|
+
stats.get 'event'
|
54
59
|
|
55
60
|
ts = num_cpus.times.map do
|
56
61
|
Thread.new do
|
@@ -58,7 +63,7 @@ module Anschel
|
|
58
63
|
event = JrJackson::Json.load \
|
59
64
|
input.shift.message.to_s, symbolize_keys: true
|
60
65
|
output.push filter.apply(event)
|
61
|
-
stats.inc '
|
66
|
+
stats.inc 'event'
|
62
67
|
end
|
63
68
|
end
|
64
69
|
end
|
data/lib/anschel/mjolnir.rb
CHANGED
@@ -11,20 +11,20 @@ module Anschel
|
|
11
11
|
COMMON_OPTIONS = {
|
12
12
|
log: {
|
13
13
|
type: :string,
|
14
|
-
aliases: %w[ -
|
14
|
+
aliases: %w[ -l ],
|
15
15
|
desc: 'Log to file instead of STDOUT',
|
16
16
|
default: ENV['ANSCHEL_LOG'] || nil
|
17
17
|
},
|
18
18
|
debug: {
|
19
19
|
type: :boolean,
|
20
|
-
aliases: %w[ -
|
20
|
+
aliases: %w[ -v ],
|
21
21
|
desc: 'Enable DEBUG-level logging',
|
22
22
|
default: ENV['ANSCHEL_DEBUG'] || false
|
23
23
|
},
|
24
24
|
trace: {
|
25
25
|
type: :boolean,
|
26
|
-
aliases: %w[ -
|
27
|
-
desc: 'Enable TRACE-level logging (
|
26
|
+
aliases: %w[ -z ],
|
27
|
+
desc: 'Enable TRACE-level logging (overrides DEBUG)',
|
28
28
|
default: ENV['ANSCHEL_TRACE'] || false
|
29
29
|
}
|
30
30
|
}
|
@@ -48,6 +48,25 @@ module Anschel
|
|
48
48
|
@logger
|
49
49
|
end
|
50
50
|
|
51
|
+
# Write out a temporary properties file for Log4j
|
52
|
+
def setup_log4j config
|
53
|
+
config ||= {}
|
54
|
+
path = config.delete(:path) || '/dev/stdout'
|
55
|
+
pattern = config.delete(:pattern) || '%p [%d] (%c) %m%n'
|
56
|
+
Tempfile.open('anschel_log4j') do |f|
|
57
|
+
log4j = %Q|
|
58
|
+
log4j.rootLogger=INFO, A1
|
59
|
+
log4j.appender.A1=org.apache.log4j.RollingFileAppender
|
60
|
+
log4j.appender.A1.File=%s
|
61
|
+
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
|
62
|
+
log4j.appender.A1.layout.ConversionPattern=%s
|
63
|
+
| % [ path, pattern ]
|
64
|
+
f.write log4j.gsub(/^\s+/,'')
|
65
|
+
f.rewind
|
66
|
+
org.apache.log4j.PropertyConfigurator.configure(f.path)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
51
70
|
end
|
52
71
|
end
|
53
72
|
end
|
data/lib/anschel/stats.rb
CHANGED
@@ -22,9 +22,11 @@ module Anschel
|
|
22
22
|
end
|
23
23
|
|
24
24
|
|
25
|
-
def create name, default=
|
25
|
+
def create name, default=0
|
26
26
|
with_lock do
|
27
|
-
stats[name] =
|
27
|
+
stats[name] = {}
|
28
|
+
stats[name].default = default
|
29
|
+
stats
|
28
30
|
end
|
29
31
|
end
|
30
32
|
|
@@ -72,6 +74,8 @@ module Anschel
|
|
72
74
|
ready_stats = with_lock do
|
73
75
|
stats.keys.flat_map do |k|
|
74
76
|
v = stats[k].delete(:val)
|
77
|
+
v ||= stats[k].default
|
78
|
+
stats[k][:val] = stats[k].default
|
75
79
|
[
|
76
80
|
[ k, v ],
|
77
81
|
[ "#{k}_rate", 1.0 * v / @interval ]
|
data/lib/anschel.rb
CHANGED
@@ -1,29 +1,14 @@
|
|
1
|
+
require 'thread'
|
2
|
+
|
3
|
+
Thread.abort_on_exception = true
|
4
|
+
|
1
5
|
# Return the number of CPU cores (should work on Unixy platforms)
|
2
6
|
def num_cpus
|
3
7
|
return Java::Java.lang.Runtime.getRuntime.availableProcessors if defined? Java::Java
|
4
8
|
return File.read('/proc/cpuinfo').scan(/^processor\s*:/).size if File.exist? '/proc/cpuinfo'
|
5
9
|
return `sysctl -a | grep cpu`.split(/\s+/,2).last.to_i
|
6
10
|
rescue
|
7
|
-
return
|
11
|
+
return 2
|
8
12
|
end
|
9
13
|
|
10
|
-
def setup_log4j config
|
11
|
-
path = config.delete(:path) || '/var/log/anschel4j.log'
|
12
|
-
pattern = config.delete(:pattern) || '[%d] %p %m (%c)%n'
|
13
|
-
Tempfile.open('anschel_log4j') do |f|
|
14
|
-
log4j = %Q|
|
15
|
-
log4j.rootLogger=INFO, A1
|
16
|
-
log4j.appender.A1=org.apache.log4j.RollingFileAppender
|
17
|
-
log4j.appender.A1.File=%s
|
18
|
-
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
|
19
|
-
log4j.appender.A1.layout.ConversionPattern=%s
|
20
|
-
| % [ path, pattern ]
|
21
|
-
f.write log4j.gsub(/^\s+/,'')
|
22
|
-
f.rewind
|
23
|
-
org.apache.log4j.PropertyConfigurator.configure(f.path)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
Thread.abort_on_exception = true
|
28
|
-
|
29
14
|
require_relative 'anschel/main'
|