loggery 0.1.0 → 0.2.0

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
  SHA1:
3
- metadata.gz: c0b7a03ec7d234a7fde324b7c5d08f01cfad7f64
4
- data.tar.gz: 89318bb7a4a045a9248d0c78a7897fca044f738f
3
+ metadata.gz: 51aab323d0268f155d0cb2d3b4706a72409dda2d
4
+ data.tar.gz: f576a02b4fcebb0a6136cc471f546613177ec4e6
5
5
  SHA512:
6
- metadata.gz: ab421d8f289c4a5a059d6f0e1d651e2020a469099bf84adc808bce618d47843451ecc14ef5998c15abcde4482b1a2f3cf537ca355e839749a4edf6ba282b60f0
7
- data.tar.gz: 3ebff63c9e25d2b0ca1e73e571b102b27985265b63dc4622d69e998277ab94b2053d8f216a3d9e30b7729cff5053df060cf6f875dc9cbbc855391f65c1c51935
6
+ metadata.gz: 70609887ea649f271a3d362be6dd3b6adce2bbbccd1a3f2ccaf05e65b7a7efe756ee4dbaccaa079d49c1d6d72fad1d861fe4cf41f25056b0e29bd40cc593898a
7
+ data.tar.gz: 9e39ac654b31a0b58778a86b1db32eabd17177af5b066d1ec87c45d78181eba90894a25a2e3599bc071f9f9913a8efae07325b1e1779b7f344e443da663c8b1b
data/.gitignore CHANGED
@@ -14,3 +14,5 @@ log
14
14
 
15
15
  # rspec failure tracking
16
16
  .rspec_status
17
+
18
+ *.gemfile.lock
@@ -7,8 +7,9 @@ Style/StringLiterals:
7
7
  Metrics/LineLength:
8
8
  Max: 120
9
9
 
10
- Style/BlockLength:
10
+ Metrics/BlockLength:
11
11
  Exclude:
12
+ - loggery-gem.gemspec
12
13
  - 'spec/**/*.rb'
13
14
 
14
15
  Documentation:
@@ -17,5 +18,13 @@ Documentation:
17
18
  Style/Lambda:
18
19
  EnforcedStyle: literal
19
20
 
20
- Style/MethodLength:
21
+ Metrics/MethodLength:
21
22
  Max: 20
23
+
24
+ Style/FrozenStringLiteralComment:
25
+ Exclude:
26
+ - gemfiles/**/*
27
+
28
+ Layout/AlignHash:
29
+ EnforcedColonStyle: table
30
+ EnforcedHashRocketStyle: table
@@ -2,6 +2,15 @@ sudo: false
2
2
  language: ruby
3
3
  rvm:
4
4
  - 2.4.2
5
+ gemfile:
6
+ - gemfiles/rails4.2.gemfile
7
+ - gemfiles/rails5.0.gemfile
8
+ - gemfiles/rails5.1.gemfile
9
+ - gemfiles/rails5.2.gemfile
10
+ before_install:
11
+ - rvm use @global
12
+ - gem uninstall bundler -x
13
+ - gem install -v 1.17.2 bundler --no-rdoc --no-ri
5
14
  script:
6
15
  - bundle exec rubocop
7
16
  - bundle exec rspec
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ appraise "rails4.2" do
4
+ gem "rails", "~> 4.2.0"
5
+ end
6
+
7
+ appraise "rails5.0" do
8
+ gem "rails", "~> 5.0.0"
9
+ end
10
+
11
+ appraise "rails5.1" do
12
+ gem "rails", "~> 5.1.0"
13
+ end
14
+
15
+ appraise "rails5.2" do
16
+ gem "rails", "5.2.0.beta2"
17
+ end
data/README.md CHANGED
@@ -24,11 +24,17 @@ And then execute:
24
24
  $ bundle
25
25
 
26
26
  ### Basic Rails integration
27
+
28
+ To enable, add
29
+
27
30
  ```ruby
28
31
  config.loggery.enabled = true
29
32
  ```
30
33
 
31
- to your `config/application.rb`. In this basic setup, Loggery will save your log output to
34
+ to your `config/application.rb` or to the environment specific `config/staging.rb` and/or
35
+ `config/production.rb`.
36
+
37
+ In this basic setup, Loggery will save your log output to
32
38
  `log/logstash-<rails-env>.log` in JSON format. It will also:
33
39
  * use [lograge](https://github.com/roidrage/lograge) to create a single-line log entry for every
34
40
  Rails request including the db / view / total duration, controller name, action, http status, etc...
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_RETRY: "1"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.2.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.0.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.1.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "5.2.0.beta2"
6
+
7
+ gemspec path: "../"
@@ -1,5 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "lograge"
4
+ require "logstash-event"
5
+ require "logstash-logger"
6
+ require "rails"
7
+
3
8
  require "loggery/gem/version"
4
9
  require "loggery/util"
5
10
  require "loggery/controller/logging_context"
@@ -11,10 +16,6 @@ require "loggery/metadata/middleware/rack"
11
16
  require "loggery/metadata/middleware/sidekiq"
12
17
  require "loggery/railtie"
13
18
 
14
- require "lograge"
15
- require "logstash-event"
16
- require "logstash-logger"
17
-
18
19
  module Loggery
19
20
  def self.setup_sidekiq
20
21
  Loggery::Sidekiq::Setup.setup
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support/concern"
4
+
3
5
  # Provides a hook in Rails controllers that allows enriching log lines from within a Rails request
4
6
  # with data that is available only within a controller action, for instance user information.
5
7
 
@@ -19,6 +21,7 @@ module Loggery
19
21
 
20
22
  def loggery_set_metadata
21
23
  return unless Loggery::Metadata::Store.store
24
+
22
25
  metadata = loggery_default_metadata.merge loggery_log_context
23
26
  Loggery::Metadata::Store.store.merge!(metadata)
24
27
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Loggery
4
4
  module Gem
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
@@ -6,33 +6,32 @@
6
6
  module Loggery
7
7
  module Metadata
8
8
  module LogstashEventUtil
9
- extend self
9
+ MAGIC_FIELDS = %i[type uid _id _type _source _all _parent _fieldnames _routing
10
+ _index _size _timestamp _ttl].freeze
10
11
 
11
- MAGIC_FIELDS = %i{type uid _id _type _source _all _parent _fieldnames _routing
12
- _index _size _timestamp _ttl }.freeze
13
-
14
- def event_metadata(event)
12
+ def self.event_metadata(event)
15
13
  return unless loglevel_includes_event?(event)
14
+
16
15
  stored_metadata = Loggery::Metadata::Store.store || {}
17
16
  metadata = default_metadata.merge(stored_metadata)
18
17
  set_logstash_event_metadata(event, metadata)
19
18
  end
20
19
 
21
- def set_logstash_event_metadata(event, metadata)
20
+ def self.set_logstash_event_metadata(event, metadata)
22
21
  metadata.each { |k, v| event[k] = v }
23
22
  fail_if_magic_fields_are_used(event)
24
23
  end
25
24
 
26
- def default_metadata
25
+ def self.default_metadata
27
26
  { pid: Process.pid }
28
27
  end
29
28
 
30
- def loglevel_includes_event?(event)
31
- severity = event['severity'].downcase
29
+ def self.loglevel_includes_event?(event)
30
+ severity = event["severity"].downcase
32
31
  Rails.logger.respond_to?(severity) && Rails.logger.public_send("#{severity}?")
33
32
  end
34
33
 
35
- def fail_if_magic_fields_are_used(event)
34
+ def self.fail_if_magic_fields_are_used(event)
36
35
  MAGIC_FIELDS.each do |magic_field|
37
36
  if event[magic_field.to_s].present? || event[magic_field.to_sym].present?
38
37
  raise "'#{magic_field}' is a reserved field name of logstash. It should not be set in a custom event"
@@ -12,7 +12,7 @@ module Loggery
12
12
 
13
13
  def call(env)
14
14
  Loggery::Metadata::Store.with_metadata(worker_type: "web",
15
- request_id: env["action_dispatch.request_id"]) do
15
+ request_id: env["action_dispatch.request_id"]) do
16
16
  @app.call(env)
17
17
  end
18
18
  end
@@ -13,15 +13,12 @@ module Loggery
13
13
  attr_accessor(:error_handler) { ->(e) { Sidekiq::Logging.logger.error(e) } }
14
14
  end
15
15
 
16
- def call(_worker, msg, queue)
17
- Loggery::Metadata::Store.with_metadata(jid: msg["jid"],
18
- thread_id: Thread.current.object_id.to_s(36),
19
- worker: msg["class"],
20
- args: msg["args"].inspect,
21
- queue: queue,
22
- retry_count: msg["retry_count"],
23
- worker_type: "sidekiq") do
24
- log_job_runtime(:sidekiq_job, "#{msg['class']} (#{msg['args']})") do
16
+ def call(_worker, message, queue)
17
+ Loggery::Metadata::Store.with_metadata(build_metadata(message, queue)) do
18
+ job_instance_name = "#{message['class']} (#{message['args']})"
19
+ log_job_start(message, job_instance_name)
20
+
21
+ log_job_runtime(:sidekiq_job, job_instance_name) do
25
22
  begin
26
23
  yield
27
24
  rescue StandardError => e
@@ -33,6 +30,31 @@ module Loggery
33
30
  end
34
31
  end
35
32
  end
33
+
34
+ private
35
+
36
+ def build_metadata(message, queue)
37
+ {
38
+ jid: message["jid"],
39
+ thread_id: Thread.current.object_id.to_s(36),
40
+ worker: message["class"],
41
+ args: message["args"].inspect,
42
+ queue: queue,
43
+ retry_count: message["retry_count"],
44
+ worker_type: "sidekiq"
45
+ }
46
+ end
47
+
48
+ def log_job_start(message, job_instance_name)
49
+ execution_delay =
50
+ (Time.current - Time.zone.at(message["enqueued_at"]) if message["enqueued_at"])
51
+
52
+ Rails.logger.info(
53
+ event_type: :sidekiq_job_started,
54
+ message: "Job type sidekiq_job - #{job_instance_name} started",
55
+ execution_delay: execution_delay
56
+ )
57
+ end
36
58
  end
37
59
  end
38
60
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "rails/railtie"
4
+ require "rails/rack/logger"
5
+
3
6
  module Loggery
4
7
  module LogstashSetup
5
8
  def self.setup(config)
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support/core_ext/time/calculations"
4
+
3
5
  module Loggery
4
6
  module Util
5
- def log_job_runtime(job_type, job_instance_name = nil)
6
- job_name = ["Job type #{job_type}", job_instance_name].compact.join " - "
7
-
8
- Rails.logger.info event_type: :"#{job_type}_started", message: "#{job_name} started"
7
+ def log_job_runtime(job_type, job_instance_name)
8
+ job_name = "Job type #{job_type} - #{job_instance_name}"
9
9
 
10
10
  begin
11
11
  start_time = Time.current
@@ -15,8 +15,8 @@ module Loggery
15
15
  duration = end_time - start_time
16
16
 
17
17
  Rails.logger.info event_type: :"#{job_type}_finished",
18
- message: "#{job_name} finished",
19
- duration: duration
18
+ message: "#{job_name} finished",
19
+ duration: duration
20
20
  end
21
21
  end
22
22
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path("../lib", __FILE__)
3
+ lib = File.expand_path("lib", __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require "loggery/gem/version"
6
6
 
@@ -21,13 +21,17 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
+ spec.add_runtime_dependency "actionpack", ">= 4.2.0"
25
+ spec.add_runtime_dependency "activesupport", ">= 4.2.0"
24
26
  spec.add_runtime_dependency "lograge", "~> 0.6"
25
27
  spec.add_runtime_dependency "logstash-event", "~> 1.2"
26
28
  spec.add_runtime_dependency "logstash-logger", "~> 0.25"
27
- spec.add_runtime_dependency "rails", ">= 4.0"
29
+ spec.add_runtime_dependency "railties", ">= 4.2.0"
28
30
 
31
+ spec.add_development_dependency "appraisal"
29
32
  spec.add_development_dependency "bundler", "~> 1.14"
30
33
  spec.add_development_dependency "pry-byebug"
34
+ spec.add_development_dependency "rails", ">= 4.2.0"
31
35
  spec.add_development_dependency "rake", "~> 10.0"
32
36
  spec.add_development_dependency "rspec"
33
37
  spec.add_development_dependency "rubocop"
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loggery
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Stemplinger
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-05 00:00:00.000000000 Z
11
+ date: 2019-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: actionpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 4.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 4.2.0
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: lograge
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -53,19 +81,33 @@ dependencies:
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0.25'
55
83
  - !ruby/object:Gem::Dependency
56
- name: rails
84
+ name: railties
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - ">="
60
88
  - !ruby/object:Gem::Version
61
- version: '4.0'
89
+ version: 4.2.0
62
90
  type: :runtime
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
94
  - - ">="
67
95
  - !ruby/object:Gem::Version
68
- version: '4.0'
96
+ version: 4.2.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: appraisal
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: bundler
71
113
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +136,20 @@ dependencies:
94
136
  - - ">="
95
137
  - !ruby/object:Gem::Version
96
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rails
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 4.2.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 4.2.0
97
153
  - !ruby/object:Gem::Dependency
98
154
  name: rake
99
155
  requirement: !ruby/object:Gem::Requirement
@@ -175,11 +231,17 @@ files:
175
231
  - ".rspec"
176
232
  - ".rubocop.yml"
177
233
  - ".travis.yml"
234
+ - Appraisals
178
235
  - CODE_OF_CONDUCT.md
179
236
  - Gemfile
180
237
  - LICENSE.txt
181
238
  - README.md
182
239
  - Rakefile
240
+ - gemfiles/.bundle/config
241
+ - gemfiles/rails4.2.gemfile
242
+ - gemfiles/rails5.0.gemfile
243
+ - gemfiles/rails5.1.gemfile
244
+ - gemfiles/rails5.2.gemfile
183
245
  - lib/loggery.rb
184
246
  - lib/loggery/controller/logging_context.rb
185
247
  - lib/loggery/gem/version.rb
@@ -212,7 +274,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
212
274
  version: '0'
213
275
  requirements: []
214
276
  rubyforge_project:
215
- rubygems_version: 2.5.1
277
+ rubygems_version: 2.5.2
216
278
  signing_key:
217
279
  specification_version: 4
218
280
  summary: Generate logstash compatible log output from Rails apps.