logstash-output-stackify 1.0.0
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 +7 -0
- data/Gemfile +3 -0
- data/README.md +2 -0
- data/lib/logstash/outputs/stackify.rb +184 -0
- data/logstash-output-stackify.gemspec +25 -0
- metadata +99 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9b2320f9ea79745878a8cbc29761a30f1b1c545d9566ae3a3ddc55b4fc218401
|
4
|
+
data.tar.gz: 604531df1db73e71429b7e19f4bf319caa96742fd0f5f3f6a4b19dbea73345c6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 521ae011b795fbe0b6e430fa38bbb855703ac7b4f1a8c603a6adf720794669f3ed86353e9ba990706462cb326efca591e212e6496717b749e3c15190a062137e
|
7
|
+
data.tar.gz: 458ec4060d1a30b0956cea9a1ee1d37f5c1cd32f4d90af730d7087470f52afe61568e3109e870f70c2c41aabd1f510c3ba352f7788b3692f87f8e910e3528226
|
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,184 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'date'
|
3
|
+
require 'socket'
|
4
|
+
require 'json'
|
5
|
+
require 'uri'
|
6
|
+
require "net/http"
|
7
|
+
require "net/https"
|
8
|
+
require "logstash/outputs/base"
|
9
|
+
require "logstash/namespace"
|
10
|
+
|
11
|
+
# An example output that does nothing.
|
12
|
+
class LogStash::Outputs::Stackify < LogStash::Outputs::Base
|
13
|
+
config_name "stackify"
|
14
|
+
|
15
|
+
# activation key
|
16
|
+
config :key, :validate => :string, :required => true
|
17
|
+
|
18
|
+
# default env_name
|
19
|
+
config :default_env_name, :validate => :string, :required => false, :default => 'Production'
|
20
|
+
|
21
|
+
# default app_name
|
22
|
+
config :default_app_name, :validate => :string, :required => false, :default => 'Logstash'
|
23
|
+
|
24
|
+
# environment name field
|
25
|
+
config :env_name_field, :validate => :string, :required => false, :default => nil
|
26
|
+
|
27
|
+
# server name field
|
28
|
+
config :server_name_field, :validate => :string, :required => false, :default => nil
|
29
|
+
|
30
|
+
# application name field
|
31
|
+
config :app_name_field, :validate => :string, :required => false, :default => nil
|
32
|
+
|
33
|
+
# log level field
|
34
|
+
config :level_field, :validate => :string, :required => false, :default => nil
|
35
|
+
|
36
|
+
# event field to use for message
|
37
|
+
config :message_field, :validate => :string, :required => false, :default => 'message'
|
38
|
+
|
39
|
+
public
|
40
|
+
|
41
|
+
def register
|
42
|
+
end
|
43
|
+
|
44
|
+
# def register
|
45
|
+
|
46
|
+
public
|
47
|
+
|
48
|
+
def multi_receive(events)
|
49
|
+
|
50
|
+
begin
|
51
|
+
|
52
|
+
default_level = 'info'
|
53
|
+
default_servername = Socket.gethostname
|
54
|
+
log_msg_groups = Hash.new
|
55
|
+
|
56
|
+
events.each do |event|
|
57
|
+
|
58
|
+
begin
|
59
|
+
|
60
|
+
# message
|
61
|
+
default_message = event.get('message')
|
62
|
+
message = default_message
|
63
|
+
unless @message_field.nil?
|
64
|
+
message = event.get(@message_field.to_s)
|
65
|
+
if message.nil? || message.empty?
|
66
|
+
message = default_message
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# level
|
71
|
+
level = default_level
|
72
|
+
unless @level_field.nil?
|
73
|
+
level = event.get(@level_field.to_s)
|
74
|
+
if level.nil? || level.empty?
|
75
|
+
level = default_level
|
76
|
+
end
|
77
|
+
end
|
78
|
+
level = level.downcase
|
79
|
+
if level != 'debug' && level != 'info' && level != 'warn' && level != 'error'
|
80
|
+
$stdout.write('Invalid level defined: ' + level.to_s)
|
81
|
+
level = default_level
|
82
|
+
end
|
83
|
+
|
84
|
+
# application name
|
85
|
+
app_name = @default_app_name.to_s
|
86
|
+
unless @app_name_field.nil?
|
87
|
+
app_name = event.get(@app_name_field.to_s)
|
88
|
+
if app_name.nil? || app_name.empty?
|
89
|
+
app_name = @default_app_name.to_s
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# env name
|
94
|
+
env_name = @default_env_name.to_s
|
95
|
+
unless @env_name_field.nil?
|
96
|
+
env_name = event.get(@env_name_field.to_s)
|
97
|
+
if env_name.nil? || env_name.empty?
|
98
|
+
env_name = @default_env_name.to_s
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# server name
|
103
|
+
server_name = default_servername
|
104
|
+
unless @server_name_field.nil?
|
105
|
+
server_name = event.get(@server_name_field.to_s)
|
106
|
+
if server_name.nil? || server_name.empty?
|
107
|
+
server_name = default_servername
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
# timestamp
|
112
|
+
timestamp = nil
|
113
|
+
begin
|
114
|
+
timestamp = (event.get('@timestamp').to_f * 1000).to_i
|
115
|
+
rescue StandardError => e
|
116
|
+
$stdout.write('Error parsing @timestamp: ' + e.to_s)
|
117
|
+
end
|
118
|
+
if timestamp.nil?
|
119
|
+
timestamp = DateTime.now.strftime('%Q')
|
120
|
+
end
|
121
|
+
|
122
|
+
# generate key
|
123
|
+
log_msg_group_key = app_name + '|' + env_name + '|' + server_name
|
124
|
+
|
125
|
+
# setup log msg group if needed
|
126
|
+
unless log_msg_groups.key?(log_msg_group_key)
|
127
|
+
log_msg_group = Hash.new
|
128
|
+
log_msg_group['Env'] = env_name
|
129
|
+
log_msg_group['ServerName'] = server_name
|
130
|
+
log_msg_group['AppName'] = app_name
|
131
|
+
log_msg_group['Logger'] = 'Logstash'
|
132
|
+
log_msg_group['Platform'] = 'Logstash'
|
133
|
+
log_msg_group['Msgs'] = Array.new
|
134
|
+
log_msg_groups[log_msg_group_key] = log_msg_group
|
135
|
+
end
|
136
|
+
|
137
|
+
# generate log msg
|
138
|
+
log_msg = Hash.new
|
139
|
+
log_msg['Msg'] = message
|
140
|
+
log_msg['EpochMs'] = timestamp
|
141
|
+
log_msg['Level'] = level
|
142
|
+
|
143
|
+
# add to log msg group
|
144
|
+
log_msg_groups[log_msg_group_key]['Msgs'].push(log_msg)
|
145
|
+
|
146
|
+
rescue StandardError => e
|
147
|
+
$stdout.write(e.to_s)
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|
151
|
+
|
152
|
+
# post
|
153
|
+
log_msg_groups.each do |key, log_msg_group|
|
154
|
+
|
155
|
+
begin
|
156
|
+
|
157
|
+
data = log_msg_group.to_json
|
158
|
+
header = {
|
159
|
+
'Content-Type' => 'application/json',
|
160
|
+
'Accept' => 'appliation/json',
|
161
|
+
'X-Stackify-PV' => 'V1',
|
162
|
+
'X-Stackify-Key' => @key.to_s
|
163
|
+
}
|
164
|
+
|
165
|
+
|
166
|
+
uri = URI.parse('https://api.stackify.com/Log/Save')
|
167
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
168
|
+
https.use_ssl = true
|
169
|
+
req = Net::HTTP::Post.new(uri.path, initheader = header)
|
170
|
+
req.body = data
|
171
|
+
https.request(req)
|
172
|
+
|
173
|
+
rescue StandardError => e
|
174
|
+
$stdout.write(e.to_s)
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
rescue StandardError => e
|
180
|
+
$stdout.write(e.to_s)
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
184
|
+
end # class LogStash::Outputs::Stackify
|
@@ -0,0 +1,25 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'logstash-output-stackify'
|
3
|
+
s.version = '1.0.0'
|
4
|
+
s.licenses = ['Apache License (2.0)']
|
5
|
+
s.summary = "Sends logs to Stackify"
|
6
|
+
s.description = "This gem is a Logstash plugin required to be installed on top of the Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This gem is not a stand-alone program"
|
7
|
+
s.authors = ["Stackify"]
|
8
|
+
s.email = "support@stackify.com"
|
9
|
+
s.homepage = "https://www.stackify.com"
|
10
|
+
s.require_paths = ["lib"]
|
11
|
+
|
12
|
+
# Files
|
13
|
+
s.files = Dir['lib/**/*','spec/**/*','vendor/**/*','*.gemspec','*.md','CONTRIBUTORS','Gemfile','LICENSE','NOTICE.TXT']
|
14
|
+
# Tests
|
15
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
16
|
+
|
17
|
+
# Special flag to let us know this is actually a logstash plugin
|
18
|
+
s.metadata = { "logstash_plugin" => "true", "logstash_group" => "output" }
|
19
|
+
|
20
|
+
# Gem dependencies
|
21
|
+
#
|
22
|
+
s.add_runtime_dependency "logstash-core-plugin-api", ">= 1.60", "<= 2.99"
|
23
|
+
s.add_runtime_dependency "logstash-codec-plain"
|
24
|
+
s.add_development_dependency 'logstash-devutils'
|
25
|
+
end
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: logstash-output-stackify
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Stackify
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-04-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
15
|
+
requirements:
|
16
|
+
- - ">="
|
17
|
+
- !ruby/object:Gem::Version
|
18
|
+
version: '1.60'
|
19
|
+
- - "<="
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '2.99'
|
22
|
+
name: logstash-core-plugin-api
|
23
|
+
prerelease: false
|
24
|
+
type: :runtime
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.60'
|
30
|
+
- - "<="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '2.99'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
name: logstash-codec-plain
|
40
|
+
prerelease: false
|
41
|
+
type: :runtime
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
name: logstash-devutils
|
54
|
+
prerelease: false
|
55
|
+
type: :development
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '0'
|
61
|
+
description: This gem is a Logstash plugin required to be installed on top of the
|
62
|
+
Logstash core pipeline using $LS_HOME/bin/logstash-plugin install gemname. This
|
63
|
+
gem is not a stand-alone program
|
64
|
+
email: support@stackify.com
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- Gemfile
|
70
|
+
- README.md
|
71
|
+
- lib/logstash/outputs/stackify.rb
|
72
|
+
- logstash-output-stackify.gemspec
|
73
|
+
homepage: https://www.stackify.com
|
74
|
+
licenses:
|
75
|
+
- Apache License (2.0)
|
76
|
+
metadata:
|
77
|
+
logstash_plugin: 'true'
|
78
|
+
logstash_group: output
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 2.7.6
|
96
|
+
signing_key:
|
97
|
+
specification_version: 4
|
98
|
+
summary: Sends logs to Stackify
|
99
|
+
test_files: []
|