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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fdd5f30aab3e292d7eefa9c362a0e79129cfc39d48c85b74822377d80a30cd91
4
- data.tar.gz: 8f0e40f5d92bad0d83c8e856b2d81d1dc347987fb28e1e963cdeb8e29d855b3d
3
+ metadata.gz: 168a4db3ef4d6631232d6bb44c475f5a558ab7f0b10072d844cc3af903e252fd
4
+ data.tar.gz: a5202f7d5495c03e8586a42c8daeff3fe3c5e8dde350e4968eaa3904aabf137b
5
5
  SHA512:
6
- metadata.gz: 462b117371427824f07fc8caf86b9d2af58e3304ebf38081e687e8c39264981a674600da0c6c69de9150d33a8975d7956af05ceab1a8ecd05d2f648d270a5590
7
- data.tar.gz: be469a18442677b5ffddc406e029941c6cda7d9daa596d227f4785960d0f3e1801a7c49f28b5500ddd0d8caa80d8b56f4c0d06b7682ae89f833bf844b93d0e66
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 do |t, logger:|
34
- logger.info("Heyyyyyy!")
35
- # The error message & backtrace are sent to Cloud Logging
36
- raise "Heyyyyyy Oops!"
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(:any_log_name)
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"], push_slack: true)
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
- you can send controller errors to Google Cloud Loggings
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
- # If you want send notity to slack
74
- # logger.error_request(e, request, push_slack: true)
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/rake/task'
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
@@ -1,9 +1,3 @@
1
- require 'dry/configurable'
2
- require 'google/cloud/logging'
3
- require 'rake/task'
4
-
5
- Rake::Task.prepend(ZgcpToolkit::Rake::Task)
6
-
7
1
  loggers = [:std_out]
8
2
 
9
3
  loggers.push(:google_cloud_logging) unless Rails.env.development?
@@ -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 :send_unexpected_error_to_slack, :backtrace_limit
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, push_slack: false|
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!(push_slack: true) if push_slack
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!(push_slack: true) if push_slack
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 = format_request_env(request)
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
@@ -1,3 +1,5 @@
1
+ require 'google/cloud/logging'
2
+
1
3
  module ZgcpToolkit
2
4
  class Logger
3
5
  class GoogleCloudLogging
@@ -1,3 +1,3 @@
1
1
  module ZgcpToolkit
2
- VERSION = '0.1.0'
2
+ VERSION = '1.2.1'
3
3
  end
data/zgcp_toolkit.gemspec CHANGED
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
24
24
 
25
25
  spec.add_dependency 'stackdriver', '~> 0.20.1'
26
26
  spec.add_dependency 'dry-configurable', '~> 0.11.6'
27
+ spec.add_dependency 'google-cloud-error_reporting', '~> 0.42.0'
27
28
  end
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: 0.1.0
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-06-01 00:00:00.000000000 Z
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.1.4
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