From 1b4d501eed0d2b227a73d1f9c340b5c049b49db2 Mon Sep 17 00:00:00 2001 From: Torrey Payne Date: Thu, 11 Jun 2026 18:10:05 +0000 Subject: [PATCH 1/7] fix: support quota_project in ErrorReporting client Allows configuring quota_project explicitly in Google::Cloud::ErrorReporting.new and via configuration. This resolves issues where the default quota project from credentials is used but has the Error Reporting API disabled. --- .../lib/google/cloud/error_reporting.rb | 8 ++- .../google/cloud/error_reporting/service.rb | 5 +- .../cloud/error_reporting/service_test.rb | 66 +++++++++++++++++++ .../test/google/cloud/error_reporting_test.rb | 34 ++++++++-- 4 files changed, 104 insertions(+), 9 deletions(-) create mode 100644 google-cloud-error_reporting/test/google/cloud/error_reporting/service_test.rb diff --git a/google-cloud-error_reporting/lib/google/cloud/error_reporting.rb b/google-cloud-error_reporting/lib/google/cloud/error_reporting.rb index 28aa231c4ef4..db953e51aae5 100644 --- a/google-cloud-error_reporting/lib/google/cloud/error_reporting.rb +++ b/google-cloud-error_reporting/lib/google/cloud/error_reporting.rb @@ -82,18 +82,22 @@ def self.new project_id: nil, timeout: nil, endpoint: nil, project: nil, - keyfile: nil + keyfile: nil, + quota_project: nil project_id ||= project project_id ||= ErrorReporting::Project.default_project_id scope ||= configure.scope timeout ||= configure.timeout endpoint ||= configure.endpoint + quota_project ||= configure.quota_project credentials ||= keyfile || default_credentials(scope: scope) credentials = resolve_credentials credentials, scope project_id = resolve_project_id project_id, credentials - service = ErrorReporting::Service.new project_id, credentials, host: endpoint, timeout: timeout + service = ErrorReporting::Service.new project_id, credentials, + host: endpoint, timeout: timeout, + quota_project: quota_project ErrorReporting::Project.new service end diff --git a/google-cloud-error_reporting/lib/google/cloud/error_reporting/service.rb b/google-cloud-error_reporting/lib/google/cloud/error_reporting/service.rb index ef43277e5aa8..8736b3b071ef 100644 --- a/google-cloud-error_reporting/lib/google/cloud/error_reporting/service.rb +++ b/google-cloud-error_reporting/lib/google/cloud/error_reporting/service.rb @@ -29,14 +29,16 @@ class Service attr_accessor :credentials attr_accessor :timeout attr_accessor :host + attr_accessor :quota_project ## # Creates a new Service instance. - def initialize project, credentials, timeout: nil, host: nil + def initialize project, credentials, timeout: nil, host: nil, quota_project: nil @project = project @credentials = credentials @timeout = timeout @host = host + @quota_project = quota_project || (credentials.quota_project_id if credentials.respond_to? :quota_project_id) end def error_reporting @@ -46,6 +48,7 @@ def error_reporting config.credentials = credentials if credentials config.timeout = timeout if timeout config.endpoint = host if host + config.quota_project = quota_project if quota_project config.lib_name = "gccl" config.lib_version = Google::Cloud::ErrorReporting::VERSION end diff --git a/google-cloud-error_reporting/test/google/cloud/error_reporting/service_test.rb b/google-cloud-error_reporting/test/google/cloud/error_reporting/service_test.rb new file mode 100644 index 000000000000..c4e0996e00fd --- /dev/null +++ b/google-cloud-error_reporting/test/google/cloud/error_reporting/service_test.rb @@ -0,0 +1,66 @@ +# Copyright 2026 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +require "helper" +require "signet/oauth_2/client" + +describe Google::Cloud::ErrorReporting::Service do + let(:project) { "test-project" } + let(:credentials) do + creds = Signet::OAuth2::Client.new + def creds.quota_project_id + "credentials-quota-project" + end + def creds.disable_universe_domain_check + true + end + creds + end + + describe ".new" do + it "sets project and credentials" do + service = Google::Cloud::ErrorReporting::Service.new project, credentials + _(service.project).must_equal project + _(service.credentials).must_equal credentials + end + + it "accepts quota_project" do + quota_project = "test-quota-project" + service = Google::Cloud::ErrorReporting::Service.new project, credentials, quota_project: quota_project + _(service.quota_project).must_equal quota_project + end + + it "falls back to credentials quota_project_id if not explicitly passed" do + service = Google::Cloud::ErrorReporting::Service.new project, credentials + _(service.quota_project).must_equal "credentials-quota-project" + end + end + + describe "#error_reporting" do + it "configures the gRPC client with quota_project" do + quota_project = "test-quota-project" + service = Google::Cloud::ErrorReporting::Service.new project, credentials, quota_project: quota_project + + client = service.error_reporting + _(client.configure.quota_project).must_equal quota_project + end + + it "configures the gRPC client with credentials quota_project" do + service = Google::Cloud::ErrorReporting::Service.new project, credentials + + client = service.error_reporting + _(client.configure.quota_project).must_equal "credentials-quota-project" + end + end +end diff --git a/google-cloud-error_reporting/test/google/cloud/error_reporting_test.rb b/google-cloud-error_reporting/test/google/cloud/error_reporting_test.rb index f01c3c01eb56..42308a175500 100644 --- a/google-cloud-error_reporting/test/google/cloud/error_reporting_test.rb +++ b/google-cloud-error_reporting/test/google/cloud/error_reporting_test.rb @@ -66,7 +66,7 @@ def creds.is_a? target it "uses provided endpoint" do endpoint = "errorreporting-endpoint2.example.com" - stubbed_service = ->(project, credentials, timeout: nil, host: nil) { + stubbed_service = ->(project, credentials, timeout: nil, host: nil, quota_project: nil) { _(project).must_equal "project-id" _(credentials).must_equal default_credentials _(timeout).must_be :nil? @@ -85,6 +85,28 @@ def creds.is_a? target end end + it "uses configuration quota_project" do + quota_project = "configure-quota-project" + Google::Cloud::ErrorReporting.configure do |config| + config.quota_project = quota_project + end + + stubbed_service = ->(project, credentials, timeout: nil, host: nil, quota_project: nil) { + _(project).must_equal "project-id" + _(quota_project).must_equal "configure-quota-project" + OpenStruct.new project: project + } + + ENV.stub :[], nil do + Google::Cloud::ErrorReporting::Service.stub :new, stubbed_service do + error_reporting = Google::Cloud::ErrorReporting.new project_id: "project-id", + credentials: default_credentials + _(error_reporting).must_be_kind_of Google::Cloud::ErrorReporting::Project + end + end + Google::Cloud::ErrorReporting.configure.reset! + end + it "uses provided project (alias), keyfile (alias), service, and version" do stubbed_credentials = ->(keyfile, scope: nil) { _(keyfile).must_equal "/path/to/a/keyfile" @@ -315,7 +337,7 @@ def creds.is_a? target _(scope).must_equal default_scopes "error_reporting-credentials" } - stubbed_service = ->(project, credentials, timeout: nil, host: nil) { + stubbed_service = ->(project, credentials, timeout: nil, host: nil, quota_project: nil) { _(project).must_equal "project-id" _(credentials).must_equal "error_reporting-credentials" _(timeout).must_be :nil? @@ -352,7 +374,7 @@ def creds.is_a? target _(scope).must_equal default_scopes "error_reporting-credentials" } - stubbed_service = ->(project, credentials, timeout: nil, host: nil) { + stubbed_service = ->(project, credentials, timeout: nil, host: nil, quota_project: nil) { _(project).must_equal "project-id" _(credentials).must_equal "error_reporting-credentials" _(timeout).must_be :nil? @@ -389,7 +411,7 @@ def creds.is_a? target _(scope).must_equal default_scopes "error_reporting-credentials" } - stubbed_service = ->(project, credentials, timeout: nil, host: nil) { + stubbed_service = ->(project, credentials, timeout: nil, host: nil, quota_project: nil) { _(project).must_equal "project-id" _(credentials).must_equal "error_reporting-credentials" _(timeout).must_equal 42 @@ -423,7 +445,7 @@ def creds.is_a? target it "uses error_reporting config for endpoint" do endpoint = "errorreporting-endpoint2.example.com" - stubbed_service = ->(project, credentials, timeout: nil, host: nil) { + stubbed_service = ->(project, credentials, timeout: nil, host: nil, quota_project: nil) { _(project).must_equal "project-id" _(credentials).must_equal default_credentials _(timeout).must_be :nil? @@ -454,7 +476,7 @@ def creds.is_a? target _(scope).must_equal default_scopes "error_reporting-credentials" } - stubbed_service = ->(project, credentials, timeout: nil, host: nil) { + stubbed_service = ->(project, credentials, timeout: nil, host: nil, quota_project: nil) { _(project).must_equal "project-id" _(credentials).must_equal "error_reporting-credentials" _(timeout).must_equal 42 From 8d768418ca953d506e69f4d54a33440ac9c7cefd Mon Sep 17 00:00:00 2001 From: Torrey Payne Date: Thu, 11 Jun 2026 22:19:20 +0000 Subject: [PATCH 2/7] docs/style: document quota_project and fix rubocop/doctest issues --- .../lib/google/cloud/error_reporting.rb | 2 ++ .../lib/google/cloud/error_reporting/project.rb | 4 ++-- google-cloud-error_reporting/support/doctest_helper.rb | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/google-cloud-error_reporting/lib/google/cloud/error_reporting.rb b/google-cloud-error_reporting/lib/google/cloud/error_reporting.rb index db953e51aae5..c990c4bdb258 100644 --- a/google-cloud-error_reporting/lib/google/cloud/error_reporting.rb +++ b/google-cloud-error_reporting/lib/google/cloud/error_reporting.rb @@ -64,6 +64,8 @@ module ErrorReporting # @param [Integer] timeout Default timeout to use in requests. Optional. # @param [String] endpoint Override of the endpoint host name. Optional. # If the param is nil, uses the default endpoint. + # @param [String] quota_project The project ID for a project that can be + # used by client libraries for quota and billing purposes. Optional. # @param [String] project Alias for the `project_id` argument. Deprecated. # @param [String] keyfile Alias for the `credentials` argument. # Deprecated. diff --git a/google-cloud-error_reporting/lib/google/cloud/error_reporting/project.rb b/google-cloud-error_reporting/lib/google/cloud/error_reporting/project.rb index cf65e373c50d..551328404eb8 100644 --- a/google-cloud-error_reporting/lib/google/cloud/error_reporting/project.rb +++ b/google-cloud-error_reporting/lib/google/cloud/error_reporting/project.rb @@ -122,8 +122,8 @@ def project_id # error_event = error_reporting.error_event "Error with Backtrace" # error_reporting.report error_event # - def report *args, &block - service.report(*args, &block) + def report(*args, &) + service.report(*args, &) end ## diff --git a/google-cloud-error_reporting/support/doctest_helper.rb b/google-cloud-error_reporting/support/doctest_helper.rb index b179fbd0de4b..d6d5703733ee 100644 --- a/google-cloud-error_reporting/support/doctest_helper.rb +++ b/google-cloud-error_reporting/support/doctest_helper.rb @@ -13,6 +13,7 @@ # limitations under the License. require "minitest/focus" +require "ostruct" require "google/cloud/error_reporting" From 20cad85079b5f35836d21d675d47f92af3c844be Mon Sep 17 00:00:00 2001 From: Torrey Payne Date: Fri, 12 Jun 2026 20:15:18 +0000 Subject: [PATCH 3/7] test: add acceptance test for invalid quota_project --- .../error_reporting/error_reporting_test.rb | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb b/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb index 597e859d8567..ca827feead3e 100644 --- a/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb +++ b/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb @@ -65,6 +65,26 @@ _(error_event.service_context.service).must_equal service_name _(error_event.service_context.version).must_equal service_version - _(error_event.message).must_match token.to_s + end + + it "fails when configured with an invalid quota_project" do + valid_reporter = Google::Cloud::ErrorReporting.new + project_id = valid_reporter.project + credentials = valid_reporter.service.credentials + + invalid_reporter = Google::Cloud::ErrorReporting.new( + project_id: project_id, + credentials: credentials, + quota_project: "invalid-quota-project-id-testing" + ) + + exception = StandardError.new "Testing invalid quota project" + error_event = invalid_reporter.error_event exception + + err = assert_raises Google::Cloud::Error do + invalid_reporter.report error_event + end + + assert_includes [3, 5, 7], err.code end end From c8ba2b05e555402faab9214f840186f3444fb18b Mon Sep 17 00:00:00 2001 From: Torrey Payne Date: Fri, 12 Jun 2026 20:53:55 +0000 Subject: [PATCH 4/7] fix: use report_exception in acceptance test --- .../acceptance/error_reporting/error_reporting_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb b/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb index ca827feead3e..71bf6da00285 100644 --- a/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb +++ b/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb @@ -79,10 +79,10 @@ ) exception = StandardError.new "Testing invalid quota project" - error_event = invalid_reporter.error_event exception + exception.set_backtrace caller err = assert_raises Google::Cloud::Error do - invalid_reporter.report error_event + invalid_reporter.report_exception exception end assert_includes [3, 5, 7], err.code From 9ec259ac48a951f0b39745e66b334b575d54004a Mon Sep 17 00:00:00 2001 From: Torrey Payne Date: Fri, 12 Jun 2026 20:56:00 +0000 Subject: [PATCH 5/7] test: fix doctest mock expectations for Ruby 3.x keyword arguments --- google-cloud-error_reporting/support/doctest_helper.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/google-cloud-error_reporting/support/doctest_helper.rb b/google-cloud-error_reporting/support/doctest_helper.rb index d6d5703733ee..1af5f8409cd7 100644 --- a/google-cloud-error_reporting/support/doctest_helper.rb +++ b/google-cloud-error_reporting/support/doctest_helper.rb @@ -74,13 +74,13 @@ def mock_error_reporting doctest.before "Google::Cloud#error_reporting" do mock_error_reporting do |mock| - mock.expect :report_error_event, nil, [Hash] + mock.expect :report_error_event, nil, [], project_name: Object, event: Object end end doctest.before "Google::Cloud.error_reporting" do mock_error_reporting do |mock| - mock.expect :report_error_event, nil, [Hash] + mock.expect :report_error_event, nil, [], project_name: Object, event: Object end end @@ -90,13 +90,13 @@ def mock_error_reporting doctest.before "Google::Cloud::ErrorReporting::ErrorEvent" do mock_error_reporting do |mock| - mock.expect :report_error_event, nil, [Hash] + mock.expect :report_error_event, nil, [], project_name: Object, event: Object end end doctest.before "Google::Cloud::ErrorReporting::Project" do mock_error_reporting do |mock| - mock.expect :report_error_event, nil, [Hash] + mock.expect :report_error_event, nil, [], project_name: Object, event: Object end end @@ -104,7 +104,7 @@ def mock_error_reporting doctest.before "Google::Cloud::ErrorReporting::Service" do mock_error_reporting do |mock| - mock.expect :report_error_event, nil, [Hash] + mock.expect :report_error_event, nil, [], project_name: Object, event: Object end end end From ed2504f149cf70dc5a2b535b4771e58964709399 Mon Sep 17 00:00:00 2001 From: Torrey Payne Date: Fri, 12 Jun 2026 22:27:19 +0000 Subject: [PATCH 6/7] refactor: resolve quota_project from configuration only --- .../error_reporting/error_reporting_test.rb | 28 +++++++++++-------- .../lib/google/cloud/error_reporting.rb | 7 ++--- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb b/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb index 71bf6da00285..68becb3f92a4 100644 --- a/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb +++ b/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb @@ -72,19 +72,25 @@ project_id = valid_reporter.project credentials = valid_reporter.service.credentials - invalid_reporter = Google::Cloud::ErrorReporting.new( - project_id: project_id, - credentials: credentials, - quota_project: "invalid-quota-project-id-testing" - ) + old_quota_project = Google::Cloud::ErrorReporting.configure.quota_project + begin + Google::Cloud::ErrorReporting.configure.quota_project = "invalid-quota-project-id-testing" - exception = StandardError.new "Testing invalid quota project" - exception.set_backtrace caller + invalid_reporter = Google::Cloud::ErrorReporting.new( + project_id: project_id, + credentials: credentials + ) - err = assert_raises Google::Cloud::Error do - invalid_reporter.report_exception exception - end + exception = StandardError.new "Testing invalid quota project" + exception.set_backtrace caller - assert_includes [3, 5, 7], err.code + err = assert_raises Google::Cloud::Error do + invalid_reporter.report_exception exception + end + + assert_includes [3, 5, 7], err.code + ensure + Google::Cloud::ErrorReporting.configure.quota_project = old_quota_project + end end end diff --git a/google-cloud-error_reporting/lib/google/cloud/error_reporting.rb b/google-cloud-error_reporting/lib/google/cloud/error_reporting.rb index c990c4bdb258..7858b0f2741d 100644 --- a/google-cloud-error_reporting/lib/google/cloud/error_reporting.rb +++ b/google-cloud-error_reporting/lib/google/cloud/error_reporting.rb @@ -64,8 +64,6 @@ module ErrorReporting # @param [Integer] timeout Default timeout to use in requests. Optional. # @param [String] endpoint Override of the endpoint host name. Optional. # If the param is nil, uses the default endpoint. - # @param [String] quota_project The project ID for a project that can be - # used by client libraries for quota and billing purposes. Optional. # @param [String] project Alias for the `project_id` argument. Deprecated. # @param [String] keyfile Alias for the `credentials` argument. # Deprecated. @@ -84,14 +82,13 @@ def self.new project_id: nil, timeout: nil, endpoint: nil, project: nil, - keyfile: nil, - quota_project: nil + keyfile: nil project_id ||= project project_id ||= ErrorReporting::Project.default_project_id scope ||= configure.scope timeout ||= configure.timeout endpoint ||= configure.endpoint - quota_project ||= configure.quota_project + quota_project = configure.quota_project credentials ||= keyfile || default_credentials(scope: scope) credentials = resolve_credentials credentials, scope From 52b2fbfcf81f93f6f78793c545784ff38cfd78f5 Mon Sep 17 00:00:00 2001 From: Torrey Payne Date: Fri, 12 Jun 2026 22:30:27 +0000 Subject: [PATCH 7/7] revert: remove acceptance test changes to reduce scope --- .../error_reporting/error_reporting_test.rb | 28 +------------------ 1 file changed, 1 insertion(+), 27 deletions(-) diff --git a/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb b/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb index 68becb3f92a4..597e859d8567 100644 --- a/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb +++ b/google-cloud-error_reporting/acceptance/error_reporting/error_reporting_test.rb @@ -65,32 +65,6 @@ _(error_event.service_context.service).must_equal service_name _(error_event.service_context.version).must_equal service_version - end - - it "fails when configured with an invalid quota_project" do - valid_reporter = Google::Cloud::ErrorReporting.new - project_id = valid_reporter.project - credentials = valid_reporter.service.credentials - - old_quota_project = Google::Cloud::ErrorReporting.configure.quota_project - begin - Google::Cloud::ErrorReporting.configure.quota_project = "invalid-quota-project-id-testing" - - invalid_reporter = Google::Cloud::ErrorReporting.new( - project_id: project_id, - credentials: credentials - ) - - exception = StandardError.new "Testing invalid quota project" - exception.set_backtrace caller - - err = assert_raises Google::Cloud::Error do - invalid_reporter.report_exception exception - end - - assert_includes [3, 5, 7], err.code - ensure - Google::Cloud::ErrorReporting.configure.quota_project = old_quota_project - end + _(error_event.message).must_match token.to_s end end