zgcp_toolkit 0.1.0 → 1.2.1
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 +10 -21
- data/lib/zgcp_toolkit.rb +1 -1
- data/lib/zgcp_toolkit/formatter/request.rb +101 -0
- data/lib/zgcp_toolkit/generators/templates/zgcp_toolkit.rb +0 -6
- data/lib/zgcp_toolkit/logger.rb +40 -46
- data/lib/zgcp_toolkit/logger/google_cloud_logging.rb +2 -0
- data/lib/zgcp_toolkit/version.rb +1 -1
- data/zgcp_toolkit.gemspec +1 -0
- metadata +18 -4
- data/lib/zgcp_toolkit/rake/task.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 168a4db3ef4d6631232d6bb44c475f5a558ab7f0b10072d844cc3af903e252fd
|
4
|
+
data.tar.gz: a5202f7d5495c03e8586a42c8daeff3fe3c5e8dde350e4968eaa3904aabf137b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e31981e2f9315f24d8bf1c48824ebc39e2495cf060b09feb7ec9e3daa76bfb96b594a073a4868e13b30df0ae7d793ac5c3b113aa55946552cc1126c3a0a4023f
|
7
|
+
data.tar.gz: c1d648d261f8f9571ad2e396110ffb58803158f2f8f88bda66cbcf4e9ac24cb3dfa43d6df857ca60861f276f1b6d8037b195bf79762ab04a3df1bb6202d45e45
|
data/README.md
CHANGED
@@ -22,7 +22,6 @@ Next, you need to run the generator:
|
|
22
22
|
$ rails generate zgcp_toolkit
|
23
23
|
|
24
24
|
## Logger
|
25
|
-
Each rake task will have its own log file in Cloud Logging. The log file name on Cloud Logging are combined from the rake task `namespace`s and `task name`. The rake task also be able to access the logger object.
|
26
25
|
|
27
26
|
Unexpected errors in rake tasks are caught automatically & write to a log file in Cloud Logging. And, by default, when GCP Toolkit caught an unexpected error, it push a key & value (key: `push_slack` with value: `true`) in Cloud Logging Log `jsonPayload` so that the log that should be sent on Slack can be filtered.
|
28
27
|
|
@@ -30,36 +29,26 @@ Unexpected errors in rake tasks are caught automatically & write to a log file i
|
|
30
29
|
|
31
30
|
```ruby
|
32
31
|
namespace :tcv_transactions do
|
33
|
-
task :daily_import
|
34
|
-
|
35
|
-
|
36
|
-
|
32
|
+
task :daily_import
|
33
|
+
ZgcpToolkit::Logger.create(:log_name) do |logger|
|
34
|
+
logger.info("Heyyyyyy!") # You can log anything to console, also google cloud logging
|
35
|
+
Bug.last
|
36
|
+
end
|
37
37
|
end
|
38
38
|
end
|
39
39
|
```
|
40
40
|
|
41
41
|
```ruby
|
42
|
-
logger = ZgcpToolkit::Logger.new(:
|
42
|
+
logger = ZgcpToolkit::Logger.new(:log_name)
|
43
43
|
logger.info("Heyyyyyy!")
|
44
44
|
logger.error(message: "Heyyyyy!", backtrace: ["line-1", "line-2"])
|
45
|
-
logger.error(message: "Hello Bug !!", backtrace: ["line-1", "line-2"]
|
45
|
+
logger.error(message: "Hello Bug !!", backtrace: ["line-1", "line-2"])
|
46
46
|
logger.warn("Hey hey nyc!")
|
47
47
|
```
|
48
48
|
|
49
|
-
- Set `send_unexpected_error_to_slack` to `false` will delete `push_slack` key from unexpected error log.
|
50
|
-
|
51
|
-
```ruby
|
52
|
-
namespace :test_log do
|
53
|
-
task do: :environment do |args, logger:|
|
54
|
-
logger.send_unexpected_error_to_slack = false
|
55
|
-
raise 'errors'
|
56
|
-
end
|
57
|
-
end
|
58
|
-
```
|
59
|
-
|
60
49
|
### Controller
|
61
50
|
|
62
|
-
|
51
|
+
You can send controller errors to Google Cloud Loggings
|
63
52
|
|
64
53
|
```ruby
|
65
54
|
# app/controllers/application_controller.rb
|
@@ -70,8 +59,8 @@ rescue_from StandardError do |e|
|
|
70
59
|
logger = ZgcpToolkit::Logger.new(Rails.env)
|
71
60
|
logger.error_request(e, request)
|
72
61
|
|
73
|
-
#
|
74
|
-
#
|
62
|
+
# You can report error (Error Reporting) with:
|
63
|
+
# ZgcpToolkit::Logger.report_error_request(e, request)
|
75
64
|
|
76
65
|
head :internal_server_error
|
77
66
|
end
|
data/lib/zgcp_toolkit.rb
CHANGED
@@ -3,6 +3,6 @@ require "zgcp_toolkit/version"
|
|
3
3
|
module ZgcpToolkit; end
|
4
4
|
|
5
5
|
require 'zgcp_toolkit/logger'
|
6
|
-
require 'zgcp_toolkit/
|
6
|
+
require 'zgcp_toolkit/formatter/request'
|
7
7
|
require 'zgcp_toolkit/generators/templates/zgcp_toolkit'
|
8
8
|
require 'zgcp_toolkit/generators/zgcp_toolkit_generator'
|
@@ -0,0 +1,101 @@
|
|
1
|
+
module ZgcpToolkit::Formatter
|
2
|
+
class Request
|
3
|
+
FILTERED_ENV_LIST = %w(
|
4
|
+
CONTENT_LENGTH
|
5
|
+
CONTENT_TYPE
|
6
|
+
HTTP_ACCEPT
|
7
|
+
HTTP_ACCEPT_ENCODING
|
8
|
+
HTTP_ACCEPT_LANGUAGE
|
9
|
+
HTTP_CACHE_CONTROL
|
10
|
+
HTTP_COOKIE
|
11
|
+
HTTP_HOST
|
12
|
+
HTTP_ORIGIN
|
13
|
+
HTTP_REFERER
|
14
|
+
HTTP_SEC_CH_UA
|
15
|
+
HTTP_SEC_CH_UA_MOBILE
|
16
|
+
HTTP_SEC_FETCH_DEST
|
17
|
+
HTTP_SEC_FETCH_MODE
|
18
|
+
HTTP_SEC_FETCH_SITE
|
19
|
+
HTTP_SEC_FETCH_USER
|
20
|
+
HTTP_UPGRADE_INSECURE_REQUESTS
|
21
|
+
HTTP_USER_AGENT
|
22
|
+
HTTP_VERSION
|
23
|
+
HTTP_VIA
|
24
|
+
HTTP_X_FORWARDED_FOR
|
25
|
+
HTTP_X_FORWARDED_PROTO
|
26
|
+
ORIGINAL_FULLPATH
|
27
|
+
ORIGINAL_SCRIPT_NAME
|
28
|
+
PATH_INFO
|
29
|
+
QUERY_STRING
|
30
|
+
REMOTE_ADDR
|
31
|
+
REMOTE_PORT
|
32
|
+
REQUEST_METHOD
|
33
|
+
REQUEST_URI
|
34
|
+
SERVER_NAME
|
35
|
+
SERVER_PORT
|
36
|
+
SERVER_PROTOCOL
|
37
|
+
).freeze
|
38
|
+
|
39
|
+
def call(request)
|
40
|
+
log_object = {}
|
41
|
+
log_object[:request] = request_filter(request)
|
42
|
+
log_object[:session] = session_filter(request)
|
43
|
+
log_object[:environment] = environment_filter(request)
|
44
|
+
log_object
|
45
|
+
end
|
46
|
+
|
47
|
+
def format_for_report(request)
|
48
|
+
log_object = {}
|
49
|
+
log_object[:request] = beauty_format request_filter(request)
|
50
|
+
log_object[:session] = beauty_format session_filter(request)
|
51
|
+
log_object[:environment] = beauty_format separation_environment_filter(request)
|
52
|
+
|
53
|
+
result = log_object.map { |key, value| "#{key.capitalize}:\n#{value}\n" }
|
54
|
+
result.join("\n")
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def beauty_format(data)
|
60
|
+
data.map { |k,v| "#{k.to_s.indent(4)}: #{v}" }.join("\n")
|
61
|
+
end
|
62
|
+
|
63
|
+
def environment_filter(request)
|
64
|
+
result = {}
|
65
|
+
request.filtered_env.keys.each do |key|
|
66
|
+
result[key] = request.filtered_env[key]
|
67
|
+
end
|
68
|
+
result
|
69
|
+
end
|
70
|
+
|
71
|
+
def separation_environment_filter(request)
|
72
|
+
result = {}
|
73
|
+
FILTERED_ENV_LIST.each do |key|
|
74
|
+
result[key] = request.filtered_env[key]
|
75
|
+
end
|
76
|
+
result
|
77
|
+
end
|
78
|
+
|
79
|
+
def session_filter(request)
|
80
|
+
result = {}
|
81
|
+
result[:session_id] = request.ssl? ? "[FILTERED]" : request.session['session_id'] || request.env['rack.session.options'][:id].inspect
|
82
|
+
result[:data_session] = request.session.to_hash
|
83
|
+
result
|
84
|
+
end
|
85
|
+
|
86
|
+
def request_filter(request)
|
87
|
+
result = {}
|
88
|
+
result[:url] = request.url
|
89
|
+
result[:request_method] = request.request_method
|
90
|
+
result[:ip_address] = request.remote_ip
|
91
|
+
result[:parameters] = request.filtered_parameters.inspect
|
92
|
+
result[:timestamp] = Time.current
|
93
|
+
result[:server] = Socket.gethostname
|
94
|
+
result[:process] = $$
|
95
|
+
if defined?(Rails) && Rails.respond_to?(:root)
|
96
|
+
result[:rails_root] = Rails.root
|
97
|
+
end
|
98
|
+
result
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
data/lib/zgcp_toolkit/logger.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'dry/configurable'
|
2
|
+
require "google/cloud/error_reporting"
|
2
3
|
require 'zgcp_toolkit/logger/stdout'
|
3
4
|
require 'zgcp_toolkit/logger/google_cloud_logging'
|
4
5
|
|
@@ -6,6 +7,8 @@ module ZgcpToolkit
|
|
6
7
|
class Logger
|
7
8
|
extend Dry::Configurable
|
8
9
|
|
10
|
+
REGEX_VALID_NAME = /^[a-z0-9_]+$/.freeze
|
11
|
+
|
9
12
|
AVAILABLE_LOGGERS = {
|
10
13
|
std_out: ZgcpToolkit::Logger::Stdout,
|
11
14
|
google_cloud_logging: ZgcpToolkit::Logger::GoogleCloudLogging
|
@@ -17,32 +20,63 @@ module ZgcpToolkit
|
|
17
20
|
|
18
21
|
class Error < StandardError; end
|
19
22
|
class UnsupportedLogType < Error; end
|
23
|
+
class InvalidLogName < Error; end
|
24
|
+
|
25
|
+
class << self
|
26
|
+
def create(log_name)
|
27
|
+
raise InvalidLogName, "Log name is invalid. Log name regex is #{REGEX_VALID_NAME.inspect}" unless valid_name?(log_name.to_s)
|
28
|
+
|
29
|
+
logger = Logger.new(log_name.to_s)
|
30
|
+
|
31
|
+
begin
|
32
|
+
yield(logger) if block_given?
|
33
|
+
rescue StandardError => e
|
34
|
+
Google::Cloud::ErrorReporting.report e
|
35
|
+
end
|
36
|
+
|
37
|
+
logger
|
38
|
+
end
|
39
|
+
|
40
|
+
def report_error_request(error, request)
|
41
|
+
message = ZgcpToolkit::Formatter::Request.new.format_for_report(request)
|
42
|
+
|
43
|
+
Google::Cloud::ErrorReporting.report error do |event|
|
44
|
+
event.message = event.message + "\n\n" + message
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def valid_name?(log_name)
|
51
|
+
return true if log_name.match(REGEX_VALID_NAME)
|
52
|
+
false
|
53
|
+
end
|
54
|
+
end
|
20
55
|
|
21
56
|
DEFAULT_BACKTRACE_LIMIT = 10
|
22
57
|
|
23
|
-
attr_accessor :
|
58
|
+
attr_accessor :backtrace_limit
|
24
59
|
attr_reader :loggers, :log_name
|
25
60
|
|
26
61
|
def initialize(log_name)
|
27
62
|
@log_name = log_name
|
28
|
-
@send_unexpected_error_to_slack = true
|
29
63
|
@backtrace_limit = DEFAULT_BACKTRACE_LIMIT
|
30
64
|
@loggers = ZgcpToolkit::Logger.registered_loggers.map { |logger| logger.new(log_name) }
|
31
65
|
end
|
32
66
|
|
33
67
|
[:debug, :info, :warn, :error, :fatal, :unknown].each do |log_level_method|
|
34
|
-
define_method(log_level_method) do |log,
|
68
|
+
define_method(log_level_method) do |log, **kwargs|
|
35
69
|
log_object =
|
36
70
|
case log
|
37
71
|
when StandardError
|
38
72
|
obj = { message: log.message, backtrace: log.backtrace.first(backtrace_limit) }
|
39
|
-
obj.merge!(
|
73
|
+
obj.merge!(kwargs)
|
40
74
|
obj
|
41
75
|
when Hash
|
42
76
|
log
|
43
77
|
when String
|
44
78
|
obj = { message: log }
|
45
|
-
obj.merge!(
|
79
|
+
obj.merge!(kwargs)
|
46
80
|
obj
|
47
81
|
else
|
48
82
|
raise UnsupportedLogType, "#{log.class.name} is not supported!"
|
@@ -52,7 +86,7 @@ module ZgcpToolkit
|
|
52
86
|
end
|
53
87
|
|
54
88
|
def error_request(error, request, **args)
|
55
|
-
filter_request_params =
|
89
|
+
filter_request_params = ZgcpToolkit::Formatter::Request.new.call(request)
|
56
90
|
|
57
91
|
error({ message: error.message, backtrace: error.backtrace.first(backtrace_limit) }.merge!(filter_request_params).merge!(args))
|
58
92
|
end
|
@@ -60,45 +94,5 @@ module ZgcpToolkit
|
|
60
94
|
def flush!
|
61
95
|
loggers.each { |a| a.flush! }
|
62
96
|
end
|
63
|
-
|
64
|
-
private
|
65
|
-
|
66
|
-
def format_request_env(request)
|
67
|
-
log_object = {}
|
68
|
-
log_object[:request] = request_filter(request)
|
69
|
-
log_object[:session] = session_filter(request)
|
70
|
-
log_object[:environment] = environment_filter(request)
|
71
|
-
log_object
|
72
|
-
end
|
73
|
-
|
74
|
-
def environment_filter(request)
|
75
|
-
result = {}
|
76
|
-
request.filtered_env.keys.each do |key|
|
77
|
-
result[key] = request.filtered_env[key]
|
78
|
-
end
|
79
|
-
result
|
80
|
-
end
|
81
|
-
|
82
|
-
def session_filter(request)
|
83
|
-
result = {}
|
84
|
-
result[:session_id] = request.ssl? ? "[FILTERED]" : request.session['session_id'] || request.env['rack.session.options'][:id].inspect
|
85
|
-
result[:data_session] = request.session.to_hash
|
86
|
-
result
|
87
|
-
end
|
88
|
-
|
89
|
-
def request_filter(request)
|
90
|
-
result = {}
|
91
|
-
result[:url] = request.url
|
92
|
-
result[:request_method] = request.request_method
|
93
|
-
result[:ip_address] = request.remote_ip
|
94
|
-
result[:parameters] = request.filtered_parameters.inspect
|
95
|
-
result[:timestamp] = Time.current
|
96
|
-
result[:server] = Socket.gethostname
|
97
|
-
result[:process] = $$
|
98
|
-
if defined?(Rails) && Rails.respond_to?(:root)
|
99
|
-
result[:rails_root] = Rails.root
|
100
|
-
end
|
101
|
-
result
|
102
|
-
end
|
103
97
|
end
|
104
98
|
end
|
data/lib/zgcp_toolkit/version.rb
CHANGED
data/zgcp_toolkit.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zgcp_toolkit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ZIGExN VeNtura developers
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-07-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: stackdriver
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.11.6
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: google-cloud-error_reporting
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 0.42.0
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.42.0
|
41
55
|
description: Manage essential toolset
|
42
56
|
email: kuruma-dev@zigexn.vn
|
43
57
|
executables: []
|
@@ -55,12 +69,12 @@ files:
|
|
55
69
|
- bin/console
|
56
70
|
- bin/setup
|
57
71
|
- lib/zgcp_toolkit.rb
|
72
|
+
- lib/zgcp_toolkit/formatter/request.rb
|
58
73
|
- lib/zgcp_toolkit/generators/templates/zgcp_toolkit.rb
|
59
74
|
- lib/zgcp_toolkit/generators/zgcp_toolkit_generator.rb
|
60
75
|
- lib/zgcp_toolkit/logger.rb
|
61
76
|
- lib/zgcp_toolkit/logger/google_cloud_logging.rb
|
62
77
|
- lib/zgcp_toolkit/logger/stdout.rb
|
63
|
-
- lib/zgcp_toolkit/rake/task.rb
|
64
78
|
- lib/zgcp_toolkit/version.rb
|
65
79
|
- zgcp_toolkit.gemspec
|
66
80
|
homepage: https://github.com/ZIGExN/zgcp_toolkit
|
@@ -84,7 +98,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
84
98
|
- !ruby/object:Gem::Version
|
85
99
|
version: '0'
|
86
100
|
requirements: []
|
87
|
-
rubygems_version: 3.
|
101
|
+
rubygems_version: 3.0.8
|
88
102
|
signing_key:
|
89
103
|
specification_version: 4
|
90
104
|
summary: GCP Toolkit
|
@@ -1,13 +0,0 @@
|
|
1
|
-
module ZgcpToolkit::Rake
|
2
|
-
module Task
|
3
|
-
def execute(args=nil)
|
4
|
-
task_name = self.name.gsub(':', '_')
|
5
|
-
logger = ZgcpToolkit::Logger.new(task_name)
|
6
|
-
args.with_defaults(logger: logger)
|
7
|
-
super
|
8
|
-
rescue StandardError => e
|
9
|
-
logger.error(e, push_slack: logger.send_unexpected_error_to_slack)
|
10
|
-
logger.flush!
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|