appydays 0.5.1 → 0.6.0

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: 80170682f5494542ea76d2d6fd4301acbbfd7c5b8388b3d431ae2c7daa7e03d0
4
- data.tar.gz: 1dae7bcb7f56835bc39f8562d708fada45e3dd8e555f26246a3165bcd2970ab4
3
+ metadata.gz: 91b081811b26e7dee2ab9ec7fb8641ef890124d72694a3cfe858ed7f72011afb
4
+ data.tar.gz: 7cc0dd2e62d643695208f542029c25363a906bb60058fd9fbb47c48f06dc69ee
5
5
  SHA512:
6
- metadata.gz: 2110baac67b50e765f0b7d2306f71f007d75b89cbc25dde2f5602e25882a1ce01592c94919f1bff6f0093066f30e8983dd73e4b8b420a0ffde94ed301f72e78d
7
- data.tar.gz: 98b244ba6540e6a53e437d32278db78e5451f74553924cf2d09df0237e089e44d1ce2922440faf6dc381a85d2ccbbdd415fc1f27dfb73537b9703efe0e012cc4
6
+ metadata.gz: f39eac94f128c900cb873d1d3a9f486a55b86ff7a38859ef32bb375cd4842cb0fd5fb39544aa172c6cd5b659a9bf6b1dc5d8a120dde08660ef1cea5a83d77aa6
7
+ data.tar.gz: 1d8ad64ba366d89fd75bf471895a1e16b88fa74346bae806f4a69205fee83be8371dc9f693439e327b53d13263806b60266eac1222244a00370929f43b834e99
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "httparty"
4
+
5
+ # Formatter that sends structred log information to HTTParty.
6
+ # After requiring this module, use
7
+ # `HTTParty.<method>(..., logger: semantic_logger, log_format: :appydays)`
8
+ # to write out a nice structured log.
9
+ # You can also subclass this formatter to use your own message (default to httparty_request),
10
+ # and modify the fields (override #fields).
11
+ class Appydays::Loggable::HTTPartyFormatter
12
+ attr_accessor :level, :logger, :message
13
+ attr_reader :request, :response
14
+
15
+ def initialize(logger, level)
16
+ @logger = logger
17
+ @level = level.to_sym
18
+ @message = "httparty_request"
19
+ end
20
+
21
+ def format(request, response)
22
+ @request = request
23
+ @response = response
24
+ self.logger.public_send(self.level, self.message, **self.fields)
25
+ end
26
+
27
+ def fields
28
+ return {
29
+ "content_length" => content_length || "-",
30
+ "http_method" => http_method,
31
+ "path" => path,
32
+ "response_code" => response.code,
33
+ }
34
+ end
35
+
36
+ def http_method
37
+ @http_method ||= request.http_method.name.split("::").last.upcase
38
+ end
39
+
40
+ def path
41
+ @path ||= request.path.to_s
42
+ end
43
+
44
+ def content_length
45
+ @content_length ||= response.respond_to?(:headers) ? response.headers["Content-Length"] : response["Content-Length"]
46
+ end
47
+ end
48
+
49
+ HTTParty::Logger.add_formatter(:appydays, Appydays::Loggable::HTTPartyFormatter)
@@ -4,6 +4,32 @@
4
4
  require "sequel/database/logging"
5
5
 
6
6
  class Sequel::Database
7
+ # Helpers for the Appydays Sequel logger.
8
+ # Very long messages may end up getting logged; the logger will truncate anything
9
+ # longer than +truncate_messages_over+, with +truncation_context+ number of chars
10
+ # at the beginning and at the end.
11
+ #
12
+ # If a message is truncated, the full message is logged at +log_full_message_level+ (default :debug).
13
+ # Use nil to disable the full message logging.
14
+ module AppydaysLogger
15
+ class << self
16
+ attr_accessor :truncate_messages_over, :truncation_message, :truncation_context, :log_full_message_level
17
+
18
+ def setdefaults
19
+ @truncate_messages_over = 2000
20
+ @truncation_message = "<truncated, full message logged at debug>"
21
+ @truncation_context = 200
22
+ end
23
+
24
+ def truncate_message(message)
25
+ return message if message.size <= self.truncate_messages_over
26
+ msg = message[...self.truncation_context] + self.truncation_message + message[-self.truncation_context..]
27
+ return msg
28
+ end
29
+ end
30
+ end
31
+ AppydaysLogger.setdefaults
32
+
7
33
  def log_exception(exception, message)
8
34
  level = message.match?(/^SELECT NULL AS "?nil"? FROM .* LIMIT 1$/i) ? :debug : :error
9
35
  log_each(
@@ -30,10 +56,25 @@ class Sequel::Database
30
56
  # warn level if duration is greater than log_warn_duration.
31
57
  def log_duration(duration, message)
32
58
  lwd = log_warn_duration
59
+ was_truncated = false
33
60
  log_each(
34
61
  lwd && (duration >= lwd) ? :warn : sql_log_level,
35
62
  proc { "(#{'%0.6fs' % duration}) #{message}" },
36
- proc { ["sequel_query", {duration: duration * 1000, query: message}] },
63
+ proc do
64
+ query = AppydaysLogger.truncate_message(message)
65
+ params = {duration: duration * 1000, query: query}
66
+ if query != message
67
+ params[:truncated] = true
68
+ was_truncated = true
69
+ end
70
+ ["sequel_query", params]
71
+ end,
72
+ )
73
+ return unless was_truncated && Sequel::Database::AppydaysLogger.log_full_message_level
74
+ log_each(
75
+ Sequel::Database::AppydaysLogger.log_full_message_level,
76
+ nil,
77
+ proc { ["sequel_query_debug", {duration: duration * 1000, query: message}] },
37
78
  )
38
79
  end
39
80
 
@@ -41,7 +82,7 @@ class Sequel::Database
41
82
  @loggers.each do |logger|
42
83
  if logger.is_a?(SemanticLogger::Base)
43
84
  logger.public_send(level, *semantic.call)
44
- else
85
+ elsif std
45
86
  logger.public_send(level, std.call)
46
87
  end
47
88
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appydays
4
- VERSION = "0.5.1"
4
+ VERSION = "0.6.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appydays
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lithic Tech
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-01-24 00:00:00.000000000 Z
11
+ date: 2023-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dotenv
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '4.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: httparty
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.20'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.20'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: monetize
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -206,6 +220,20 @@ dependencies:
206
220
  - - "~>"
207
221
  - !ruby/object:Gem::Version
208
222
  version: '6.0'
223
+ - !ruby/object:Gem::Dependency
224
+ name: webmock
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '3.1'
230
+ type: :development
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '3.1'
209
237
  description: 'appydays provides support for env-based configuration, and common structured
210
238
  logging capabilities
211
239
 
@@ -218,6 +246,7 @@ files:
218
246
  - lib/appydays/configurable.rb
219
247
  - lib/appydays/dotenviable.rb
220
248
  - lib/appydays/loggable.rb
249
+ - lib/appydays/loggable/httparty_formatter.rb
221
250
  - lib/appydays/loggable/request_logger.rb
222
251
  - lib/appydays/loggable/sequel_logger.rb
223
252
  - lib/appydays/loggable/sidekiq_job_logger.rb