mongo 2.1.0.beta → 2.1.0.rc0

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.
Files changed (253) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/Rakefile +2 -2
  5. data/lib/mongo.rb +2 -3
  6. data/lib/mongo/address.rb +7 -5
  7. data/lib/mongo/address/unix.rb +2 -2
  8. data/lib/mongo/auth/ldap/conversation.rb +6 -2
  9. data/lib/mongo/auth/scram/conversation.rb +8 -2
  10. data/lib/mongo/auth/user/view.rb +21 -0
  11. data/lib/mongo/bulk_write.rb +155 -23
  12. data/lib/mongo/bulk_write/combineable.rb +51 -0
  13. data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
  14. data/lib/mongo/bulk_write/result.rb +61 -8
  15. data/lib/mongo/bulk_write/result_combiner.rb +117 -0
  16. data/lib/mongo/bulk_write/transformable.rb +117 -0
  17. data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
  18. data/lib/mongo/bulk_write/validatable.rb +62 -0
  19. data/lib/mongo/client.rb +7 -3
  20. data/lib/mongo/cluster.rb +3 -3
  21. data/lib/mongo/cluster/topology/replica_set.rb +8 -6
  22. data/lib/mongo/cluster/topology/unknown.rb +5 -2
  23. data/lib/mongo/collection.rb +75 -4
  24. data/lib/mongo/collection/view.rb +1 -2
  25. data/lib/mongo/collection/view/aggregation.rb +13 -8
  26. data/lib/mongo/collection/view/immutable.rb +6 -6
  27. data/lib/mongo/collection/view/iterable.rb +13 -4
  28. data/lib/mongo/collection/view/map_reduce.rb +22 -17
  29. data/lib/mongo/collection/view/readable.rb +121 -70
  30. data/lib/mongo/cursor.rb +5 -1
  31. data/lib/mongo/database.rb +3 -3
  32. data/lib/mongo/database/view.rb +1 -1
  33. data/lib/mongo/error.rb +7 -0
  34. data/lib/mongo/{bulk_write/unordered_bulk_write.rb → error/closed_stream.rb} +12 -21
  35. data/lib/mongo/{bulk_write/ordered_bulk_write.rb → error/extra_file_chunk.rb} +13 -27
  36. data/lib/mongo/error/file_not_found.rb +37 -0
  37. data/lib/mongo/error/invalid_file.rb +2 -2
  38. data/lib/mongo/error/invalid_file_revision.rb +37 -0
  39. data/lib/mongo/error/invalid_uri.rb +5 -4
  40. data/lib/mongo/error/missing_file_chunk.rb +38 -0
  41. data/lib/mongo/error/operation_failure.rb +1 -1
  42. data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
  43. data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
  44. data/lib/mongo/grid.rb +2 -1
  45. data/lib/mongo/grid/file.rb +12 -9
  46. data/lib/mongo/grid/file/chunk.rb +6 -6
  47. data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
  48. data/lib/mongo/grid/fs_bucket.rb +441 -0
  49. data/lib/mongo/grid/stream.rb +64 -0
  50. data/lib/mongo/grid/stream/read.rb +208 -0
  51. data/lib/mongo/grid/stream/write.rb +187 -0
  52. data/lib/mongo/index/view.rb +1 -1
  53. data/lib/mongo/loggable.rb +34 -57
  54. data/lib/mongo/logger.rb +16 -78
  55. data/lib/mongo/monitoring.rb +1 -5
  56. data/lib/mongo/monitoring/command_log_subscriber.rb +35 -17
  57. data/lib/mongo/monitoring/event/command_succeeded.rb +20 -1
  58. data/lib/mongo/monitoring/publishable.rb +22 -12
  59. data/lib/mongo/operation.rb +3 -6
  60. data/lib/mongo/operation/commands.rb +24 -0
  61. data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
  62. data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
  63. data/lib/mongo/operation/commands/collections_info.rb +66 -0
  64. data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
  65. data/lib/mongo/operation/commands/indexes.rb +70 -0
  66. data/lib/mongo/operation/commands/list_collections.rb +54 -0
  67. data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
  68. data/lib/mongo/operation/commands/list_indexes.rb +56 -0
  69. data/lib/mongo/operation/commands/list_indexes/result.rb +115 -0
  70. data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
  71. data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +0 -0
  72. data/lib/mongo/operation/{parallel_scan.rb → commands/parallel_scan.rb} +3 -23
  73. data/lib/mongo/operation/{parallel_scan → commands/parallel_scan}/result.rb +0 -0
  74. data/lib/mongo/operation/commands/user_query.rb +69 -0
  75. data/lib/mongo/operation/commands/users_info.rb +53 -0
  76. data/lib/mongo/operation/commands/users_info/result.rb +36 -0
  77. data/lib/mongo/operation/executable.rb +4 -68
  78. data/lib/mongo/operation/kill_cursors.rb +3 -3
  79. data/lib/mongo/operation/read.rb +0 -4
  80. data/lib/mongo/operation/read/get_more.rb +2 -22
  81. data/lib/mongo/operation/read/query.rb +2 -21
  82. data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
  83. data/lib/mongo/operation/specifiable.rb +24 -0
  84. data/lib/mongo/operation/write.rb +2 -0
  85. data/lib/mongo/operation/write/bulk.rb +6 -3
  86. data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
  87. data/lib/mongo/operation/write/bulk/delete.rb +71 -0
  88. data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
  89. data/lib/mongo/operation/write/bulk/insert.rb +96 -0
  90. data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
  91. data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
  92. data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
  93. data/lib/mongo/operation/write/bulk/update.rb +81 -0
  94. data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
  95. data/lib/mongo/operation/write/command/create_index.rb +0 -1
  96. data/lib/mongo/operation/write/command/create_user.rb +0 -1
  97. data/lib/mongo/operation/write/command/delete.rb +0 -1
  98. data/lib/mongo/operation/write/command/drop_index.rb +0 -1
  99. data/lib/mongo/operation/write/command/insert.rb +0 -1
  100. data/lib/mongo/operation/write/command/remove_user.rb +0 -1
  101. data/lib/mongo/operation/write/command/update.rb +0 -1
  102. data/lib/mongo/operation/write/command/update_user.rb +0 -1
  103. data/lib/mongo/operation/write/command/writable.rb +13 -18
  104. data/lib/mongo/operation/write/create_index.rb +4 -27
  105. data/lib/mongo/operation/write/create_user.rb +4 -30
  106. data/lib/mongo/operation/write/delete.rb +5 -28
  107. data/lib/mongo/operation/write/drop_index.rb +3 -3
  108. data/lib/mongo/operation/write/gle.rb +48 -0
  109. data/lib/mongo/operation/write/idable.rb +5 -0
  110. data/lib/mongo/operation/write/insert.rb +2 -24
  111. data/lib/mongo/operation/write/remove_user.rb +4 -27
  112. data/lib/mongo/operation/write/update.rb +4 -32
  113. data/lib/mongo/operation/write/update_user.rb +4 -30
  114. data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
  115. data/lib/mongo/options/mapper.rb +4 -2
  116. data/lib/mongo/protocol/delete.rb +68 -3
  117. data/lib/mongo/protocol/get_more.rb +54 -2
  118. data/lib/mongo/protocol/insert.rb +59 -1
  119. data/lib/mongo/protocol/kill_cursors.rb +53 -4
  120. data/lib/mongo/protocol/message.rb +12 -12
  121. data/lib/mongo/protocol/query.rb +139 -65
  122. data/lib/mongo/protocol/reply.rb +69 -1
  123. data/lib/mongo/protocol/update.rb +70 -1
  124. data/lib/mongo/server/connection.rb +11 -3
  125. data/lib/mongo/server/description.rb +29 -0
  126. data/lib/mongo/server/description/features.rb +2 -1
  127. data/lib/mongo/server/monitor.rb +2 -2
  128. data/lib/mongo/server_selector.rb +14 -10
  129. data/lib/mongo/server_selector/selectable.rb +24 -22
  130. data/lib/mongo/socket.rb +6 -3
  131. data/lib/mongo/socket/tcp.rb +2 -2
  132. data/lib/mongo/socket/unix.rb +5 -8
  133. data/lib/mongo/uri.rb +243 -139
  134. data/lib/mongo/version.rb +1 -1
  135. data/spec/mongo/address/unix_spec.rb +1 -1
  136. data/spec/mongo/address_spec.rb +25 -0
  137. data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
  138. data/spec/mongo/auth/user/view_spec.rb +26 -1
  139. data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
  140. data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
  141. data/spec/mongo/bulk_write_spec.rb +332 -166
  142. data/spec/mongo/client_spec.rb +25 -0
  143. data/spec/mongo/cluster/topology/replica_set_spec.rb +2 -0
  144. data/spec/mongo/collection/view/aggregation_spec.rb +65 -0
  145. data/spec/mongo/collection/view/immutable_spec.rb +103 -0
  146. data/spec/mongo/collection/view/map_reduce_spec.rb +98 -3
  147. data/spec/mongo/collection/view/readable_spec.rb +17 -30
  148. data/spec/mongo/collection/view_spec.rb +233 -7
  149. data/spec/mongo/collection_spec.rb +360 -18
  150. data/spec/mongo/command_monitoring_spec.rb +51 -0
  151. data/spec/mongo/connection_string_spec.rb +137 -0
  152. data/spec/mongo/database_spec.rb +27 -11
  153. data/spec/mongo/grid/file/chunk_spec.rb +5 -5
  154. data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
  155. data/spec/mongo/grid/file_spec.rb +8 -8
  156. data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
  157. data/spec/mongo/grid/stream/read_spec.rb +275 -0
  158. data/spec/mongo/grid/stream/write_spec.rb +440 -0
  159. data/spec/mongo/grid/stream_spec.rb +48 -0
  160. data/spec/mongo/gridfs_spec.rb +50 -0
  161. data/spec/mongo/logger_spec.rb +0 -40
  162. data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
  163. data/spec/mongo/operation/{aggregate_spec.rb → commands/aggregate_spec.rb} +0 -42
  164. data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
  165. data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -0
  166. data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
  167. data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +0 -18
  168. data/spec/mongo/operation/kill_cursors_spec.rb +1 -1
  169. data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
  170. data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +1 -12
  171. data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +1 -12
  172. data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +1 -12
  173. data/spec/mongo/operation/write/insert_spec.rb +0 -11
  174. data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
  175. data/spec/mongo/server/description_spec.rb +42 -0
  176. data/spec/mongo/server/monitor_spec.rb +21 -0
  177. data/spec/mongo/server_discovery_and_monitoring_spec.rb +1 -0
  178. data/spec/mongo/server_selection_spec.rb +3 -3
  179. data/spec/mongo/server_selector/nearest_spec.rb +34 -27
  180. data/spec/mongo/server_selector/primary_preferred_spec.rb +31 -30
  181. data/spec/mongo/server_selector/primary_spec.rb +14 -13
  182. data/spec/mongo/server_selector/secondary_preferred_spec.rb +27 -26
  183. data/spec/mongo/server_selector/secondary_spec.rb +23 -22
  184. data/spec/mongo/server_selector_spec.rb +87 -24
  185. data/spec/mongo/socket/unix_spec.rb +52 -0
  186. data/spec/mongo/uri_spec.rb +251 -39
  187. data/spec/spec_helper.rb +11 -4
  188. data/spec/support/authorization.rb +4 -5
  189. data/spec/support/command_monitoring.rb +365 -0
  190. data/spec/support/command_monitoring/bulkWrite.yml +73 -0
  191. data/spec/support/command_monitoring/command.yml +42 -0
  192. data/spec/support/command_monitoring/deleteMany.yml +55 -0
  193. data/spec/support/command_monitoring/deleteOne.yml +55 -0
  194. data/spec/support/command_monitoring/find.yml +219 -0
  195. data/spec/support/command_monitoring/insertMany.yml +81 -0
  196. data/spec/support/command_monitoring/insertOne.yml +51 -0
  197. data/spec/support/command_monitoring/updateMany.yml +67 -0
  198. data/spec/support/command_monitoring/updateOne.yml +95 -0
  199. data/spec/support/connection_string.rb +228 -0
  200. data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
  201. data/spec/support/connection_string_tests/valid-auth.yml +256 -0
  202. data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
  203. data/spec/support/connection_string_tests/valid-options.yml +30 -0
  204. data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
  205. data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
  206. data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
  207. data/spec/support/crud.rb +3 -1
  208. data/spec/support/crud/read.rb +14 -10
  209. data/spec/support/crud/write.rb +36 -9
  210. data/spec/support/gridfs.rb +637 -0
  211. data/spec/support/gridfs_tests/delete.yml +157 -0
  212. data/spec/support/gridfs_tests/download.yml +210 -0
  213. data/spec/support/gridfs_tests/download_by_name.yml +113 -0
  214. data/spec/support/gridfs_tests/upload.yml +158 -0
  215. data/spec/support/sdam/rs/equal_electionids.yml +1 -2
  216. data/spec/support/sdam/rs/new_primary_new_electionid.yml +0 -3
  217. data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
  218. data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
  219. data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
  220. data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
  221. data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
  222. data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
  223. data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
  224. data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
  225. data/spec/support/sdam/single/not_ok_response.yml +0 -1
  226. data/spec/support/server_discovery_and_monitoring.rb +3 -1
  227. data/spec/support/server_selection.rb +3 -1
  228. data/spec/support/shared/bulk_write.rb +192 -0
  229. data/spec/support/shared/server_selector.rb +21 -12
  230. metadata +147 -57
  231. metadata.gz.sig +0 -0
  232. data/lib/mongo/bulk_write/bulk_writable.rb +0 -252
  233. data/lib/mongo/bulk_write/deletable.rb +0 -57
  234. data/lib/mongo/bulk_write/insertable.rb +0 -49
  235. data/lib/mongo/bulk_write/replacable.rb +0 -58
  236. data/lib/mongo/bulk_write/updatable.rb +0 -69
  237. data/lib/mongo/grid/fs.rb +0 -146
  238. data/lib/mongo/operation/list_collections/result.rb +0 -114
  239. data/lib/mongo/operation/list_indexes/result.rb +0 -118
  240. data/lib/mongo/operation/read/collections_info.rb +0 -68
  241. data/lib/mongo/operation/read/indexes.rb +0 -69
  242. data/lib/mongo/operation/read/list_collections.rb +0 -76
  243. data/lib/mongo/operation/read/list_indexes.rb +0 -78
  244. data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
  245. data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
  246. data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
  247. data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
  248. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
  249. data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
  250. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -174
  251. data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
  252. data/spec/mongo/grid/fs_spec.rb +0 -160
  253. data/spec/mongo/loggable_spec.rb +0 -63
@@ -229,7 +229,7 @@ module Mongo
229
229
  end
230
230
 
231
231
  def initial_query_op
232
- Operation::Read::Indexes.new(indexes_spec)
232
+ Operation::Indexes.new(indexes_spec)
233
233
  end
234
234
 
235
235
  def limit; -1; end
@@ -24,105 +24,82 @@ module Mongo
24
24
  # @since 2.0.0
25
25
  PREFIX = 'MONGODB'.freeze
26
26
 
27
- # Log the operations. If a block is provided it will be yielded to,
28
- # otherwise only the logging will take place.
29
- #
30
- # @example Log a query operation.
31
- # loggable.log(:debug, "MONGO.query", operations)
32
- #
33
- # @param [ Symbol ] level The log level.
34
- # @param [ String ] prefix The prefix for the log line.
35
- # @param [ Array<Object> ] operations The operations to log. The must
36
- # respond to #log_message.
37
- #
38
- # @return [ Object ] The result of the block or nil if no block given.
39
- #
40
- # @since 2.0.0
41
- def log(level, prefix, operations)
42
- started = Time.new
43
- begin
44
- yield(operations) if block_given?
45
- rescue Exception => e
46
- raise e
47
- ensure
48
- if Logger.allow?(level)
49
- runtime = format("%.4fms", (Time.now.to_f - started.to_f) * 1000.0)
50
- operations.each do |operation|
51
- Logger.log(level, prefix, log_inspect(operation), runtime)
52
- end
53
- end
54
- end
55
- end
56
-
57
27
  # Convenience method to log debug messages with the standard prefix.
58
28
  #
59
29
  # @example Log a debug message.
60
- # log_debug([ 'Message' ])
30
+ # log_debug('Message')
61
31
  #
62
- # @param [ Array<Operation, String> ] operations The operations or messages
63
- # to log.
32
+ # @param [ String ] message The message to log.
64
33
  #
65
34
  # @since 2.0.0
66
- def log_debug(operations, &block)
67
- log(:debug, PREFIX, operations, &block)
35
+ def log_debug(message)
36
+ logger.debug(format_message(message)) if logger.debug?
68
37
  end
69
38
 
70
39
  # Convenience method to log error messages with the standard prefix.
71
40
  #
72
41
  # @example Log a error message.
73
- # log_error([ 'Message' ])
42
+ # log_error('Message')
74
43
  #
75
- # @param [ Array<Operation, String> ] operations The operations or messages
76
- # to log.
44
+ # @param [ String ] message The message to log.
77
45
  #
78
46
  # @since 2.0.0
79
- def log_error(operations, &block)
80
- log(:error, PREFIX, operations, &block)
47
+ def log_error(message)
48
+ logger.error(format_message(message)) if logger.error?
81
49
  end
82
50
 
83
51
  # Convenience method to log fatal messages with the standard prefix.
84
52
  #
85
53
  # @example Log a fatal message.
86
- # log_fatal([ 'Message' ])
54
+ # log_fatal('Message')
87
55
  #
88
- # @param [ Array<Operation, String> ] operations The operations or messages
89
- # to log.
56
+ # @param [ String ] message The message to log.
90
57
  #
91
58
  # @since 2.0.0
92
- def log_fatal(operations, &block)
93
- log(:fatal, PREFIX, operations, &block)
59
+ def log_fatal(message)
60
+ logger.fatal(format_message(message)) if logger.fatal?
94
61
  end
95
62
 
96
63
  # Convenience method to log info messages with the standard prefix.
97
64
  #
98
65
  # @example Log a info message.
99
- # log_info([ 'Message' ])
66
+ # log_info('Message')
100
67
  #
101
- # @param [ Array<Operation, String> ] operations The operations or messages
102
- # to log.
68
+ # @param [ String ] message The message to log.
103
69
  #
104
70
  # @since 2.0.0
105
- def log_info(operations, &block)
106
- log(:info, PREFIX, operations, &block)
71
+ def log_info(message)
72
+ logger.info(format_message(message)) if logger.info?
107
73
  end
108
74
 
109
75
  # Convenience method to log warn messages with the standard prefix.
110
76
  #
111
77
  # @example Log a warn message.
112
- # log_warn([ 'Message' ])
78
+ # log_warn('Message')
113
79
  #
114
- # @param [ Array<Operation, String> ] operations The operations or messages
115
- # to log.
80
+ # @param [ String ] message The message to log.
116
81
  #
117
82
  # @since 2.0.0
118
- def log_warn(operations, &block)
119
- log(:warn, PREFIX, operations, &block)
83
+ def log_warn(message)
84
+ logger.warn(format_message(message)) if logger.warn?
85
+ end
86
+
87
+ # Get the logger instance.
88
+ #
89
+ # @example Get the logger instance.
90
+ # loggable.logger
91
+ #
92
+ # @return [ Logger ] The logger.
93
+ #
94
+ # @since 2.1.0
95
+ def logger
96
+ (options[:logger] || Logger.logger)
120
97
  end
121
98
 
122
99
  private
123
100
 
124
- def log_inspect(operation)
125
- operation.respond_to?(:log_message) ? operation.log_message : operation
101
+ def format_message(message)
102
+ format("%s | %s".freeze, PREFIX, message)
126
103
  end
127
104
  end
128
105
  end
data/lib/mongo/logger.rb CHANGED
@@ -23,76 +23,6 @@ module Mongo
23
23
 
24
24
  class << self
25
25
 
26
- # Log a debug level message.
27
- #
28
- # @example Log a debug level message.
29
- # Logger.debug('mongo', 'message', '10ms')
30
- #
31
- # @param [ String ] prefix The category prefix.
32
- # @param [ String ] message The log message.
33
- # @param [ String ] runtime The time of the operation.
34
- #
35
- # @since 2.0.0
36
- def debug(prefix, message, runtime)
37
- self.log(:debug, prefix, message, runtime)
38
- end
39
-
40
- # Log a error level message.
41
- #
42
- # @example Log a error level message.
43
- # Logger.error('mongo', 'message', '10ms')
44
- #
45
- # @param [ String ] prefix The category prefix.
46
- # @param [ String ] message The log message.
47
- # @param [ String ] runtime The time of the operation.
48
- #
49
- # @since 2.0.0
50
- def error(prefix, message, runtime)
51
- self.log(:error, prefix, message, runtime)
52
- end
53
-
54
- # Log a fatal level message.
55
- #
56
- # @example Log a fatal level message.
57
- # Logger.fatal('mongo', 'message', '10ms')
58
- #
59
- # @param [ String ] prefix The category prefix.
60
- # @param [ String ] message The log message.
61
- # @param [ String ] runtime The time of the operation.
62
- #
63
- # @since 2.0.0
64
- def fatal(prefix, message, runtime)
65
- self.log(:fatal, prefix, message, runtime)
66
- end
67
-
68
- # Log a info level message.
69
- #
70
- # @example Log a info level message.
71
- # Logger.info('mongo', 'message', '10ms')
72
- #
73
- # @param [ String ] prefix The category prefix.
74
- # @param [ String ] message The log message.
75
- # @param [ String ] runtime The time of the operation.
76
- #
77
- # @since 2.0.0
78
- def info(prefix, message, runtime)
79
- self.log(:info, prefix, message, runtime)
80
- end
81
-
82
- # Log a warn level message.
83
- #
84
- # @example Log a warn level message.
85
- # Logger.warn('mongo', 'message', '10ms')
86
- #
87
- # @param [ String ] prefix The category prefix.
88
- # @param [ String ] message The log message.
89
- # @param [ String ] runtime The time of the operation.
90
- #
91
- # @since 2.0.0
92
- def warn(prefix, message, runtime)
93
- self.log(:warn, prefix, message, runtime)
94
- end
95
-
96
26
  # Get the wrapped logger. If none was set will return a default debug
97
27
  # level logger.
98
28
  #
@@ -120,18 +50,26 @@ module Mongo
120
50
  @logger = other
121
51
  end
122
52
 
123
- def log(level, prefix, message, runtime)
124
- logger.send(level, format("%s | %s | runtime: %s".freeze, prefix, message, runtime))
125
- end
126
-
127
- def allow?(level)
128
- logger.send(:"#{level}?")
129
- end
130
-
53
+ # Get the global logger level.
54
+ #
55
+ # @example Get the global logging level.
56
+ # Mongo::Logger.level
57
+ #
58
+ # @return [ Integer ] The log level.
59
+ #
60
+ # @since 2.0.0
131
61
  def level
132
62
  logger.level
133
63
  end
134
64
 
65
+ # Set the global logger level.
66
+ #
67
+ # @example Set the global logging level.
68
+ # Mongo::Logger.level == Logger::DEBUG
69
+ #
70
+ # @return [ Integer ] The log level.
71
+ #
72
+ # @since 2.0.0
135
73
  def level=(level)
136
74
  logger.level = level
137
75
  end
@@ -83,11 +83,6 @@ module Mongo
83
83
  end
84
84
  end
85
85
 
86
- # Adds our internal command logging to the global subscribers.
87
- #
88
- # @since 2.1.0
89
- Global.subscribe(COMMAND, CommandLogSubscriber.new)
90
-
91
86
  # Initialize the monitoring.
92
87
  #
93
88
  # @api private
@@ -105,6 +100,7 @@ module Mongo
105
100
  subscribe(topic, subscriber)
106
101
  end
107
102
  end
103
+ subscribe(COMMAND, CommandLogSubscriber.new(options))
108
104
  end
109
105
  end
110
106
 
@@ -19,6 +19,10 @@ module Mongo
19
19
  #
20
20
  # @since 2.1.0
21
21
  class CommandLogSubscriber
22
+ include Loggable
23
+
24
+ # @return [ Hash ] options The options.
25
+ attr_reader :options
22
26
 
23
27
  # Constant for the max number of characters to print when inspecting
24
28
  # a query field.
@@ -26,6 +30,20 @@ module Mongo
26
30
  # @since 2.1.0
27
31
  LOG_STRING_LIMIT = 250
28
32
 
33
+ # Create the new log subscriber.
34
+ #
35
+ # @example Create the log subscriber.
36
+ # CommandLogSubscriber.new
37
+ #
38
+ # @param [ Hash ] options The options.
39
+ #
40
+ # @option options [ Logger ] :logger An optional custom logger.
41
+ #
42
+ # @since 2.1.0
43
+ def initialize(options = {})
44
+ @options = options
45
+ end
46
+
29
47
  # Handle the command started event.
30
48
  #
31
49
  # @example Handle the event.
@@ -35,9 +53,7 @@ module Mongo
35
53
  #
36
54
  # @since 2.1.0
37
55
  def started(event)
38
- if Logger.logger.debug?
39
- log("#{prefix(event)} | STARTED | #{format(event.command)}")
40
- end
56
+ log_debug("#{prefix(event)} | STARTED | #{format_command(event.command)}")
41
57
  end
42
58
 
43
59
  # Handle the command succeeded event.
@@ -49,9 +65,7 @@ module Mongo
49
65
  #
50
66
  # @since 2.1.0
51
67
  def succeeded(event)
52
- if Logger.logger.debug?
53
- log("#{prefix(event)} | SUCCEEDED | #{event.duration}s")
54
- end
68
+ log_debug("#{prefix(event)} | SUCCEEDED | #{event.duration}s")
55
69
  end
56
70
 
57
71
  # Handle the command failed event.
@@ -63,25 +77,29 @@ module Mongo
63
77
  #
64
78
  # @since 2.1.0
65
79
  def failed(event)
66
- if Logger.logger.debug?
67
- log("#{prefix(event)} | FAILED | #{event.message} | #{event.duration}s")
68
- end
80
+ log_debug("#{prefix(event)} | FAILED | #{event.message} | #{event.duration}s")
69
81
  end
70
82
 
71
83
  private
72
84
 
73
- def format(args)
74
- ((s = args.inspect).length > LOG_STRING_LIMIT) ? "#{s[0..LOG_STRING_LIMIT]}..." : s
75
- rescue ArgumentError
76
- '<Unable to inspect arguments>'
85
+ def format_command(args)
86
+ begin
87
+ truncating? ? truncate(args) : args.inspect
88
+ rescue Exception
89
+ '<Unable to inspect arguments>'
90
+ end
91
+ end
92
+
93
+ def prefix(event)
94
+ "#{event.address.to_s} | #{event.database_name}.#{event.command_name}"
77
95
  end
78
96
 
79
- def log(message)
80
- Logger.logger.debug(message)
97
+ def truncate(command)
98
+ ((s = command.inspect).length > LOG_STRING_LIMIT) ? "#{s[0..LOG_STRING_LIMIT]}..." : s
81
99
  end
82
100
 
83
- def prefix(event)
84
- "MONGODB | #{event.address.to_s} | #{event.database_name}.#{event.command_name}"
101
+ def truncating?
102
+ @truncating ||= (options[:truncate_logs] != false)
85
103
  end
86
104
  end
87
105
  end
@@ -86,10 +86,29 @@ module Mongo
86
86
  address,
87
87
  command_payload[:request_id],
88
88
  operation_id,
89
- reply_payload ? reply_payload[:reply] : nil,
89
+ generate_reply(command_payload, reply_payload),
90
90
  duration
91
91
  )
92
92
  end
93
+
94
+ private
95
+
96
+ def self.generate_reply(command_payload, reply_payload)
97
+ if reply_payload
98
+ reply = reply_payload[:reply]
99
+ if cursor = reply[:cursor]
100
+ reply = reply.merge(cursor: cursor.merge(ns: namespace(command_payload)))
101
+ end
102
+ reply
103
+ else
104
+ BSON::Document.new(ok: 1)
105
+ end
106
+ end
107
+
108
+ def self.namespace(payload)
109
+ command = payload[:command]
110
+ "#{payload[:database_name]}.#{command[:collection] || command.values.first}"
111
+ end
93
112
  end
94
113
  end
95
114
  end
@@ -37,14 +37,20 @@ module Mongo
37
37
  # @since 2.1.0
38
38
  def publish_command(messages, operation_id = Monitoring.next_operation_id)
39
39
  start = Time.now
40
- payload = messages.first.payload
40
+ message = messages.first
41
+ message.set_request_id
42
+ payload = message.payload
43
+ send_duration = duration(start)
41
44
  command_started(address, operation_id, payload)
45
+ receive_start = Time.now
42
46
  begin
43
47
  result = yield(messages)
44
- command_completed(result, address, operation_id, payload, start)
48
+ total_duration = duration(receive_start) + send_duration
49
+ command_completed(result, address, operation_id, payload, total_duration)
45
50
  result
46
51
  rescue Exception => e
47
- command_failed(address, operation_id, payload, e.message, start)
52
+ total_duration = duration(receive_start) + send_duration
53
+ command_failed(address, operation_id, payload, e.message, total_duration)
48
54
  raise e
49
55
  end
50
56
  end
@@ -58,17 +64,17 @@ module Mongo
58
64
  )
59
65
  end
60
66
 
61
- def command_completed(result, address, operation_id, payload, start)
67
+ def command_completed(result, address, operation_id, payload, duration)
62
68
  document = result ? (result.documents || []).first : nil
63
- parser = Error::Parser.new(document)
64
- if parser.message.empty?
65
- command_succeeded(result, address, operation_id, payload, start)
69
+ if error?(document)
70
+ parser = Error::Parser.new(document)
71
+ command_failed(address, operation_id, payload, parser.message, duration)
66
72
  else
67
- command_failed(address, operation_id, payload, parser.message, start)
73
+ command_succeeded(result, address, operation_id, payload, duration)
68
74
  end
69
75
  end
70
76
 
71
- def command_succeeded(result, address, operation_id, payload, start)
77
+ def command_succeeded(result, address, operation_id, payload, duration)
72
78
  monitoring.succeeded(
73
79
  Monitoring::COMMAND,
74
80
  Event::CommandSucceeded.generate(
@@ -76,21 +82,25 @@ module Mongo
76
82
  operation_id,
77
83
  payload,
78
84
  result ? result.payload : nil,
79
- duration(start)
85
+ duration
80
86
  )
81
87
  )
82
88
  end
83
89
 
84
- def command_failed(address, operation_id, payload, message, start)
90
+ def command_failed(address, operation_id, payload, message, duration)
85
91
  monitoring.failed(
86
92
  Monitoring::COMMAND,
87
- Event::CommandFailed.generate(address, operation_id, payload, message, duration(start))
93
+ Event::CommandFailed.generate(address, operation_id, payload, message, duration)
88
94
  )
89
95
  end
90
96
 
91
97
  def duration(start)
92
98
  Time.now - start
93
99
  end
100
+
101
+ def error?(document)
102
+ document && (document['ok'] == 0 || document.key?('$err'))
103
+ end
94
104
  end
95
105
  end
96
106
  end