logasm 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +15 -3
- data/lib/logasm/adapters/logstash_adapter/formatter.rb +2 -21
- data/lib/logasm/adapters/logstash_adapter.rb +0 -1
- data/lib/logasm/adapters/rabbitmq_adapter.rb +3 -5
- data/lib/logasm/utils.rb +35 -0
- data/lib/logasm.rb +2 -0
- data/logasm.gemspec +1 -2
- data/spec/adapters/logstash_adapter/formatter_spec.rb +12 -30
- data/spec/adapters/rabbitmq_adapter_spec.rb +19 -7
- data/spec/spec_helper.rb +9 -5
- data/spec/support/freddy_mock.rb +11 -0
- data/spec/utils_spec.rb +37 -0
- metadata +8 -20
- data/lib/logasm/adapters/rabbitmq_adapter/message_builder.rb +0 -22
- data/spec/adapters/rabbitmq_adapter/message_builder_spec.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 95ef4c8dd10a76b6775e23d3ed9788b8fd0c566e
|
4
|
+
data.tar.gz: c42a97f69f78953749d22008b8dd8dadab680ba8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 71b8cd77787497193c97508a269c0d538c3fd2a38a8940eaff94174f5918222ff3d59ec8f1fbb1cd7b1f7c90f1147ea08e776762f5919a1eeb20f005b74cd460
|
7
|
+
data.tar.gz: a766efc45eff5765e72353fc49c6680f31722e3bd81d710ceb0f64ef130901c8823349b6556f0bba3e33b07806e69cde3dd842937a621522b78d56af84961029
|
data/Gemfile.lock
CHANGED
@@ -1,17 +1,26 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
logasm (0.2.
|
4
|
+
logasm (0.2.2)
|
5
5
|
inflecto
|
6
|
-
logstash-event (~> 1.2)
|
7
6
|
|
8
7
|
GEM
|
9
8
|
remote: https://rubygems.org/
|
10
9
|
specs:
|
10
|
+
amq-protocol (2.0.0)
|
11
|
+
atomic (1.1.99)
|
12
|
+
bunny (1.6.3)
|
13
|
+
amq-protocol (>= 1.9.2)
|
11
14
|
coderay (1.1.0)
|
12
15
|
diff-lcs (1.2.5)
|
16
|
+
freddy (0.4.1)
|
17
|
+
bunny (= 1.6.3)
|
18
|
+
hamster (~> 1.0.1.pre.rc3)
|
19
|
+
symbolizer
|
20
|
+
thread (~> 0.2)
|
21
|
+
hamster (1.0.1.pre.rc3)
|
22
|
+
atomic (~> 1.1)
|
13
23
|
inflecto (0.0.2)
|
14
|
-
logstash-event (1.2.02)
|
15
24
|
method_source (0.8.2)
|
16
25
|
pry (0.10.1)
|
17
26
|
coderay (~> 1.1.0)
|
@@ -32,12 +41,15 @@ GEM
|
|
32
41
|
rspec-support (~> 3.3.0)
|
33
42
|
rspec-support (3.3.0)
|
34
43
|
slop (3.6.0)
|
44
|
+
symbolizer (0.0.1)
|
45
|
+
thread (0.2.2)
|
35
46
|
|
36
47
|
PLATFORMS
|
37
48
|
ruby
|
38
49
|
|
39
50
|
DEPENDENCIES
|
40
51
|
bundler (~> 1.3)
|
52
|
+
freddy (~> 0.4.1)
|
41
53
|
logasm!
|
42
54
|
pry
|
43
55
|
rake
|
@@ -2,33 +2,14 @@ class Logasm
|
|
2
2
|
module Adapters
|
3
3
|
class LogstashAdapter
|
4
4
|
class Formatter < ::Logger::Formatter
|
5
|
-
HOST = ::Socket.gethostname
|
6
|
-
|
7
5
|
def initialize(service_name)
|
8
6
|
@service_name = service_name
|
9
7
|
end
|
10
8
|
|
11
|
-
def call(
|
12
|
-
event = build_event(message,
|
9
|
+
def call(level, _time, _progname, message)
|
10
|
+
event = Utils.build_event(message, level, @service_name)
|
13
11
|
"#{event.to_json}\n"
|
14
12
|
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def build_event(metadata, level, time)
|
19
|
-
event = LogStash::Event.new(metadata.merge("@timestamp" => time))
|
20
|
-
|
21
|
-
event['application'] = @service_name if @service_name
|
22
|
-
event['level'] = level.downcase
|
23
|
-
event['host'] ||= HOST
|
24
|
-
|
25
|
-
# In case Time#to_json has been overridden
|
26
|
-
if event.timestamp.is_a?(Time)
|
27
|
-
event.timestamp = event.timestamp.iso8601(3)
|
28
|
-
end
|
29
|
-
|
30
|
-
event
|
31
|
-
end
|
32
13
|
end
|
33
14
|
end
|
34
15
|
end
|
@@ -7,8 +7,6 @@ rescue LoadError => e
|
|
7
7
|
raise exception
|
8
8
|
end
|
9
9
|
|
10
|
-
require_relative 'rabbitmq_adapter/message_builder'
|
11
|
-
|
12
10
|
class Logasm
|
13
11
|
module Adapters
|
14
12
|
class RabbitmqAdapter
|
@@ -16,18 +14,18 @@ class Logasm
|
|
16
14
|
|
17
15
|
CONFIGURATION_KEYS = [:host, :user, :pass, :port]
|
18
16
|
|
19
|
-
def initialize(level,
|
17
|
+
def initialize(level, service_name, arguments = {})
|
20
18
|
config = arguments.select { |key, value| CONFIGURATION_KEYS.include?(key) }
|
21
19
|
logger = Logger.new(STDOUT)
|
22
20
|
@queue = arguments.fetch(:queue, 'logstash-queue')
|
23
21
|
@level = level
|
24
|
-
@
|
22
|
+
@service_name = service_name
|
25
23
|
@freddy = Freddy.build(logger, config.merge({recover_from_connection_close: true}))
|
26
24
|
end
|
27
25
|
|
28
26
|
def log(level, metadata = {})
|
29
27
|
if meets_threshold?(level)
|
30
|
-
message =
|
28
|
+
message = Utils.build_event(metadata, level, @service_name)
|
31
29
|
deliver_message message
|
32
30
|
end
|
33
31
|
end
|
data/lib/logasm/utils.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'socket'
|
2
|
+
|
3
|
+
class Logasm
|
4
|
+
module Utils
|
5
|
+
HOST = ::Socket.gethostname
|
6
|
+
|
7
|
+
# Build logstash json compatible event
|
8
|
+
#
|
9
|
+
# @param [Hash] metadata
|
10
|
+
# @param [#to_s] level
|
11
|
+
# @param [String] service_name
|
12
|
+
#
|
13
|
+
# @return [Hash]
|
14
|
+
def self.build_event(metadata, level, service_name)
|
15
|
+
metadata.merge(
|
16
|
+
application: application_name(service_name),
|
17
|
+
level: level.to_s.downcase,
|
18
|
+
host: HOST,
|
19
|
+
:@timestamp => Time.now.utc.iso8601(3)
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Return application name
|
24
|
+
#
|
25
|
+
# Returns lower snake case application name. This allows the
|
26
|
+
# application value to be used in the elasticsearch index name.
|
27
|
+
#
|
28
|
+
# @param [String] service_name
|
29
|
+
#
|
30
|
+
# @return [String]
|
31
|
+
def self.application_name(service_name)
|
32
|
+
Inflecto.underscore(service_name)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/logasm.rb
CHANGED
data/logasm.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "logasm"
|
7
|
-
gem.version = '0.2.
|
7
|
+
gem.version = '0.2.2'
|
8
8
|
gem.authors = ["Salemove"]
|
9
9
|
gem.email = ["support@salemove.com"]
|
10
10
|
gem.description = %q{It's logasmic}
|
@@ -16,7 +16,6 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
17
|
gem.require_paths = ["lib"]
|
18
18
|
|
19
|
-
gem.add_dependency 'logstash-event', '~> 1.2'
|
20
19
|
gem.add_dependency 'inflecto'
|
21
20
|
|
22
21
|
gem.add_development_dependency "bundler", "~> 1.3"
|
@@ -2,37 +2,19 @@ require 'spec_helper'
|
|
2
2
|
require_relative '../../../lib/logasm/adapters/logstash_adapter/formatter'
|
3
3
|
|
4
4
|
describe Logasm::Adapters::LogstashAdapter::Formatter do
|
5
|
-
subject(:event) {
|
5
|
+
subject(:event) { formatter.call(severity, Time.now, nil, message) }
|
6
6
|
|
7
|
-
let(:formatter)
|
7
|
+
let(:formatter) { described_class.new(service_name) }
|
8
8
|
let(:service_name) { 'test_service' }
|
9
|
-
let(:severity)
|
10
|
-
let(:
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
context 'when service name is not present' do
|
20
|
-
let(:service_name) { nil }
|
21
|
-
|
22
|
-
it 'includes does not include the application key' do
|
23
|
-
expect(event).to_not have_key('application')
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'includes severity as lowercase level' do
|
28
|
-
expect(event['level']).to eq('info')
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'includes timestamp' do
|
32
|
-
expect(event['@timestamp']).to match(/\d{4}.*/)
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'includes the host' do
|
36
|
-
expect(event['host']).to be_a(String)
|
9
|
+
let(:severity) { 'INFO' }
|
10
|
+
let(:message) { {x: 'y'} }
|
11
|
+
|
12
|
+
it 'returns correct json' do
|
13
|
+
hash = JSON.parse(subject)
|
14
|
+
expect(hash['x']).to eq('y')
|
15
|
+
expect(hash['application']).to eq('test_service')
|
16
|
+
expect(hash['level']).to eq('info')
|
17
|
+
expect(hash['host']).to be_a(String)
|
18
|
+
expect(hash['@timestamp']).to match(/\d{4}-\d{2}-\d{2}T.*/)
|
37
19
|
end
|
38
20
|
end
|
@@ -2,21 +2,33 @@ require 'spec_helper'
|
|
2
2
|
require_relative '../../lib/logasm/adapters/rabbitmq_adapter'
|
3
3
|
|
4
4
|
describe Logasm::Adapters::RabbitmqAdapter do
|
5
|
-
let(:adapter)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
let(:adapter) do
|
6
|
+
described_class.new(log_level, 'TestService', {
|
7
|
+
host: 'localhost', user: 'guest', pass: 'guest', port: '5672'
|
8
|
+
})
|
9
|
+
end
|
10
10
|
let(:freddy) { adapter.freddy }
|
11
11
|
|
12
|
+
before do
|
13
|
+
allow(Freddy).to receive(:build) { FreddyMock.new }
|
14
|
+
end
|
15
|
+
|
12
16
|
describe '#log' do
|
13
17
|
context 'when logging a message' do
|
14
18
|
let(:log_level) { 0 }
|
15
19
|
|
16
20
|
it 'delegates to freddy' do
|
17
|
-
expect(freddy).to receive(:deliver)
|
18
|
-
|
19
21
|
adapter.log :info, message: 'test'
|
22
|
+
|
23
|
+
expect(freddy.deliveries.size).to eq(1)
|
24
|
+
|
25
|
+
queue, event = freddy.deliveries[0]
|
26
|
+
expect(queue).to eq('logstash-queue')
|
27
|
+
expect(event[:message]).to eq('test')
|
28
|
+
expect(event[:application]).to eq('test_service')
|
29
|
+
expect(event[:level]).to eq('info')
|
30
|
+
expect(event[:host]).to be_a(String)
|
31
|
+
expect(event[:@timestamp]).to match(/\d{4}-\d{2}-\d{2}T.*/)
|
20
32
|
end
|
21
33
|
end
|
22
34
|
|
data/spec/spec_helper.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
require 'pry'
|
4
|
+
Bundler.setup
|
5
|
+
|
6
|
+
require 'logasm'
|
7
|
+
|
8
|
+
Dir[File.dirname(__FILE__) + '/support/*.rb'].each {|f| require f}
|
9
|
+
|
1
10
|
RSpec.configure do |config|
|
2
11
|
config.run_all_when_everything_filtered = true
|
3
12
|
config.filter_run :focus
|
4
13
|
config.order = 'random'
|
5
14
|
end
|
6
|
-
|
7
|
-
require 'pry'
|
8
|
-
require 'securerandom'
|
9
|
-
|
10
|
-
require 'logasm'
|
data/spec/utils_spec.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Logasm::Utils do
|
4
|
+
describe '.build_event' do
|
5
|
+
subject(:event) { described_class.build_event(metadata, level, service_name) }
|
6
|
+
|
7
|
+
let(:service_name) { 'test_service' }
|
8
|
+
let(:level) { 'INFO' }
|
9
|
+
let(:metadata) { {x: 'y'} }
|
10
|
+
|
11
|
+
context 'when service name is in correct format' do
|
12
|
+
it 'includes it in the event as application' do
|
13
|
+
expect(event[:application]).to eq('test_service')
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context 'when service name is in camelcase' do
|
18
|
+
let(:service_name) { 'InformationService' }
|
19
|
+
|
20
|
+
it 'includes it in the event as lower snake case' do
|
21
|
+
expect(event[:application]).to eq('information_service')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'includes level as a lower case string' do
|
26
|
+
expect(event[:level]).to eq('info')
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'includes timestamp' do
|
30
|
+
expect(event[:@timestamp]).to match(/\d{4}.*/)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'includes the host' do
|
34
|
+
expect(event[:host]).to be_a(String)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logasm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Salemove
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: logstash-event
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.2'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.2'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: inflecto
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,16 +86,17 @@ files:
|
|
100
86
|
- lib/logasm/adapters/logstash_adapter.rb
|
101
87
|
- lib/logasm/adapters/logstash_adapter/formatter.rb
|
102
88
|
- lib/logasm/adapters/rabbitmq_adapter.rb
|
103
|
-
- lib/logasm/adapters/rabbitmq_adapter/message_builder.rb
|
104
89
|
- lib/logasm/adapters/stdout_adapter.rb
|
90
|
+
- lib/logasm/utils.rb
|
105
91
|
- logasm.gemspec
|
106
92
|
- spec/adapters/logstash_adapter/formatter_spec.rb
|
107
93
|
- spec/adapters/logstash_adapter_spec.rb
|
108
|
-
- spec/adapters/rabbitmq_adapter/message_builder_spec.rb
|
109
94
|
- spec/adapters/rabbitmq_adapter_spec.rb
|
110
95
|
- spec/adapters/stdout_adapter_spec.rb
|
111
96
|
- spec/logasm_spec.rb
|
112
97
|
- spec/spec_helper.rb
|
98
|
+
- spec/support/freddy_mock.rb
|
99
|
+
- spec/utils_spec.rb
|
113
100
|
homepage:
|
114
101
|
licenses:
|
115
102
|
- MIT
|
@@ -130,15 +117,16 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
130
117
|
version: '0'
|
131
118
|
requirements: []
|
132
119
|
rubyforge_project:
|
133
|
-
rubygems_version: 2.4.
|
120
|
+
rubygems_version: 2.4.5.1
|
134
121
|
signing_key:
|
135
122
|
specification_version: 4
|
136
123
|
summary: What description said
|
137
124
|
test_files:
|
138
125
|
- spec/adapters/logstash_adapter/formatter_spec.rb
|
139
126
|
- spec/adapters/logstash_adapter_spec.rb
|
140
|
-
- spec/adapters/rabbitmq_adapter/message_builder_spec.rb
|
141
127
|
- spec/adapters/rabbitmq_adapter_spec.rb
|
142
128
|
- spec/adapters/stdout_adapter_spec.rb
|
143
129
|
- spec/logasm_spec.rb
|
144
130
|
- spec/spec_helper.rb
|
131
|
+
- spec/support/freddy_mock.rb
|
132
|
+
- spec/utils_spec.rb
|
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'socket'
|
2
|
-
|
3
|
-
class Logasm
|
4
|
-
module Adapters
|
5
|
-
class RabbitmqAdapter
|
6
|
-
class MessageBuilder
|
7
|
-
HOST = ::Socket.gethostname
|
8
|
-
|
9
|
-
def initialize(service_name)
|
10
|
-
@service_name = service_name
|
11
|
-
end
|
12
|
-
|
13
|
-
def build_message(metadata, level)
|
14
|
-
metadata.merge({ application: @service_name,
|
15
|
-
level: level,
|
16
|
-
host: HOST,
|
17
|
-
:@timestamp => Time.now.utc.iso8601(3) })
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require_relative '../../../lib/logasm/adapters/rabbitmq_adapter/message_builder'
|
3
|
-
|
4
|
-
describe Logasm::Adapters::RabbitmqAdapter::MessageBuilder do
|
5
|
-
subject { message_builder.build_message(metadata, level) }
|
6
|
-
|
7
|
-
let(:message_builder) { described_class.new(service_name) }
|
8
|
-
let(:service_name) { 'test_service' }
|
9
|
-
let(:level) { :info }
|
10
|
-
let(:metadata) { {message: 'test'} }
|
11
|
-
|
12
|
-
it 'adds necessary arguments' do
|
13
|
-
expect(subject[:message]).to eq(metadata[:message])
|
14
|
-
expect(subject[:application]).to eq(service_name)
|
15
|
-
expect(subject[:level]).to eq(level)
|
16
|
-
expect(subject).to have_key(:host)
|
17
|
-
expect(subject).to have_key(:@timestamp)
|
18
|
-
end
|
19
|
-
end
|