logstash-output-logmatic 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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: ''
|