## Motivation and Context This repository does not track Gemfile.lock, so `bundle install` resolves to the latest RuboCop gems. Upgrading rubocop-shopify from 2.x to 3.0.0 surfaces 8 new offenses because the shared config no longer disables `Style/MutableConstant`, newly disables `Lint/RescueException` and `Naming/AccessorMethodName`, and drops `AllowedPatterns` for `Naming/MethodName`. Upgrading rubocop itself to 1.88 surfaces one more offense from the new `Style/ReduceToHash` cop. This change fixes them as follows: - Freeze mutable constants. Regexp constants are also flagged because `TargetRubyVersion` is 2.7, where Regexp literals are not frozen. - Remove inline disable directives that became redundant. - Restore `AllowedPatterns: ['\Atest_']` for `Naming/MethodName` so `def test_` style test names can reference class names such as `NoMethodError`. - Swap out the frozen `SUPPORTED_STABLE_PROTOCOL_VERSIONS` constant in the protocol version fallback test since Mocha cannot stub methods on frozen objects. - Use `to_h` instead of `each_with_object` in `Server#index_resources_by_uri`. Ref: https://rubygems.org/gems/rubocop-shopify/versions/3.0.0 ## How Has This Been Tested? `bundle exec rake` passes: 1402 runs, 0 failures, 0 errors, and RuboCop reports no offenses. The conformance suite also passes against its baseline. ## Breaking Changes None. Freezing these constants only affects code that mutates them in place, which has never been supported.
45 lines
1.6 KiB
Ruby
45 lines
1.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module MCP
|
|
module Instrumentation
|
|
def instrument_call(method, server_context: {}, exception_already_reported: nil, &block)
|
|
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
begin
|
|
@instrumentation_data = {}
|
|
add_instrumentation_data(method: method)
|
|
|
|
result = configuration.around_request.call(@instrumentation_data, &block)
|
|
|
|
result
|
|
rescue => e
|
|
already_reported = begin
|
|
!!exception_already_reported&.call(e)
|
|
rescue Exception
|
|
# The predicate is expected to be side-effect-free and return a boolean.
|
|
# Any exception raised from it (including non-StandardError such as SystemExit)
|
|
# must not shadow the original exception.
|
|
false
|
|
end
|
|
|
|
unless already_reported
|
|
add_instrumentation_data(error: :internal_error) unless @instrumentation_data.key?(:error)
|
|
configuration.exception_reporter.call(e, server_context)
|
|
end
|
|
|
|
raise
|
|
ensure
|
|
end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
add_instrumentation_data(duration: end_time - start_time)
|
|
|
|
# Backward compatibility: `instrumentation_callback` is soft-deprecated
|
|
# in favor of `around_request`, but existing callers still expect it
|
|
# to fire after every request until it is removed in a future version.
|
|
configuration.instrumentation_callback.call(@instrumentation_data)
|
|
end
|
|
end
|
|
|
|
def add_instrumentation_data(**kwargs)
|
|
@instrumentation_data.merge!(kwargs)
|
|
end
|
|
end
|
|
end
|