skylight 5.1.0.beta → 5.1.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +390 -371
  3. data/CLA.md +1 -1
  4. data/LICENSE.md +7 -17
  5. data/README.md +1 -1
  6. data/ext/extconf.rb +42 -54
  7. data/lib/skylight.rb +20 -30
  8. data/lib/skylight/api.rb +22 -18
  9. data/lib/skylight/cli.rb +47 -46
  10. data/lib/skylight/cli/doctor.rb +50 -50
  11. data/lib/skylight/cli/helpers.rb +19 -19
  12. data/lib/skylight/cli/merger.rb +141 -139
  13. data/lib/skylight/config.rb +265 -302
  14. data/lib/skylight/deprecation.rb +4 -4
  15. data/lib/skylight/errors.rb +3 -4
  16. data/lib/skylight/extensions.rb +17 -29
  17. data/lib/skylight/extensions/source_location.rb +128 -128
  18. data/lib/skylight/formatters/http.rb +1 -3
  19. data/lib/skylight/gc.rb +30 -40
  20. data/lib/skylight/helpers.rb +43 -41
  21. data/lib/skylight/instrumenter.rb +25 -18
  22. data/lib/skylight/middleware.rb +31 -35
  23. data/lib/skylight/native.rb +8 -10
  24. data/lib/skylight/native_ext_fetcher.rb +10 -12
  25. data/lib/skylight/normalizers.rb +43 -39
  26. data/lib/skylight/normalizers/action_controller/process_action.rb +24 -25
  27. data/lib/skylight/normalizers/action_controller/send_file.rb +7 -6
  28. data/lib/skylight/normalizers/action_dispatch/route_set.rb +7 -7
  29. data/lib/skylight/normalizers/active_job/perform.rb +48 -44
  30. data/lib/skylight/normalizers/active_model_serializers/render.rb +7 -3
  31. data/lib/skylight/normalizers/active_storage.rb +11 -13
  32. data/lib/skylight/normalizers/active_support/cache.rb +1 -12
  33. data/lib/skylight/normalizers/coach/handler_finish.rb +1 -3
  34. data/lib/skylight/normalizers/default.rb +1 -9
  35. data/lib/skylight/normalizers/faraday/request.rb +1 -3
  36. data/lib/skylight/normalizers/grape/endpoint.rb +13 -19
  37. data/lib/skylight/normalizers/grape/endpoint_run.rb +16 -18
  38. data/lib/skylight/normalizers/grape/endpoint_run_filters.rb +1 -3
  39. data/lib/skylight/normalizers/graphql/base.rb +23 -28
  40. data/lib/skylight/normalizers/render.rb +19 -21
  41. data/lib/skylight/normalizers/shrine.rb +15 -17
  42. data/lib/skylight/normalizers/sql.rb +4 -4
  43. data/lib/skylight/probes.rb +38 -46
  44. data/lib/skylight/probes/action_controller.rb +32 -28
  45. data/lib/skylight/probes/action_dispatch/request_id.rb +9 -5
  46. data/lib/skylight/probes/action_dispatch/routing/route_set.rb +7 -5
  47. data/lib/skylight/probes/action_view.rb +9 -10
  48. data/lib/skylight/probes/active_job_enqueue.rb +3 -9
  49. data/lib/skylight/probes/active_model_serializers.rb +8 -8
  50. data/lib/skylight/probes/delayed_job.rb +37 -42
  51. data/lib/skylight/probes/elasticsearch.rb +3 -5
  52. data/lib/skylight/probes/excon.rb +1 -1
  53. data/lib/skylight/probes/excon/middleware.rb +22 -23
  54. data/lib/skylight/probes/graphql.rb +2 -7
  55. data/lib/skylight/probes/middleware.rb +14 -5
  56. data/lib/skylight/probes/mongo.rb +83 -91
  57. data/lib/skylight/probes/net_http.rb +1 -1
  58. data/lib/skylight/probes/redis.rb +5 -17
  59. data/lib/skylight/probes/sequel.rb +7 -11
  60. data/lib/skylight/probes/sinatra.rb +8 -5
  61. data/lib/skylight/probes/tilt.rb +2 -4
  62. data/lib/skylight/railtie.rb +121 -135
  63. data/lib/skylight/sidekiq.rb +4 -5
  64. data/lib/skylight/subscriber.rb +31 -33
  65. data/lib/skylight/test.rb +89 -84
  66. data/lib/skylight/trace.rb +121 -115
  67. data/lib/skylight/user_config.rb +14 -17
  68. data/lib/skylight/util/clock.rb +1 -0
  69. data/lib/skylight/util/component.rb +18 -21
  70. data/lib/skylight/util/deploy.rb +11 -13
  71. data/lib/skylight/util/http.rb +104 -105
  72. data/lib/skylight/util/logging.rb +4 -6
  73. data/lib/skylight/util/lru_cache.rb +2 -6
  74. data/lib/skylight/util/platform.rb +2 -6
  75. data/lib/skylight/util/ssl.rb +1 -3
  76. data/lib/skylight/version.rb +1 -1
  77. data/lib/skylight/vm/gc.rb +1 -9
  78. metadata +4 -4
@@ -10,9 +10,9 @@ module Skylight
10
10
 
11
11
  private
12
12
 
13
- def internal_request_id
14
- @skylight_request_id || super
15
- end
13
+ def internal_request_id
14
+ @skylight_request_id || super
15
+ end
16
16
  end
17
17
 
18
18
  class Probe
@@ -23,7 +23,11 @@ module Skylight
23
23
  end
24
24
  end
25
25
 
26
- register(:action_dispatch, "ActionDispatch::RequestId", "action_dispatch/middleware/request_id",
27
- ActionDispatch::RequestId::Probe.new)
26
+ register(
27
+ :action_dispatch,
28
+ "ActionDispatch::RequestId",
29
+ "action_dispatch/middleware/request_id",
30
+ ActionDispatch::RequestId::Probe.new
31
+ )
28
32
  end
29
33
  end
@@ -7,9 +7,7 @@ module Skylight
7
7
  module RouteSet
8
8
  module Instrumentation
9
9
  def call(env)
10
- ActiveSupport::Notifications.instrument("route_set.action_dispatch") do
11
- super
12
- end
10
+ ActiveSupport::Notifications.instrument("route_set.action_dispatch") { super }
13
11
  end
14
12
  end
15
13
 
@@ -22,7 +20,11 @@ module Skylight
22
20
  end
23
21
  end
24
22
 
25
- register(:rails_router, "ActionDispatch::Routing::RouteSet", "action_dispatch/routing/route_set",
26
- ActionDispatch::Routing::RouteSet::Probe.new)
23
+ register(
24
+ :rails_router,
25
+ "ActionDispatch::Routing::RouteSet",
26
+ "action_dispatch/routing/route_set",
27
+ ActionDispatch::Routing::RouteSet::Probe.new
28
+ )
27
29
  end
28
30
  end
@@ -5,19 +5,18 @@ module Skylight
5
5
  module ActionView
6
6
  module Instrumentation
7
7
  def render_with_layout(*args) #:nodoc:
8
- path, locals = case args.length
9
- when 2
10
- args
11
- when 4
12
- # Rails > 6.0.0.beta3 arguments are (view, template, path, locals)
13
- [args[2], args[3]]
14
- end
8
+ path, locals =
9
+ case args.length
10
+ when 2
11
+ args
12
+ when 4
13
+ # Rails > 6.0.0.beta3 arguments are (view, template, path, locals)
14
+ [args[2], args[3]]
15
+ end
15
16
 
16
17
  layout = nil
17
18
 
18
- if path
19
- layout = find_layout(path, locals.keys, [formats.first])
20
- end
19
+ layout = find_layout(path, locals.keys, [formats.first]) if path
21
20
 
22
21
  if layout
23
22
  ActiveSupport::Notifications.instrument("render_template.action_view", identifier: layout.identifier) do
@@ -14,17 +14,11 @@ module Skylight
14
14
  name, job_class_name = Normalizers::ActiveJob::Perform.normalize_title(job)
15
15
  descriptors = ["adapter: '#{adapter_name}'", "queue: '#{job.queue_name}'"]
16
16
  descriptors << "job: '#{job_class_name}'" if job_class_name
17
- desc = "{ #{descriptors.join(', ')} }"
18
- rescue
17
+ desc = "{ #{descriptors.join(", ")} }"
18
+ rescue StandardError
19
19
  block.call
20
20
  else
21
- Skylight.instrument(
22
- title: "Enqueue #{name}",
23
- category: CAT,
24
- description: desc,
25
- internal: true,
26
- &block
27
- )
21
+ Skylight.instrument(title: "Enqueue #{name}", category: CAT, description: desc, internal: true, &block)
28
22
  end
29
23
 
30
24
  self.class.instance_eval do
@@ -18,9 +18,7 @@ module Skylight
18
18
  rescue LoadError # rubocop:disable Lint/SuppressedException
19
19
  end
20
20
 
21
- if Gem.loaded_specs["active_model_serializers"]
22
- version = Gem.loaded_specs["active_model_serializers"].version
23
- end
21
+ version = Gem.loaded_specs["active_model_serializers"].version if Gem.loaded_specs["active_model_serializers"]
24
22
 
25
23
  if !version || version < Gem::Version.new("0.5.0")
26
24
  Skylight.error "Instrumention is only available for ActiveModelSerializers version 0.5.0 and greater."
@@ -37,14 +35,16 @@ module Skylight
37
35
  # End users could override as_json without calling super, but it's likely safer
38
36
  # than overriding serializable_array/hash/object.
39
37
 
40
- [::ActiveModel::Serializer, ::ActiveModel::ArraySerializer].each do |klass|
41
- klass.prepend(Instrumentation)
42
- end
38
+ [::ActiveModel::Serializer, ::ActiveModel::ArraySerializer].each { |klass| klass.prepend(Instrumentation) }
43
39
  end
44
40
  end
45
41
  end
46
42
 
47
- register(:active_model_serializers, "ActiveModel::Serializer", "active_model/serializer",
48
- ActiveModelSerializers::Probe.new)
43
+ register(
44
+ :active_model_serializers,
45
+ "ActiveModel::Serializer",
46
+ "active_model/serializer",
47
+ ActiveModelSerializers::Probe.new
48
+ )
49
49
  end
50
50
  end
@@ -10,13 +10,9 @@ module Skylight
10
10
 
11
11
  class Plugin < ::Delayed::Plugin
12
12
  callbacks do |lifecycle|
13
- lifecycle.around(:perform) do |worker, job, &block|
14
- sk_instrument(worker, job, &block)
15
- end
13
+ lifecycle.around(:perform) { |worker, job, &block| sk_instrument(worker, job, &block) }
16
14
 
17
- lifecycle.after(:error) do |_worker, _job|
18
- Skylight.trace&.segment = "error"
19
- end
15
+ lifecycle.after(:error) { |_worker, _job| Skylight.trace&.segment = "error" }
20
16
  end
21
17
 
22
18
  class << self
@@ -25,15 +21,19 @@ module Skylight
25
21
  def sk_instrument(_worker, job)
26
22
  endpoint = Skylight::Probes::DelayedJob.handler_name(job)
27
23
 
28
- Skylight.trace(endpoint,
29
- "app.delayed_job.worker",
30
- "Delayed::Worker#run",
31
- component: :worker,
32
- segment: job.queue,
33
- meta: { source_location: "delayed_job" }) do
34
- t { "Delayed::Job beginning trace" }
35
- yield
36
- end
24
+ Skylight.trace(
25
+ endpoint,
26
+ "app.delayed_job.worker",
27
+ "Delayed::Worker#run",
28
+ component: :worker,
29
+ segment: job.queue,
30
+ meta: {
31
+ source_location: "delayed_job"
32
+ }
33
+ ) do
34
+ t { "Delayed::Job beginning trace" }
35
+ yield
36
+ end
37
37
  end
38
38
  end
39
39
  end
@@ -44,11 +44,8 @@ module Skylight
44
44
  UNKNOWN = "<Delayed::Job Unknown>"
45
45
 
46
46
  def self.handler_name(job)
47
- payload_object = if job.respond_to?(:payload_object_without_sk)
48
- job.payload_object_without_sk
49
- else
50
- job.payload_object
51
- end
47
+ payload_object =
48
+ job.respond_to?(:payload_object_without_sk) ? job.payload_object_without_sk : job.payload_object
52
49
 
53
50
  payload_object_name(payload_object)
54
51
  end
@@ -62,7 +59,7 @@ module Skylight
62
59
  # Use class name instead to avoid this.
63
60
  payload_object.class.name
64
61
  end
65
- rescue
62
+ rescue StandardError
66
63
  UNKNOWN
67
64
  end
68
65
 
@@ -84,8 +81,10 @@ module Skylight
84
81
 
85
82
  opts = {
86
83
  category: "app.delayed_job.job",
87
- title: format_source(*source_meta),
88
- meta: { source_location_hint: source_meta },
84
+ title: format_source(*source_meta),
85
+ meta: {
86
+ source_location_hint: source_meta
87
+ },
89
88
  internal: true
90
89
  }
91
90
 
@@ -99,13 +98,9 @@ module Skylight
99
98
 
100
99
  private
101
100
 
102
- def format_source(method_type, constant_name, method_name)
103
- if method_type == :instance_method
104
- "#{constant_name}##{method_name}"
105
- else
106
- "#{constant_name}.#{method_name}"
107
- end
108
- end
101
+ def format_source(method_type, constant_name, method_name)
102
+ method_type == :instance_method ? "#{constant_name}##{method_name}" : "#{constant_name}.#{method_name}"
103
+ end
109
104
  end
110
105
 
111
106
  class Probe
@@ -124,23 +119,23 @@ module Skylight
124
119
 
125
120
  private
126
121
 
127
- def plugin_defined?
128
- defined?(::Skylight::Probes::DelayedJob::Plugin)
129
- end
122
+ def plugin_defined?
123
+ defined?(::Skylight::Probes::DelayedJob::Plugin)
124
+ end
130
125
 
131
- def validate_version
132
- spec = Gem.loaded_specs["delayed_job"]
133
- version = spec&.version
126
+ def validate_version
127
+ spec = Gem.loaded_specs["delayed_job"]
128
+ version = spec&.version
134
129
 
135
- if !version || version < Gem::Version.new("4.0.0")
136
- Skylight.error "The installed version of DelayedJob is not supported on Skylight. " \
130
+ if !version || version < Gem::Version.new("4.0.0")
131
+ Skylight.error "The installed version of DelayedJob is not supported on Skylight. " \
137
132
  "Your jobs will not be tracked."
138
133
 
139
- return false
140
- end
141
-
142
- true
134
+ return false
143
135
  end
136
+
137
+ true
138
+ end
144
139
  end
145
140
  end
146
141
 
@@ -9,16 +9,14 @@ module Skylight
9
9
  def perform_request(method, path, *args, &block)
10
10
  ActiveSupport::Notifications.instrument(
11
11
  "request.elasticsearch",
12
- name: "Request",
12
+ name: "Request",
13
13
  method: method,
14
- path: path
14
+ path: path
15
15
  ) do
16
16
  # Prevent HTTP-related probes from firing
17
17
  Skylight::Normalizers::Faraday::Request.disable do
18
18
  disable_skylight_probe(:NetHTTP) do
19
- disable_skylight_probe(:HTTPClient) do
20
- perform_request_without_sk(method, path, *args, &block)
21
- end
19
+ disable_skylight_probe(:HTTPClient) { perform_request_without_sk(method, path, *args, &block) }
22
20
  end
23
21
  end
24
22
  end
@@ -14,7 +14,7 @@ module Skylight
14
14
  ::Excon.defaults[:middlewares].insert(idx, Probes::Excon::Middleware)
15
15
  else
16
16
  Skylight.error "The installed version of Excon doesn't support Middlewares. " \
17
- "The Excon probe will be disabled."
17
+ "The Excon probe will be disabled."
18
18
  end
19
19
  end
20
20
  end
@@ -33,33 +33,32 @@ module Skylight
33
33
 
34
34
  private
35
35
 
36
- def begin_instrumentation(datum)
37
- method = datum[:method].to_s
38
- scheme = datum[:scheme]
39
- host = datum[:host]
40
- # TODO: Maybe don't show other default ports like 443
41
- port = datum[:port] == 80 ? nil : datum[:port]
42
- path = datum[:path]
43
- query = datum[:query]
36
+ def begin_instrumentation(datum)
37
+ method = datum[:method].to_s
38
+ scheme = datum[:scheme]
39
+ host = datum[:host]
44
40
 
45
- opts = Formatters::HTTP.build_opts(method, scheme, host, port, path, query)
41
+ # TODO: Maybe don't show other default ports like 443
42
+ port = datum[:port] == 80 ? nil : datum[:port]
43
+ path = datum[:path]
44
+ query = datum[:query]
46
45
 
47
- @requests[datum] = Skylight.instrument(opts)
48
- rescue Exception => e
49
- Skylight.error "failed to begin instrumentation for Excon; msg=%s", e.message
50
- end
46
+ opts = Formatters::HTTP.build_opts(method, scheme, host, port, path, query)
47
+
48
+ @requests[datum] = Skylight.instrument(opts)
49
+ rescue Exception => e
50
+ Skylight.error "failed to begin instrumentation for Excon; msg=%s", e.message
51
+ end
51
52
 
52
- def end_instrumentation(datum)
53
- if (request = @requests.delete(datum))
54
- meta = {}
55
- if datum[:error].is_a?(Exception)
56
- meta[:exception_object] = datum[:error]
57
- end
58
- Skylight.done(request, meta)
59
- end
60
- rescue Exception => e
61
- Skylight.error "failed to end instrumentation for Excon; msg=%s", e.message
53
+ def end_instrumentation(datum)
54
+ if (request = @requests.delete(datum))
55
+ meta = {}
56
+ meta[:exception_object] = datum[:error] if datum[:error].is_a?(Exception)
57
+ Skylight.done(request, meta)
62
58
  end
59
+ rescue Exception => e
60
+ Skylight.error "failed to end instrumentation for Excon; msg=%s", e.message
61
+ end
63
62
  end
64
63
  end
65
64
  end
@@ -20,16 +20,11 @@ module Skylight
20
20
  class Probe
21
21
  def install
22
22
  tracing_klass_name = "::GraphQL::Tracing::ActiveSupportNotificationsTracing"
23
- klasses_to_probe = %w[
24
- ::GraphQL::Execution::Multiplex
25
- ::GraphQL::Query
26
- ]
23
+ klasses_to_probe = %w[::GraphQL::Execution::Multiplex ::GraphQL::Query]
27
24
 
28
25
  return unless ([tracing_klass_name] + klasses_to_probe).all?(&method(:safe_constantize))
29
26
 
30
- klasses_to_probe.each do |klass_name|
31
- safe_constantize(klass_name).prepend(Instrumentation)
32
- end
27
+ klasses_to_probe.each { |klass_name| safe_constantize(klass_name).prepend(Instrumentation) }
33
28
  end
34
29
 
35
30
  def safe_constantize(klass_name)
@@ -16,7 +16,7 @@ module Skylight
16
16
  elsif middleware.respond_to?(:call)
17
17
  middleware.method(:call).source_location
18
18
  end
19
- rescue
19
+ rescue StandardError
20
20
  nil
21
21
  end
22
22
  end
@@ -72,8 +72,13 @@ module Skylight
72
72
 
73
73
  source_file, source_line = method(__method__).super_method.source_location
74
74
 
75
- spans = Skylight.instrument(title: name, category: __sk_category,
76
- source_file: source_file, source_line: source_line)
75
+ spans =
76
+ Skylight.instrument(
77
+ title: name,
78
+ category: __sk_category,
79
+ source_file: source_file,
80
+ source_line: source_line
81
+ )
77
82
 
78
83
  proxied_response =
79
84
  Skylight::Middleware.with_after_close(super(*args), debug_identifier: "Middleware: #{name}") do
@@ -120,7 +125,11 @@ module Skylight
120
125
  end
121
126
  end
122
127
 
123
- register(:middleware, "ActionDispatch::MiddlewareStack::Middleware", "actionpack/action_dispatch",
124
- Middleware::Probe.new)
128
+ register(
129
+ :middleware,
130
+ "ActionDispatch::MiddlewareStack::Middleware",
131
+ "actionpack/action_dispatch",
132
+ Middleware::Probe.new
133
+ )
125
134
  end
126
135
  end
@@ -14,9 +14,7 @@ module Skylight
14
14
 
15
15
  COMMANDS = %i[insert find count distinct update findandmodify findAndModify delete aggregate].freeze
16
16
 
17
- COMMAND_NAMES = {
18
- findandmodify: "findAndModify".freeze
19
- }.freeze
17
+ COMMAND_NAMES = { findandmodify: "findAndModify".freeze }.freeze
20
18
 
21
19
  def initialize
22
20
  @events = {}
@@ -41,121 +39,115 @@ module Skylight
41
39
 
42
40
  private
43
41
 
44
- def begin_instrumentation(event)
45
- return unless COMMANDS.include?(event.command_name.to_sym)
42
+ def begin_instrumentation(event)
43
+ return unless COMMANDS.include?(event.command_name.to_sym)
46
44
 
47
- command_name = COMMAND_NAMES[event.command_name] || event.command_name.to_s
45
+ command_name = COMMAND_NAMES[event.command_name] || event.command_name.to_s
48
46
 
49
- title = "#{event.database_name}.#{command_name}"
47
+ title = "#{event.database_name}.#{command_name}"
50
48
 
51
- command = event.command
49
+ command = event.command
52
50
 
53
- # Not sure if this will always exist
54
- # Delete so the description will be less redundant
55
- if (target = command[event.command_name])
56
- title << " #{target}"
57
- end
58
-
59
- payload = {}
60
-
61
- # Ruby Hashes are ordered based on insertion so do the most important ones first
51
+ # Not sure if this will always exist
52
+ # Delete so the description will be less redundant
53
+ if (target = command[event.command_name])
54
+ title << " #{target}"
55
+ end
62
56
 
63
- add_value("key".freeze, command, payload)
64
- add_bound("query".freeze, command, payload)
65
- add_bound("filter".freeze, command, payload)
66
- add_value("sort".freeze, command, payload)
57
+ payload = {}
67
58
 
68
- if command_name == "findAndModify".freeze
69
- add_bound("update".freeze, command, payload)
70
- end
59
+ # Ruby Hashes are ordered based on insertion so do the most important ones first
71
60
 
72
- add_value("remove".freeze, command, payload)
73
- add_value("new".freeze, command, payload)
61
+ add_value("key".freeze, command, payload)
62
+ add_bound("query".freeze, command, payload)
63
+ add_bound("filter".freeze, command, payload)
64
+ add_value("sort".freeze, command, payload)
74
65
 
75
- if (updates = command["updates".freeze])
76
- # AFAICT the gem generally just sends one item in the updates array
77
- update = updates[0]
78
- update_payload = {}
79
- add_bound("q".freeze, update, update_payload)
80
- add_bound("u".freeze, update, update_payload)
81
- add_value("multi".freeze, update, update_payload)
82
- add_value("upsert".freeze, update, update_payload)
66
+ add_bound("update".freeze, command, payload) if command_name == "findAndModify".freeze
83
67
 
84
- payload["updates".freeze] = [update_payload]
68
+ add_value("remove".freeze, command, payload)
69
+ add_value("new".freeze, command, payload)
85
70
 
86
- if updates.length > 1
87
- payload["updates".freeze] << "..."
88
- end
89
- end
71
+ if (updates = command["updates".freeze])
72
+ # AFAICT the gem generally just sends one item in the updates array
73
+ update = updates[0]
74
+ update_payload = {}
75
+ add_bound("q".freeze, update, update_payload)
76
+ add_bound("u".freeze, update, update_payload)
77
+ add_value("multi".freeze, update, update_payload)
78
+ add_value("upsert".freeze, update, update_payload)
90
79
 
91
- if (deletes = command["deletes".freeze])
92
- # AFAICT the gem generally just sends one item in the updates array
93
- delete = deletes[0]
94
- delete_payload = {}
95
- add_bound("q".freeze, delete, delete_payload)
96
- add_value("limit".freeze, delete, delete_payload)
80
+ payload["updates".freeze] = [update_payload]
97
81
 
98
- payload["deletes".freeze] = [delete_payload]
82
+ payload["updates".freeze] << "..." if updates.length > 1
83
+ end
99
84
 
100
- if deletes.length > 1
101
- payload["deletes".freeze] << "..."
102
- end
103
- end
85
+ if (deletes = command["deletes".freeze])
86
+ # AFAICT the gem generally just sends one item in the updates array
87
+ delete = deletes[0]
88
+ delete_payload = {}
89
+ add_bound("q".freeze, delete, delete_payload)
90
+ add_value("limit".freeze, delete, delete_payload)
104
91
 
105
- if (pipeline = command["pipeline".freeze])
106
- payload["pipeline".freeze] = pipeline.map { |segment| extract_binds(segment) }
107
- end
92
+ payload["deletes".freeze] = [delete_payload]
108
93
 
109
- # We're ignoring documents from insert because they could have completely inconsistent
110
- # format which would make it hard to merge.
111
-
112
- opts = {
113
- category: CAT,
114
- title: title,
115
- description: payload.empty? ? nil : payload.to_json,
116
- meta: { database: event.database_name },
117
- internal: true
118
- }
94
+ payload["deletes".freeze] << "..." if deletes.length > 1
95
+ end
119
96
 
120
- @events[event.operation_id] = Skylight.instrument(opts)
121
- rescue Exception => e
122
- error "failed to begin instrumentation for Mongo; msg=%s", e.message
97
+ if (pipeline = command["pipeline".freeze])
98
+ payload["pipeline".freeze] = pipeline.map { |segment| extract_binds(segment) }
123
99
  end
124
100
 
125
- def end_instrumentation(event)
126
- if (original_event = @events.delete(event.operation_id))
127
- meta = {}
128
- if event.is_a?(::Mongo::Monitoring::Event::CommandFailed)
129
- meta[:exception] = ["CommandFailed", event.message]
130
- end
131
- Skylight.done(original_event, meta)
101
+ # We're ignoring documents from insert because they could have completely inconsistent
102
+ # format which would make it hard to merge.
103
+
104
+ opts = {
105
+ category: CAT,
106
+ title: title,
107
+ description: payload.empty? ? nil : payload.to_json,
108
+ meta: {
109
+ database: event.database_name
110
+ },
111
+ internal: true
112
+ }
113
+
114
+ @events[event.operation_id] = Skylight.instrument(opts)
115
+ rescue Exception => e
116
+ error "failed to begin instrumentation for Mongo; msg=%s", e.message
117
+ end
118
+
119
+ def end_instrumentation(event)
120
+ if (original_event = @events.delete(event.operation_id))
121
+ meta = {}
122
+ if event.is_a?(::Mongo::Monitoring::Event::CommandFailed)
123
+ meta[:exception] = ["CommandFailed", event.message]
132
124
  end
133
- rescue Exception => e
134
- error "failed to end instrumentation for Mongo; msg=%s", e.message
125
+ Skylight.done(original_event, meta)
135
126
  end
127
+ rescue Exception => e
128
+ error "failed to end instrumentation for Mongo; msg=%s", e.message
129
+ end
136
130
 
137
- def add_value(key, command, payload)
138
- if command.key?(key)
139
- value = command[key]
140
- payload[key] = value
141
- end
131
+ def add_value(key, command, payload)
132
+ if command.key?(key)
133
+ value = command[key]
134
+ payload[key] = value
142
135
  end
136
+ end
143
137
 
144
- def add_bound(key, command, payload)
145
- if (value = command[key])
146
- payload[key] = extract_binds(value)
147
- end
138
+ def add_bound(key, command, payload)
139
+ if (value = command[key])
140
+ payload[key] = extract_binds(value)
148
141
  end
142
+ end
149
143
 
150
- def extract_binds(hash)
151
- ret = {}
144
+ def extract_binds(hash)
145
+ ret = {}
152
146
 
153
- hash.each do |k, v|
154
- ret[k] = v.is_a?(Hash) ? extract_binds(v) : "?".freeze
155
- end
147
+ hash.each { |k, v| ret[k] = v.is_a?(Hash) ? extract_binds(v) : "?".freeze }
156
148
 
157
- ret
158
- end
149
+ ret
150
+ end
159
151
  end
160
152
  end
161
153