resurfaceio-logger 1.7.5
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/lib/resurfaceio/all.rb +35 -0
- data/lib/resurfaceio/base_logger.rb +104 -0
- data/lib/resurfaceio/http_logger.rb +89 -0
- data/lib/resurfaceio/http_logger_for_rack.rb +32 -0
- data/lib/resurfaceio/http_logger_for_rails.rb +17 -0
- data/lib/resurfaceio/http_request_impl.rb +42 -0
- data/lib/resurfaceio/http_response_impl.rb +41 -0
- data/lib/resurfaceio/usage_loggers.rb +30 -0
- metadata +108 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3e0ed89c6f3304584c60bb686d5c20de7f0cd341
|
4
|
+
data.tar.gz: 32d7eef540733c228600ef0868160be0a2f83f5f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d527e29d631b95cf34831079fefb95b52cf5c40e0d2b40d249c47a10aa8606b3d6b7be588878d318446fa7192be0203312a6633838b4a4e3c7321c096f52fc17
|
7
|
+
data.tar.gz: 95942bc79f0877a8ff7e5d6f07d4390d4cc492f1f8b69f197cab4e07d5da3a5066fd578a860382c6d869b0d8d8cbe6f36c097f9dd00991c43c91e19dff6c0c01
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# © 2016-2017 Resurface Labs LLC
|
3
|
+
|
4
|
+
require 'resurfaceio/base_logger'
|
5
|
+
require 'resurfaceio/http_logger'
|
6
|
+
require 'resurfaceio/http_logger_for_rack'
|
7
|
+
require 'resurfaceio/http_logger_for_rails'
|
8
|
+
require 'resurfaceio/http_request_impl'
|
9
|
+
require 'resurfaceio/http_response_impl'
|
10
|
+
require 'resurfaceio/usage_loggers'
|
11
|
+
|
12
|
+
module Resurfaceio
|
13
|
+
|
14
|
+
class BaseLogger < HttpLogger
|
15
|
+
end
|
16
|
+
|
17
|
+
class HttpLogger < HttpLogger
|
18
|
+
end
|
19
|
+
|
20
|
+
class HttpLoggerForRack < HttpLoggerForRack
|
21
|
+
end
|
22
|
+
|
23
|
+
class HttpLoggerForRails < HttpLoggerForRails
|
24
|
+
end
|
25
|
+
|
26
|
+
class HttpRequestImpl < HttpRequestImpl
|
27
|
+
end
|
28
|
+
|
29
|
+
class HttpResponseImpl < HttpResponseImpl
|
30
|
+
end
|
31
|
+
|
32
|
+
class UsageLoggers < UsageLoggers
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# © 2016-2017 Resurface Labs LLC
|
3
|
+
|
4
|
+
require 'uri'
|
5
|
+
require 'net/http'
|
6
|
+
require 'net/https'
|
7
|
+
require 'resurfaceio/usage_loggers'
|
8
|
+
|
9
|
+
class BaseLogger
|
10
|
+
|
11
|
+
def initialize(agent, options={})
|
12
|
+
@agent = agent
|
13
|
+
@version = BaseLogger.version_lookup
|
14
|
+
|
15
|
+
# set options in priority order
|
16
|
+
if options.respond_to?(:fetch) && options.respond_to?(:has_key?)
|
17
|
+
@enabled = options.fetch(:enabled, true)
|
18
|
+
if options.has_key?(:queue)
|
19
|
+
@queue = options[:queue]
|
20
|
+
elsif options.has_key?(:url)
|
21
|
+
url = options[:url]
|
22
|
+
if url.nil?
|
23
|
+
@url = UsageLoggers.url_by_default
|
24
|
+
elsif url.eql?('DEMO')
|
25
|
+
@url = UsageLoggers.url_for_demo
|
26
|
+
else
|
27
|
+
@url = url
|
28
|
+
end
|
29
|
+
@enabled = false if url.nil?
|
30
|
+
else
|
31
|
+
@url = UsageLoggers.url_by_default
|
32
|
+
@enabled = false if @url.nil?
|
33
|
+
end
|
34
|
+
elsif options.respond_to?(:to_s)
|
35
|
+
@url = options.to_s
|
36
|
+
@enabled = @url.nil? ? false : true
|
37
|
+
else
|
38
|
+
@enabled = false
|
39
|
+
end
|
40
|
+
|
41
|
+
# validate url when present
|
42
|
+
unless @url.nil?
|
43
|
+
begin
|
44
|
+
raise Exception unless URI.parse(@url).scheme.include?('http')
|
45
|
+
rescue Exception
|
46
|
+
@url = nil
|
47
|
+
@enabled = false
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def agent
|
53
|
+
@agent
|
54
|
+
end
|
55
|
+
|
56
|
+
def disable
|
57
|
+
@enabled = false
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
def enable
|
62
|
+
@enabled = true unless @queue.nil? && @url.nil?
|
63
|
+
self
|
64
|
+
end
|
65
|
+
|
66
|
+
def enabled?
|
67
|
+
@enabled && UsageLoggers.enabled?
|
68
|
+
end
|
69
|
+
|
70
|
+
def submit(json)
|
71
|
+
if !enabled?
|
72
|
+
true
|
73
|
+
elsif @queue
|
74
|
+
@queue << json
|
75
|
+
true
|
76
|
+
else
|
77
|
+
begin
|
78
|
+
@url_parsed ||= URI.parse(@url)
|
79
|
+
@url_connection ||= Net::HTTP.new(@url_parsed.host, @url_parsed.port)
|
80
|
+
@url_connection.use_ssl = @url.include?('https')
|
81
|
+
request = Net::HTTP::Post.new(@url_parsed.path)
|
82
|
+
request.body = json
|
83
|
+
response = @url_connection.request(request)
|
84
|
+
response.code.to_i == 200
|
85
|
+
rescue SocketError
|
86
|
+
@url_connection = nil
|
87
|
+
false
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def url
|
93
|
+
@url
|
94
|
+
end
|
95
|
+
|
96
|
+
def version
|
97
|
+
@version
|
98
|
+
end
|
99
|
+
|
100
|
+
def self.version_lookup
|
101
|
+
Gem.loaded_specs['resurfaceio-logger'].version.to_s
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# © 2016-2017 Resurface Labs LLC
|
3
|
+
|
4
|
+
require 'json'
|
5
|
+
require 'resurfaceio/base_logger'
|
6
|
+
|
7
|
+
class HttpLogger < BaseLogger
|
8
|
+
|
9
|
+
AGENT = 'http_logger.rb'
|
10
|
+
|
11
|
+
def initialize(options={})
|
12
|
+
super(AGENT, options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def format(request, request_body, response, response_body, now=Time.now.to_i.to_s)
|
16
|
+
message = []
|
17
|
+
append_value message, 'request_method', request.request_method
|
18
|
+
append_value message, 'request_url', request.url
|
19
|
+
append_value message, 'response_code', response.status
|
20
|
+
append_request_headers message, request
|
21
|
+
append_response_headers message, response
|
22
|
+
append_value message, 'request_body', request_body.nil? ? request.body : request_body
|
23
|
+
append_value message, 'response_body', response_body.nil? ? response.body : response_body
|
24
|
+
message << ['agent', @agent]
|
25
|
+
message << ['version', @version]
|
26
|
+
message << ['now', now]
|
27
|
+
JSON.generate message
|
28
|
+
end
|
29
|
+
|
30
|
+
def log(request, request_body, response, response_body)
|
31
|
+
!enabled? || submit(format(request, request_body, response, response_body))
|
32
|
+
end
|
33
|
+
|
34
|
+
protected
|
35
|
+
|
36
|
+
def append_request_headers(message, request)
|
37
|
+
respond_to_env = request.respond_to?(:env)
|
38
|
+
if respond_to_env || request.respond_to?(:headers)
|
39
|
+
headers = respond_to_env ? request.env : request.headers
|
40
|
+
headers.each do |name, value|
|
41
|
+
unless value.nil?
|
42
|
+
if name =~ /^CONTENT_TYPE/
|
43
|
+
message << ['request_header.content-type', value]
|
44
|
+
end
|
45
|
+
if name =~ /^HTTP_/
|
46
|
+
message << ["request_header.#{name[5..-1].downcase.tr('_', '-')}", value]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def append_response_headers(message, response)
|
54
|
+
found_content_type = false
|
55
|
+
if response.respond_to?(:headers)
|
56
|
+
response.headers.each do |name, value|
|
57
|
+
unless value.nil?
|
58
|
+
name = name.downcase
|
59
|
+
found_content_type = true if name =~ /^content-type/
|
60
|
+
message << ["response_header.#{name}", value]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
unless found_content_type || response.content_type.nil?
|
65
|
+
message << ['response_header.content-type', response.content_type]
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def append_value(message, key, value=nil)
|
70
|
+
unless key.nil?
|
71
|
+
unless value.nil?
|
72
|
+
case value
|
73
|
+
when Array
|
74
|
+
message << [key, value.join]
|
75
|
+
when String
|
76
|
+
message << [key, value]
|
77
|
+
else
|
78
|
+
if value.respond_to?(:read)
|
79
|
+
message << [key, value.read]
|
80
|
+
else
|
81
|
+
message << [key, value.to_s]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
message
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# © 2016-2017 Resurface Labs LLC
|
3
|
+
|
4
|
+
require 'rack'
|
5
|
+
require 'resurfaceio/http_logger'
|
6
|
+
|
7
|
+
class HttpLoggerForRack # http://rack.rubyforge.org/doc/SPEC.html
|
8
|
+
|
9
|
+
def initialize(app, options={})
|
10
|
+
@app = app
|
11
|
+
@logger = HttpLogger.new(options)
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
status, headers, body = @app.call(env)
|
16
|
+
if @logger.enabled? && status == 200
|
17
|
+
response = Rack::Response.new(body, status, headers)
|
18
|
+
if string_content_type?(response.content_type)
|
19
|
+
request = Rack::Request.new(env)
|
20
|
+
@logger.log(request, nil, response, nil)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
[status, headers, body]
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
def string_content_type?(s)
|
29
|
+
!s.nil? && s =~ /^(text\/(html|plain|xml))|(application\/(json|soap|xml|x-www-form-urlencoded))/i
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# © 2016-2017 Resurface Labs LLC
|
3
|
+
|
4
|
+
require 'resurfaceio/http_logger'
|
5
|
+
|
6
|
+
class HttpLoggerForRails
|
7
|
+
|
8
|
+
def initialize(options={})
|
9
|
+
@logger = HttpLogger.new(options)
|
10
|
+
end
|
11
|
+
|
12
|
+
def around(controller)
|
13
|
+
yield
|
14
|
+
@logger.log(controller.request, nil, controller.response, nil)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# © 2016-2017 Resurface Labs LLC
|
3
|
+
|
4
|
+
class HttpRequestImpl
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@headers = Hash.new
|
8
|
+
@raw_body = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_header(key, value)
|
12
|
+
unless value.nil?
|
13
|
+
existing = @headers[key]
|
14
|
+
if existing.nil?
|
15
|
+
@headers[key] = value
|
16
|
+
else
|
17
|
+
@headers[key] = "#{existing}, #{value}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def body
|
23
|
+
@raw_body ? StringIO.new(@raw_body) : nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def content_type
|
27
|
+
@headers['CONTENT_TYPE']
|
28
|
+
end
|
29
|
+
|
30
|
+
def content_type=(content_type)
|
31
|
+
@headers['CONTENT_TYPE'] = content_type
|
32
|
+
end
|
33
|
+
|
34
|
+
def headers
|
35
|
+
@headers
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_accessor :raw_body
|
39
|
+
attr_accessor :request_method
|
40
|
+
attr_accessor :url
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# © 2016-2017 Resurface Labs LLC
|
3
|
+
|
4
|
+
class HttpResponseImpl
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@headers = Hash.new
|
8
|
+
@raw_body = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_header(key, value)
|
12
|
+
unless value.nil?
|
13
|
+
existing = @headers[key]
|
14
|
+
if existing.nil?
|
15
|
+
@headers[key] = value
|
16
|
+
else
|
17
|
+
@headers[key] = "#{existing}, #{value}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def body
|
23
|
+
@raw_body ? [@raw_body] : nil
|
24
|
+
end
|
25
|
+
|
26
|
+
def content_type
|
27
|
+
@headers['Content-Type']
|
28
|
+
end
|
29
|
+
|
30
|
+
def content_type=(content_type)
|
31
|
+
@headers['Content-Type'] = content_type
|
32
|
+
end
|
33
|
+
|
34
|
+
def headers
|
35
|
+
@headers
|
36
|
+
end
|
37
|
+
|
38
|
+
attr_accessor :raw_body
|
39
|
+
attr_accessor :status
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
# © 2016-2017 Resurface Labs LLC
|
3
|
+
|
4
|
+
class UsageLoggers
|
5
|
+
|
6
|
+
@@DISABLED = 'true'.eql?(ENV['USAGE_LOGGERS_DISABLE'])
|
7
|
+
|
8
|
+
@@disabled = @@DISABLED
|
9
|
+
|
10
|
+
def self.disable
|
11
|
+
@@disabled = true
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.enable
|
15
|
+
@@disabled = false unless @@DISABLED
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.enabled?
|
19
|
+
!@@disabled
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.url_by_default
|
23
|
+
ENV['USAGE_LOGGERS_URL']
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.url_for_demo
|
27
|
+
'https://demo-resurfaceio.herokuapp.com/messages'
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,108 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: resurfaceio-logger
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.7.5
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- RobDickinson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-05-19 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: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rack
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
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
|
+
description: Library for usage logging
|
70
|
+
email:
|
71
|
+
- resurfacelabs@gmail.com
|
72
|
+
executables: []
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- lib/resurfaceio/all.rb
|
77
|
+
- lib/resurfaceio/base_logger.rb
|
78
|
+
- lib/resurfaceio/http_logger.rb
|
79
|
+
- lib/resurfaceio/http_logger_for_rack.rb
|
80
|
+
- lib/resurfaceio/http_logger_for_rails.rb
|
81
|
+
- lib/resurfaceio/http_request_impl.rb
|
82
|
+
- lib/resurfaceio/http_response_impl.rb
|
83
|
+
- lib/resurfaceio/usage_loggers.rb
|
84
|
+
homepage: https://github.com/resurfaceio/logger-ruby
|
85
|
+
licenses:
|
86
|
+
- Apache-2.0
|
87
|
+
metadata: {}
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options: []
|
90
|
+
require_paths:
|
91
|
+
- lib
|
92
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '2.2'
|
97
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
requirements: []
|
103
|
+
rubyforge_project:
|
104
|
+
rubygems_version: 2.6.11
|
105
|
+
signing_key:
|
106
|
+
specification_version: 4
|
107
|
+
summary: Library for usage logging
|
108
|
+
test_files: []
|