mongo 2.0.6 → 2.1.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongo.rb +2 -0
  5. data/lib/mongo/bulk_write.rb +1 -0
  6. data/lib/mongo/bulk_write/bulk_writable.rb +87 -31
  7. data/lib/mongo/bulk_write/deletable.rb +8 -7
  8. data/lib/mongo/bulk_write/insertable.rb +4 -3
  9. data/lib/mongo/bulk_write/ordered_bulk_write.rb +6 -6
  10. data/lib/mongo/bulk_write/replacable.rb +4 -3
  11. data/lib/mongo/bulk_write/result.rb +138 -0
  12. data/lib/mongo/bulk_write/unordered_bulk_write.rb +5 -8
  13. data/lib/mongo/bulk_write/updatable.rb +8 -7
  14. data/lib/mongo/client.rb +36 -4
  15. data/lib/mongo/cluster.rb +39 -4
  16. data/lib/mongo/cluster/topology/replica_set.rb +20 -4
  17. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  18. data/lib/mongo/collection.rb +282 -29
  19. data/lib/mongo/collection/view/aggregation.rb +32 -4
  20. data/lib/mongo/collection/view/iterable.rb +2 -1
  21. data/lib/mongo/collection/view/map_reduce.rb +3 -1
  22. data/lib/mongo/collection/view/readable.rb +89 -14
  23. data/lib/mongo/collection/view/writable.rb +11 -5
  24. data/lib/mongo/cursor.rb +11 -3
  25. data/lib/mongo/dbref.rb +113 -0
  26. data/lib/mongo/error.rb +6 -2
  27. data/lib/mongo/error/parser.rb +1 -1
  28. data/lib/mongo/event/description_changed.rb +1 -1
  29. data/lib/mongo/grid/file.rb +1 -1
  30. data/lib/mongo/grid/fs.rb +2 -5
  31. data/lib/mongo/monitoring.rb +199 -0
  32. data/lib/mongo/monitoring/command_log_subscriber.rb +88 -0
  33. data/lib/mongo/monitoring/event.rb +17 -0
  34. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  35. data/lib/mongo/monitoring/event/command_started.rb +88 -0
  36. data/lib/mongo/monitoring/event/command_succeeded.rb +96 -0
  37. data/lib/mongo/monitoring/publishable.rb +96 -0
  38. data/lib/mongo/operation.rb +1 -0
  39. data/lib/mongo/operation/executable.rb +1 -1
  40. data/lib/mongo/operation/parallel_scan.rb +76 -0
  41. data/lib/mongo/operation/parallel_scan/result.rb +72 -0
  42. data/lib/mongo/operation/specifiable.rb +18 -0
  43. data/lib/mongo/operation/write/bulk/bulk_delete.rb +1 -1
  44. data/lib/mongo/operation/write/bulk/bulk_insert.rb +1 -1
  45. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +2 -2
  46. data/lib/mongo/operation/write/bulk/bulk_update.rb +1 -1
  47. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +13 -1
  48. data/lib/mongo/protocol/delete.rb +8 -13
  49. data/lib/mongo/protocol/get_more.rb +13 -13
  50. data/lib/mongo/protocol/insert.rb +8 -13
  51. data/lib/mongo/protocol/kill_cursors.rb +7 -11
  52. data/lib/mongo/protocol/query.rb +58 -20
  53. data/lib/mongo/protocol/reply.rb +12 -0
  54. data/lib/mongo/protocol/update.rb +13 -14
  55. data/lib/mongo/server.rb +23 -2
  56. data/lib/mongo/server/connectable.rb +0 -22
  57. data/lib/mongo/server/connection.rb +29 -0
  58. data/lib/mongo/server/description.rb +23 -1
  59. data/lib/mongo/server/monitor.rb +17 -1
  60. data/lib/mongo/server/monitor/connection.rb +24 -0
  61. data/lib/mongo/socket/ssl.rb +28 -16
  62. data/lib/mongo/socket/tcp.rb +1 -1
  63. data/lib/mongo/socket/unix.rb +1 -1
  64. data/lib/mongo/uri.rb +12 -5
  65. data/lib/mongo/version.rb +1 -1
  66. data/spec/mongo/auth/cr_spec.rb +9 -1
  67. data/spec/mongo/auth/ldap_spec.rb +9 -1
  68. data/spec/mongo/auth/scram_spec.rb +9 -1
  69. data/spec/mongo/auth/x509_spec.rb +9 -1
  70. data/spec/mongo/{bulk/bulk_write_spec.rb → bulk_write_spec.rb} +15 -15
  71. data/spec/mongo/client_spec.rb +42 -0
  72. data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -9
  73. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  74. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  75. data/spec/mongo/cluster_spec.rb +55 -10
  76. data/spec/mongo/collection/view/aggregation_spec.rb +123 -1
  77. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  78. data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
  79. data/spec/mongo/collection/view/readable_spec.rb +251 -6
  80. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  81. data/spec/mongo/collection/view_spec.rb +233 -71
  82. data/spec/mongo/collection_spec.rb +905 -9
  83. data/spec/mongo/crud_spec.rb +2 -2
  84. data/spec/mongo/cursor_spec.rb +3 -3
  85. data/spec/mongo/dbref_spec.rb +149 -0
  86. data/spec/mongo/monitoring_spec.rb +168 -0
  87. data/spec/mongo/operation/map_reduce_spec.rb +1 -1
  88. data/spec/mongo/operation/write/bulk/bulk_delete_spec.rb +1 -1
  89. data/spec/mongo/operation/write/bulk/bulk_insert_spec.rb +2 -2
  90. data/spec/mongo/operation/write/bulk/bulk_update_spec.rb +1 -1
  91. data/spec/mongo/operation/write/delete_spec.rb +1 -1
  92. data/spec/mongo/operation/write/insert_spec.rb +2 -2
  93. data/spec/mongo/operation/write/update_spec.rb +1 -1
  94. data/spec/mongo/protocol/query_spec.rb +0 -29
  95. data/spec/mongo/server/connection_pool_spec.rb +18 -6
  96. data/spec/mongo/server/connection_spec.rb +12 -4
  97. data/spec/mongo/server/description_spec.rb +7 -3
  98. data/spec/mongo/server/monitor_spec.rb +30 -0
  99. data/spec/mongo/server_discovery_and_monitoring_spec.rb +11 -4
  100. data/spec/mongo/server_selection_spec.rb +14 -6
  101. data/spec/mongo/server_spec.rb +27 -8
  102. data/spec/mongo/socket/ssl_spec.rb +94 -8
  103. data/spec/mongo/uri_spec.rb +25 -9
  104. data/spec/spec_helper.rb +29 -20
  105. data/spec/support/authorization.rb +19 -4
  106. data/spec/support/certificates/client.pem +4 -4
  107. data/spec/support/crud/read.rb +9 -10
  108. data/spec/support/crud/write.rb +24 -20
  109. data/spec/support/sdam/rs/equal_electionids.yml +45 -0
  110. data/spec/support/sdam/rs/new_primary_new_electionid.yml +98 -0
  111. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  112. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  113. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  114. data/spec/support/server_discovery_and_monitoring.rb +19 -2
  115. data/spec/support/shared/bulk_write.rb +26 -22
  116. data/spec/support/shared/server_selector.rb +2 -1
  117. metadata +31 -7
  118. metadata.gz.sig +0 -0
  119. data/lib/mongo/error/invalid_uri_option.rb +0 -38
@@ -43,11 +43,16 @@ module Mongo
43
43
  # @since 2.0.0
44
44
  WRITE_ERRORS = 'writeErrors'.freeze
45
45
 
46
- # The constant for write concern errors.
46
+ # The constant for a write concern error.
47
47
  #
48
48
  # @since 2.0.0
49
49
  WRITE_CONCERN_ERROR = 'writeConcernError'.freeze
50
50
 
51
+ # The constant for write concern errors.
52
+ #
53
+ # @since 2.1.0
54
+ WRITE_CONCERN_ERRORS = 'writeConcernErrors'.freeze
55
+
51
56
  # Constant for an unknown error.
52
57
  #
53
58
  # @since 2.0.0
@@ -75,7 +80,6 @@ require 'mongo/error/invalid_server_preference'
75
80
  require 'mongo/error/invalid_signature'
76
81
  require 'mongo/error/invalid_update_document'
77
82
  require 'mongo/error/invalid_uri'
78
- require 'mongo/error/invalid_uri_option'
79
83
  require 'mongo/error/max_bson_size'
80
84
  require 'mongo/error/max_message_size'
81
85
  require 'mongo/error/multi_index_drop'
@@ -36,7 +36,7 @@ module Mongo
36
36
  #
37
37
  # @since 2.0.0
38
38
  def initialize(document)
39
- @document = document
39
+ @document = document || {}
40
40
  parse!
41
41
  end
42
42
 
@@ -42,7 +42,7 @@ module Mongo
42
42
  # @example Handle the event.
43
43
  # server_added.handle('127.0.0.1:27018')
44
44
  #
45
- # @param [ Address ] address The added host.
45
+ # @param [ Server::Description ] updated The changed description.
46
46
  #
47
47
  # @since 2.0.0
48
48
  def handle(updated)
@@ -30,7 +30,7 @@ module Mongo
30
30
  # @return [ Array<Chunk> ] chunks The file chunks.
31
31
  attr_reader :chunks
32
32
 
33
- # @return [ IO ] data The raw datafor the file.
33
+ # @return [ IO ] data The raw data for the file.
34
34
  attr_reader :data
35
35
 
36
36
  # @return [ Metadata ] metadata The file metadata.
@@ -70,15 +70,12 @@ module Mongo
70
70
  #
71
71
  # @param [ Grid::File ] file The file to insert.
72
72
  #
73
- # @return [ Result ] The result of the insert.
73
+ # @return [ BSON::ObjectId ] The file id.
74
74
  #
75
75
  # @since 2.0.0
76
76
  def insert_one(file)
77
77
  files_collection.insert_one(file.metadata)
78
- inserts = file.chunks.reduce([]) do |ops, chunk|
79
- ops << { :insert_one => chunk }
80
- end
81
- result = chunks_collection.bulk_write(inserts, ordered: true)
78
+ result = chunks_collection.insert_many(file.chunks)
82
79
  validate_md5!(file) if write_concern.get_last_error
83
80
  file.id
84
81
  end
@@ -0,0 +1,199 @@
1
+ # Copyright (C) 2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the 'License');
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an 'AS IS' BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'mongo/monitoring/event'
16
+ require 'mongo/monitoring/publishable'
17
+ require 'mongo/monitoring/command_log_subscriber'
18
+
19
+ module Mongo
20
+
21
+ # The class defines behaviour for the performance monitoring API.
22
+ #
23
+ # @since 2.1.0
24
+ class Monitoring
25
+
26
+ # The command topic.
27
+ #
28
+ # @since 2.1.0
29
+ COMMAND = 'Command'.freeze
30
+
31
+ @@operation_id = 0
32
+ @@operation_id_lock = Mutex.new
33
+
34
+ # Used for generating unique operation ids to link events together.
35
+ #
36
+ # @example Get the next operation id.
37
+ # Monitoring.next_operation_id
38
+ #
39
+ # @return [ Integer ] The next operation id.
40
+ #
41
+ # @since 2.1.0
42
+ def self.next_operation_id
43
+ @@operation_id_lock.synchronize do
44
+ @@operation_id += 1
45
+ end
46
+ end
47
+
48
+ # Provides behaviour around global subscribers.
49
+ #
50
+ # @since 2.1.0
51
+ module Global
52
+ extend self
53
+
54
+ # Subscribe a listener to an event topic.
55
+ #
56
+ # @example Subscribe to the topic.
57
+ # Monitoring::Global.subscribe(QUERY, subscriber)
58
+ #
59
+ # @param [ String ] topic The event topic.
60
+ # @param [ Object ] subscriber The subscriber to handle the event.
61
+ #
62
+ # @since 2.1.0
63
+ def subscribe(topic, subscriber)
64
+ subscribers_for(topic).push(subscriber)
65
+ end
66
+
67
+ # Get all the global subscribers.
68
+ #
69
+ # @example Get all the global subscribers.
70
+ # Monitoring::Global.subscribers
71
+ #
72
+ # @return [ Hash<String, Object> ] The subscribers.
73
+ #
74
+ # @since 2.1.0
75
+ def subscribers
76
+ @subscribers ||= {}
77
+ end
78
+
79
+ private
80
+
81
+ def subscribers_for(topic)
82
+ subscribers[topic] ||= []
83
+ end
84
+ end
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
+ # Initialize the monitoring.
92
+ #
93
+ # @api private
94
+ #
95
+ # @example Create the new monitoring.
96
+ # Monitoring.new(:monitoring => true)
97
+ #
98
+ # @param [ Hash ] options The options.
99
+ #
100
+ # @since 2.1.0
101
+ def initialize(options = {})
102
+ if options[:monitoring] != false
103
+ Global.subscribers.each do |topic, subscribers|
104
+ subscribers.each do |subscriber|
105
+ subscribe(topic, subscriber)
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ # Publish a started event.
112
+ #
113
+ # @example Publish a started event.
114
+ # monitoring.started(COMMAND, event)
115
+ #
116
+ # @param [ String ] topic The event topic.
117
+ # @param [ Event ] event The event to publish.
118
+ #
119
+ # @since 2.1.0
120
+ def started(topic, event)
121
+ subscribers_for(topic).each{ |subscriber| subscriber.started(event) }
122
+ end
123
+
124
+ # Publish a succeeded event.
125
+ #
126
+ # @example Publish a succeeded event.
127
+ # monitoring.succeeded(COMMAND, event)
128
+ #
129
+ # @param [ String ] topic The event topic.
130
+ # @param [ Event ] event The event to publish.
131
+ #
132
+ # @since 2.1.0
133
+ def succeeded(topic, event)
134
+ subscribers_for(topic).each{ |subscriber| subscriber.succeeded(event) }
135
+ end
136
+
137
+ # Publish a failed event.
138
+ #
139
+ # @example Publish a failed event.
140
+ # monitoring.failed(COMMAND, event)
141
+ #
142
+ # @param [ String ] topic The event topic.
143
+ # @param [ Event ] event The event to publish.
144
+ #
145
+ # @since 2.1.0
146
+ def failed(topic, event)
147
+ subscribers_for(topic).each{ |subscriber| subscriber.failed(event) }
148
+ end
149
+
150
+ # Subscribe a listener to an event topic.
151
+ #
152
+ # @example Subscribe to the topic.
153
+ # monitoring.subscribe(QUERY, subscriber)
154
+ #
155
+ # @param [ String ] topic The event topic.
156
+ # @param [ Object ] subscriber The subscriber to handle the event.
157
+ #
158
+ # @since 2.1.0
159
+ def subscribe(topic, subscriber)
160
+ subscribers_for(topic).push(subscriber)
161
+ end
162
+
163
+ # Get all the subscribers.
164
+ #
165
+ # @example Get all the subscribers.
166
+ # monitoring.subscribers
167
+ #
168
+ # @return [ Hash<String, Object> ] The subscribers.
169
+ #
170
+ # @since 2.1.0
171
+ def subscribers
172
+ @subscribers ||= {}
173
+ end
174
+
175
+ # Determine if there are any subscribers for a particular event.
176
+ #
177
+ # @example Are there subscribers?
178
+ # monitoring.subscribers?(COMMAND)
179
+ #
180
+ # @param [ String ] topic The event topic.
181
+ #
182
+ # @return [ true, false ] If there are subscribers for the topic.
183
+ #
184
+ # @since 2.1.0
185
+ def subscribers?(topic)
186
+ !subscribers_for(topic).empty?
187
+ end
188
+
189
+ private
190
+
191
+ def initialize_copy(original)
192
+ @subscribers = original.subscribers.dup
193
+ end
194
+
195
+ def subscribers_for(topic)
196
+ subscribers[topic] ||= []
197
+ end
198
+ end
199
+ end
@@ -0,0 +1,88 @@
1
+ # Copyright (C) 2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the 'License');
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an 'AS IS' BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Monitoring
17
+
18
+ # Subscribes to command events and logs them.
19
+ #
20
+ # @since 2.1.0
21
+ class CommandLogSubscriber
22
+
23
+ # Constant for the max number of characters to print when inspecting
24
+ # a query field.
25
+ #
26
+ # @since 2.1.0
27
+ LOG_STRING_LIMIT = 250
28
+
29
+ # Handle the command started event.
30
+ #
31
+ # @example Handle the event.
32
+ # subscriber.started(event)
33
+ #
34
+ # @param [ CommandStartedEvent ] event The event.
35
+ #
36
+ # @since 2.1.0
37
+ def started(event)
38
+ if Logger.logger.debug?
39
+ log("#{prefix(event)} | STARTED | #{format(event.command)}")
40
+ end
41
+ end
42
+
43
+ # Handle the command succeeded event.
44
+ #
45
+ # @example Handle the event.
46
+ # subscriber.succeeded(event)
47
+ #
48
+ # @param [ CommandSucceededEvent ] event The event.
49
+ #
50
+ # @since 2.1.0
51
+ def succeeded(event)
52
+ if Logger.logger.debug?
53
+ log("#{prefix(event)} | SUCCEEDED | #{event.duration}s")
54
+ end
55
+ end
56
+
57
+ # Handle the command failed event.
58
+ #
59
+ # @example Handle the event.
60
+ # subscriber.failed(event)
61
+ #
62
+ # @param [ CommandFailedEvent ] event The event.
63
+ #
64
+ # @since 2.1.0
65
+ def failed(event)
66
+ if Logger.logger.debug?
67
+ log("#{prefix(event)} | FAILED | #{event.message} | #{event.duration}s")
68
+ end
69
+ end
70
+
71
+ private
72
+
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>'
77
+ end
78
+
79
+ def log(message)
80
+ Logger.logger.debug(message)
81
+ end
82
+
83
+ def prefix(event)
84
+ "MONGODB | #{event.address.to_s} | #{event.database_name}.#{event.command_name}"
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,17 @@
1
+ # Copyright (C) 2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the 'License');
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an 'AS IS' BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ require 'mongo/monitoring/event/command_started'
16
+ require 'mongo/monitoring/event/command_succeeded'
17
+ require 'mongo/monitoring/event/command_failed'
@@ -0,0 +1,96 @@
1
+ # Copyright (C) 2015 MongoDB, Inc.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the 'License');
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an 'AS IS' BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ module Mongo
16
+ class Monitoring
17
+ module Event
18
+
19
+ # Event that is fired when a command operation fails.
20
+ #
21
+ # @since 2.1.0
22
+ class CommandFailed
23
+
24
+ # @return [ Server::Address ] address The server address.
25
+ attr_reader :address
26
+
27
+ # @return [ String ] command_name The name of the command.
28
+ attr_reader :command_name
29
+
30
+ # @return [ String ] database_name The name of the database_name.
31
+ attr_reader :database_name
32
+
33
+ # @return [ Float ] duration The duration of the command in seconds.
34
+ attr_reader :duration
35
+
36
+ # @return [ String ] message The error message.
37
+ attr_reader :message
38
+
39
+ # @return [ Integer ] operation_id The operation id.
40
+ attr_reader :operation_id
41
+
42
+ # @return [ Integer ] request_id The request id.
43
+ attr_reader :request_id
44
+
45
+ # Create the new event.
46
+ #
47
+ # @example Create the event.
48
+ #
49
+ # @param [ String ] command_name The name of the command.
50
+ # @param [ String ] database_name The database_name name.
51
+ # @param [ Server::Address ] address The server address.
52
+ # @param [ Integer ] request_id The request id.
53
+ # @param [ Integer ] operation_id The operation id.
54
+ # @param [ String ] message The error message.
55
+ # @param [ Float ] duration The duration the command took in seconds.
56
+ #
57
+ # @since 2.1.0
58
+ def initialize(command_name, database_name, address, request_id, operation_id, message, duration)
59
+ @command_name = command_name
60
+ @database_name = database_name
61
+ @address = address
62
+ @request_id = request_id
63
+ @operation_id = operation_id
64
+ @message = message
65
+ @duration = duration
66
+ end
67
+
68
+ # Create the event from a wire protocol message payload.
69
+ #
70
+ # @example Create the event.
71
+ # CommandFailed.generate(address, 1, payload, duration)
72
+ #
73
+ # @param [ Server::Address ] address The server address.
74
+ # @param [ Integer ] operation_id The operation id.
75
+ # @param [ Hash ] payload The message payload.
76
+ # @param [ String ] message The error message.
77
+ # @param [ Float ] duration The duration of the command in seconds.
78
+ #
79
+ # @return [ CommandFailed ] The event.
80
+ #
81
+ # @since 2.1.0
82
+ def self.generate(address, operation_id, payload, message, duration)
83
+ new(
84
+ payload[:command_name],
85
+ payload[:database_name],
86
+ address,
87
+ payload[:request_id],
88
+ operation_id,
89
+ message,
90
+ duration
91
+ )
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end