logstash-output-logmatic 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -7
- data/lib/logstash/outputs/logmatic.rb +127 -42
- data/lib/logstash/outputs/logmatic_https.rb +65 -0
- data/logstash-output-logmatic.gemspec +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a61c28d9d73583df0f16c50fd0f02429e35270e9
|
4
|
+
data.tar.gz: b5d6bc8647be4c4b25eabb6ce073d6a5b6c7559b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6d1ddd1a910ff2cd32e4e77c65bb80b9e83e3e60fed3d625683acb31f7160344a5bce52e6a9e2eb427e53359283d12f39f33ae2b226d41876c7c43b14a2a0ba
|
7
|
+
data.tar.gz: 3c0ec9702a3f2a0819564d1a13d33169e0403bf65e99f23006f5879a11d61ca825e9a576613648713e5a88243d1bee96c2f96adfa63c87777c8e019209b72080
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Logstash Logmatic.io's Output Plugin
|
2
2
|
|
3
|
-
|
3
|
+
This project is an output plugin to send logs to Logmatic.io from Logstash >v1.5.0.
|
4
4
|
|
5
5
|
## How to install it?
|
6
6
|
|
@@ -27,12 +27,6 @@ Then you just need to configure the output as follow:
|
|
27
27
|
output {
|
28
28
|
logmatic {
|
29
29
|
key => "<your_api_key>"
|
30
|
-
# In order to limit the amount of resources the output uses buffering
|
31
|
-
# You can configure its behavior with:
|
32
|
-
# The number of elements queued before flushing
|
33
|
-
# queue_size => 10
|
34
|
-
# The timeframe in seconds for buffering before flushing
|
35
|
-
# timeframe => 10
|
36
30
|
}
|
37
31
|
}
|
38
32
|
|
@@ -1,65 +1,150 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "logstash/outputs/base"
|
3
3
|
require "logstash/namespace"
|
4
|
-
require "
|
4
|
+
require "thread"
|
5
5
|
|
6
|
-
#
|
6
|
+
# Write events over a TCP socket.
|
7
7
|
#
|
8
|
-
#
|
9
|
-
|
10
|
-
|
8
|
+
# Each event json is separated by a newline.
|
9
|
+
#
|
10
|
+
# Can either accept connections from clients or connect to a server,
|
11
|
+
# depending on `mode`.
|
12
|
+
class LogStash::Outputs::LogmaticTcp < LogStash::Outputs::Base
|
11
13
|
|
12
14
|
config_name "logmatic"
|
13
|
-
milestone 2
|
14
15
|
|
15
16
|
default :codec, "json"
|
16
17
|
|
18
|
+
# When mode is `server`, the address to listen on.
|
19
|
+
# When mode is `client`, the address to connect to.
|
20
|
+
config :host, :validate => :string, :default => "api.logmatic.io"
|
21
|
+
|
22
|
+
# When mode is `server`, the port to listen on.
|
23
|
+
# When mode is `client`, the port to connect to.
|
24
|
+
config :port, :validate => :number, :default => 10514
|
25
|
+
|
17
26
|
# The Logmatic api key
|
18
27
|
# You can find it in the 'Account' section in the Logmatic interface.
|
19
28
|
config :key, :validate => :string, :required => true
|
20
29
|
|
21
|
-
#
|
22
|
-
|
23
|
-
config :queue_size, :validate => :number, :default => 10
|
30
|
+
# When connect failed,retry interval in sec.
|
31
|
+
config :reconnect_interval, :validate => :number, :default => 10
|
24
32
|
|
25
|
-
#
|
26
|
-
|
33
|
+
# Mode to operate in. `server` listens for client connections,
|
34
|
+
# `client` connects to a server.
|
35
|
+
config :mode, :validate => ["server", "client"], :default => "client"
|
36
|
+
|
37
|
+
# The format to use when writing events to the file. This value
|
38
|
+
# supports any string and can include `%{name}` and other dynamic
|
39
|
+
# strings.
|
40
|
+
#
|
41
|
+
# If this setting is omitted, the full json representation of the
|
42
|
+
# event will be written as a single line.
|
43
|
+
config :message_format, :validate => :string, :deprecated => true
|
44
|
+
|
45
|
+
class Client
|
46
|
+
public
|
47
|
+
def initialize(socket, logger)
|
48
|
+
@socket = socket
|
49
|
+
@logger = logger
|
50
|
+
@queue = Queue.new
|
51
|
+
end
|
52
|
+
|
53
|
+
public
|
54
|
+
def run
|
55
|
+
loop do
|
56
|
+
begin
|
57
|
+
@socket.write(@queue.pop)
|
58
|
+
rescue => e
|
59
|
+
@logger.warn("tcp output exception", :socket => @socket,
|
60
|
+
:exception => e)
|
61
|
+
break
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end # def run
|
65
|
+
|
66
|
+
public
|
67
|
+
def write(msg)
|
68
|
+
@queue.push(msg)
|
69
|
+
end # def write
|
70
|
+
end # class Client
|
27
71
|
|
28
72
|
public
|
29
73
|
def register
|
30
|
-
require "
|
31
|
-
require "
|
32
|
-
|
33
|
-
|
34
|
-
@client = Net::HTTP.new(@uri.host, @uri.port)
|
35
|
-
@client.use_ssl = true
|
36
|
-
@client.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
37
|
-
@logger.debug("Logmatic URL", :url => @url)
|
38
|
-
|
39
|
-
buffer_initialize(
|
40
|
-
:max_items => @queue_size,
|
41
|
-
:max_interval => @timeframe,
|
42
|
-
:logger => @logger
|
43
|
-
)
|
44
|
-
end
|
74
|
+
require "socket"
|
75
|
+
require "stud/try"
|
76
|
+
if server?
|
77
|
+
workers_not_supported
|
45
78
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
buffer_receive(event.to_json)
|
50
|
-
end
|
79
|
+
@logger.info("Starting tcp output listener", :address => "#{@host}:#{@port}")
|
80
|
+
@server_socket = TCPServer.new(@host, @port)
|
81
|
+
@client_threads = []
|
51
82
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
83
|
+
@accept_thread = Thread.new(@server_socket) do |server_socket|
|
84
|
+
loop do
|
85
|
+
client_thread = Thread.start(server_socket.accept) do |client_socket|
|
86
|
+
client = Client.new(client_socket, @logger)
|
87
|
+
Thread.current[:client] = client
|
88
|
+
client.run
|
89
|
+
end
|
90
|
+
@client_threads << client_thread
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
@codec.on_event do |event, payload|
|
95
|
+
@client_threads.each do |client_thread|
|
96
|
+
client_thread[:client].write(payload)
|
97
|
+
end
|
98
|
+
@client_threads.reject! {|t| !t.alive? }
|
99
|
+
end
|
61
100
|
else
|
62
|
-
|
101
|
+
client_socket = nil
|
102
|
+
@codec.on_event do |event, payload|
|
103
|
+
begin
|
104
|
+
client_socket = connect unless client_socket
|
105
|
+
r,w,e = IO.select([client_socket], [client_socket], [client_socket], nil)
|
106
|
+
# don't expect any reads, but a readable socket might
|
107
|
+
# mean the remote end closed, so read it and throw it away.
|
108
|
+
# we'll get an EOFError if it happens.
|
109
|
+
client_socket.sysread(16384) if r.any?
|
110
|
+
|
111
|
+
# Now send the payload
|
112
|
+
@logger.debug(@key);
|
113
|
+
client_socket.syswrite(@key + " " + payload+"\n") if w.any?
|
114
|
+
rescue => e
|
115
|
+
@logger.warn("tcp output exception", :host => @host, :port => @port,
|
116
|
+
:exception => e, :backtrace => e.backtrace)
|
117
|
+
client_socket.close rescue nil
|
118
|
+
client_socket = nil
|
119
|
+
sleep @reconnect_interval
|
120
|
+
retry
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end # def register
|
125
|
+
|
126
|
+
private
|
127
|
+
def connect
|
128
|
+
Stud::try do
|
129
|
+
return TCPSocket.new(@host, @port)
|
63
130
|
end
|
131
|
+
end # def connect
|
132
|
+
|
133
|
+
private
|
134
|
+
def server?
|
135
|
+
@mode == "server"
|
136
|
+
end # def server?
|
137
|
+
|
138
|
+
public
|
139
|
+
def receive(event)
|
140
|
+
|
141
|
+
|
142
|
+
#if @message_format
|
143
|
+
#output = event.sprintf(@message_format) + "\n"
|
144
|
+
#else
|
145
|
+
#output = event.to_hash.to_json + "\n"
|
146
|
+
#end
|
147
|
+
|
148
|
+
@codec.encode(event)
|
64
149
|
end # def receive
|
65
|
-
end # class LogStash::Outputs::
|
150
|
+
end # class LogStash::Outputs::Tcp
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "logstash/outputs/base"
|
3
|
+
require "logstash/namespace"
|
4
|
+
require "stud/buffer"
|
5
|
+
|
6
|
+
# Ship log from logstash straight to Logmatic
|
7
|
+
#
|
8
|
+
# To use this you will need a valid Logmatic API Key
|
9
|
+
class LogStash::Outputs::LogmaticHttpBatch < LogStash::Outputs::Base
|
10
|
+
include Stud::Buffer
|
11
|
+
|
12
|
+
config_name "logmatic_http"
|
13
|
+
milestone 2
|
14
|
+
|
15
|
+
default :codec, "json"
|
16
|
+
|
17
|
+
# The Logmatic api key
|
18
|
+
# You can find it in the 'Account' section in the Logmatic interface.
|
19
|
+
config :key, :validate => :string, :required => true
|
20
|
+
|
21
|
+
# How many events to queue before flushing to Logmatic
|
22
|
+
# prior to schedule set in @timeframe
|
23
|
+
config :queue_size, :validate => :number, :default => 10
|
24
|
+
|
25
|
+
# How often (in seconds) to flush queued events to Logmatic
|
26
|
+
config :timeframe, :validate => :number, :default => 10
|
27
|
+
|
28
|
+
public
|
29
|
+
def register
|
30
|
+
require "net/https"
|
31
|
+
require "uri"
|
32
|
+
@url = "https://api.logmatic.io/v1/input/#{@key}"
|
33
|
+
@uri = URI.parse(@url)
|
34
|
+
@client = Net::HTTP.new(@uri.host, @uri.port)
|
35
|
+
@client.use_ssl = true
|
36
|
+
@client.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
37
|
+
@logger.debug("Logmatic URL", :url => @url)
|
38
|
+
|
39
|
+
buffer_initialize(
|
40
|
+
:max_items => @queue_size,
|
41
|
+
:max_interval => @timeframe,
|
42
|
+
:logger => @logger
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
46
|
+
public
|
47
|
+
def receive(event)
|
48
|
+
return unless output?(event)
|
49
|
+
buffer_receive(event.to_json)
|
50
|
+
end
|
51
|
+
|
52
|
+
public
|
53
|
+
def flush(events, final=false)
|
54
|
+
# Send the event over http.
|
55
|
+
request = Net::HTTP::Post.new(@uri.path)
|
56
|
+
request.body = events.inspect
|
57
|
+
request.add_field("Content-Type", 'application/json')
|
58
|
+
response = @client.request(request)
|
59
|
+
if response.is_a?(Net::HTTPSuccess)
|
60
|
+
@logger.debug("Event sent to Logmatic OK!")
|
61
|
+
else
|
62
|
+
@logger.warn("HTTP error", :error => response.error!)
|
63
|
+
end
|
64
|
+
end # def receive
|
65
|
+
end # class LogStash::Outputs::LogmaticBatch
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-output-logmatic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Giovanni CLEMENT
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-10-
|
12
|
+
date: 2015-10-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,6 +67,7 @@ files:
|
|
67
67
|
- NOTICE.TXT
|
68
68
|
- README.md
|
69
69
|
- lib/logstash/outputs/logmatic.rb
|
70
|
+
- lib/logstash/outputs/logmatic_https.rb
|
70
71
|
- logstash-output-logmatic.gemspec
|
71
72
|
- spec/outputs/logmatic.rb
|
72
73
|
homepage: ''
|