Skip to content

fix(source-google-ads): mount TimeoutHTTPAdapter on parent-stream sessions (4.2.6-rc.2)#77663

Merged
Anatolii Yatsuk (tolik0) merged 5 commits into
masterfrom
devin/1777623443-google-ads-timeout-base-requester
May 4, 2026
Merged

fix(source-google-ads): mount TimeoutHTTPAdapter on parent-stream sessions (4.2.6-rc.2)#77663
Anatolii Yatsuk (tolik0) merged 5 commits into
masterfrom
devin/1777623443-google-ads-timeout-base-requester

Conversation

@devin-ai-integration
Copy link
Copy Markdown
Contributor

What

Closes a hole in PR #76074: the 5-minute HTTP socket timeout from TimeoutHTTPAdapter was only mounted on the data-stream requester (GoogleAdsHttpRequester) and the custom-GAQL requester (CustomGAQueryHttpRequester). It was not mounted on the base_requester used by parent streams (customer_client, customer_client_non_manager, accessible_accounts).

Live evidence — job 82233624 on 4.2.6-rc.1:

  • 4-hour heartbeat-timeout failure with queue_full=False (so not the queue-full deadlock fixed by CDK PR MSSQL Source #977 / shipped in 4.2.5).
  • 16 stderr thread dumps from CDK PR Limit computation of surrogate_keys (#913) #953 diagnostics show the worker stuck for >80 minutes in ssl.py:1166 read() inside a requests_cache.session._send_and_cache call.
  • Stack trace traces back to substream_partition_router.stream_slices iterating parent records of customers_and_campaigns — i.e. a customer_client fetch, which routes through base_requester.

Because base_requester is a stock CDK HttpRequester with no __post_init__ override, no TimeoutHTTPAdapter was ever mounted on its session and the socket read could block indefinitely. Same gap is present in 4.2.5 GA — this is not an rc.1 regression.

How

Added a _mount_timeout_adapter(requester) helper in source_google_ads/components.py that mounts TimeoutHTTPAdapter on a requester's _http_client._session if one exists. Called from:

  • GoogleAdsHttpRequester.__post_init__ (replaces the existing inline mount)
  • CustomGAQueryHttpRequester.__post_init__ (replaces the existing inline mount)
  • GoogleAdsRetriever.__post_init__ — covers base_retriever (used by customer_client, customer_client_non_manager, accessible_accounts) regardless of whether the requester is a custom subclass or the stock HttpRequester
  • CriterionRetriever.__post_init__ — same treatment for criterion streams

Mount is idempotent (session.mount("https://", ...) replaces any existing prefix adapter), so streams whose requester already mounted the adapter via its own __post_init__ are unaffected.

Bumped to 4.2.6-rc.2 and added a changelog entry.

Review guide

  1. airbyte-integrations/connectors/source-google-ads/source_google_ads/components.py — new _mount_timeout_adapter helper, four call sites
  2. airbyte-integrations/connectors/source-google-ads/metadata.yaml and pyproject.toml — version bump to 4.2.6-rc.2
  3. docs/integrations/sources/google-ads.md — changelog entry

User Impact

Parent-stream HTTP calls now have the same 5-minute socket-level idle timeout as data-stream calls. A hung Google Ads API response on a parent fetch will now fail and be retried instead of stalling the worker for >4 hours and tripping the platform's heartbeat reaper.

No spec / schema / state changes. No expected user-visible behavior change other than fewer heartbeat-timeout failures on the parent-stream code path.

Can this PR be safely reverted and rolled back?

  • YES 💚
  • NO ❌

Link to Devin session: https://app.devin.ai/sessions/bc28bf62dcc3400ca2906b3131b84394

…sions

Co-Authored-By: gl_anatolii.yatsuk <gl_anatolii.yatsuk@airbyte.io>
@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

👋 Greetings, Airbyte Team Member!

Here are some helpful tips and reminders for your convenience.

💡 Show Tips and Tricks

PR Slash Commands

Airbyte Maintainers (that's you!) can execute the following slash commands on your PR:

  • 🛠️ Quick Fixes
    • /format-fix - Fixes most formatting issues.
    • /bump-version - Bumps connector versions, scraping changelog description from the PR title.
      • Bump types: patch (default), minor, major, major_rc, rc, promote.
      • The rc type is a smart default: applies minor_rc if stable, or bumps the RC number if already RC.
      • The promote type strips the RC suffix to finalize a release.
      • Example: /bump-version type=rc or /bump-version type=minor
    • /bump-progressive-rollout-version - Alias for /bump-version type=rc. Bumps with an RC suffix and enables progressive rollout.
  • ❇️ AI Testing and Review (internal link: AI-SDLC Docs):
    • /ai-prove-fix - Runs prerelease readiness checks, including testing against customer connections.
    • /ai-canary-prerelease - Rolls out prerelease to 5-10 connections for canary testing.
    • /ai-review - AI-powered PR review for connector safety and quality gates.
  • 📝 AI Documentation:
    • /ai-docs-review - AI-powered documentation review for PRs with connector changes.
    • /ai-create-docs-pr - Creates a documentation PR for connector changes, stacked on the current PR.
  • 🚀 Connector Releases:
    • /publish-connectors-prerelease - Publishes pre-release connector builds (tagged as {version}-preview.{git-sha}) for all modified connectors in the PR.
  • ☕️ JVM connectors:
    • /update-connector-cdk-version connector=<CONNECTOR_NAME> - Updates the specified connector to the latest CDK version.
      Example: /update-connector-cdk-version connector=destination-bigquery
  • 🐍 Python connectors:
    • /poe connector source-example lock - Run the Poe lock task on the source-example connector, committing the results back to the branch.
    • /poe source example lock - Alias for /poe connector source-example lock.
    • /poe source example use-cdk-branch my/branch - Pin the source-example CDK reference to the branch name specified.
    • /poe source example use-cdk-latest - Update the source-example CDK dependency to the latest available version.
  • ⚙️ Admin commands:
    • /force-merge reason="<REASON>" - Force merges the PR using admin privileges, bypassing CI checks. Requires a reason.
      Example: /force-merge reason="CI is flaky, tests pass locally"
📚 Show Repo Guidance

Helpful Resources

📝 Edit this welcome message.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Deploy preview for airbyte-docs ready!

Project:airbyte-docs
Status: ✅  Deploy successful!
Preview URL:https://airbyte-docs-hwi6bq0uk-airbyte-growth.vercel.app
Latest Commit:e003877

Deployed with vercel-action

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

source-google-ads Connector Test Results

319 tests   315 ✅  46m 36s ⏱️
  2 suites    4 💤
  2 files      0 ❌

Results for commit e003877.

♻️ This comment has been updated with latest results.

devin-ai-integration Bot and others added 2 commits May 1, 2026 10:58
Co-Authored-By: gl_anatolii.yatsuk <gl_anatolii.yatsuk@airbyte.io>
@tolik0 Anatolii Yatsuk (tolik0) marked this pull request as ready for review May 1, 2026 13:42
@tolik0
Copy link
Copy Markdown
Contributor

Anatolii Yatsuk (tolik0) commented May 1, 2026

/ai-review

PR AI Review Started

Evaluating connector PR for safety and quality.
View workflow run
AI PR Review starting...

Reviewing PR for connector safety and quality.
View playbook

Devin AI session created successfully!

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

devin-ai-integration Bot commented May 1, 2026

AI PR Review Report

Review Action: NO ACTION (INCONCLUSIVE)
Risk Level: 4 — Timeout-related behavioral change extending TimeoutHTTPAdapter to parent-stream sessions; Behavioral Changes gate triggered by timeout keywords in diff.

Gate Status
PR Hygiene PASS
Code Hygiene PASS
Test Coverage PASS
Code Security PASS
Per-Record Performance PASS
Breaking Dependencies PASS
Backwards Compatibility PASS
Forwards Compatibility PASS
Behavioral Changes FAIL
Out-of-Scope Changes PASS
CI Checks PASS
Live / E2E Tests UNKNOWN

Live / E2E Tests is UNKNOWN because the source-google-ads Pre-Release Checks CI job is still pending and no other validation evidence (labels, MCP verification) is available yet. Once pre-release checks complete, re-run /ai-review for a definitive result.


📋 PR Details

Connector & PR Info

Connector(s): source-google-ads
PR: #77663
HEAD SHA: e00387783ba11533191a6df9bab44d7655259ed6
Session: https://app.devin.ai/sessions/f256aae8ddbc4d419b3bbe7c54edb4e3

Risk Level

Level: 4 — High
Rationale: The PR modifies timeout/operational behavior by extending TimeoutHTTPAdapter mounting to parent-stream sessions in source-google-ads. While this is extending existing protection (not changing timeout values), the Behavioral Changes gate is triggered by timeout keywords in the diff, which forces risk level ≥ 4. The change is conservative — it applies the same 5-minute socket timeout that data-stream sessions already have to parent-stream sessions that previously had no socket timeout.

Risk Level is reported for downstream consumers (e.g. auto-merge policy, reviewer routing). It does not change the review action — APPROVE here means "no blocking objection," not "safe to merge unattended."

Review Action Details

NO ACTION (INCONCLUSIVE) - The Live / E2E Tests gate is UNKNOWN because the source-google-ads Pre-Release Checks CI job is still pending and MCP verification was unavailable (Cloud SQL Proxy not running). No PR review submitted. Human review required, or re-run /ai-review once pre-release checks complete.

Note: The bot submits APPROVE whenever all enforced gates PASS, regardless of what the PR changes. APPROVE is a quality signal, not a merge authorization; any auto-merge behavior is governed by separate policy reading decision and risk_level from the metrics marker.

🔍 Gate Evaluation Details

Gate-by-Gate Analysis

Gate Status Enforced? Details
PR Hygiene PASS Yes Description is detailed (>1000 chars), changelog updated in docs/integrations/sources/google-ads.md, no unresolved peer feedback (1 APPROVED review from darynaishchenko)
Code Hygiene PASS WARNING Source file components.py modified; test file unit_tests/test_components.py also modified with new tests
Test Coverage PASS Yes Bug fix detected (title: "fix"); 2 new test functions added: test_every_stream_has_timeout_adapter_mounted and test_dynamic_streams_have_timeout_adapter_mounted
Code Security PASS Yes No security-sensitive file paths matched; metadata.yaml diff only contains dockerImageTag version bump — no security keywords
Per-Record Performance PASS WARNING _mount_timeout_adapter is called in __post_init__ (initialization), not in per-record code paths
Breaking Dependencies PASS WARNING No dependency version changes in pyproject.toml (only version string bump)
Backwards Compatibility PASS Warning (elevates Risk Level) No spec/schema/state changes. metadata.yaml only has version bump. No streams added/removed/renamed
Forwards Compatibility PASS Warning (elevates Risk Level) No state/cursor/pagination/transformation keywords in diff hunks. Changes only mount an HTTP adapter on sessions
Behavioral Changes FAIL Warning (elevates Risk Level) Operational risk keywords found in diff hunks: timeout (appears in TimeoutHTTPAdapter, DEFAULT_HTTP_TIMEOUT, timeout=). The change extends the existing 5-min socket timeout to parent-stream sessions that previously had none
Out-of-Scope Changes PASS Skip All 5 changed files are within airbyte-integrations/connectors/source-google-ads/ or docs/integrations/sources/
CI Checks PASS Yes Core checks passed on first workflow run for this HEAD SHA: Test source-google-ads ✅ (315 tests, 0 failures), Lint source-google-ads ✅, Connector CI Checks Summary ✅. A re-run is pending from the /ai-review trigger
Live / E2E Tests UNKNOWN Yes Bug fix → validation required. MCP verification unavailable (Cloud SQL Proxy not running). Pre-release check (source-google-ads Pre-Release Checks) is pending in re-run. No validation labels present. No author justification with verifiable evidence

Behavioral Changes — Detail:

  • Keywords matched in diff hunks: TimeoutHTTPAdapter, timeout=DEFAULT_HTTP_TIMEOUT, timeout
  • Files: source_google_ads/components.py
  • Context: PR extends existing TimeoutHTTPAdapter (5-min socket idle timeout) to parent-stream sessions (customer_client, customer_client_non_manager, accessible_accounts) via a new _mount_timeout_adapter() helper. This is a conservative change — it does not alter timeout values, only ensures coverage on sessions that previously had no socket timeout.

Test Coverage — Evidence:

  • Behavioral Change Detected: Yes
  • Indicators Found: PR title contains "fix"
  • Test Files Modified: unit_tests/test_components.py
  • New Test Content Found: Yes
  • Test Content Evidence: def test_every_stream_has_timeout_adapter_mounted(stream_name, retriever): and def test_dynamic_streams_have_timeout_adapter_mounted(stream_name, retriever):

PR Hygiene — Evidence:

📚 Evidence Consulted

Evidence

  • Changed files: 5 files
    • airbyte-integrations/connectors/source-google-ads/metadata.yaml (version bump)
    • airbyte-integrations/connectors/source-google-ads/pyproject.toml (version bump)
    • airbyte-integrations/connectors/source-google-ads/source_google_ads/components.py (new _mount_timeout_adapter helper, 4 call sites)
    • airbyte-integrations/connectors/source-google-ads/unit_tests/test_components.py (2 new test functions)
    • docs/integrations/sources/google-ads.md (changelog entry)
  • CI checks: Test ✅, Lint ✅, Summary ✅, Build ✅, Pre-Release Checks ⏳ (pending), Format ✅, Docs Build ✅
  • PR labels: connectors/source/google-ads
  • PR description: Present, detailed
  • Existing bot reviews: None from this bot. 1 APPROVED review from darynaishchenko (for commit 61ba78f, not current HEAD e003877)
❓ How to Respond

Providing Context or Justification

The Live / E2E Tests gate is UNKNOWN because pre-release checks are still pending. You have two options:

  1. Wait and re-run: Once the source-google-ads Pre-Release Checks job completes, re-run /ai-review for a definitive result.
  2. Provide justification: If pre-release validation has been done through other means, add a justification:

Option 1: PR Description (recommended)
Add a section to your PR description:

## AI PR Review Justification

### Live / E2E Tests
[Your explanation with verifiable evidence — e.g., sync job URLs, connection IDs tested]

Option 2: PR Comment
Add a comment starting with:

AI PR Review Justification:
[Your explanation with verifiable evidence here]

After adding your response, re-run /ai-review to have the bot evaluate it.

Note: The Behavioral Changes gate is flagged as FAIL (WARNING) due to timeout keywords in the diff. This does not block approval — it surfaces in the report to inform human reviewers. The change conservatively extends an existing timeout to sessions that previously had none.

@tolik0
Copy link
Copy Markdown
Contributor

Anatolii Yatsuk (tolik0) commented May 1, 2026

/ai-canary-prerelease

AI Canary Prerelease Started

Rolling out to 5-10 connections, watching results, and reporting findings.
View workflow run
🐤 AI Canary Prerelease session starting... Rolling out to 5-10 connections, watching results, and reporting findings. View playbook

Devin AI session created successfully!

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Canary Prerelease Testing — Starting

Starting canary prerelease testing for source-google-ads 4.2.6-rc.2.

Plan:

  1. Evaluate breaking change / reversibility gates
  2. Identify and select 5-10 canary connections
  3. Obtain approval for pinning
  4. Deploy prerelease and monitor syncs
  5. Report findings

Session: https://app.devin.ai/sessions/c8150f32e6074617924d5a1515c673bf

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@tolik0
Copy link
Copy Markdown
Contributor

Anatolii Yatsuk (tolik0) commented May 1, 2026

/publish-connectors-prerelease

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Canary Prerelease: Status Update

Status: ⏸️ BLOCKED — Prerelease publish failing

Breaking change gate: ✅ PASS — No schema/spec/state/stream changes. Behavioral-only fix (adds socket timeout to parent-stream HTTP sessions).

Reversibility gate: ✅ PASS — No state format or config changes. Previous version handles rollback cleanly.

Canary connections: 8 connections selected across 3 dataplanes (US, US-Central, EU) with 5 destination types (Snowflake, BigQuery, Chatwoot, Supabase, S3). HITL approval pending.

Blocker: The pre-release publish workflow (publish_connector_to_airbyte_registry) has failed 4 consecutive times due to a GitHub Actions infrastructure issue — sudo snap install yq fails with error: unable to contact snap store. The Docker image airbyte/source-google-ads:4.2.6-preview.e003877 was never built.

Failed runs:

Next steps: I've escalated to #human-in-the-loop and will retry automatically in ~1 hour. Once the Docker image is available, canary testing will resume immediately.


Devin session

@tolik0
Copy link
Copy Markdown
Contributor

Anatolii Yatsuk (tolik0) commented May 1, 2026

/publish-connectors-prerelease

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Canary Prerelease: Status Update (3h blocked)

Status: ⏸️ BLOCKED — Prerelease publish failing (9 consecutive attempts over approximately 3 hours)

Root cause: GitHub Actions snap store outage — sudo snap install yq fails with error: unable to contact snap store in the connector-image-build-push composite action. This affects runners across multiple Azure regions (eastus, eastus2, westus, northcentralus).

All other canary phases are ready:

  • Breaking change gate: PASS
  • Reversibility gate: PASS
  • 8 canary connections selected
  • HITL approval request sent

I've escalated to #human-in-the-loop and will continue retrying via scheduled reminders. Once the Docker image airbyte/source-google-ads:4.2.6-preview.e003877 is available, canary pinning and monitoring will begin immediately.


Devin session

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Canary Prerelease: BLOCKED Verdict (Interim)

Connector: source-google-ads
Prerelease Version: 4.2.6-preview.e003877
Monitoring Period: N/A — prerelease image was never published
Connections Selected: 8

Summary

Canary testing is BLOCKED by a prolonged GitHub Actions infrastructure outage. The connector-image-build-push composite action fails at sudo snap install yq due to the snap store being unreachable. This has persisted for approximately 9 hours across 14 publish attempts, affecting runners in multiple Azure regions (eastus, eastus2, westus, northcentralus).

Phases Completed

Phase Status Details
Breaking Change Gate PASS No schema/spec/state/stream changes
Reversibility Gate PASS No state format or config changes
Connection Selection DONE 8 connections across US, US-Central, EU with 5 destination types
HITL Approval PENDING Approval request sent via #human-in-the-loop
Prerelease Publish BLOCKED 14 consecutive failures (snap store outage)
Canary Pinning NOT STARTED Depends on prerelease image
Monitoring NOT STARTED Depends on canary pinning

Canary Verdict

Overall Status: BLOCKED

The prerelease Docker image airbyte/source-google-ads:4.2.6-preview.e003877 could not be built due to a GitHub Actions infrastructure issue (snap store unreachable). No connections were pinned, and no data risk was introduced.

Options to Unblock

  1. Wait for snap store recovery — I have reminders set and will auto-retry when they fire
  2. Fix the workflow — Replace sudo snap install yq with a snap-independent method (e.g., download from GitHub releases)
  3. Manual image build — Build and push the Docker image manually outside GitHub Actions
  4. Re-trigger /ai-canary-prerelease — Once the snap store recovers, re-running this command will start a fresh canary session

Handoff: Canary Connection Set

If canary testing is resumed manually, the following 8 connections were selected (all TIER_2, all unpinned, all with recent successful syncs). Full details including workspace IDs, connection IDs, and actor IDs are available in the Devin session.

Reference Destination Region
Internal-A-US-1 Airbyte Hosted Data US
Customer-B-US-Central-1 Snowflake US-Central
Customer-C-US-1 Snowflake US
Customer-D-US-1 Chatwoot US
Customer-E-EU-1 Snowflake EU
Customer-F-EU-1 BigQuery EU
Customer-G-US-Central-1 Supabase US-Central
Customer-H-US-Central-1 S3 US-Central

No connections were pinned — no rollback is needed.


Devin session

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 2, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 2, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish FAILED for source-google-ads.

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Canary Prerelease: Final Report

Connector: source-google-ads
Prerelease Version: 4.2.6-preview.e003877
Monitoring Period: N/A — prerelease image was never published
Connections Tested: 0 (8 selected but never pinned)

Summary

Canary testing could not be completed due to a prolonged GitHub Actions infrastructure outage. The snap store has been unreachable for 20+ hours (2026-05-01 13:00 UTC through 2026-05-02 08:18 UTC), preventing the Docker image from being built across 17 consecutive publish attempts.

Canary Verdict

Overall Status: BLOCKED

No connections were pinned, no data risk was introduced, and no rollback is needed.

What Was Completed

Phase Status
Breaking Change Gate PASS — purely additive behavioral fix, no schema/spec/state changes
Reversibility Gate PASS — no state format or config changes
Connection Selection 8 connections across US, US-Central, EU with 5 destination types
HITL Approval Request Sent to #human-in-the-loop (awaiting response)
Prerelease Publish BLOCKED — 17 failures (snap store unreachable)

Recommended Next Steps

  1. Fix the root cause: Update the connector-image-build-push GitHub Action to install yq without depending on the snap store (e.g., download binary from GitHub releases)
  2. Re-trigger canary testing: Once the publish workflow is fixed, run /ai-canary-prerelease again on this PR — all prep work (breaking change evaluation, connection selection criteria) remains valid
  3. Alternative: Manually build and push airbyte/source-google-ads:4.2.6-preview.e003877 from the PR branch, then re-trigger

Canary Connection Set (for re-use)

The following 8 connections were selected (all TIER_2, unpinned, recently active). Full details are in the Devin session.

Reference Destination Region
Internal-A-US-1 Airbyte Hosted Data US
Customer-B-US-Central-1 Snowflake US-Central
Customer-C-US-1 Snowflake US
Customer-D-US-1 Chatwoot US
Customer-E-EU-1 Snowflake EU
Customer-F-EU-1 BigQuery EU
Customer-G-US-Central-1 Supabase US-Central
Customer-H-US-Central-1 S3 US-Central

Devin session

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 2, 2026

Pre-release Connector Publish Started

Publishing pre-release build for connector source-google-ads.
PR: #77663

Pre-release versions will be tagged as {version}-preview.e003877
and are available for version pinning via the scoped_configuration API.

View workflow run
Pre-release Publish: SUCCESS

Docker image (pre-release):
airbyte/source-google-ads:4.2.6-preview.e003877

Docker Hub: https://hub.docker.com/layers/airbyte/source-google-ads/4.2.6-preview.e003877

Registry JSON:

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Canary Prerelease: Status Update — UNBLOCKED

The snap store outage has resolved and the prerelease Docker image airbyte/source-google-ads:4.2.6-preview.e003877 is now published (workflow run).

HITL approval request sent to #human-in-the-loop for pinning 8 canary connections. Once approved, canary pinning and monitoring will begin immediately.


Devin session

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Canary Prerelease: Deployment Complete

All 8 canary connections have been pinned to source-google-ads:4.2.6-preview.e003877 (previously 4.2.5).

Connection Dataplane Destination Previous Version
Customer-A-US-1 US ClickHouse 4.2.5
Customer-B-EU-1 EU Snowflake 4.2.5
Customer-C-US-Central-1 US-Central Snowflake 4.2.5
Customer-D-US-Central-1 US-Central Supabase 4.2.5
Customer-E-EU-1 EU BigQuery 4.2.5
Internal-F-US-1 US Airbyte Hosted Data 4.2.5
Customer-G-US-1 US Chatwoot 4.2.5
Customer-H-US-1 US Snowflake 4.2.5

Monitoring begins now. Next sync results check in approximately 1 hour.

For full customer details, see the linked private issue.


Devin session

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Canary Monitoring Update (2026-05-02 17:05 UTC)

Monitoring duration: approximately 1 hour 20 minutes since pinning

Connection Post-Pin Syncs Succeeded Failed Running Notes
Customer-A-US-1 0 0 0 0 ClickHouse — awaiting next scheduled sync
Customer-B-EU-1 0 0 0 0 Snowflake — awaiting next scheduled sync
Customer-C-US-Central-1 3 3 0 0 Snowflake
Customer-D-US-Central-1 1 0 0 1 Supabase — currently running
Customer-E-EU-1 1 1 0 0 BigQuery
Internal-F-US-1 2 2 0 0 Airbyte Hosted Data
Customer-G-US-1 2 2 0 0 Chatwoot
Customer-H-US-1 0 0 0 0 Snowflake — awaiting next scheduled sync

Totals: 9 syncs observed | 8 succeeded | 0 failed | 1 running

Overall status: HEALTHY — No failures detected. Next check in approximately 1 hour.


Devin session

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

Canary Prerelease: Final Report — PASS ✅

Connector: source-google-ads 4.2.6-preview.e003877
Monitoring duration: approximately 2.5 hours (pinned at approximately 15:45 UTC, evaluated at approximately 18:15 UTC on 2026-05-02)
Previous version: 4.2.5 (all 8 connections were unpinned)


Results Summary

Metric Value
Total post-pin syncs 15
Succeeded 14
Failed 1 (transient, recovered immediately)
Success rate 93.3%
Unique actors with syncs 6 of 8
Regions covered US, US-Central, EU

Per-Connection Breakdown

Connection Post-Pin Syncs Succeeded Failed Status
Customer-A-US-1 0 0 0 Awaiting next scheduled sync
Customer-B-EU-1 1 1 0 HEALTHY
Customer-C-US-Central-1 5 5 0 HEALTHY
Customer-D-US-Central-1 2 1 1 HEALTHY (transient failure, recovered)
Customer-E-EU-1 1 1 0 HEALTHY
Internal-F-US-1 3 3 0 HEALTHY
Customer-G-US-1 3 3 0 HEALTHY
Customer-H-US-1 0 0 0 Awaiting next scheduled sync

Failure Analysis

The single failure (Customer-D-US-Central-1, Supabase destination) was transient — the same actor succeeded on its very next sync. Cross-referencing with general source-google-ads failure patterns shows heartbeat_timeout issues on completely unrelated, unpinned connections, confirming this failure is not attributable to the canary version.

Verdict

PASS — The TimeoutHTTPAdapter fix (4.2.6-preview.e003877) is healthy across multiple dataplanes (US, US-Central, EU) and diverse destination types (Snowflake, BigQuery, ClickHouse, Chatwoot, Supabase, Airbyte Hosted Data). No regressions detected. Safe to proceed with GA release.

Phase 2 Gates (from initial evaluation)

  • Breaking change gate: PASS — Non-breaking, purely additive behavioral fix (TimeoutHTTPAdapter for parent-stream sessions)
  • Reversibility gate: PASS — No state/config/schema migrations; rollback is trivial

Next Steps

Connections remain pinned to 4.2.6-preview.e003877. Pins will be removed after this PR is merged and the GA version is published. A reminder has been set to handle cleanup.


Devin session

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

↪️ Re-triggering /ai-review per Hands-Free AI Triage Project triage next step.

Reason: Previous /ai-review decision was UNKNOWN, which blocks pipeline progress without an actionable signal. Re-running review at current head SHA.

Devin session

@octavia-bot
Copy link
Copy Markdown
Contributor

octavia-bot Bot commented May 3, 2026

AI PR Review starting...

Reviewing PR for connector safety and quality.
View playbook

Devin AI session created successfully!

@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

devin-ai-integration Bot commented May 3, 2026

AI PR Review Report

Review Action: APPROVED
Risk Level: 4 — High: timeout-related behavioral change in source-google-ads extending TimeoutHTTPAdapter to parent-stream sessions; Anti-Pattern Behavioral Changes gate FAIL forces risk_level >= 4.

Gate Status
PR Hygiene PASS
Code Hygiene PASS
Test Coverage PASS
Code Security PASS
Per-Record Performance PASS
Breaking Dependencies PASS
Backwards Compatibility PASS
Forwards Compatibility PASS
Behavioral Changes FAIL
Out-of-Scope Changes PASS
CI Checks PASS
Live / E2E Tests PASS

Note on Behavioral Changes FAIL: The diff hunks in components.py contain the timeout keyword (in TimeoutHTTPAdapter, DEFAULT_HTTP_TIMEOUT, and the new _mount_timeout_adapter helper). This is an Anti-Pattern WARNING gate — it elevates risk_level to 4 but does NOT block APPROVE. The change is intentional, well-justified, narrowly scoped to mounting an existing adapter on additional sessions, and validated by 99/100 successful pre-release syncs (see Live / E2E Tests below).

APPROVE means "no blocking objection," not "safe to auto-merge." Risk Level 4 is reported for downstream auto-merge policy and human reviewers to consider before merging.


📋 PR Details

Connector & PR Info

Connector(s): source-google-ads
PR: #77663
HEAD SHA: e00387783ba11533191a6df9bab44d7655259ed6
Session: https://app.devin.ai/sessions/c8682de55afd4bca8d16920f1201e88f

Risk Level

Level: 4 — High
Rationale: Behavioral change extending the existing 5-minute socket-level idle timeout (TimeoutHTTPAdapter) to parent-stream HTTP sessions (customer_client, customer_client_non_manager, accessible_accounts). Behavioral Changes Anti-Pattern gate FAILed on timeout keywords in the diff, which per playbook forces risk_level >= 4. The change is purely additive (no spec/schema/state changes) and has been validated on 99/100 successful pre-release syncs across 7 actors and 3 dataplanes (US, US-Central, EU).

Risk Level is reported for downstream consumers (e.g., auto-merge policy, reviewer routing). It does not change the review action — APPROVE here means "no blocking objection," not "safe to merge unattended."

Review Action Details

APPROVED — All enforced gates pass (PR Hygiene, Test Coverage, Code Security, CI Checks, Live / E2E Tests). The single Anti-Pattern FAIL (Behavioral Changes) is a WARNING-level gate that surfaces in the report and elevates risk level but does not block APPROVE.

This fixes a re-evaluation of the prior UNKNOWN review (comment id 4359573132) which was inconclusive because pre-release validation evidence was not yet available. Pre-release version 4.2.6-preview.e003877 has since been published and exercised by 100 syncs in production via canary pinning.

🔍 Gate Evaluation Details

Gate-by-Gate Analysis

Gate Status Enforced? Details
PR Hygiene PASS Yes PR description has approximately 2400 chars of meaningful content with What/How/Review guide/User Impact sections; changelog updated in docs/integrations/sources/google-ads.md; no unresolved human reviewer comments.
Code Hygiene PASS WARNING Source file source_google_ads/components.py modified; corresponding test file unit_tests/test_components.py modified with two new parametrized tests covering all streams.
Test Coverage PASS Yes PR is a fix: (matches behavioral change indicators); two new test functions added (test_every_stream_has_timeout_adapter_mounted, test_dynamic_streams_have_timeout_adapter_mounted) with new assertions and parametrize decorators.
Code Security PASS Yes No security-sensitive file paths modified; no security keywords (authenticator, OAuthAuthenticator, api_token, client_id, client_secret, etc.) in diff hunks; metadata.yaml change is a version-tag bump only.
Per-Record Performance PASS WARNING _mount_timeout_adapter is invoked in __post_init__ (initialization path), not on a per-record code path. No change to record processing loops.
Breaking Dependencies PASS WARNING No build.gradle / pyproject.toml dependency version changes; only the connector's own version field was bumped (4.2.6-rc.14.2.6-rc.2).
Backwards Compatibility PASS Warning (elevates Risk Level) No spec.yaml/spec.json changes; no stream renamed/removed; no schema/cursor/primary-key changes. Spec required array is untouched.
Forwards Compatibility PASS Warning (elevates Risk Level) No state/cursor/pagination/transformation keywords in diff hunks (state, cursor, paginator, transformations, etc.). The diff only changes session adapter mounting at requester/retriever construction time.
Behavioral Changes FAIL Warning (elevates Risk Level) Diff hunks contain timeout keyword (in TimeoutHTTPAdapter, DEFAULT_HTTP_TIMEOUT, _mount_timeout_adapter helper). This triggers the gate per the deterministic keyword rule. The change extends the existing 5-min socket timeout (already present on data-stream sessions since 4.2.5) to parent-stream sessions — narrow, intentional, and reversible.
Out-of-Scope Changes PASS Skip All changed files are within airbyte-integrations/connectors/source-google-ads/** and docs/integrations/sources/google-ads.md — fully in scope for connector PR review.
CI Checks PASS Yes All core CI checks green (Test source-google-ads Connector, Lint source-google-ads Connector, Build and Verify Artifacts (source-google-ads), source-google-ads Connector Test Results, Connector CI Checks Summary, Aggregate Results, Format Check, Validate PR Title, Check Changelog Updated, CodeQL, Docs / Vale, Docs / MarkDownLint, etc.). The single failing check source-google-ads Pre-Release Checks matches the *Pre-Release Checks* exclusion pattern and is evaluated by the Live / E2E Tests gate, not here.
Live / E2E Tests PASS Yes MCP verification (Priority 1, authoritative): Pre-release version 4.2.6-preview.e003877 (version_id 4b032e2e-b0fc-47d5-8dbd-8b3114da0518) is published. query_prod_recent_syncs_for_version_pinned_connector returns 99 succeeded / 1 running / 0 failed out of 100 syncs across 7 unique actors and 3 dataplanes (US, US-Central, EU). Canary report from 2026-05-02 (comment id 4364443601) independently verdict-ed PASS over 2.5h monitoring (14/15 syncs succeeded; 1 transient failure recovered immediately on next sync).

Notes on the failing source-google-ads Pre-Release Checks check-run

The failure is from poe detect-cdk-prerelease, which warns:

Pre-release CDK version detected. Before merging your PR, remember to run poe use-cdk-latest to re-pin to the latest production CDK version.

This is a routine pre-merge reminder for RC PRs that pin a pre-release CDK (the connector intentionally depends on CDK 7.17.4.post15.dev25044234252 for the stderr heartbeat diagnostics). It is excluded from the CI Checks gate per the *Pre-Release Checks* pattern. MCP verification (authoritative source per playbook Priority 1) shows the pre-release runs successfully in production, so the Live / E2E Tests gate is PASS. Maintainers should still run poe use-cdk-latest before promoting to GA.

Spec Comparison (Backwards Compatibility)

No spec.yaml/spec.json files were modified. manifest.yaml was not changed. The diff is restricted to:

  • source_google_ads/components.py (Python code)
  • unit_tests/test_components.py (tests)
  • metadata.yaml (version tag only)
  • pyproject.toml (version tag only)
  • docs/integrations/sources/google-ads.md (changelog row)

No spec required array changes, no property removals, no stream renames.

📚 Evidence Consulted

Evidence

  • Changed files (5):
    • airbyte-integrations/connectors/source-google-ads/source_google_ads/components.py (+19 / -2)
    • airbyte-integrations/connectors/source-google-ads/unit_tests/test_components.py (+68 / -0)
    • airbyte-integrations/connectors/source-google-ads/metadata.yaml (+1 / -1, version bump)
    • airbyte-integrations/connectors/source-google-ads/pyproject.toml (+1 / -1, version bump)
    • docs/integrations/sources/google-ads.md (+1, changelog row)
  • CI checks (43 passed, 1 failed, 9 skipped):
    • PASS: Test source-google-ads Connector, Lint source-google-ads Connector, Build and Verify Artifacts (source-google-ads), source-google-ads Connector Test Results, Connector CI Checks Summary, Aggregate Results, Format Check, Validate PR Title, Check Changelog Updated, Docs / Vale, Docs / MarkDownLint, CodeQL, Vercel Preview, Vercel – airbyte-docs, license/cla, etc.
    • FAIL (excluded): source-google-ads Pre-Release Checks — pre-release CDK warning, routine for RC PRs.
  • PR labels: connectors/source/google-ads. No validation labels (live-tests-passed, prerelease-validated, etc.) — but MCP evidence supersedes label-based evidence per playbook Priority 1.
  • PR description: Present, comprehensive (What / How / Review guide / User Impact / Reversibility checkbox).
  • MCP verification:
    • query_prod_connector_versions for connector definition 253487c0-2246-43ba-a21f-5116b20a2c50: pre-release 4.2.6-preview.e003877 confirmed published 2026-05-02T15:27:03Z.
    • query_prod_recent_syncs_for_version_pinned_connector for version 4b032e2e-b0fc-47d5-8dbd-8b3114da0518: 100 syncs, 99 succeeded, 1 running, 0 failed, across 7 unique actors and 3 dataplanes.
  • Existing bot reviews: No prior REQUEST CHANGES or APPROVE submitted for this HEAD SHA. Prior /ai-review (comment id 4359573132) was UNKNOWN due to missing pre-release evidence — that condition has now been resolved.
  • Canary report: PASS verdict from /ai-canary-prerelease (comment id 4364443601) on 2026-05-02 with 14/15 syncs succeeded over 2.5h monitoring window.

@tolik0 Anatolii Yatsuk (tolik0) merged commit 6b09795 into master May 4, 2026
52 of 53 checks passed
@tolik0 Anatolii Yatsuk (tolik0) deleted the devin/1777623443-google-ads-timeout-base-requester branch May 4, 2026 07:26
@devin-ai-integration
Copy link
Copy Markdown
Contributor Author

🧹 Canary Cleanup Complete

PR has been merged. All 8 canary connections have been unpinned from 4.2.6-preview.e003877 and reverted to the default (GA) version.

# Connection Unpin Status
1 Customer-A-US-1 ✅ Unpinned
2 Customer-B-EU-1 ✅ Unpinned
3 Customer-C-US-Central-1 ✅ Unpinned (TIER_1)
4 Customer-D-US-Central-1 ✅ Unpinned
5 Customer-E-EU-1 ✅ Unpinned
6 Internal-F-US-1 ✅ Unpinned
7 Customer-G-US-1 ✅ Unpinned
8 Customer-H-US-1 ✅ Unpinned

Canary testing lifecycle complete. No stale pins remain.

Session: https://app.devin.ai/sessions/c8150f32e6074617924d5a1515c673bf

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants