mongo_request_logger 0.5.0 → 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
  SHA1:
3
- metadata.gz: a1a7c2d660f9091c18bab904f5c7adf9c7481dfd
4
- data.tar.gz: 756f66c113e76c516016dc068de35e6c81bf3f0e
3
+ metadata.gz: 10ab543ab4fed5e432099b38ce6c32bc3e745aa0
4
+ data.tar.gz: b202b63d0c93bd20baea08a806f3325bdd1114c6
5
5
  SHA512:
6
- metadata.gz: 7248658d11b915dd320dc65104c20b238b4f64f1f496925f9e9ed7abe2aeaba2a2efc504d82380a98289e4d44cd6209ee7b3899730a4526d967167719b7257ee
7
- data.tar.gz: a66e533c523a2c78ba07f2faac8442fa7e6e82940f6597d8d56da426fa1b8246148c8cc7ac28a4c95bb7342fc2ea28b399c844004cf57171f8be2cc9ce1eee3e
6
+ metadata.gz: a7a24b97466f0803cd2ff95a180ff122fbc82bd646e39c381f65e7ecf15bfdac68a328b2f9ac029bb496c415d4d3ae0a391674a0c4a0de1c501aada5529bdeeb
7
+ data.tar.gz: 1f591f39c0926808a0f1308fda972968e54798a24226bc6b1a7901e33eba9dc13f90a5725d7fcf34d4da29562744a1abadfdb5f110e115e911b82282d8efb497
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.2.0
1
+ 2.2.2
data/.travis.yml CHANGED
@@ -1,4 +1,6 @@
1
1
  language: ruby
2
+ before_install:
3
+ - gem install bundler
2
4
  script: "bundle exec rspec"
3
5
  branches:
4
6
  except:
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.6.0
2
+
3
+ *Backwards incompatible!*
4
+
5
+ * Replace Moped with the official Mongo Ruby Driver, while retaining support for the mongoid configuration file.
6
+
1
7
  ## 0.5.0
2
8
 
3
9
  *Backwards incompatible!*
data/Gemfile CHANGED
@@ -1,6 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem 'moped', '~> 2.0'
3
+ gem 'mongo', '~> 2.0'
4
4
  gem 'mongoid', '~> 4.0'
5
5
  gem 'rspec'
6
6
  gem 'sinatra', '~> 1.4.0'
data/README.md CHANGED
@@ -18,7 +18,7 @@ Example:
18
18
 
19
19
  development:
20
20
  sessions:
21
- loggger:
21
+ logger:
22
22
  database: your_log_db
23
23
  hosts:
24
24
  - host1:27017
@@ -44,7 +44,7 @@ In config.ru:
44
44
  require './yourapp'
45
45
 
46
46
  # Configure database details
47
- session = Moped::Session.new(%w(127.0.0.1:27017))
47
+ session = Mongo::Client.new(%w(127.0.0.1:27017))
48
48
  session.use 'your_log_db'
49
49
  session.options[:capsize] = 10 # MB
50
50
 
data/config.ru CHANGED
@@ -1,12 +1,11 @@
1
1
  # Sinatra app for viewing logs
2
- require 'moped'
2
+ require 'mongo'
3
3
  require 'mongo_request_logger/viewer'
4
4
 
5
- session = Moped::Session.new(%w(127.0.0.1:27017))
6
- session.use ENV['DB'] || 'request_logger_test'
7
- session.options[:capsize] = 10 # MB
5
+ client = Mongo::Client.new(%w(127.0.0.1:27017))
6
+ client.use ENV['DB'] || 'request_logger_test'
8
7
 
9
- MongoRequestLogger::Viewer.adapter = MongoRequestLogger::Adapters::Moped.new(session)
8
+ MongoRequestLogger::Viewer.adapter = MongoRequestLogger::Adapters::Moped.new(client)
10
9
 
11
10
  MongoRequestLogger::Viewer.run!
12
11
 
@@ -1,5 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ gem 'mongo', '~> 2.0'
3
4
  gem 'moped', '~> 2.0'
4
5
  gem 'mongoid', '~> 4.0'
5
6
  gem 'rspec'
@@ -1,5 +1,6 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ gem 'mongo', '~> 2.0'
3
4
  gem 'moped', '~> 2.0'
4
5
  gem 'mongoid', '~> 4.0'
5
6
  gem 'rspec'
@@ -3,6 +3,7 @@
3
3
  module MongoRequestLogger
4
4
  module Adapters
5
5
  class Base
6
+ DEFAULT_CAP_SIZE = 100
6
7
 
7
8
  attr_reader :configuration, :connection, :connection_type, :collection, :authenticated
8
9
 
@@ -12,7 +13,8 @@ module MongoRequestLogger
12
13
 
13
14
  # Capsize in bytes
14
15
  def capsize
15
- options[:capsize] * 1024 * 1024
16
+ cap = options[:capsize] || DEFAULT_CAP_SIZE
17
+ cap * 1024 * 1024
16
18
  end
17
19
 
18
20
  def authenticated?
@@ -0,0 +1,62 @@
1
+ require 'mongo'
2
+ require 'mongo_request_logger/adapters/base'
3
+
4
+ module MongoRequestLogger
5
+ module Adapters
6
+ class Mongo < Base
7
+ def initialize client, opts = {}
8
+ @connection = client.database
9
+
10
+ @options = {
11
+ read: {
12
+ mode: :secondary_preferred
13
+ },
14
+ write: {
15
+ w: 0
16
+ }
17
+ }
18
+ @options.merge!(@connection.options.deep_dup)
19
+ @options.merge!(opts)
20
+
21
+ check_for_collection
22
+ end
23
+
24
+ def options
25
+ @options.with_indifferent_access
26
+ end
27
+
28
+ def create_collection
29
+ @collection = @connection[collection_name, capped: true, size: capsize]
30
+ @collection.create
31
+ end
32
+
33
+ def create_index field
34
+ @collection.indexes.create_one({ field: 1 }, background: true)
35
+ end
36
+
37
+ def insert_log_record(record)
38
+ @collection.insert_one(record)
39
+ end
40
+
41
+ def collection_stats
42
+ collection_stats_hash(@connection.command(collStats: collection_name).first)
43
+ end
44
+
45
+ def query(criteria, options={})
46
+ q = @collection.find(criteria).sort({'timestamp' => -1})
47
+ if options[:limit]
48
+ q = q.limit(options[:limit])
49
+ end
50
+ q
51
+ end
52
+
53
+ def find_by_id(id)
54
+ @collection.find("_id" => ::BSON::ObjectId.from_string(id)).first
55
+ end
56
+
57
+ def clear!
58
+ @collection.drop
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,95 @@
1
+ module MongoRequestLogger
2
+ # Directly parse the mongoig.yml config and present accessors similar to Mongoid 5.
3
+ # TODO: to be replaced by the Mongoid 5 default behaviour
4
+ module MongoidConfig
5
+ def self.clients
6
+ @clients ||= ClientMap.new
7
+ end
8
+
9
+ class ClientMap
10
+ attr_reader :config
11
+
12
+ def initialize
13
+ @clients = HashWithIndifferentAccess.new
14
+ config_file = Rails.root.join("config", "mongoid.yml")
15
+ @config = Environment.load_yaml(config_file).with_indifferent_access
16
+ @config = @config[:sessions]
17
+ @config = @config.with_indifferent_access
18
+ end
19
+
20
+ def [] key
21
+ config = @config[key]
22
+ raise Mongoid::Errors::NoSessionConfig.new(key) unless config
23
+ @clients[key] ||= ClientFactory.create(config)
24
+ end
25
+ end
26
+
27
+ class ClientFactory
28
+ def self.create configuration
29
+ raise unless configuration
30
+ if configuration[:uri]
31
+ Mongo::Client.new(configuration[:uri], options(configuration))
32
+ else
33
+ opts = options(configuration).merge(database: configuration[:database])
34
+ opts = opts.merge(credentials(configuration))
35
+ Mongo::Client.new(configuration[:hosts], opts)
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def self.options(configuration)
42
+ config = configuration.dup
43
+ options = config.delete(:options) || {}
44
+ options.reject{ |k, v| k == :hosts }.to_hash.symbolize_keys!
45
+ end
46
+
47
+ def self.credentials(configuration)
48
+ details = {}
49
+ details[:user] = configuration[:username] unless configuration[:username].nil?
50
+ details[:password] = configuration[:password] unless configuration[:password].nil?
51
+ details
52
+ end
53
+ end
54
+
55
+ class NoEnvironment < RuntimeError; end
56
+ # Encapsulates logic for getting environment information.
57
+ module Environment
58
+ extend self
59
+
60
+ # Get the name of the environment that we are running under. This first
61
+ # looks for Rails, then Sinatra, then a RACK_ENV environment variable,
62
+ # and if none of those are found raises an error.
63
+ #
64
+ # @example Get the env name.
65
+ # Environment.env_name
66
+ #
67
+ # @raise [ Errors::NoEnvironment ] If no environment was set.
68
+ #
69
+ # @return [ String ] The name of the current environment.
70
+ #
71
+ # @since 2.3.0
72
+ def env_name
73
+ return Rails.env if defined?(Rails) && Rails.respond_to?(:env)
74
+ return Sinatra::Base.environment.to_s if defined?(Sinatra)
75
+ ENV["RACK_ENV"] || ENV["MONGOID_ENV"] || raise(NoEnvironment.new)
76
+ end
77
+
78
+ # Load the yaml from the provided path and return the settings for the
79
+ # current environment.
80
+ #
81
+ # @example Load the yaml.
82
+ # Environment.load_yaml("/work/mongoid.yml")
83
+ #
84
+ # @param [ String ] path The location of the file.
85
+ #
86
+ # @return [ Hash ] The settings.
87
+ #
88
+ # @since 2.3.0
89
+ def load_yaml(path, environment = nil)
90
+ env = environment ? environment.to_s : env_name
91
+ YAML.load(ERB.new(File.new(path).read).result)[env]
92
+ end
93
+ end
94
+ end
95
+ end
@@ -7,6 +7,7 @@ if defined? Rails
7
7
  class Railtie < ::Rails::Railtie
8
8
  class << self
9
9
  def setup(app)
10
+ Mongo::Logger.logger.level = Logger::INFO # Because spammy.
10
11
  logger = MongoRequestLogger.configure(fallback_log: Rails.root.join("log/#{Rails.env}.log"))
11
12
 
12
13
  app.config.logger = logger
@@ -24,20 +25,22 @@ if defined? Rails
24
25
 
25
26
  app.config.middleware.insert_after ActionDispatch::DebugExceptions, MongoRequestLogger::Rack
26
27
 
27
- app.config.after_initialize do
28
- # Unicorn clears the START_CTX when a worker is forked, so if we have
29
- # data in START_CTX then we know we're being preloaded. Unicorn does
30
- # not provide application-level hooks for executing code after the
31
- # process has forked, so we reconnect lazily.
32
- if defined?(Unicorn) && !Unicorn::HttpServer::START_CTX.empty?
33
- ::MongoRequestLogger.session.disconnect
34
- end
28
+ unless logger.adapter.is_a?(MongoRequestLogger::Adapters::Mongo)
29
+ app.config.after_initialize do
30
+ # Unicorn clears the START_CTX when a worker is forked, so if we have
31
+ # data in START_CTX then we know we're being preloaded. Unicorn does
32
+ # not provide application-level hooks for executing code after the
33
+ # process has forked, so we reconnect lazily.
34
+ if defined?(Unicorn) && !Unicorn::HttpServer::START_CTX.empty?
35
+ ::MongoRequestLogger.session.disconnect
36
+ end
35
37
 
36
- # Passenger provides the :starting_worker_process event for executing
37
- # code after it has forked, so we use that and reconnect immediately.
38
- if ::Mongoid::Config.running_with_passenger?
39
- PhusionPassenger.on_event(:starting_worker_process) do |forked|
40
- ::MongoRequestLogger.session.disconnect if forked
38
+ # Passenger provides the :starting_worker_process event for executing
39
+ # code after it has forked, so we use that and reconnect immediately.
40
+ if ::Mongoid::Config.running_with_passenger?
41
+ PhusionPassenger.on_event(:starting_worker_process) do |forked|
42
+ ::MongoRequestLogger.session.disconnect if forked
43
+ end
41
44
  end
42
45
  end
43
46
  end
@@ -1,3 +1,3 @@
1
1
  module MongoRequestLogger
2
- VERSION = '0.5.0'
2
+ VERSION = '0.6.0'
3
3
  end
@@ -9,8 +9,10 @@ if defined?(Rails)
9
9
  end
10
10
 
11
11
  require 'mongoid'
12
- require 'moped'
13
- require 'mongo_request_logger/adapters/moped'
12
+
13
+ require 'mongo'
14
+ require_relative './mongo_request_logger/adapters/mongo.rb'
15
+ require_relative './mongo_request_logger/mongoid_config.rb'
14
16
 
15
17
 
16
18
  module MongoRequestLogger
@@ -24,13 +26,14 @@ module MongoRequestLogger
24
26
  require 'mongo_request_logger/viewer'
25
27
 
26
28
  environment = ENV['RACK_ENV'] || ENV['RAILS_ENV']
27
- session = options[:session] || Mongoid::Sessions.with_name(:logger)
29
+
30
+ session = MongoidConfig.clients[:logger]
28
31
  if session
29
- log_config = session.options
32
+ log_config = MongoidConfig.clients.config[:logger][:options].with_indifferent_access
30
33
 
31
34
  fallback_log = options[:fallback_log] || log_config['fallback_log'] || "log/#{environment}.log"
32
35
 
33
- adapter = MongoRequestLogger::Adapters::Moped.new(session)
36
+ adapter = MongoRequestLogger::Adapters::Mongo.new(session, log_config)
34
37
 
35
38
  @session = session
36
39
 
@@ -0,0 +1,34 @@
1
+ require 'spec_helper'
2
+ require 'mongo_request_logger'
3
+ require 'mongo'
4
+ require 'shared_examples'
5
+
6
+ include MongoRequestLogger
7
+
8
+ describe 'MongoRequestLogger::Logger with mongo-ruby-driver' do
9
+ before do
10
+ Mongo::Logger.logger.level = Logger::INFO
11
+ client = Mongo::Client.new(%w(127.0.0.1:27017), database: "request_logger_test")
12
+ begin
13
+ client = client.with(user: "request_logger_test", password: "test_password")
14
+ client.command(ping: 1)
15
+ rescue Mongo::Auth::Unauthorized => e
16
+ # Try without authentication
17
+ client.command(ping: 1)
18
+ end
19
+
20
+ client['server_log'].drop rescue nil
21
+
22
+ @adapter = MongoRequestLogger::Adapters::Mongo.new(client, capsize: 10)
23
+
24
+ @file = 'test-log.txt'
25
+ FileUtils.remove @file, :force => true
26
+ end
27
+
28
+ after do
29
+ FileUtils.remove @file, :force => true
30
+ end
31
+
32
+ include_examples "log"
33
+
34
+ end
data/spec/rails_spec.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
-
3
2
  begin
4
3
  require 'rails'
5
4
 
@@ -8,7 +7,6 @@ begin
8
7
  require 'dummy/application'
9
8
 
10
9
 
11
-
12
10
  describe "Rails Integration" do
13
11
  let(:app) do
14
12
  Rails.application
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongo_request_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Embark Mobile
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-16 00:00:00.000000000 Z
11
+ date: 2016-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
@@ -376,15 +376,15 @@ files:
376
376
  - gemfiles/sinatra1.4.gemfile
377
377
  - lib/mongo_request_logger.rb
378
378
  - lib/mongo_request_logger/adapters/base.rb
379
- - lib/mongo_request_logger/adapters/moped.rb
379
+ - lib/mongo_request_logger/adapters/mongo.rb
380
380
  - lib/mongo_request_logger/backtrace_cleaner.rb
381
381
  - lib/mongo_request_logger/ext/activesupport_logger.rb
382
382
  - lib/mongo_request_logger/ext/logger.rb
383
- - lib/mongo_request_logger/ext/moped_session.rb
384
383
  - lib/mongo_request_logger/log_message.rb
385
384
  - lib/mongo_request_logger/logged_job.rb
386
385
  - lib/mongo_request_logger/logger.rb
387
386
  - lib/mongo_request_logger/logger_extensions.rb
387
+ - lib/mongo_request_logger/mongoid_config.rb
388
388
  - lib/mongo_request_logger/rack.rb
389
389
  - lib/mongo_request_logger/railtie.rb
390
390
  - lib/mongo_request_logger/search_terms.rb
@@ -394,7 +394,7 @@ files:
394
394
  - spec/dummy/application.rb
395
395
  - spec/dummy/config/mongoid.yml
396
396
  - spec/dummy/log/.gitkeep
397
- - spec/moped_logger_spec.rb
397
+ - spec/mongodriver_logger_spec.rb
398
398
  - spec/query_spec.rb
399
399
  - spec/rails_spec.rb
400
400
  - spec/shared_examples.rb
@@ -424,7 +424,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
424
424
  version: '0'
425
425
  requirements: []
426
426
  rubyforge_project:
427
- rubygems_version: 2.4.5
427
+ rubygems_version: 2.6.4
428
428
  signing_key:
429
429
  specification_version: 4
430
430
  summary: Structured logger and log viewer for Rack (including Rails) requests
@@ -432,7 +432,7 @@ test_files:
432
432
  - spec/dummy/application.rb
433
433
  - spec/dummy/config/mongoid.yml
434
434
  - spec/dummy/log/.gitkeep
435
- - spec/moped_logger_spec.rb
435
+ - spec/mongodriver_logger_spec.rb
436
436
  - spec/query_spec.rb
437
437
  - spec/rails_spec.rb
438
438
  - spec/shared_examples.rb
@@ -1,64 +0,0 @@
1
- # Adapted from https://github.com/le0pard/mongodb_logger/
2
- require 'moped'
3
-
4
- require 'mongo_request_logger/adapters/base'
5
- require 'mongo_request_logger/ext/moped_session'
6
-
7
- module MongoRequestLogger
8
- module Adapters
9
- class Moped < Base
10
- class << self
11
- attr_accessor :connection
12
- end
13
-
14
-
15
- def initialize(session)
16
- @connection = session
17
- MongoRequestLogger::Adapters::Moped.connection = @connection
18
-
19
- @connection_type = @connection.class
20
-
21
- check_for_collection
22
- end
23
-
24
- def options
25
- @connection.options
26
- end
27
-
28
- def create_collection
29
- @connection.cluster.with_primary do |node|
30
- node.command(@connection.send(:current_database).name, {create: collection_name, capped: true, size: capsize})
31
- end
32
- end
33
-
34
- def create_index field
35
- @collection.indexes.create({field => 1})
36
- end
37
-
38
- def insert_log_record(record)
39
- record[:_id] = ::BSON::ObjectId.new
40
- @connection.with(safe: false)[collection_name].insert(record)
41
- end
42
-
43
- def collection_stats
44
- collection_stats_hash(@connection.command(collStats: collection_name))
45
- end
46
-
47
- def query(criteria, options={})
48
- q = @collection.find(criteria).sort({'timestamp' => -1})
49
- if options[:limit]
50
- q = q.limit(options[:limit])
51
- end
52
- q
53
- end
54
-
55
- def find_by_id(id)
56
- @collection.find("_id" => ::BSON::ObjectId.from_string(id)).first
57
- end
58
-
59
- def clear!
60
- @collection.drop
61
- end
62
- end
63
- end
64
- end
@@ -1,5 +0,0 @@
1
- require 'moped'
2
- require 'moped/session'
3
-
4
- # We use an additional :capsize option in the config.
5
- Moped::Session.send(:option, :capsize).allow(Optionable.any(Integer))
@@ -1,35 +0,0 @@
1
- require 'spec_helper'
2
- require 'mongo_request_logger'
3
- require 'moped'
4
- require 'shared_examples'
5
-
6
- include MongoRequestLogger
7
-
8
- describe 'MongoRequestLogger::Logger with moped' do
9
- before do
10
- session = Moped::Session.new(%w(127.0.0.1:27017))
11
- session.use "request_logger_test"
12
- begin
13
- session.login("request_logger_test", "test_password")
14
- session.command(ping: 1)
15
- rescue Moped::Errors::AuthenticationFailure => e
16
- session.logout
17
- session.command(ping: 1)
18
- end
19
-
20
- session['server_log'].drop rescue nil
21
-
22
- session.options[:capsize] = 10
23
- @adapter = MongoRequestLogger::Adapters::Moped.new(session)
24
-
25
- @file = 'test-log.txt'
26
- FileUtils.remove @file, :force => true
27
- end
28
-
29
- after do
30
- FileUtils.remove @file, :force => true
31
- end
32
-
33
- include_examples "log"
34
-
35
- end