zgcp_toolkit 0.1.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
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