fluent-plugin-systemd 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 473961511b5ecf9533e4e5276317fcd91553a9b4
4
+ data.tar.gz: b340367404c3b3851dcdb720320fb0e2442a6166
5
+ SHA512:
6
+ metadata.gz: ba42443dc10da1c1824a73395be4dc82dca01a45eb7a60e8d7455d6fb837b9d491c2c5dcf4c95683c5dadfbe4881e8539812d450aa960ed1ec33f4074c184bc5
7
+ data.tar.gz: b1ccb5cb033c495200a500a029e8ad72ab45413d0a4c112c7d7916789fa4e2c80634f4474999f70451288ca08cb5b4cebf648ea0b5f06569b5a1c217c81ede0d
@@ -0,0 +1 @@
1
+ Gemfile.lock
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ sudo: required
3
+ services:
4
+ - docker
@@ -0,0 +1,21 @@
1
+ FROM quay.io/assemblyline/buildpack_deps:15.10
2
+
3
+ RUN echo "deb http://ppa.launchpad.net/brightbox/ruby-ng/ubuntu vivid main" | tee /etc/apt/sources.list.d/ruby-ng.list \
4
+ && echo "deb-src http://ppa.launchpad.net/brightbox/ruby-ng/ubuntu vivid main" | tee -a /etc/apt/sources.list.d/ruby-ng.list \
5
+ && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C3173AA6 \
6
+ && apt-get update -q && apt-get install -qy --no-install-recommends \
7
+ ruby2.2 \
8
+ ruby2.2-dev \
9
+ libsystemd-dev \
10
+ && apt-get clean \
11
+ && rm -rf /var/lib/apt/lists/* \
12
+ && truncate -s 0 /var/log/*log \
13
+ && gem install bundler
14
+
15
+ WORKDIR /usr/local/src
16
+
17
+ COPY Gemfile ./
18
+ COPY fluent-plugin-systemd.gemspec ./
19
+ RUN bundle install -j4 -r3
20
+ COPY . .
21
+ RUN bundle exec rake
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
data/LICENCE ADDED
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2015 Edward Robinson
2
+
3
+
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+
13
+
14
+ The above copyright notice and this permission notice shall be included in
15
+ all copies or substantial portions of the Software.
16
+
17
+
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
+ THE SOFTWARE.
@@ -0,0 +1,73 @@
1
+ # systemd input plugin for [Fluentd](http://github.com/fluent/fluentd)
2
+
3
+ [<img src="https://travis-ci.org/reevoo/fluent-plugin-systemd.svg?branch=master"
4
+ alt="Build Status" />](https://travis-ci.org/reevoo/fluent-plugin-systemd) [<img
5
+ src="https://codeclimate.com/github/reevoo/fluent-plugin-systemd/badges/gpa.svg"
6
+ />](https://codeclimate.com/github/reevoo/fluent-plugin-systemd)
7
+
8
+ ## Overview
9
+
10
+ **systemd** input plugin reads logs from the systemd journal
11
+
12
+ ## Installation
13
+
14
+ Simply use RubyGems:
15
+
16
+ gem install fluent-plugin-systemd
17
+
18
+ or
19
+
20
+ fluent-gem install fluent-plugin-systemd
21
+
22
+ or
23
+
24
+ td-agent-gem install fluent-plugin-systemd
25
+
26
+ ## Configuration
27
+
28
+ <source>
29
+ type systemd
30
+ path /var/log/journal
31
+ filters [{ "_SYSTEMD_UNIT": "kube-proxy.service" }]
32
+ pos_file kube-proxy.pos
33
+ tag kube-proxy
34
+ read_from_head true
35
+ </source>
36
+
37
+ **path**
38
+
39
+ Path to the systemd journal, defaults to `/var/log/journal`
40
+
41
+ **filters**
42
+
43
+ Array of filters, see [here](http://www.rubydoc.info/gems/systemd-journal/Systemd%2FJournal%2FFilterable%3Afilter) for futher
44
+ documentation, defaults to no filtering.
45
+
46
+ **pos file**
47
+
48
+ Path to pos file, stores the journald cursor. File is created if does not exist.
49
+
50
+ **read_from_head**
51
+
52
+ If true reads all avalible journal from head, otherwise starts reading from tail,
53
+ ignored if pos file exists. Defaults to false.
54
+
55
+ **tag**
56
+
57
+ Required the tag for events generated by this input plugin.
58
+
59
+ ## Dependencies
60
+
61
+ This plugin depends on libsystemd
62
+
63
+ ## Running the tests
64
+
65
+ To run the tests simply run `rake test`
66
+
67
+ For systems without systemd the tests are run in a docker container. So you will need docker or systemd installed to work on this.
68
+
69
+ ## Licence etc
70
+
71
+ [MIT](LICENCE)
72
+
73
+ Issues and pull requests welcome
@@ -0,0 +1,27 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+ require 'reevoocop/rake_task'
4
+
5
+ ReevooCop::RakeTask.new(:reevoocop)
6
+
7
+ Rake::TestTask.new(:tests) do |t|
8
+ t.test_files = Dir['test/**/test_*.rb']
9
+ end
10
+
11
+ task default: :test
12
+ task build: :test
13
+ task tests: :reevoocop
14
+
15
+ namespace :docker do
16
+ task :test do
17
+ sh 'docker build .'
18
+ end
19
+ end
20
+
21
+ task :test do
22
+ if system('which journalctl')
23
+ Rake::Task['tests'].invoke
24
+ else
25
+ Rake::Task['docker:test'].invoke
26
+ end
27
+ end
@@ -0,0 +1,29 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'fluent-plugin-systemd'
8
+ spec.version = '0.0.1'
9
+ spec.authors = ['Ed Robinson']
10
+ spec.email = ['ed@reevoo.com']
11
+
12
+ spec.summary = 'Input plugin to read from systemd journal.'
13
+ spec.description = 'This is a fluentd input plugin. It reads logs from the systemd journal.'
14
+ spec.homepage = 'https://github.com/assemblyline/fluent-plugin-systemd'
15
+ spec.license = 'MIT'
16
+
17
+
18
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(/^(test|spec|features)\//) }
19
+ spec.executables = spec.files.grep(/^exe\//) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_development_dependency 'bundler', '~> 1.10'
23
+ spec.add_development_dependency 'rake', '~> 10.4'
24
+ spec.add_development_dependency 'test-unit', '~> 3.1'
25
+ spec.add_development_dependency 'reevoocop'
26
+
27
+ spec.add_runtime_dependency 'fluentd', '~> 0.12'
28
+ spec.add_runtime_dependency 'systemd-journal', '~> 1.2'
29
+ end
@@ -0,0 +1,62 @@
1
+ require 'systemd/journal'
2
+ require 'fluent/plugin/systemd/pos_writer'
3
+
4
+ module Fluent
5
+ class SystemdInput < Input
6
+ Fluent::Plugin.register_input('systemd', self)
7
+
8
+ config_param :path, :string, default: '/var/log/journal'
9
+ config_param :filters, :array, default: []
10
+ config_param :pos_file, :string, default: nil
11
+ config_param :read_from_head, :bool, default: false
12
+ config_param :tag, :string
13
+
14
+ attr_reader :tag
15
+
16
+ def configure(conf)
17
+ super
18
+ @pos_writer = PosWriter.new(conf['pos_file'])
19
+ @journal = Systemd::Journal.new(path: path)
20
+ journal.filter(*filters)
21
+ read_from = @pos_writer.cursor || (conf['read_from_head'] ? :head : :tail)
22
+ journal.seek(read_from)
23
+ end
24
+
25
+ def start
26
+ super
27
+ @running = true
28
+ pos_writer.start
29
+ @thread = Thread.new(&method(:run))
30
+ end
31
+
32
+ def shutdown
33
+ @running = false
34
+ @thread.join
35
+ pos_writer.shutdown
36
+ end
37
+
38
+ private
39
+
40
+ attr_reader :journal, :running, :lock, :cursor, :path, :pos_writer
41
+
42
+ def run
43
+ watch do |entry|
44
+ router.emit(tag, entry.realtime_timestamp.to_i, formatted(entry))
45
+ end
46
+ end
47
+
48
+ def formatted(entry)
49
+ entry.to_h
50
+ end
51
+
52
+ def watch
53
+ while running
54
+ next unless journal.wait(1_000_000)
55
+ while journal.move_next && running
56
+ yield journal.current_entry
57
+ pos_writer.update(journal.cursor)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,58 @@
1
+ module Fluent
2
+ class SystemdInput < Input
3
+ class PosWriter
4
+ def initialize(pos_file)
5
+ @path = pos_file
6
+ setup
7
+ end
8
+
9
+ attr_reader :cursor
10
+
11
+ def start
12
+ return unless path
13
+ @running = true
14
+ @thread = Thread.new(&method(:work))
15
+ end
16
+
17
+ def shutdown
18
+ return unless path
19
+ @running = false
20
+ thread.join
21
+ write_pos
22
+ end
23
+
24
+ def update(c)
25
+ return unless path
26
+ lock.synchronize { @cursor = c }
27
+ end
28
+
29
+ private
30
+
31
+ attr_reader :path, :lock, :thread, :running
32
+
33
+ def setup
34
+ return unless path
35
+ @lock = Mutex.new
36
+ @cursor = IO.read(path).chomp if File.exist?(path)
37
+ end
38
+
39
+ def work
40
+ while running
41
+ write_pos
42
+ sleep 1
43
+ end
44
+ end
45
+
46
+ def write_pos
47
+ lock.synchronize do
48
+ if @written_cursor != cursor
49
+ file = File.open(path, 'w+')
50
+ file.print cursor
51
+ file.close
52
+ @written_cursor = cursor
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-systemd
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ed Robinson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-11-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.4'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.4'
41
+ - !ruby/object:Gem::Dependency
42
+ name: test-unit
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.1'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: reevoocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: fluentd
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.12'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.12'
83
+ - !ruby/object:Gem::Dependency
84
+ name: systemd-journal
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.2'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.2'
97
+ description: This is a fluentd input plugin. It reads logs from the systemd journal.
98
+ email:
99
+ - ed@reevoo.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".travis.yml"
106
+ - Dockerfile
107
+ - Gemfile
108
+ - LICENCE
109
+ - README.md
110
+ - Rakefile
111
+ - fluent-plugin-systemd.gemspec
112
+ - lib/fluent/plugin/in_systemd.rb
113
+ - lib/fluent/plugin/systemd/pos_writer.rb
114
+ homepage: https://github.com/assemblyline/fluent-plugin-systemd
115
+ licenses:
116
+ - MIT
117
+ metadata: {}
118
+ post_install_message:
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 2.2.3
135
+ signing_key:
136
+ specification_version: 4
137
+ summary: Input plugin to read from systemd journal.
138
+ test_files: []