lograge-sql 0.2.0 → 1.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
  SHA256:
3
- metadata.gz: f057e0f18be0a66527bf7bed2c8c217ca95e731304bbaae193efd24e0a764db3
4
- data.tar.gz: e84b14ff93214088f99de92228be072a727e834727b362aa4c772afd93ab5fb8
3
+ metadata.gz: 3726273a2b54f66be4bbdab30b8b2166d9d45f00d2e27b7e0f217aab51befe14
4
+ data.tar.gz: b35279e56a149def5f8ac6db9d564bc27e264971b15bfe064d63e87a8398ce26
5
5
  SHA512:
6
- metadata.gz: 7388da0b428389ab33f38476fd717452b5a144ece741531397c43a6c43a97a0eb00235020c89441d34a6977dc6507d6c29678e45d5ecbb30f345f6d80c0cd7a7
7
- data.tar.gz: 92c0643b0a37b3f0928be58115ada58d3691b0d2505806f9a97e1226fb3fb7f07e59de7ddcc1a09cad0648f08c11b033d7202d19bb652f205954580b2cb63366
6
+ metadata.gz: 7d171a9e1a9f2152cc4e3d22434334849f3df4aca8131fb625967ecd79d390a3cb555ce14f6839023221dee85415be8c5068c46492b602d22cd28f69a4fe1309
7
+ data.tar.gz: dd425accb219b4342a58a1a7275ba032c11e3d8caa04b6342ca7db8a8ddf8ec3552097cca95d4e4d3a6b0c8c9240b519dfb3ab6285a3b2ebfeaf14147c816fed
@@ -0,0 +1,22 @@
1
+ require:
2
+ - rubocop-performance
3
+
4
+ AllCops:
5
+ DisplayCopNames: true
6
+ DisplayStyleGuide: true
7
+ TargetRubyVersion: 2.4
8
+ Exclude:
9
+ - gemfiles/vendor/bundle/**/*
10
+
11
+ Metrics/BlockLength:
12
+ Exclude:
13
+ - spec/**/*.rb
14
+
15
+ Metrics/LineLength:
16
+ Max: 120
17
+ Exclude:
18
+ - spec/**/*.rb
19
+
20
+ Style/Documentation:
21
+ Exclude:
22
+ - 'spec/**/*'
@@ -1,4 +1,33 @@
1
1
  language: ruby
2
+ cache: bundler
2
3
  rvm:
3
- - 2.2.2
4
- before_install: gem install bundler -v 1.11.2
4
+ - 2.4
5
+ - 2.5
6
+ - 2.6
7
+ - ruby-head
8
+ gemfile:
9
+ - gemfiles/lograge10.gemfile
10
+ - gemfiles/lograge11.gemfile
11
+ before_install:
12
+ - gem update --system
13
+ - gem install bundler
14
+ jobs:
15
+ include:
16
+ - stage: linting
17
+ rvm: 2.6
18
+ gemfile: gemfiles/lograge11.gemfile # Only run on 1 gemfile
19
+ install: true # Do not bundle install
20
+ script: gem install rubocop rubocop-performance --no-document && rubocop
21
+ stages:
22
+ - linting
23
+ - test
24
+ deploy:
25
+ provider: rubygems
26
+ api_key:
27
+ secure: xlc4BM+5ljo4cO2FC71KbhbVGVYd3NMxhZPat/Y37vo6b5/I01D+Z+K84azMvhIZa+O17cA56FGqT6P0XYfcjZVnYzixpyRlbffKBGNPcIFj2UklWk2BDOojezHPEQnbR2f0jE2+8jHtAb9qyoBTbTlvsW3+svd76+53TxMW1PgGF9+1xdtlEumF1q+IYRL+5TzDLk9GyQ+3RmVd9KBVvQIxxUpn4COJohmQWnv98ZzluX4I/QUt3k4o+etUINPewyg3S+VNP0u+K9HGkY3TL8OpUbCS3Syr3OydwzgpXIBlW+kWVez5/qZn3pd6oSpNEUF9Mh3NhaVsDacFSh6XgGNgww+isazyAROsledK2GsEOH0Hi6gpia/Ny5cD5TFAiGshMcUIb2K4roI3AW9kJ2e59hoC+QvPy64IybO/dhaKcxwX8F4qq3Fk/8EzQV5eOTq0Iai5aYNJaGZUqHV/X4DiMwDk/JoyQVYE+2CMF/PlZIFV4LuegDArVXYh5w3Qo9vYDfNp7Hfv0w5XgpEqAhk+Dabl+BlVhzSM/Cf28i6OVAhLURnGMNKhQEi3/4EusaM/cOQlM5QKWweAPfOwDKMFUoj9+Rtr0FfSyNzerG9dlGuzEKOlqq+XuOQ7RfDUV4+bn2PwbYo5XwMKz1Y8FWUZTz6l14miaw8Yq7U0GU8=
28
+ gem: lograge-sql
29
+ on:
30
+ tags: true
31
+ repo: iMacTia/lograge-sql
32
+ rvm: 2.6
33
+
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
 
3
5
  # Specify your gem's dependencies in lograge-sql.gemspec
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # Lograge::Sql
2
2
 
3
- [![Gem Version](https://badge.fury.io/rb/lograge-sql.svg)](https://badge.fury.io/rb/lograge-sql) [<img src="https://travis-ci.org/iMacTia/lograge-sql.svg?branch=master" alt="version" />](https://travis-ci.org/iMacTia/lograge-sql)
3
+ [![Gem Version](https://badge.fury.io/rb/lograge-sql.svg)](https://badge.fury.io/rb/lograge-sql)
4
+ [![Build Status](https://travis-ci.org/iMacTia/lograge-sql.svg)](https://travis-ci.org/iMacTia/lograge-sql)
4
5
 
5
6
  Lograge::Sql is an extension to the famous [Lograge](https://github.com/roidrage/lograge) gem, which adds SQL queries to the Lograge Event and disable default ActiveRecord logging.
6
7
  This is extremely useful if you're using Lograge together with the ELK stack.
@@ -22,6 +23,53 @@ In order to enable SQL logging in your application, you'll simply need to add th
22
23
  require 'lograge/sql/extension'
23
24
  ```
24
25
 
26
+ By default, Lograge::Sql disables default logging on ActiveRecord. To preserve default logging, add this to your lograge initializer:
27
+
28
+ ```ruby
29
+ config.lograge_sql.keep_default_active_record_log = true
30
+ ```
31
+
32
+ ## Customization
33
+
34
+ By default, the format is a string concatenation of the query name, the query duration and the query itself joined by `\n` newline:
35
+
36
+ ```
37
+ method=GET path=/mypath format=html ...
38
+ Object Load (0.42) SELECT "objects.*" FROM "objects"
39
+ Associations Load (0.42) SELECT "associations.*" FROM "associations" WHERE "associations"."object_id" = "$1"
40
+ ```
41
+
42
+ However, having `Lograge::Formatters::Json.new`, the relevant output is
43
+
44
+ ```json
45
+ {
46
+ "sql_queries": "name1 ({duration1}) {query1}\nname2 ({duration2}) query2 ...",
47
+ "sql_queries_count": 3
48
+ }
49
+ ```
50
+
51
+ To customize the output:
52
+
53
+ ```ruby
54
+ # config/initializers/lograge.rb
55
+ Rails.application.configure do
56
+
57
+ # Instead of extracting event as Strings, extract as Hash. You can also extract
58
+ # additional fields to add to the formatter
59
+ config.lograge_sql.extract_event = Proc.new do |event|
60
+ { name: event.payload[:name], duration: event.duration.to_f.round(2), sql: event.payload[:sql] }
61
+ end
62
+ # Format the array of extracted events
63
+ config.lograge_sql.formatter = Proc.new do |sql_queries|
64
+ sql_queries
65
+ end
66
+ end
67
+ ```
68
+
69
+ #### Thread-safety
70
+
71
+ [Depending on the web server in your project](https://github.com/steveklabnik/request_store#the-problem) you might benefit from improved thread-safety by adding [`request_store`](https://github.com/steveklabnik/request_store) to your Gemfile. It will be automatically picked up by `lograge-sql`.
72
+
25
73
  ## Contributing
26
74
 
27
75
  Bug reports and pull requests are welcome on GitHub at https://github.com/iMacTia/lograge-sql.
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'bundler/setup'
4
5
  require 'lograge/sql'
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'lograge', '~> 0.10.0'
6
+
7
+ gemspec path: '../'
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ gem 'lograge', '~> 0.11.0'
6
+
7
+ gemspec path: '../'
@@ -1,7 +1,52 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'lograge/sql/version'
2
4
 
3
5
  module Lograge
6
+ # Main gem module
4
7
  module Sql
8
+ class << self
9
+ # Format SQL log
10
+ attr_accessor :formatter
11
+ # Extract information from SQL event
12
+ attr_accessor :extract_event
13
+
14
+ # Initialise configuration with fallback to default values
15
+ def setup(config)
16
+ Lograge::Sql.formatter = config.formatter || default_formatter
17
+ Lograge::Sql.extract_event = config.extract_event || default_extract_event
18
+
19
+ return if config.keep_default_active_record_log
20
+
21
+ # Disable existing ActiveRecord logging
22
+ ActiveSupport::LogSubscriber.log_subscribers.each do |subscriber|
23
+ Lograge.unsubscribe(:active_record, subscriber) if subscriber.is_a?(ActiveRecord::LogSubscriber)
24
+ end
25
+ end
5
26
 
27
+ def store
28
+ defined?(RequestStore) ? RequestStore.store : Thread.current
29
+ end
30
+
31
+ private
32
+
33
+ # By default, the output is a concatenated string of all extracted events
34
+ def default_formatter
35
+ proc do |sql_queries|
36
+ %('#{sql_queries.join("\n")}')
37
+ end
38
+ end
39
+
40
+ # By default, only extract values required for the default_formatter and
41
+ # already convert to a string
42
+ def default_extract_event
43
+ proc do |event|
44
+ "#{event.payload[:name]} (#{event.duration.to_f.round(2)}) #{event.payload[:sql]}"
45
+ end
46
+ end
47
+ end
6
48
  end
7
49
  end
50
+
51
+ # Rails specific configuration
52
+ require 'lograge/sql/railtie' if defined?(Rails)
@@ -1,17 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
4
  module Sql
5
+ # Module used to extend Lograge
3
6
  module Extension
7
+ # Overrides `Lograge::RequestLogSubscriber#extract_request` do add SQL queries
4
8
  def extract_request(event, payload)
5
9
  super.merge!(extract_sql_queries)
6
10
  end
7
11
 
12
+ # Collects all SQL queries stored in the Thread during request processing
8
13
  def extract_sql_queries
9
- sql_queries = Thread.current[:lograge_sql_queries]
14
+ sql_queries = Lograge::Sql.store[:lograge_sql_queries]
10
15
  return {} unless sql_queries
11
16
 
12
- Thread.current[:lograge_sql_queries] = nil
17
+ Lograge::Sql.store[:lograge_sql_queries] = nil
13
18
  {
14
- sql_queries: %('#{sql_queries.join("\n")}'),
19
+ sql_queries: Lograge::Sql.formatter.call(sql_queries),
15
20
  sql_queries_count: sql_queries.length
16
21
  }
17
22
  end
@@ -20,20 +25,24 @@ module Lograge
20
25
  end
21
26
 
22
27
  module Lograge
28
+ # Log subscriber to replace ActiveRecord's default one
23
29
  class ActiveRecordLogSubscriber < ActiveSupport::LogSubscriber
30
+ # Every time there's an SQL query, stores it into the Thread.
31
+ # They'll later be access from the RequestLogSubscriber.
24
32
  def sql(event)
25
33
  ActiveRecord::LogSubscriber.runtime += event.duration
26
34
  return if event.payload[:name] == 'SCHEMA'
27
- Thread.current[:lograge_sql_queries] ||= []
28
- Thread.current[:lograge_sql_queries] << ("#{event.payload[:name]} (#{event.duration.to_f.round(2)}) #{event.payload[:sql]}")
35
+
36
+ Lograge::Sql.store[:lograge_sql_queries] ||= []
37
+ Lograge::Sql.store[:lograge_sql_queries] << Lograge::Sql.extract_event.call(event)
29
38
  end
30
39
  end
31
40
  end
32
41
 
33
- Lograge::RequestLogSubscriber.prepend Lograge::Sql::Extension
34
-
35
- ActiveSupport::LogSubscriber.log_subscribers.each do |subscriber|
36
- Lograge.unsubscribe(:active_record, subscriber) if subscriber.is_a?(ActiveRecord::LogSubscriber)
42
+ if defined?(Lograge::RequestLogSubscriber)
43
+ Lograge::RequestLogSubscriber.prepend Lograge::Sql::Extension
44
+ else
45
+ Lograge::LogSubscribers::ActionController.prepend Lograge::Sql::Extension
37
46
  end
38
47
 
39
48
  Lograge::ActiveRecordLogSubscriber.attach_to :active_record
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/railtie'
4
+ require 'active_support/ordered_options'
5
+
6
+ module Lograge
7
+ module Sql
8
+ # Railtie to automatically setup in Rails
9
+ class Railtie < Rails::Railtie
10
+ # To ensure that configuration is not nil when initialise Lograge::Sql.setup
11
+ config.lograge_sql = ActiveSupport::OrderedOptions.new
12
+
13
+ config.after_initialize do |app|
14
+ Lograge::Sql.setup(app.config.lograge_sql)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lograge
2
4
  module Sql
3
- VERSION = '0.2.0'
5
+ # Gem version
6
+ VERSION = '1.2.0'
4
7
  end
5
8
  end
@@ -1,5 +1,6 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'lograge/sql/version'
5
6
 
@@ -9,8 +10,8 @@ Gem::Specification.new do |spec|
9
10
  spec.authors = ['Mattia Giuffrida']
10
11
  spec.email = ['giuffrida.mattia@gmail.com']
11
12
 
12
- spec.summary = %q{An extension for Lograge to log SQL queries}
13
- spec.description = %q{An extension for Lograge to log SQL queries}
13
+ spec.summary = 'An extension for Lograge to log SQL queries'
14
+ spec.description = 'An extension for Lograge to log SQL queries'
14
15
  spec.homepage = 'https://github.com/iMacTia/lograge-sql'
15
16
  spec.license = 'MIT'
16
17
 
@@ -19,10 +20,12 @@ Gem::Specification.new do |spec|
19
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
21
  spec.require_paths = ['lib']
21
22
 
23
+ spec.add_runtime_dependency 'activerecord', '>= 4', '< 7.0'
22
24
  spec.add_runtime_dependency 'lograge', '~> 0.4'
23
- spec.add_runtime_dependency 'activerecord', '>= 4', '< 6.0'
24
25
 
25
- spec.add_development_dependency 'bundler', '~> 1.0'
26
+ spec.add_development_dependency 'bundler', '~> 2.0'
26
27
  spec.add_development_dependency 'rake', '~> 10.0'
27
28
  spec.add_development_dependency 'rspec', '~> 3.0'
29
+ spec.add_development_dependency 'rubocop'
30
+ spec.add_development_dependency 'rubocop-performance'
28
31
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lograge-sql
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mattia Giuffrida
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-07 00:00:00.000000000 Z
11
+ date: 2020-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: lograge
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - "~>"
18
- - !ruby/object:Gem::Version
19
- version: '0.4'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '0.4'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: activerecord
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -33,7 +19,7 @@ dependencies:
33
19
  version: '4'
34
20
  - - "<"
35
21
  - !ruby/object:Gem::Version
36
- version: '6.0'
22
+ version: '7.0'
37
23
  type: :runtime
38
24
  prerelease: false
39
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -43,21 +29,35 @@ dependencies:
43
29
  version: '4'
44
30
  - - "<"
45
31
  - !ruby/object:Gem::Version
46
- version: '6.0'
32
+ version: '7.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: lograge
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0.4'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.4'
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: bundler
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '1.0'
53
+ version: '2.0'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '1.0'
60
+ version: '2.0'
61
61
  - !ruby/object:Gem::Dependency
62
62
  name: rake
63
63
  requirement: !ruby/object:Gem::Requirement
@@ -86,6 +86,34 @@ dependencies:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
88
  version: '3.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: rubocop
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: rubocop-performance
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
89
117
  description: An extension for Lograge to log SQL queries
90
118
  email:
91
119
  - giuffrida.mattia@gmail.com
@@ -95,14 +123,18 @@ extra_rdoc_files: []
95
123
  files:
96
124
  - ".gitignore"
97
125
  - ".rspec"
126
+ - ".rubocop.yml"
98
127
  - ".travis.yml"
99
128
  - Gemfile
100
129
  - README.md
101
130
  - Rakefile
102
131
  - bin/console
103
132
  - bin/setup
133
+ - gemfiles/lograge10.gemfile
134
+ - gemfiles/lograge11.gemfile
104
135
  - lib/lograge/sql.rb
105
136
  - lib/lograge/sql/extension.rb
137
+ - lib/lograge/sql/railtie.rb
106
138
  - lib/lograge/sql/version.rb
107
139
  - lograge-sql.gemspec
108
140
  homepage: https://github.com/iMacTia/lograge-sql