lograge-sql 0.2.0 → 1.2.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: 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