From 7c004a7af32bcd4be1ef4d3dba00f68fcfd56e3d Mon Sep 17 00:00:00 2001 From: Jaydan Pratts Date: Thu, 1 Feb 2024 12:13:52 +0000 Subject: [PATCH] Update Google Ads --- .../connectors/source-google-ads/BOOTSTRAP.md | 4 +- .../connectors/source-google-ads/README.md | 128 +-- .../acceptance-test-config.yml | 124 ++- .../connectors/source-google-ads/icon.svg | 1 + .../integration_tests/__init__.py | 3 + .../integration_tests/abnormal_state.json | 95 +- .../integration_tests/configured_catalog.json | 319 ++++++- .../configured_catalog_with_click_view.json | 18 + .../configured_catalog_with_gaql_only.json | 14 + .../integration_tests/expected_records.jsonl | 157 ++-- .../expected_records_click.jsonl | 69 ++ .../incremental_catalog.json | 242 ++++- .../integration_tests/integration_tests.py | 225 +++++ .../integration_tests/state.json | 73 ++ .../connectors/source-google-ads/main.py | 9 +- .../source-google-ads/metadata.yaml | 68 ++ .../source-google-ads/requirements.txt | 1 - .../connectors/source-google-ads/setup.py | 9 +- .../source_google_ads/__init__.py | 3 + .../source_google_ads/config_migrations.py | 131 +++ .../source_google_ads/custom_query_stream.py | 29 +- .../source_google_ads/google_ads.py | 139 +-- .../source_google_ads/models.py | 28 +- .../source_google_ads/run.py | 16 + .../source_google_ads/schemas/ad_group.json | 109 +++ .../schemas/ad_group_ad.json | 532 +++++++++++ .../schemas/ad_group_ad_label.json | 27 + .../schemas/ad_group_ad_legacy.json | 484 ++++++++++ .../schemas/ad_group_bidding_strategy.json | 97 ++ .../schemas/ad_group_criterion.json | 231 +++++ .../schemas/ad_group_criterion_label.json | 24 + .../schemas/ad_group_label.json | 24 + .../schemas/ad_listing_group_criterion.json | 84 ++ .../source_google_ads/schemas/audience.json | 33 + .../source_google_ads/schemas/campaign.json | 325 +++++++ .../schemas/campaign_bidding_strategy.json | 100 ++ .../schemas/campaign_budget.json | 163 ++++ .../schemas/campaign_criterion.json | 36 + .../schemas/campaign_label.json | 24 + .../schemas/change_status.json | 24 + .../source_google_ads/schemas/click_view.json | 3 +- .../source_google_ads/schemas/customer.json | 73 ++ .../schemas/customer_client.json | 24 + .../schemas/customer_label.json | 18 + .../schemas/display_keyword_view.json | 262 ++++++ .../schemas/geographic_view.json | 25 + .../schemas/keyword_view.json | 88 ++ .../source_google_ads/schemas/label.json | 27 + .../schemas/shopping_performance_view.json | 184 ++++ .../source_google_ads/schemas/topic_view.json | 265 ++++++ .../schemas/user_interest.json | 30 + .../schemas/user_location_view.json | 148 +++ .../source_google_ads/source.py | 288 ++++-- .../source_google_ads/spec.json | 112 ++- .../source_google_ads/streams.py | 853 +++++++++++++----- .../source_google_ads/utils.py | 378 +++++++- .../source-google-ads/unit_tests/__init__.py | 3 + .../source-google-ads/unit_tests/common.py | 117 ++- .../source-google-ads/unit_tests/conftest.py | 14 +- .../unit_tests/test_config_migrations.py | 79 ++ .../unit_tests/test_custom_query.py | 43 +- .../unit_tests/test_errors.py | 156 ++++ .../unit_tests/test_google_ads.py | 221 ++--- .../test_incremental_events_streams.py | 608 +++++++++++++ .../custom_query/test_config.json | 18 + .../custom_query/test_new_config.json | 12 + .../unit_tests/test_models.py | 20 +- .../unit_tests/test_source.py | 444 +++++---- .../unit_tests/test_streams.py | 152 +++- .../unit_tests/test_utils.py | 117 ++- 70 files changed, 7869 insertions(+), 1135 deletions(-) create mode 100644 airbyte-integrations/connectors/source-google-ads/icon.svg create mode 100644 airbyte-integrations/connectors/source-google-ads/integration_tests/configured_catalog_with_click_view.json create mode 100644 airbyte-integrations/connectors/source-google-ads/integration_tests/configured_catalog_with_gaql_only.json create mode 100644 airbyte-integrations/connectors/source-google-ads/integration_tests/expected_records_click.jsonl create mode 100644 airbyte-integrations/connectors/source-google-ads/integration_tests/integration_tests.py create mode 100644 airbyte-integrations/connectors/source-google-ads/integration_tests/state.json create mode 100644 airbyte-integrations/connectors/source-google-ads/metadata.yaml create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/config_migrations.py create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/run.py create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_ad.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_ad_label.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_ad_legacy.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_bidding_strategy.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_criterion.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_criterion_label.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_label.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_listing_group_criterion.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/audience.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_bidding_strategy.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_budget.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_criterion.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_label.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/change_status.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/customer.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/customer_client.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/customer_label.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/display_keyword_view.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/geographic_view.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/keyword_view.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/label.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/shopping_performance_view.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/topic_view.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/user_interest.json create mode 100644 airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/user_location_view.json create mode 100644 airbyte-integrations/connectors/source-google-ads/unit_tests/test_config_migrations.py create mode 100644 airbyte-integrations/connectors/source-google-ads/unit_tests/test_errors.py create mode 100644 airbyte-integrations/connectors/source-google-ads/unit_tests/test_incremental_events_streams.py create mode 100644 airbyte-integrations/connectors/source-google-ads/unit_tests/test_migrations/custom_query/test_config.json create mode 100644 airbyte-integrations/connectors/source-google-ads/unit_tests/test_migrations/custom_query/test_new_config.json diff --git a/airbyte-integrations/connectors/source-google-ads/BOOTSTRAP.md b/airbyte-integrations/connectors/source-google-ads/BOOTSTRAP.md index 89c07e4750cb1..4092d3c7075cd 100644 --- a/airbyte-integrations/connectors/source-google-ads/BOOTSTRAP.md +++ b/airbyte-integrations/connectors/source-google-ads/BOOTSTRAP.md @@ -9,14 +9,14 @@ The resources are listed [here](https://developers.google.com/google-ads/api/ref When querying data, there are three categories of information that can be fetched: - **Attributes**: These are properties of the various entities in the API e.g: the title or ID of an ad campaign. -- **Metrics**: metrics are statistics related to entities in the API. For example, the number of impressions for an ad or an ad campaign. All available metrics can be found [here](https://developers.google.com/google-ads/api/fields/v11/metrics). +- **Metrics**: metrics are statistics related to entities in the API. For example, the number of impressions for an ad or an ad campaign. All available metrics can be found [here](https://developers.google.com/google-ads/api/fields/v15/metrics). - **Segments**: These are ways to partition metrics returned in the query by particular attributes. For example, one could query for the number of impressions (views of an ad) by running SELECT metrics.impressions FROM campaigns which would return the number of impressions for each campaign e.g: 10k impressions. Or you could query for impressions segmented by device type e.g; SELECT metrics.impressions, segments.device FROM campaigns which would return the number of impressions broken down by device type e.g: 3k iOS and 7k Android. When summing the result across all segments, the sum should be the same (approximately) as when requesting the whole query without segments. This is a useful feature for granular data analysis as an advertiser may for example want to know if their ad is successful with a particular kind of person over the other. See more about segmentation [here](https://developers.google.com/google-ads/api/docs/concepts/retrieving-objects). -If you want to get a representation of the raw resources in the API e.g: just know what are all the ads or campaigns in your google account, you would query only for attributes e.g. SELECT campaign.title FROM campaigns. +If you want to get a representation of the raw resources in the API e.g: just know what are all the ads or campaigns in your Google account, you would query only for attributes e.g. SELECT campaign.title FROM campaigns. But if you wanted to get reports about the data (a common use case is impression data for an ad campaign) then you would query for metrics, potentially with segmentation. diff --git a/airbyte-integrations/connectors/source-google-ads/README.md b/airbyte-integrations/connectors/source-google-ads/README.md index 2ecbb03251ca6..d539875f4dc06 100644 --- a/airbyte-integrations/connectors/source-google-ads/README.md +++ b/airbyte-integrations/connectors/source-google-ads/README.md @@ -27,14 +27,6 @@ used for editable installs (`pip install -e`) to pull in Python dependencies fro If this is mumbo jumbo to you, don't worry about it, just put your deps in `setup.py` but install using `pip install -r requirements.txt` and everything should work as you expect. -#### Building via Gradle -You can also build the connector in Gradle. This is typically used in CI and not needed for your development workflow. - -To build using Gradle, from the Airbyte repository root, run: -``` -./gradlew :airbyte-integrations:connectors:source-google-ads:build -``` - #### Create credentials **If you are a community contributor**, follow the instructions in the [documentation](https://docs.airbyte.io/integrations/sources/google-ads) to generate the necessary credentials. Then create a file `secrets/config.json` conforming to the `source_google_ads/spec.json` file. @@ -54,19 +46,70 @@ python main.py read --config secrets/config.json --catalog integration_tests/con ### Locally running the connector docker image -#### Build -First, make sure you build the latest Docker image: -``` -docker build . -t airbyte/source-google-ads:dev + + +#### Use `airbyte-ci` to build your connector +The Airbyte way of building this connector is to use our `airbyte-ci` tool. +You can follow install instructions [here](https://github.com/airbytehq/airbyte/blob/master/airbyte-ci/connectors/pipelines/README.md#L1). +Then running the following command will build your connector: + +```bash +airbyte-ci connectors --name=source-google-ads build ``` +Once the command is done, you will find your connector image in your local docker registry: `airbyte/source-google-ads:dev`. + +##### Customizing our build process +When contributing on our connector you might need to customize the build process to add a system dependency or set an env var. +You can customize our build process by adding a `build_customization.py` module to your connector. +This module should contain a `pre_connector_install` and `post_connector_install` async function that will mutate the base image and the connector container respectively. +It will be imported at runtime by our build process and the functions will be called if they exist. -You can also build the connector image via Gradle: +Here is an example of a `build_customization.py` module: +```python +from __future__ import annotations + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + # Feel free to check the dagger documentation for more information on the Container object and its methods. + # https://dagger-io.readthedocs.io/en/sdk-python-v0.6.4/ + from dagger import Container + + +async def pre_connector_install(base_image_container: Container) -> Container: + return await base_image_container.with_env_variable("MY_PRE_BUILD_ENV_VAR", "my_pre_build_env_var_value") + +async def post_connector_install(connector_container: Container) -> Container: + return await connector_container.with_env_variable("MY_POST_BUILD_ENV_VAR", "my_post_build_env_var_value") ``` -./gradlew :airbyte-integrations:connectors:source-google-ads:airbyteDocker + +#### Build your own connector image +This connector is built using our dynamic built process in `airbyte-ci`. +The base image used to build it is defined within the metadata.yaml file under the `connectorBuildOptions`. +The build logic is defined using [Dagger](https://dagger.io/) [here](https://github.com/airbytehq/airbyte/blob/master/airbyte-ci/connectors/pipelines/pipelines/builds/python_connectors.py). +It does not rely on a Dockerfile. + +If you would like to patch our connector and build your own a simple approach would be to: + +1. Create your own Dockerfile based on the latest version of the connector image. +```Dockerfile +FROM airbyte/source-google-ads:latest + +COPY . ./airbyte/integration_code +RUN pip install ./airbyte/integration_code + +# The entrypoint and default env vars are already set in the base image +# ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" +# ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] ``` -When building via Gradle, the docker image name and tag, respectively, are the values of the `io.airbyte.name` and `io.airbyte.version` `LABEL`s in -the Dockerfile. +Please use this as an example. This is not optimized. +2. Build your image: +```bash +docker build -t airbyte/source-google-ads:dev . +# Running the spec command against your patched connector +docker run airbyte/source-google-ads:dev spec +``` #### Run Then run any of the connector commands as follows: ``` @@ -75,44 +118,16 @@ docker run --rm -v $(pwd)/secrets:/secrets airbyte/source-google-ads:dev check - docker run --rm -v $(pwd)/secrets:/secrets airbyte/source-google-ads:dev discover --config /secrets/config.json docker run --rm -v $(pwd)/secrets:/secrets -v $(pwd)/integration_tests:/integration_tests airbyte/source-google-ads:dev read --config /secrets/config.json --catalog /integration_tests/configured_catalog.json ``` + ## Testing -Make sure to familiarize yourself with [pytest test discovery](https://docs.pytest.org/en/latest/goodpractices.html#test-discovery) to know how your test files and methods should be named. -First install test dependencies into your virtual environment: -``` -pip install -e '.[tests]' -``` -### Unit Tests -To run unit tests locally, from the connector directory run: -``` -python -m pytest unit_tests +You can run our full test suite locally using [`airbyte-ci`](https://github.com/airbytehq/airbyte/blob/master/airbyte-ci/connectors/pipelines/README.md): +```bash +airbyte-ci connectors --name=source-google-ads test ``` -### Integration Tests -There are two types of integration tests: Acceptance Tests (Airbyte's test suite for all source connectors) and custom integration tests (which are specific to this connector). -#### Custom Integration tests -Place custom tests inside `integration_tests/` folder, then, from the connector root, run -``` -python -m pytest integration_tests -``` -#### Acceptance Tests -Customize `acceptance-test-config.yml` file to configure tests. See [Connector Acceptance Tests](https://docs.airbyte.io/connector-development/testing-connectors/connector-acceptance-tests-reference) for more information. +### Customizing acceptance Tests +Customize `acceptance-test-config.yml` file to configure tests. See [Connector Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/connector-acceptance-tests-reference) for more information. If your connector requires to create or destroy resources for use during acceptance tests create fixtures for it and place them inside integration_tests/acceptance.py. -To run your integration tests with acceptance tests, from the connector root, run -``` -python -m pytest integration_tests -p integration_tests.acceptance -``` -To run your integration tests with docker - -### Using gradle to run tests -All commands should be run from airbyte project root. -To run unit tests: -``` -./gradlew :airbyte-integrations:connectors:source-google-ads:unitTest -``` -To run acceptance and custom integration tests: -``` -./gradlew :airbyte-integrations:connectors:source-google-ads:integrationTest -``` ## Dependency Management All of your dependencies should go in `setup.py`, NOT `requirements.txt`. The requirements file is only used to connect internal Airbyte dependencies in the monorepo for local development. @@ -122,8 +137,11 @@ We split dependencies between two groups, dependencies that are: ### Publishing a new version of the connector You've checked out the repo, implemented a million dollar feature, and you're ready to share your changes with the world. Now what? -1. Make sure your changes are passing unit and integration tests. -1. Bump the connector version in `Dockerfile` -- just increment the value of the `LABEL io.airbyte.version` appropriately (we use [SemVer](https://semver.org/)). -1. Create a Pull Request. -1. Pat yourself on the back for being an awesome contributor. -1. Someone from Airbyte will take a look at your PR and iterate with you to merge it into master. +1. Make sure your changes are passing our test suite: `airbyte-ci connectors --name=source-google-ads test` +2. Bump the connector version in `metadata.yaml`: increment the `dockerImageTag` value. Please follow [semantic versioning for connectors](https://docs.airbyte.com/contributing-to-airbyte/resources/pull-requests-handbook/#semantic-versioning-for-connectors). +3. Make sure the `metadata.yaml` content is up to date. +4. Make the connector documentation and its changelog is up to date (`docs/integrations/sources/google-ads.md`). +5. Create a Pull Request: use [our PR naming conventions](https://docs.airbyte.com/contributing-to-airbyte/resources/pull-requests-handbook/#pull-request-title-convention). +6. Pat yourself on the back for being an awesome contributor. +7. Someone from Airbyte will take a look at your PR and iterate with you to merge it into master. + diff --git a/airbyte-integrations/connectors/source-google-ads/acceptance-test-config.yml b/airbyte-integrations/connectors/source-google-ads/acceptance-test-config.yml index 0bfaeb98b1ad6..8c7f037815c4d 100644 --- a/airbyte-integrations/connectors/source-google-ads/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-google-ads/acceptance-test-config.yml @@ -15,45 +15,119 @@ acceptance_tests: discovery: tests: - config_path: "secrets/config.json" + backward_compatibility_tests_config: + disable_for_version: "1.0.0" # schemas of default streams were updated basic_read: tests: - config_path: "secrets/config.json" expect_records: path: "integration_tests/expected_records.jsonl" - timeout_seconds: 600 + extra_fields: no + exact_order: yes + extra_records: yes # the file with all the records is 15 MB, so comparing only 3 records + timeout_seconds: 3600 empty_streams: - - name: "accounts" - bypass_reason: "Floating data" - - name: "display_topics_performance_report" - bypass_reason: "Stream not filled yet." + - name: "customer_label" + bypass_reason: "Data is present in UI, but not in API: supposedly insufficient permissions" + - name: "shopping_performance_view" + bypass_reason: "No shopping campaign, need item for sale" + - name: "topic_view" + bypass_reason: "No data for this date range, tested in next config" - name: "click_view" - bypass_reason: "Stream not filled yet." - - name: "unhappytable" - bypass_reason: "Stream not filled yet." - - name: "shopping_performance_report" - bypass_reason: "Stream not filled yet." + bypass_reason: "Stream has data only for last 90 days, next config is used for testing it" + ignored_fields: + customer: + - name: customer.optimization_score_weight + bypass_reason: "Value can be updated by Google Ads" + - name: customer.optimization_score + bypass_reason: "Value can be updated by Google Ads" + - name: customer.pay_per_conversion_eligibility_failure_reasons + bypass_reason: "Value can be updated by Google Ads" + - config_path: "secrets/config_click_view.json" + expect_records: + path: "integration_tests/expected_records_click.jsonl" + timeout_seconds: 3600 + empty_streams: + - name: "customer_label" + bypass_reason: "Data is present in UI, but not in API: supposedly insufficient permissions" + - name: "shopping_performance_view" + bypass_reason: "No shopping campaign, need item for sale" + - name: "display_keyword_view" + bypass_reason: "No data for this date range, tested in previous config" + - name: "keyword_view" + bypass_reason: "No data for this date range, tested in previous config" + ignored_fields: + customer: + - name: customer.optimization_score_weight + bypass_reason: "Value can be updated by Google Ads" + - name: customer.optimization_score + bypass_reason: "Value can be updated by Google Ads" + - name: customer.pay_per_conversion_eligibility_failure_reasons + bypass_reason: "Value can be updated by Google Ads" + campaign_budget: + - name: campaign_budget.recommended_budget_estimated_change_weekly_interactions + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.all_conversions + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.all_conversions_from_interactions_rate + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.all_conversions_value + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.conversions + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.conversions_from_interactions_rate + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.conversions_value + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.cost_per_all_conversions + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.cost_per_conversion + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.value_per_all_conversions + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.value_per_conversion + bypass_reason: "Value can be updated by Google Ads" + campaign: + - name: campaign.optimization_score + bypass_reason: "Value can be updated by Google Ads" + ad_group_ad_legacy: + - name: metrics.all_conversions_from_interactions_rate + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.all_conversions_value + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.all_conversions + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.conversions_from_interactions_rate + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.conversions_value + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.conversions + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.cost_per_all_conversions + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.cost_per_conversion + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.cost_per_current_model_attributed_conversion + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.current_model_attributed_conversions_value + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.current_model_attributed_conversions + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.value_per_all_conversions + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.value_per_conversion + bypass_reason: "Value can be updated by Google Ads" + - name: metrics.value_per_current_model_attributed_conversion + bypass_reason: "Value can be updated by Google Ads" full_refresh: tests: - config_path: "secrets/config.json" configured_catalog_path: "integration_tests/configured_catalog.json" + - config_path: "secrets/config_manager_account.json" incremental: tests: - config_path: "secrets/incremental_config.json" + timeout_seconds: 3600 configured_catalog_path: "integration_tests/incremental_catalog.json" - threshold_days: 14 future_state: future_state_path: "integration_tests/abnormal_state.json" - cursor_paths: - account_performance_report: ["4651612872", "segments.date"] - click_view: ["4651612872", "segments.date"] - geographic_report: ["4651612872", "segments.date"] - keyword_report: ["4651612872", "segments.date"] - display_topics_performance_report: ["4651612872", "segments.date"] - shopping_performance_report: ["4651612872", "segments.date"] - ad_group_ads: ["4651612872", "segments.date"] - ad_groups: ["4651612872", "segments.date"] - accounts: ["4651612872", "segments.date"] - campaigns: ["4651612872", "segments.date"] - user_location_report: ["4651612872", "segments.date"] - ad_group_ad_report: ["4651612872", "segments.date"] - display_keyword_performance_report: ["4651612872", "segments.date"] diff --git a/airbyte-integrations/connectors/source-google-ads/icon.svg b/airbyte-integrations/connectors/source-google-ads/icon.svg new file mode 100644 index 0000000000000..f942522174409 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-google-ads/integration_tests/__init__.py b/airbyte-integrations/connectors/source-google-ads/integration_tests/__init__.py index e69de29bb2d1d..c941b30457953 100644 --- a/airbyte-integrations/connectors/source-google-ads/integration_tests/__init__.py +++ b/airbyte-integrations/connectors/source-google-ads/integration_tests/__init__.py @@ -0,0 +1,3 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# diff --git a/airbyte-integrations/connectors/source-google-ads/integration_tests/abnormal_state.json b/airbyte-integrations/connectors/source-google-ads/integration_tests/abnormal_state.json index 9241aad423b4f..3adb6391998c4 100644 --- a/airbyte-integrations/connectors/source-google-ads/integration_tests/abnormal_state.json +++ b/airbyte-integrations/connectors/source-google-ads/integration_tests/abnormal_state.json @@ -2,92 +2,139 @@ { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, "stream_descriptor": { "name": "account_performance_report" } } }, { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, "stream_descriptor": { "name": "click_view" } } }, { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, - "stream_descriptor": { "name": "geographic_report" } + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "geographic_view" } } }, { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, - "stream_descriptor": { "name": "keyword_report" } + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "keyword_view" } } }, { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, - "stream_descriptor": { "name": "display_topics_performance_report" } + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "topic_view" } } }, { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, - "stream_descriptor": { "name": "shopping_performance_report" } + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "shopping_performance_view" } } }, { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, - "stream_descriptor": { "name": "ad_group_ads" } + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "ad_group_ad" } } }, { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, - "stream_descriptor": { "name": "ad_groups" } + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "ad_group" } } }, { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, - "stream_descriptor": { "name": "accounts" } + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "customer" } } }, { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, - "stream_descriptor": { "name": "campaigns" } + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "campaign" } } }, { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, - "stream_descriptor": { "name": "user_location_report" } + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "user_location_view" } } }, { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, - "stream_descriptor": { "name": "ad_group_ad_report" } + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "ad_group_ad_legacy" } } }, { "type": "STREAM", "stream": { - "stream_state": { "4651612872": { "segments.date": "2222-01-01" }}, - "stream_descriptor": { "name": "display_keyword_performance_report" } + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "display_keyword_view" } + } + }, + { + "type": "STREAM", + "stream": { + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "campaign_budget" } + } + }, + { + "type": "STREAM", + "stream": { + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "campaign_bidding_strategy" } + } + }, + { + "type": "STREAM", + "stream": { + "stream_state": { "4651612872": { "segments.date": "2222-01-01" } }, + "stream_descriptor": { "name": "ad_group_bidding_strategy" } + } + }, + { + "type": "STREAM", + "stream": { + "stream_state": { + "change_status": { + "4651612872": { + "change_status.last_change_date_time": "2024-08-16 13:20:01.003295" + } + } + }, + "stream_descriptor": { "name": "ad_group_criterion" } + } + }, + { + "type": "STREAM", + "stream": { + "stream_state": { + "change_status": { + "4651612872": { + "change_status.last_change_date_time": "2024-08-16 13:20:01.003295" + } + } + }, + "stream_descriptor": { "name": "campaign_criterion" } } } ] diff --git a/airbyte-integrations/connectors/source-google-ads/integration_tests/configured_catalog.json b/airbyte-integrations/connectors/source-google-ads/integration_tests/configured_catalog.json index 06de28d488afb..47d5458aa18c9 100644 --- a/airbyte-integrations/connectors/source-google-ads/integration_tests/configured_catalog.json +++ b/airbyte-integrations/connectors/source-google-ads/integration_tests/configured_catalog.json @@ -2,16 +2,54 @@ "streams": [ { "stream": { - "name": "ad_group_ad_report", + "name": "ad_group_ad_legacy", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, + "source_defined_primary_key": [ + ["ad_group.id"], + ["ad_group_ad.ad.id"], + ["segments.date"], + ["segments.ad_network_type"] + ], "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", + "primary_key": [ + ["ad_group.id"], + ["ad_group_ad.ad.id"], + ["segments.date"], + ["segments.ad_network_type"] + ], "cursor_field": ["segments.date"] }, + { + "stream": { + "name": "campaign_budget", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["segments.date"], + "source_defined_primary_key": [ + ["customer.id"], + ["campaign_budget.id"], + ["segments.date"], + ["segments.budget_campaign_association_status.campaign"], + ["segments.budget_campaign_association_status.status"] + ] + }, + "sync_mode": "incremental", + "destination_sync_mode": "overwrite", + "cursor_field": ["segments.date"], + "primary_key": [ + ["customer.id"], + ["campaign_budget.id"], + ["segments.date"], + ["segments.budget_campaign_association_status.campaign"], + ["segments.budget_campaign_association_status.status"] + ] + }, { "stream": { "name": "ad_group_custom", @@ -29,11 +67,23 @@ "name": "account_performance_report", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["customer.id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], "source_defined_cursor": true, "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", + "primary_key": [ + ["customer.id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], "cursor_field": ["segments.date"] }, { @@ -42,65 +92,123 @@ "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, - "source_defined_primary_key": [["click_view.gclid"], ["segments.date"]], + "source_defined_primary_key": [ + ["click_view.gclid"], + ["segments.date"], + ["segments.ad_network_type"] + ], "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", "cursor_field": ["segments.date"], - "primary_key": [["click_view.gclid"], ["segments.date"]] + "primary_key": [ + ["click_view.gclid"], + ["segments.date"], + ["segments.ad_network_type"] + ] }, { "stream": { - "name": "geographic_report", + "name": "geographic_view", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["customer.id"], + ["geographic_view.country_criterion_id"], + ["geographic_view.location_type"], + ["segments.date"] + ], "source_defined_cursor": true, "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", + "primary_key": [ + ["customer.id"], + ["geographic_view.country_criterion_id"], + ["geographic_view.location_type"], + ["segments.date"] + ], "cursor_field": ["segments.date"] }, { "stream": { - "name": "keyword_report", + "name": "keyword_view", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["ad_group_criterion.criterion_id"], + ["ad_group.id"], + ["segments.date"] + ], "source_defined_cursor": true, "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", + "primary_key": [ + ["ad_group_criterion.criterion_id"], + ["ad_group.id"], + ["segments.date"] + ], "cursor_field": ["segments.date"] }, { "stream": { - "name": "display_keyword_performance_report", + "name": "display_keyword_view", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["ad_group.id"], + ["ad_group_criterion.criterion_id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], "source_defined_cursor": true, "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", + "primary_key": [ + ["ad_group.id"], + ["ad_group_criterion.criterion_id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], "cursor_field": ["segments.date"] }, { "stream": { - "name": "display_topics_performance_report", + "name": "topic_view", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["ad_group.id"], + ["ad_group_criterion.criterion_id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], "source_defined_cursor": true, "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", + "primary_key": [ + ["ad_group.id"], + ["ad_group_criterion.criterion_id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], "destination_sync_mode": "overwrite", "cursor_field": ["segments.date"] }, { "stream": { - "name": "shopping_performance_report", + "name": "shopping_performance_view", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, @@ -112,11 +220,12 @@ }, { "stream": { - "name": "ad_group_ads", + "name": "ad_group_ad", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, "source_defined_primary_key": [ + ["ad_group.id"], ["ad_group_ad.ad.id"], ["segments.date"] ], @@ -125,11 +234,11 @@ "sync_mode": "incremental", "destination_sync_mode": "overwrite", "cursor_field": ["segments.date"], - "primary_key": [["ad_group_ad.ad.id"], ["segments.date"]] + "primary_key": [["ad_group.id"], ["ad_group_ad.ad.id"], ["segments.date"]] }, { "stream": { - "name": "ad_groups", + "name": "ad_group", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, @@ -143,7 +252,7 @@ }, { "stream": { - "name": "accounts", + "name": "customer", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, @@ -157,61 +266,89 @@ }, { "stream": { - "name": "campaigns", + "name": "campaign", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, "default_cursor_field": ["segments.date"], - "source_defined_primary_key": [["campaign.id"], ["segments.date"]] + "source_defined_primary_key": [ + ["campaign.id"], + ["segments.date"], + ["segments.hour"], + ["segments.ad_network_type"] + ] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", "cursor_field": ["segments.date"], - "primary_key": [["campaign.id"], ["segments.date"]] + "primary_key": [ + ["campaign.id"], + ["segments.date"], + ["segments.hour"], + ["segments.ad_network_type"] + ] }, { "stream": { - "name": "campaign_labels", + "name": "campaign_label", "json_schema": {}, "supported_sync_modes": ["full_refresh"], - "source_defined_primary_key": [["campaign_label.resource_name"]] + "source_defined_primary_key": [["campaign.id"], ["label.id"]] }, "sync_mode": "full_refresh", "destination_sync_mode": "overwrite", - "primary_key": [["campaign_label.resource_name"]] + "primary_key": [["campaign.id"], ["label.id"]] }, { "stream": { - "name": "ad_group_labels", + "name": "ad_group_label", "json_schema": {}, "supported_sync_modes": ["full_refresh"], - "source_defined_primary_key": [["ad_group_label.resource_name"]] + "source_defined_primary_key": [["ad_group.id"], ["label.id"]] }, "sync_mode": "full_refresh", "destination_sync_mode": "overwrite", - "primary_key": [["ad_group_label.resource_name"]] + "primary_key": [["ad_group.id"], ["label.id"]] }, { "stream": { - "name": "ad_group_ad_labels", + "name": "ad_group_ad_label", "json_schema": {}, "supported_sync_modes": ["full_refresh"], - "source_defined_primary_key": [["ad_group_ad_label.resource_name"]] + "source_defined_primary_key": [ + ["ad_group.id"], + ["ad_group_ad.ad.id"], + ["label.id"] + ] }, "sync_mode": "full_refresh", "destination_sync_mode": "overwrite", - "primary_key": [["ad_group_ad_label.resource_name"]] + "primary_key": [["ad_group.id"], ["ad_group_ad.ad.id"], ["label.id"]] }, { "stream": { - "name": "user_location_report", + "name": "user_location_view", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, + "source_defined_primary_key": [ + ["customer.id"], + ["user_location_view.country_criterion_id"], + ["user_location_view.targeting_location"], + ["segments.date"], + ["segments.ad_network_type"] + ], "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", + "primary_key": [ + ["customer.id"], + ["user_location_view.country_criterion_id"], + ["user_location_view.targeting_location"], + ["segments.date"], + ["segments.ad_network_type"] + ], "cursor_field": ["segments.date"] }, { @@ -228,24 +365,146 @@ }, { "stream": { - "name": "unhappytable", + "name": "custom_audience", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite" + }, + { + "stream": { + "name": "audience", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"], + "source_defined_primary_key": [["customer.id"], ["audience.id"]] + }, + "sync_mode": "full_refresh", + "primary_key": [["customer.id"], ["audience.id"]], + "destination_sync_mode": "overwrite" + }, + { + "stream": { + "name": "user_interest", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"], + "source_defined_primary_key": [["user_interest.user_interest_id"]] + }, + "sync_mode": "full_refresh", + "primary_key": [["user_interest.user_interest_id"]], + "destination_sync_mode": "overwrite" + }, + { + "stream": { + "name": "label", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"], + "source_defined_primary_key": [["label.id"]] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite", + "primary_key": [["label.id"]] + }, + { + "stream": { + "name": "customer_label", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"], + "source_defined_primary_key": [["customer_label.resource_name"]] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite", + "primary_key": [["customer_label.resource_name"]] + }, + { + "stream": { + "name": "campaign_bidding_strategy", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["campaign.id"], + ["bidding_strategy.id"], + ["segments.date"] + ], + "source_defined_cursor": true, + "default_cursor_field": ["segments.date"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite", + "primary_key": [ + ["campaign.id"], + ["bidding_strategy.id"], + ["segments.date"] + ], + "cursor_field": ["segments.date"] + }, + { + "stream": { + "name": "ad_group_bidding_strategy", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["ad_group.id"], + ["bidding_strategy.id"], + ["segments.date"] + ], "source_defined_cursor": true, "default_cursor_field": ["segments.date"] }, - "sync_mode": "incremental", + "sync_mode": "full_refresh", "destination_sync_mode": "overwrite", + "primary_key": [ + ["ad_group.id"], + ["bidding_strategy.id"], + ["segments.date"] + ], "cursor_field": ["segments.date"] }, { "stream": { - "name": "custom_audience", + "name": "ad_group_criterion", "json_schema": {}, - "supported_sync_modes": ["full_refresh"] + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [["ad_group_criterion.resource_name"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "overwrite", + "primary_key": [["ad_group_criterion.resource_name"]] + }, + { + "stream": { + "name": "ad_listing_group_criterion", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"], + "source_defined_primary_key": [["ad_group_criterion.resource_name"]] }, "sync_mode": "full_refresh", - "destination_sync_mode": "overwrite" + "destination_sync_mode": "overwrite", + "primary_key": [["ad_group_criterion.resource_name"]] + }, + { + "stream": { + "name": "ad_group_criterion_label", + "json_schema": {}, + "supported_sync_modes": ["full_refresh"], + "source_defined_primary_key": [ + ["ad_group_criterion_label.resource_name"] + ] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite", + "primary_key": [["ad_group_criterion_label.resource_name"]] + }, + { + "stream": { + "name": "campaign_criterion", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [["campaign_criterion.resource_name"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "overwrite", + "primary_key": [["campaign_criterion.resource_name"]] } ] } diff --git a/airbyte-integrations/connectors/source-google-ads/integration_tests/configured_catalog_with_click_view.json b/airbyte-integrations/connectors/source-google-ads/integration_tests/configured_catalog_with_click_view.json new file mode 100644 index 0000000000000..d7edf73ae0466 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/integration_tests/configured_catalog_with_click_view.json @@ -0,0 +1,18 @@ +{ + "streams": [ + { + "stream": { + "name": "click_view", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "source_defined_primary_key": [["click_view.gclid"], ["segments.date"]], + "default_cursor_field": ["segments.date"] + }, + "sync_mode": "incremental", + "destination_sync_mode": "overwrite", + "cursor_field": ["segments.date"], + "primary_key": [["click_view.gclid"], ["segments.date"]] + } + ] +} diff --git a/airbyte-integrations/connectors/source-google-ads/integration_tests/configured_catalog_with_gaql_only.json b/airbyte-integrations/connectors/source-google-ads/integration_tests/configured_catalog_with_gaql_only.json new file mode 100644 index 0000000000000..2804c77d24dcc --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/integration_tests/configured_catalog_with_gaql_only.json @@ -0,0 +1,14 @@ +{ + "streams": [ + { + "stream": { + "name": "custom_ga_query", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite" + } + ] +} diff --git a/airbyte-integrations/connectors/source-google-ads/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-google-ads/integration_tests/expected_records.jsonl index 1c85b69d1b12e..875167ce8290b 100644 --- a/airbyte-integrations/connectors/source-google-ads/integration_tests/expected_records.jsonl +++ b/airbyte-integrations/connectors/source-google-ads/integration_tests/expected_records.jsonl @@ -1,86 +1,71 @@ -{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 0, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.date": "2022-04-08", "segments.day_of_week": "FRIDAY", "segments.device": "DESKTOP", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 0, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-04-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.9001, "metrics.search_exact_match_impression_share": 0.0, "metrics.search_impression_share": 0.0999, "metrics.search_rank_lost_impression_share": 0.0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-04-04", "segments.year": 2022}, "emitted_at": 1671617272961} -{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 0, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.date": "2022-04-08", "segments.day_of_week": "FRIDAY", "segments.device": "MOBILE", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 2, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-04-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.9001, "metrics.search_exact_match_impression_share": 0.0, "metrics.search_impression_share": 0.0999, "metrics.search_rank_lost_impression_share": 0.0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-04-04", "segments.year": 2022}, "emitted_at": 1671617272966} -{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 0, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.device": "DESKTOP", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 28, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-04-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.6618578465869106, "metrics.search_exact_match_impression_share": 0.0999, "metrics.search_impression_share": 0.0999, "metrics.search_rank_lost_impression_share": 0.3282899366643209, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-04-04", "segments.year": 2022}, "emitted_at": 1671617272971} -{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 70000.0, "metrics.average_cpc": 70000.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 1014492.7536231884, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 1, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 70000, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.014492753623188406, "segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.device": "MOBILE", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 69, "metrics.interaction_rate": 0.014492753623188406, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interactions": 1, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-04-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.6715465465465466, "metrics.search_exact_match_impression_share": 0.0999, "metrics.search_impression_share": 0.0999, "metrics.search_rank_lost_impression_share": 0.30255255255255253, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-04-04", "segments.year": 2022}, "emitted_at": 1671617272975} -{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 0, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.device": "TABLET", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 1, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-04-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.8473282442748091, "metrics.search_exact_match_impression_share": 0.0999, "metrics.search_impression_share": 0.0999, "metrics.search_rank_lost_impression_share": 0.1450381679389313, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-04-04", "segments.year": 2022}, "emitted_at": 1671617272980} -{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH_PARTNERS", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 0, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.device": "DESKTOP", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 15, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-04-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.0, "metrics.search_exact_match_impression_share": 0.0, "metrics.search_impression_share": 0.0, "metrics.search_rank_lost_impression_share": 0.0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-04-04", "segments.year": 2022}, "emitted_at": 1671617272984} -{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH_PARTNERS", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 0, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.device": "MOBILE", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 26, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-04-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.0, "metrics.search_exact_match_impression_share": 0.0, "metrics.search_impression_share": 0.0, "metrics.search_rank_lost_impression_share": 0.0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-04-04", "segments.year": 2022}, "emitted_at": 1671617272987} -{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH_PARTNERS", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 0, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.device": "TABLET", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 3, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-04-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.0, "metrics.search_exact_match_impression_share": 0.0, "metrics.search_impression_share": 0.0, "metrics.search_rank_lost_impression_share": 0.0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-04-04", "segments.year": 2022}, "emitted_at": 1671617272990} -{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 262000.0, "metrics.average_cpc": 262000.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 93571428.57142857, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 5, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 1310000, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.35714285714285715, "segments.date": "2022-04-10", "segments.day_of_week": "SUNDAY", "segments.device": "DESKTOP", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 14, "metrics.interaction_rate": 0.35714285714285715, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interactions": 5, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-04-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.6144693003331747, "metrics.search_exact_match_impression_share": 0.12244897959183673, "metrics.search_impression_share": 0.0999, "metrics.search_rank_lost_impression_share": 0.378867206092337, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-04-04", "segments.year": 2022}, "emitted_at": 1671617272992} -{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 30000.0, "metrics.average_cpc": 30000.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 2195121.951219512, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 3, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 90000, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.07317073170731707, "segments.date": "2022-04-10", "segments.day_of_week": "SUNDAY", "segments.device": "MOBILE", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 41, "metrics.interaction_rate": 0.07317073170731707, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interactions": 3, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-04-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.628, "metrics.search_exact_match_impression_share": 0.0999, "metrics.search_impression_share": 0.0999, "metrics.search_rank_lost_impression_share": 0.3556, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-04-04", "segments.year": 2022}, "emitted_at": 1671617272994} -{"stream": "geographic_report", "data": {"customer.descriptive_name": "", "geographic_view.country_criterion_id": 2124, "geographic_view.location_type": "LOCATION_OF_PRESENCE", "ad_group.id": 137051662444, "segments.date": "2022-04-08"}, "emitted_at": 1671617280435} -{"stream": "geographic_report", "data": {"customer.descriptive_name": "", "geographic_view.country_criterion_id": 2840, "geographic_view.location_type": "AREA_OF_INTEREST", "ad_group.id": 137020701042, "segments.date": "2022-04-09"}, "emitted_at": 1671617280437} -{"stream": "geographic_report", "data": {"customer.descriptive_name": "", "geographic_view.country_criterion_id": 2124, "geographic_view.location_type": "LOCATION_OF_PRESENCE", "ad_group.id": 137020701042, "segments.date": "2022-04-09"}, "emitted_at": 1671617280438} -{"stream": "geographic_report", "data": {"customer.descriptive_name": "", "geographic_view.country_criterion_id": 2840, "geographic_view.location_type": "LOCATION_OF_PRESENCE", "ad_group.id": 137020701042, "segments.date": "2022-04-09"}, "emitted_at": 1671617280440} -{"stream": "geographic_report", "data": {"customer.descriptive_name": "", "geographic_view.country_criterion_id": 2124, "geographic_view.location_type": "AREA_OF_INTEREST", "ad_group.id": 137051662444, "segments.date": "2022-04-09"}, "emitted_at": 1671617280442} -{"stream": "geographic_report", "data": {"customer.descriptive_name": "", "geographic_view.country_criterion_id": 2840, "geographic_view.location_type": "AREA_OF_INTEREST", "ad_group.id": 137051662444, "segments.date": "2022-04-09"}, "emitted_at": 1671617280443} -{"stream": "geographic_report", "data": {"customer.descriptive_name": "", "geographic_view.country_criterion_id": 2124, "geographic_view.location_type": "LOCATION_OF_PRESENCE", "ad_group.id": 137051662444, "segments.date": "2022-04-09"}, "emitted_at": 1671617280445} -{"stream": "geographic_report", "data": {"customer.descriptive_name": "", "geographic_view.country_criterion_id": 2840, "geographic_view.location_type": "LOCATION_OF_PRESENCE", "ad_group.id": 137051662444, "segments.date": "2022-04-09"}, "emitted_at": 1671617280447} -{"stream": "geographic_report", "data": {"customer.descriptive_name": "", "geographic_view.country_criterion_id": 2840, "geographic_view.location_type": "AREA_OF_INTEREST", "ad_group.id": 137020701042, "segments.date": "2022-04-10"}, "emitted_at": 1671617280448} -{"stream": "geographic_report", "data": {"customer.descriptive_name": "", "geographic_view.country_criterion_id": 2124, "geographic_view.location_type": "LOCATION_OF_PRESENCE", "ad_group.id": 137020701042, "segments.date": "2022-04-10"}, "emitted_at": 1671617280450} -{"stream": "keyword_report", "data": {"customer.descriptive_name": "", "ad_group.id": 123273719655, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "open source analytics", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 1, "metrics.ctr": 0.0, "segments.date": "2022-02-16", "campaign.bidding_strategy_type": "TARGET_SPEND", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 0, "ad_group_criterion.criterion_id": 1732729676}, "emitted_at": 1671617284427} -{"stream": "keyword_report", "data": {"customer.descriptive_name": "", "ad_group.id": 123273719655, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "etl pipeline", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 3, "metrics.ctr": 0.0, "segments.date": "2022-02-16", "campaign.bidding_strategy_type": "TARGET_SPEND", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 0, "ad_group_criterion.criterion_id": 297585172071}, "emitted_at": 1671617284428} -{"stream": "keyword_report", "data": {"customer.descriptive_name": "", "ad_group.id": 123273719655, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "open source etl", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 7, "metrics.ctr": 0.0, "segments.date": "2022-02-16", "campaign.bidding_strategy_type": "TARGET_SPEND", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 0, "ad_group_criterion.criterion_id": 298270671583}, "emitted_at": 1671617284429} -{"stream": "keyword_report", "data": {"customer.descriptive_name": "", "ad_group.id": 123273719655, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "data connectors", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 5, "metrics.ctr": 0.0, "segments.date": "2022-02-16", "campaign.bidding_strategy_type": "TARGET_SPEND", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 0, "ad_group_criterion.criterion_id": 303376179543}, "emitted_at": 1671617284429} -{"stream": "keyword_report", "data": {"customer.descriptive_name": "", "ad_group.id": 123273719655, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "open source analytics", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 1, "metrics.ctr": 0.0, "segments.date": "2022-02-17", "campaign.bidding_strategy_type": "TARGET_SPEND", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 0, "ad_group_criterion.criterion_id": 1732729676}, "emitted_at": 1671617284430} -{"stream": "keyword_report", "data": {"customer.descriptive_name": "", "ad_group.id": 123273719655, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "etl pipeline", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 3, "metrics.ctr": 0.0, "segments.date": "2022-02-17", "campaign.bidding_strategy_type": "TARGET_SPEND", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 0, "ad_group_criterion.criterion_id": 297585172071}, "emitted_at": 1671617284430} -{"stream": "keyword_report", "data": {"customer.descriptive_name": "", "ad_group.id": 123273719655, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "open source etl", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 7, "metrics.ctr": 0.0, "segments.date": "2022-02-17", "campaign.bidding_strategy_type": "TARGET_SPEND", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 0, "ad_group_criterion.criterion_id": 298270671583}, "emitted_at": 1671617284431} -{"stream": "keyword_report", "data": {"customer.descriptive_name": "", "ad_group.id": 123273719655, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "data connectors", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 5, "metrics.ctr": 0.0, "segments.date": "2022-02-17", "campaign.bidding_strategy_type": "TARGET_SPEND", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 0, "ad_group_criterion.criterion_id": 303376179543}, "emitted_at": 1671617284431} -{"stream": "keyword_report", "data": {"customer.descriptive_name": "", "ad_group.id": 123273719655, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "open source analytics", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 1, "metrics.ctr": 0.0, "segments.date": "2022-02-18", "campaign.bidding_strategy_type": "TARGET_SPEND", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 0, "ad_group_criterion.criterion_id": 1732729676}, "emitted_at": 1671617284432} -{"stream": "keyword_report", "data": {"customer.descriptive_name": "", "ad_group.id": 123273719655, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "etl pipeline", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 3, "metrics.ctr": 0.0, "segments.date": "2022-02-18", "campaign.bidding_strategy_type": "TARGET_SPEND", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 0, "ad_group_criterion.criterion_id": 297585172071}, "emitted_at": 1671617284432} -{"stream": "display_keyword_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 10012000.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 1, "metrics.active_view_measurability": 1.0, "metrics.active_view_measurable_cost_micros": 10012, "metrics.active_view_measurable_impressions": 1, "metrics.active_view_viewability": 1.0, "ad_group.id": 143992182864, "ad_group.name": "Video Non-skippable - 2022-05-30", "ad_group.status": "ENABLED", "segments.ad_network_type": "YOUTUBE_WATCH", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 10012000.0, "metrics.average_cpv": 0.0, "ad_group.base_ad_group": "customers/4651612872/adGroups/143992182864", "campaign.base_campaign": "customers/4651612872/campaigns/17354032686", "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "TARGET_CPM", "campaign.id": 17354032686, "campaign.name": "Video Non-skippable - 2022-05-30", "campaign.status": "ENABLED", "metrics.clicks": 0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 10012, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "ad_group_criterion.effective_cpc_bid_micros": 10000, "ad_group_criterion.effective_cpc_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpm_bid_micros": 10000, "ad_group_criterion.effective_cpm_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpv_bid_micros": 10000, "ad_group_criterion.effective_cpv_bid_source": "AD_GROUP", "ad_group_criterion.keyword.text": "big data software", "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.day_of_week": "TUESDAY", "segments.device": "MOBILE", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "ad_group_criterion.final_mobile_urls": [], "ad_group_criterion.final_urls": [], "metrics.gmail_forwards": 0, "metrics.gmail_saves": 0, "metrics.gmail_secondary_clicks": 0, "ad_group_criterion.criterion_id": 26160872903, "metrics.impressions": 1, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "ad_group_criterion.negative": false, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n", "targeting_dimension: TOPIC\nbid_only: false\n"], "segments.month": "2022-05-01", "segments.quarter": "2022-04-01", "ad_group_criterion.status": "ENABLED", "ad_group_criterion.tracking_url_template": "", "ad_group_criterion.keyword.match_type": "BROAD", "ad_group_criterion.url_custom_parameters": [], "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_quartile_p100_rate": 0.0, "metrics.video_quartile_p25_rate": 0.0, "metrics.video_quartile_p50_rate": 0.0, "metrics.video_quartile_p75_rate": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-05-30", "segments.year": 2022, "segments.date": "2022-05-31"}, "emitted_at": 1671617298755} -{"stream": "campaign_labels", "data": {"campaign.resource_name": "customers/4651612872/campaigns/12124071339", "campaign_label.resource_name": "customers/4651612872/campaignLabels/12124071339~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471"}, "emitted_at": 1671617384908} -{"stream": "campaign_labels", "data": {"campaign.resource_name": "customers/4651612872/campaigns/13284356762", "campaign_label.resource_name": "customers/4651612872/campaignLabels/13284356762~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471"}, "emitted_at": 1671617384909} -{"stream": "ad_group_labels", "data": {"ad_group.resource_name": "customers/4651612872/adGroups/123273719655", "ad_group_label.resource_name": "customers/4651612872/adGroupLabels/123273719655~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471"}, "emitted_at": 1671617385395} -{"stream": "ad_group_ad_labels", "data": {"ad_group_ad.ad.resource_name": "customers/4651612872/ads/524518584182", "ad_group_ad_label.resource_name": "customers/4651612872/adGroupAdLabels/123273719655~524518584182~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471"}, "emitted_at": 1671617386108} -{"stream": "user_location_report", "data": {"segments.date": "2022-04-08", "segments.day_of_week": "FRIDAY", "segments.month": "2022-04-01", "segments.week": "2022-04-04", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2124, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2124~true", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a01", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137051662444", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 2, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1671617390491} -{"stream": "user_location_report", "data": {"segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.month": "2022-04-01", "segments.week": "2022-04-04", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2124, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2124~true", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 70000.0, "metrics.average_cpc": 70000.0, "metrics.average_cpm": 3684210.5263157897, "metrics.average_cpv": 0.0, "metrics.clicks": 1, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 70000, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.05263157894736842, "metrics.impressions": 19, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interaction_rate": 0.05263157894736842, "metrics.interactions": 1, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1671617390495} -{"stream": "user_location_report", "data": {"segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.month": "2022-04-01", "segments.week": "2022-04-04", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2840, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2840~true", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 3, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1671617390499} -{"stream": "user_location_report", "data": {"segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.month": "2022-04-01", "segments.week": "2022-04-04", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2051, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2051~false", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a01", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137051662444", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 1, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1671617390503} -{"stream": "user_location_report", "data": {"segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.month": "2022-04-01", "segments.week": "2022-04-04", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2170, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2170~false", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a01", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137051662444", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 2, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1671617390507} -{"stream": "user_location_report", "data": {"segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.month": "2022-04-01", "segments.week": "2022-04-04", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2218, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2218~false", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a01", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137051662444", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 1, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1671617390511} -{"stream": "user_location_report", "data": {"segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.month": "2022-04-01", "segments.week": "2022-04-04", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2356, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2356~false", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a01", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137051662444", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 1, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1671617390514} -{"stream": "user_location_report", "data": {"segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.month": "2022-04-01", "segments.week": "2022-04-04", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2484, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2484~false", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a01", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137051662444", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 4, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1671617390516} -{"stream": "user_location_report", "data": {"segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.month": "2022-04-01", "segments.week": "2022-04-04", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2504, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2504~false", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a01", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137051662444", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 1, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1671617390518} -{"stream": "user_location_report", "data": {"segments.date": "2022-04-09", "segments.day_of_week": "SATURDAY", "segments.month": "2022-04-01", "segments.week": "2022-04-04", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2524, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2524~false", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a01", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137051662444", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 2, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1671617390520} -{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-04-08"}, "emitted_at": 1671617397632} -{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-04-09"}, "emitted_at": 1671617397634} -{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-04-10"}, "emitted_at": 1671617397634} -{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-04-11"}, "emitted_at": 1671617397635} -{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-04-12"}, "emitted_at": 1671617397635} -{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-04-13"}, "emitted_at": 1671617397635} -{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-04-14"}, "emitted_at": 1671617397636} -{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-04-15"}, "emitted_at": 1671617397636} -{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-04-16"}, "emitted_at": 1671617397636} -{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "WEBSITE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-04-09"}, "emitted_at": 1671617397637} -{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-04-08"}, "emitted_at": 1671617407844} -{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-04-09"}, "emitted_at": 1671617407844} -{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-04-09"}, "emitted_at": 1671617407844} -{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-04-10"}, "emitted_at": 1671617407845} -{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-04-10"}, "emitted_at": 1671617407845} -{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-04-11"}, "emitted_at": 1671617407846} -{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-04-11"}, "emitted_at": 1671617407846} -{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-04-12"}, "emitted_at": 1671617407846} -{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-04-12"}, "emitted_at": 1671617407846} -{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-04-13"}, "emitted_at": 1671617407847} -{"stream":"custom_audience","data":{"custom_audience.description":"","custom_audience.name":"Airbyet","custom_audience.id":523469909,"custom_audience.members":["member_type: KEYWORD\nkeyword: \"etl elt\"\n","member_type: KEYWORD\nkeyword: \"cloud data management and analytics\"\n","member_type: KEYWORD\nkeyword: \"data integration\"\n","member_type: KEYWORD\nkeyword: \"big data analytics database\"\n","member_type: KEYWORD\nkeyword: \"data\"\n","member_type: KEYWORD\nkeyword: \"data sherid nada\"\n","member_type: KEYWORD\nkeyword: \"airbyteforeveryone\"\n","member_type: KEYWORD\nkeyword: \"Airbyte\"\n"],"custom_audience.resource_name":"customers/4651612872/customAudiences/523469909","custom_audience.status":"ENABLED","custom_audience.type":"AUTO"},"emitted_at":1676550195853} -{"stream":"ad_group_ad_report","data":{"ad_group_ad.ad.legacy_responsive_display_ad.accent_color":"","ad_group.id":137051662444,"customer.currency_code":"USD","customer.descriptive_name":"","customer.time_zone":"America/Los_Angeles","metrics.active_view_cpm":0.0,"metrics.active_view_ctr":0.0,"metrics.active_view_impressions":0,"metrics.active_view_measurability":0.0,"metrics.active_view_measurable_cost_micros":0,"metrics.active_view_measurable_impressions":0,"metrics.active_view_viewability":0.0,"ad_group_ad.ad_group":"customers/4651612872/adGroups/137051662444","ad_group.name":"Группа объявлений 1","ad_group.status":"ENABLED","segments.ad_network_type":"SEARCH","ad_group_ad.ad_strength":"POOR","ad_group_ad.ad.type":"RESPONSIVE_SEARCH_AD","metrics.all_conversions_from_interactions_rate":0.0,"metrics.all_conversions_value":0.0,"metrics.all_conversions":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.added_by_google_ads":false,"metrics.average_cost":0.0,"metrics.average_cpc":0.0,"metrics.average_cpe":0.0,"metrics.average_cpm":0.0,"metrics.average_cpv":0.0,"metrics.average_page_views":0.0,"metrics.average_time_on_site":0.0,"ad_group.base_ad_group":"customers/4651612872/adGroups/137051662444","campaign.base_campaign":"customers/4651612872/campaigns/16820250687","metrics.bounce_rate":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.business_name":"","ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text":"","campaign.id":16820250687,"campaign.name":"Website traffic-Search-15","campaign.status":"PAUSED","metrics.clicks":0,"ad_group_ad.policy_summary.approval_status":"APPROVED","metrics.conversions_from_interactions_rate":0.0,"metrics.conversions_value":0.0,"metrics.conversions":0.0,"metrics.cost_micros":0,"metrics.cost_per_all_conversions":0.0,"metrics.cost_per_conversion":0.0,"metrics.cost_per_current_model_attributed_conversion":0.0,"ad_group_ad.ad.final_mobile_urls":[],"ad_group_ad.ad.final_urls":["https://airbyte.com"],"ad_group_ad.ad.tracking_url_template":"","ad_group_ad.ad.url_custom_parameters":[],"metrics.cross_device_conversions":0.0,"metrics.ctr":0.0,"metrics.current_model_attributed_conversions_value":0.0,"metrics.current_model_attributed_conversions":0.0,"segments.date":"2022-04-08","segments.day_of_week":"FRIDAY","ad_group_ad.ad.expanded_text_ad.description":"","ad_group_ad.ad.text_ad.description1":"","ad_group_ad.ad.text_ad.description2":"","ad_group_ad.ad.device_preference":"UNSPECIFIED","ad_group_ad.ad.display_url":"","metrics.engagement_rate":0.0,"metrics.engagements":0,"ad_group_ad.ad.legacy_responsive_display_ad.logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.marketing_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image":"","ad_group_ad.ad.expanded_dynamic_search_ad.description":"","ad_group_ad.ad.expanded_text_ad.description2":"","ad_group_ad.ad.expanded_text_ad.headline_part3":"","customer.id":4651612872,"ad_group_ad.ad.legacy_responsive_display_ad.format_setting":"UNSPECIFIED","metrics.gmail_forwards":0,"metrics.gmail_saves":0,"metrics.gmail_secondary_clicks":0,"ad_group_ad.ad.text_ad.headline":"","ad_group_ad.ad.expanded_text_ad.headline_part1":"","ad_group_ad.ad.expanded_text_ad.headline_part2":"","ad_group_ad.ad.id":592078676857,"ad_group_ad.ad.image_ad.image_url":"","ad_group_ad.ad.image_ad.pixel_height":0,"ad_group_ad.ad.image_ad.pixel_width":0,"ad_group_ad.ad.image_ad.mime_type":"UNSPECIFIED","ad_group_ad.ad.image_ad.name":"","metrics.impressions":2,"metrics.interaction_rate":0.0,"metrics.interaction_event_types":[],"metrics.interactions":0,"ad_group_ad.ad.legacy_responsive_display_ad.long_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.main_color":"","segments.month":"2022-04-01","ad_group_ad.ad.responsive_display_ad.accent_color":"","ad_group_ad.ad.responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.responsive_display_ad.business_name":"","ad_group_ad.ad.responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.responsive_display_ad.descriptions":[],"ad_group_ad.ad.responsive_display_ad.price_prefix":"","ad_group_ad.ad.responsive_display_ad.promo_text":"","ad_group_ad.ad.responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.responsive_display_ad.headlines":[],"ad_group_ad.ad.responsive_display_ad.logo_images":[],"ad_group_ad.ad.responsive_display_ad.square_logo_images":[],"ad_group_ad.ad.responsive_display_ad.long_headline":"","ad_group_ad.ad.responsive_display_ad.main_color":"","ad_group_ad.ad.responsive_display_ad.marketing_images":[],"ad_group_ad.ad.responsive_display_ad.square_marketing_images":[],"ad_group_ad.ad.responsive_display_ad.youtube_videos":[],"ad_group_ad.ad.expanded_text_ad.path1":"","ad_group_ad.ad.expanded_text_ad.path2":"","metrics.percent_new_visitors":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.price_prefix":"","ad_group_ad.ad.legacy_responsive_display_ad.promo_text":"","segments.quarter":"2022-04-01","ad_group_ad.ad.responsive_search_ad.descriptions":["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.headlines":["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.path1":"","ad_group_ad.ad.responsive_search_ad.path2":"","ad_group_ad.ad.legacy_responsive_display_ad.short_headline":"","ad_group_ad.status":"REMOVED","ad_group_ad.ad.system_managed_resource_source":"UNSPECIFIED","metrics.top_impression_percentage":0.0,"ad_group_ad.ad.app_ad.descriptions":[],"ad_group_ad.ad.app_ad.headlines":[],"ad_group_ad.ad.app_ad.html5_media_bundles":[],"ad_group_ad.ad.app_ad.images":[],"ad_group_ad.ad.app_ad.mandatory_ad_text":"","ad_group_ad.ad.app_ad.youtube_videos":[],"metrics.value_per_all_conversions":0.0,"metrics.value_per_conversion":0.0,"metrics.value_per_current_model_attributed_conversion":0.0,"metrics.video_quartile_p100_rate":0.0,"metrics.video_quartile_p25_rate":0.0,"metrics.video_quartile_p50_rate":0.0,"metrics.video_quartile_p75_rate":0.0,"metrics.video_view_rate":0.0,"metrics.video_views":0,"metrics.view_through_conversions":0,"segments.week":"2022-04-04","segments.year":2022},"emitted_at":1679508005462} -{"stream":"ad_group_ad_report","data":{"ad_group_ad.ad.legacy_responsive_display_ad.accent_color":"","ad_group.id":137020701042,"customer.currency_code":"USD","customer.descriptive_name":"","customer.time_zone":"America/Los_Angeles","metrics.active_view_cpm":0.0,"metrics.active_view_ctr":0.0,"metrics.active_view_impressions":0,"metrics.active_view_measurability":0.0,"metrics.active_view_measurable_cost_micros":0,"metrics.active_view_measurable_impressions":0,"metrics.active_view_viewability":0.0,"ad_group_ad.ad_group":"customers/4651612872/adGroups/137020701042","ad_group.name":"Группа объявлений 2","ad_group.status":"ENABLED","segments.ad_network_type":"SEARCH","ad_group_ad.ad_strength":"POOR","ad_group_ad.ad.type":"RESPONSIVE_SEARCH_AD","metrics.all_conversions_from_interactions_rate":0.0,"metrics.all_conversions_value":0.0,"metrics.all_conversions":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.added_by_google_ads":false,"metrics.average_cost":70000.0,"metrics.average_cpc":70000.0,"metrics.average_cpe":0.0,"metrics.average_cpm":3181818.181818182,"metrics.average_cpv":0.0,"metrics.average_page_views":0.0,"metrics.average_time_on_site":0.0,"ad_group.base_ad_group":"customers/4651612872/adGroups/137020701042","campaign.base_campaign":"customers/4651612872/campaigns/16820250687","metrics.bounce_rate":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.business_name":"","ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text":"","campaign.id":16820250687,"campaign.name":"Website traffic-Search-15","campaign.status":"PAUSED","metrics.clicks":1,"ad_group_ad.policy_summary.approval_status":"APPROVED_LIMITED","metrics.conversions_from_interactions_rate":0.0,"metrics.conversions_value":0.0,"metrics.conversions":0.0,"metrics.cost_micros":70000,"metrics.cost_per_all_conversions":0.0,"metrics.cost_per_conversion":0.0,"metrics.cost_per_current_model_attributed_conversion":0.0,"ad_group_ad.ad.final_mobile_urls":[],"ad_group_ad.ad.final_urls":["https://airbyte.com"],"ad_group_ad.ad.tracking_url_template":"","ad_group_ad.ad.url_custom_parameters":[],"metrics.cross_device_conversions":0.0,"metrics.ctr":0.045454545454545456,"metrics.current_model_attributed_conversions_value":0.0,"metrics.current_model_attributed_conversions":0.0,"segments.date":"2022-04-09","segments.day_of_week":"SATURDAY","ad_group_ad.ad.expanded_text_ad.description":"","ad_group_ad.ad.text_ad.description1":"","ad_group_ad.ad.text_ad.description2":"","ad_group_ad.ad.device_preference":"UNSPECIFIED","ad_group_ad.ad.display_url":"","metrics.engagement_rate":0.0,"metrics.engagements":0,"ad_group_ad.ad.legacy_responsive_display_ad.logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.marketing_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image":"","ad_group_ad.ad.expanded_dynamic_search_ad.description":"","ad_group_ad.ad.expanded_text_ad.description2":"","ad_group_ad.ad.expanded_text_ad.headline_part3":"","customer.id":4651612872,"ad_group_ad.ad.legacy_responsive_display_ad.format_setting":"UNSPECIFIED","metrics.gmail_forwards":0,"metrics.gmail_saves":0,"metrics.gmail_secondary_clicks":0,"ad_group_ad.ad.text_ad.headline":"","ad_group_ad.ad.expanded_text_ad.headline_part1":"","ad_group_ad.ad.expanded_text_ad.headline_part2":"","ad_group_ad.ad.id":592078631218,"ad_group_ad.ad.image_ad.image_url":"","ad_group_ad.ad.image_ad.pixel_height":0,"ad_group_ad.ad.image_ad.pixel_width":0,"ad_group_ad.ad.image_ad.mime_type":"UNSPECIFIED","ad_group_ad.ad.image_ad.name":"","metrics.impressions":22,"metrics.interaction_rate":0.045454545454545456,"metrics.interaction_event_types":["InteractionEventType.CLICK"],"metrics.interactions":1,"ad_group_ad.ad.legacy_responsive_display_ad.long_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.main_color":"","segments.month":"2022-04-01","ad_group_ad.ad.responsive_display_ad.accent_color":"","ad_group_ad.ad.responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.responsive_display_ad.business_name":"","ad_group_ad.ad.responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.responsive_display_ad.descriptions":[],"ad_group_ad.ad.responsive_display_ad.price_prefix":"","ad_group_ad.ad.responsive_display_ad.promo_text":"","ad_group_ad.ad.responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.responsive_display_ad.headlines":[],"ad_group_ad.ad.responsive_display_ad.logo_images":[],"ad_group_ad.ad.responsive_display_ad.square_logo_images":[],"ad_group_ad.ad.responsive_display_ad.long_headline":"","ad_group_ad.ad.responsive_display_ad.main_color":"","ad_group_ad.ad.responsive_display_ad.marketing_images":[],"ad_group_ad.ad.responsive_display_ad.square_marketing_images":[],"ad_group_ad.ad.responsive_display_ad.youtube_videos":[],"ad_group_ad.ad.expanded_text_ad.path1":"","ad_group_ad.ad.expanded_text_ad.path2":"","metrics.percent_new_visitors":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.price_prefix":"","ad_group_ad.ad.legacy_responsive_display_ad.promo_text":"","segments.quarter":"2022-04-01","ad_group_ad.ad.responsive_search_ad.descriptions":["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n policy_topic_entries {\n topic: \"TRADEMARKS_IN_AD_TEXT\"\n type_: LIMITED\n evidences {\n text_list {\n texts: \"airbyte\"\n }\n }\n constraints {\n reseller_constraint {\n }\n }\n }\n review_status: REVIEWED\n approval_status: APPROVED_LIMITED\n}\n","text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Consolidate your data in your data warehouses, lakes and databases\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.headlines":["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.path1":"","ad_group_ad.ad.responsive_search_ad.path2":"","ad_group_ad.ad.legacy_responsive_display_ad.short_headline":"","ad_group_ad.status":"ENABLED","ad_group_ad.ad.system_managed_resource_source":"UNSPECIFIED","metrics.top_impression_percentage":0.7727272727272727,"ad_group_ad.ad.app_ad.descriptions":[],"ad_group_ad.ad.app_ad.headlines":[],"ad_group_ad.ad.app_ad.html5_media_bundles":[],"ad_group_ad.ad.app_ad.images":[],"ad_group_ad.ad.app_ad.mandatory_ad_text":"","ad_group_ad.ad.app_ad.youtube_videos":[],"metrics.value_per_all_conversions":0.0,"metrics.value_per_conversion":0.0,"metrics.value_per_current_model_attributed_conversion":0.0,"metrics.video_quartile_p100_rate":0.0,"metrics.video_quartile_p25_rate":0.0,"metrics.video_quartile_p50_rate":0.0,"metrics.video_quartile_p75_rate":0.0,"metrics.video_view_rate":0.0,"metrics.video_views":0,"metrics.view_through_conversions":0,"segments.week":"2022-04-04","segments.year":2022},"emitted_at":1679508005467} -{"stream":"ad_group_ad_report","data":{"ad_group_ad.ad.legacy_responsive_display_ad.accent_color":"","ad_group.id":137051662444,"customer.currency_code":"USD","customer.descriptive_name":"","customer.time_zone":"America/Los_Angeles","metrics.active_view_cpm":0.0,"metrics.active_view_ctr":0.0,"metrics.active_view_impressions":0,"metrics.active_view_measurability":0.0,"metrics.active_view_measurable_cost_micros":0,"metrics.active_view_measurable_impressions":0,"metrics.active_view_viewability":0.0,"ad_group_ad.ad_group":"customers/4651612872/adGroups/137051662444","ad_group.name":"Группа объявлений 1","ad_group.status":"ENABLED","segments.ad_network_type":"SEARCH","ad_group_ad.ad_strength":"POOR","ad_group_ad.ad.type":"RESPONSIVE_SEARCH_AD","metrics.all_conversions_from_interactions_rate":0.0,"metrics.all_conversions_value":0.0,"metrics.all_conversions":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.added_by_google_ads":false,"metrics.average_cost":0.0,"metrics.average_cpc":0.0,"metrics.average_cpe":0.0,"metrics.average_cpm":0.0,"metrics.average_cpv":0.0,"metrics.average_page_views":0.0,"metrics.average_time_on_site":0.0,"ad_group.base_ad_group":"customers/4651612872/adGroups/137051662444","campaign.base_campaign":"customers/4651612872/campaigns/16820250687","metrics.bounce_rate":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.business_name":"","ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text":"","campaign.id":16820250687,"campaign.name":"Website traffic-Search-15","campaign.status":"PAUSED","metrics.clicks":0,"ad_group_ad.policy_summary.approval_status":"APPROVED","metrics.conversions_from_interactions_rate":0.0,"metrics.conversions_value":0.0,"metrics.conversions":0.0,"metrics.cost_micros":0,"metrics.cost_per_all_conversions":0.0,"metrics.cost_per_conversion":0.0,"metrics.cost_per_current_model_attributed_conversion":0.0,"ad_group_ad.ad.final_mobile_urls":[],"ad_group_ad.ad.final_urls":["https://airbyte.com"],"ad_group_ad.ad.tracking_url_template":"","ad_group_ad.ad.url_custom_parameters":[],"metrics.cross_device_conversions":0.0,"metrics.ctr":0.0,"metrics.current_model_attributed_conversions_value":0.0,"metrics.current_model_attributed_conversions":0.0,"segments.date":"2022-04-09","segments.day_of_week":"SATURDAY","ad_group_ad.ad.expanded_text_ad.description":"","ad_group_ad.ad.text_ad.description1":"","ad_group_ad.ad.text_ad.description2":"","ad_group_ad.ad.device_preference":"UNSPECIFIED","ad_group_ad.ad.display_url":"","metrics.engagement_rate":0.0,"metrics.engagements":0,"ad_group_ad.ad.legacy_responsive_display_ad.logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.marketing_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image":"","ad_group_ad.ad.expanded_dynamic_search_ad.description":"","ad_group_ad.ad.expanded_text_ad.description2":"","ad_group_ad.ad.expanded_text_ad.headline_part3":"","customer.id":4651612872,"ad_group_ad.ad.legacy_responsive_display_ad.format_setting":"UNSPECIFIED","metrics.gmail_forwards":0,"metrics.gmail_saves":0,"metrics.gmail_secondary_clicks":0,"ad_group_ad.ad.text_ad.headline":"","ad_group_ad.ad.expanded_text_ad.headline_part1":"","ad_group_ad.ad.expanded_text_ad.headline_part2":"","ad_group_ad.ad.id":592078676857,"ad_group_ad.ad.image_ad.image_url":"","ad_group_ad.ad.image_ad.pixel_height":0,"ad_group_ad.ad.image_ad.pixel_width":0,"ad_group_ad.ad.image_ad.mime_type":"UNSPECIFIED","ad_group_ad.ad.image_ad.name":"","metrics.impressions":76,"metrics.interaction_rate":0.0,"metrics.interaction_event_types":[],"metrics.interactions":0,"ad_group_ad.ad.legacy_responsive_display_ad.long_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.main_color":"","segments.month":"2022-04-01","ad_group_ad.ad.responsive_display_ad.accent_color":"","ad_group_ad.ad.responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.responsive_display_ad.business_name":"","ad_group_ad.ad.responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.responsive_display_ad.descriptions":[],"ad_group_ad.ad.responsive_display_ad.price_prefix":"","ad_group_ad.ad.responsive_display_ad.promo_text":"","ad_group_ad.ad.responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.responsive_display_ad.headlines":[],"ad_group_ad.ad.responsive_display_ad.logo_images":[],"ad_group_ad.ad.responsive_display_ad.square_logo_images":[],"ad_group_ad.ad.responsive_display_ad.long_headline":"","ad_group_ad.ad.responsive_display_ad.main_color":"","ad_group_ad.ad.responsive_display_ad.marketing_images":[],"ad_group_ad.ad.responsive_display_ad.square_marketing_images":[],"ad_group_ad.ad.responsive_display_ad.youtube_videos":[],"ad_group_ad.ad.expanded_text_ad.path1":"","ad_group_ad.ad.expanded_text_ad.path2":"","metrics.percent_new_visitors":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.price_prefix":"","ad_group_ad.ad.legacy_responsive_display_ad.promo_text":"","segments.quarter":"2022-04-01","ad_group_ad.ad.responsive_search_ad.descriptions":["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.headlines":["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.path1":"","ad_group_ad.ad.responsive_search_ad.path2":"","ad_group_ad.ad.legacy_responsive_display_ad.short_headline":"","ad_group_ad.status":"REMOVED","ad_group_ad.ad.system_managed_resource_source":"UNSPECIFIED","metrics.top_impression_percentage":0.2894736842105263,"ad_group_ad.ad.app_ad.descriptions":[],"ad_group_ad.ad.app_ad.headlines":[],"ad_group_ad.ad.app_ad.html5_media_bundles":[],"ad_group_ad.ad.app_ad.images":[],"ad_group_ad.ad.app_ad.mandatory_ad_text":"","ad_group_ad.ad.app_ad.youtube_videos":[],"metrics.value_per_all_conversions":0.0,"metrics.value_per_conversion":0.0,"metrics.value_per_current_model_attributed_conversion":0.0,"metrics.video_quartile_p100_rate":0.0,"metrics.video_quartile_p25_rate":0.0,"metrics.video_quartile_p50_rate":0.0,"metrics.video_quartile_p75_rate":0.0,"metrics.video_view_rate":0.0,"metrics.video_views":0,"metrics.view_through_conversions":0,"segments.week":"2022-04-04","segments.year":2022},"emitted_at":1679508005471} -{"stream":"ad_group_ad_report","data":{"ad_group_ad.ad.legacy_responsive_display_ad.accent_color":"","ad_group.id":137020701042,"customer.currency_code":"USD","customer.descriptive_name":"","customer.time_zone":"America/Los_Angeles","metrics.active_view_cpm":0.0,"metrics.active_view_ctr":0.0,"metrics.active_view_impressions":0,"metrics.active_view_measurability":0.0,"metrics.active_view_measurable_cost_micros":0,"metrics.active_view_measurable_impressions":0,"metrics.active_view_viewability":0.0,"ad_group_ad.ad_group":"customers/4651612872/adGroups/137020701042","ad_group.name":"Группа объявлений 2","ad_group.status":"ENABLED","segments.ad_network_type":"SEARCH_PARTNERS","ad_group_ad.ad_strength":"POOR","ad_group_ad.ad.type":"RESPONSIVE_SEARCH_AD","metrics.all_conversions_from_interactions_rate":0.0,"metrics.all_conversions_value":0.0,"metrics.all_conversions":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.added_by_google_ads":false,"metrics.average_cost":0.0,"metrics.average_cpc":0.0,"metrics.average_cpe":0.0,"metrics.average_cpm":0.0,"metrics.average_cpv":0.0,"metrics.average_page_views":0.0,"metrics.average_time_on_site":0.0,"ad_group.base_ad_group":"customers/4651612872/adGroups/137020701042","campaign.base_campaign":"customers/4651612872/campaigns/16820250687","metrics.bounce_rate":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.business_name":"","ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text":"","campaign.id":16820250687,"campaign.name":"Website traffic-Search-15","campaign.status":"PAUSED","metrics.clicks":0,"ad_group_ad.policy_summary.approval_status":"APPROVED_LIMITED","metrics.conversions_from_interactions_rate":0.0,"metrics.conversions_value":0.0,"metrics.conversions":0.0,"metrics.cost_micros":0,"metrics.cost_per_all_conversions":0.0,"metrics.cost_per_conversion":0.0,"metrics.cost_per_current_model_attributed_conversion":0.0,"ad_group_ad.ad.final_mobile_urls":[],"ad_group_ad.ad.final_urls":["https://airbyte.com"],"ad_group_ad.ad.tracking_url_template":"","ad_group_ad.ad.url_custom_parameters":[],"metrics.cross_device_conversions":0.0,"metrics.ctr":0.0,"metrics.current_model_attributed_conversions_value":0.0,"metrics.current_model_attributed_conversions":0.0,"segments.date":"2022-04-09","segments.day_of_week":"SATURDAY","ad_group_ad.ad.expanded_text_ad.description":"","ad_group_ad.ad.text_ad.description1":"","ad_group_ad.ad.text_ad.description2":"","ad_group_ad.ad.device_preference":"UNSPECIFIED","ad_group_ad.ad.display_url":"","metrics.engagement_rate":0.0,"metrics.engagements":0,"ad_group_ad.ad.legacy_responsive_display_ad.logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.marketing_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image":"","ad_group_ad.ad.expanded_dynamic_search_ad.description":"","ad_group_ad.ad.expanded_text_ad.description2":"","ad_group_ad.ad.expanded_text_ad.headline_part3":"","customer.id":4651612872,"ad_group_ad.ad.legacy_responsive_display_ad.format_setting":"UNSPECIFIED","metrics.gmail_forwards":0,"metrics.gmail_saves":0,"metrics.gmail_secondary_clicks":0,"ad_group_ad.ad.text_ad.headline":"","ad_group_ad.ad.expanded_text_ad.headline_part1":"","ad_group_ad.ad.expanded_text_ad.headline_part2":"","ad_group_ad.ad.id":592078631218,"ad_group_ad.ad.image_ad.image_url":"","ad_group_ad.ad.image_ad.pixel_height":0,"ad_group_ad.ad.image_ad.pixel_width":0,"ad_group_ad.ad.image_ad.mime_type":"UNSPECIFIED","ad_group_ad.ad.image_ad.name":"","metrics.impressions":16,"metrics.interaction_rate":0.0,"metrics.interaction_event_types":[],"metrics.interactions":0,"ad_group_ad.ad.legacy_responsive_display_ad.long_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.main_color":"","segments.month":"2022-04-01","ad_group_ad.ad.responsive_display_ad.accent_color":"","ad_group_ad.ad.responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.responsive_display_ad.business_name":"","ad_group_ad.ad.responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.responsive_display_ad.descriptions":[],"ad_group_ad.ad.responsive_display_ad.price_prefix":"","ad_group_ad.ad.responsive_display_ad.promo_text":"","ad_group_ad.ad.responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.responsive_display_ad.headlines":[],"ad_group_ad.ad.responsive_display_ad.logo_images":[],"ad_group_ad.ad.responsive_display_ad.square_logo_images":[],"ad_group_ad.ad.responsive_display_ad.long_headline":"","ad_group_ad.ad.responsive_display_ad.main_color":"","ad_group_ad.ad.responsive_display_ad.marketing_images":[],"ad_group_ad.ad.responsive_display_ad.square_marketing_images":[],"ad_group_ad.ad.responsive_display_ad.youtube_videos":[],"ad_group_ad.ad.expanded_text_ad.path1":"","ad_group_ad.ad.expanded_text_ad.path2":"","metrics.percent_new_visitors":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.price_prefix":"","ad_group_ad.ad.legacy_responsive_display_ad.promo_text":"","segments.quarter":"2022-04-01","ad_group_ad.ad.responsive_search_ad.descriptions":["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n policy_topic_entries {\n topic: \"TRADEMARKS_IN_AD_TEXT\"\n type_: LIMITED\n evidences {\n text_list {\n texts: \"airbyte\"\n }\n }\n constraints {\n reseller_constraint {\n }\n }\n }\n review_status: REVIEWED\n approval_status: APPROVED_LIMITED\n}\n","text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Consolidate your data in your data warehouses, lakes and databases\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.headlines":["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.path1":"","ad_group_ad.ad.responsive_search_ad.path2":"","ad_group_ad.ad.legacy_responsive_display_ad.short_headline":"","ad_group_ad.status":"ENABLED","ad_group_ad.ad.system_managed_resource_source":"UNSPECIFIED","metrics.top_impression_percentage":0.0,"ad_group_ad.ad.app_ad.descriptions":[],"ad_group_ad.ad.app_ad.headlines":[],"ad_group_ad.ad.app_ad.html5_media_bundles":[],"ad_group_ad.ad.app_ad.images":[],"ad_group_ad.ad.app_ad.mandatory_ad_text":"","ad_group_ad.ad.app_ad.youtube_videos":[],"metrics.value_per_all_conversions":0.0,"metrics.value_per_conversion":0.0,"metrics.value_per_current_model_attributed_conversion":0.0,"metrics.video_quartile_p100_rate":0.0,"metrics.video_quartile_p25_rate":0.0,"metrics.video_quartile_p50_rate":0.0,"metrics.video_quartile_p75_rate":0.0,"metrics.video_view_rate":0.0,"metrics.video_views":0,"metrics.view_through_conversions":0,"segments.week":"2022-04-04","segments.year":2022},"emitted_at":1679508005476} -{"stream":"ad_group_ad_report","data":{"ad_group_ad.ad.legacy_responsive_display_ad.accent_color":"","ad_group.id":137051662444,"customer.currency_code":"USD","customer.descriptive_name":"","customer.time_zone":"America/Los_Angeles","metrics.active_view_cpm":0.0,"metrics.active_view_ctr":0.0,"metrics.active_view_impressions":0,"metrics.active_view_measurability":0.0,"metrics.active_view_measurable_cost_micros":0,"metrics.active_view_measurable_impressions":0,"metrics.active_view_viewability":0.0,"ad_group_ad.ad_group":"customers/4651612872/adGroups/137051662444","ad_group.name":"Группа объявлений 1","ad_group.status":"ENABLED","segments.ad_network_type":"SEARCH_PARTNERS","ad_group_ad.ad_strength":"POOR","ad_group_ad.ad.type":"RESPONSIVE_SEARCH_AD","metrics.all_conversions_from_interactions_rate":0.0,"metrics.all_conversions_value":0.0,"metrics.all_conversions":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.added_by_google_ads":false,"metrics.average_cost":0.0,"metrics.average_cpc":0.0,"metrics.average_cpe":0.0,"metrics.average_cpm":0.0,"metrics.average_cpv":0.0,"metrics.average_page_views":0.0,"metrics.average_time_on_site":0.0,"ad_group.base_ad_group":"customers/4651612872/adGroups/137051662444","campaign.base_campaign":"customers/4651612872/campaigns/16820250687","metrics.bounce_rate":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.business_name":"","ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text":"","campaign.id":16820250687,"campaign.name":"Website traffic-Search-15","campaign.status":"PAUSED","metrics.clicks":0,"ad_group_ad.policy_summary.approval_status":"APPROVED","metrics.conversions_from_interactions_rate":0.0,"metrics.conversions_value":0.0,"metrics.conversions":0.0,"metrics.cost_micros":0,"metrics.cost_per_all_conversions":0.0,"metrics.cost_per_conversion":0.0,"metrics.cost_per_current_model_attributed_conversion":0.0,"ad_group_ad.ad.final_mobile_urls":[],"ad_group_ad.ad.final_urls":["https://airbyte.com"],"ad_group_ad.ad.tracking_url_template":"","ad_group_ad.ad.url_custom_parameters":[],"metrics.cross_device_conversions":0.0,"metrics.ctr":0.0,"metrics.current_model_attributed_conversions_value":0.0,"metrics.current_model_attributed_conversions":0.0,"segments.date":"2022-04-09","segments.day_of_week":"SATURDAY","ad_group_ad.ad.expanded_text_ad.description":"","ad_group_ad.ad.text_ad.description1":"","ad_group_ad.ad.text_ad.description2":"","ad_group_ad.ad.device_preference":"UNSPECIFIED","ad_group_ad.ad.display_url":"","metrics.engagement_rate":0.0,"metrics.engagements":0,"ad_group_ad.ad.legacy_responsive_display_ad.logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.marketing_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image":"","ad_group_ad.ad.expanded_dynamic_search_ad.description":"","ad_group_ad.ad.expanded_text_ad.description2":"","ad_group_ad.ad.expanded_text_ad.headline_part3":"","customer.id":4651612872,"ad_group_ad.ad.legacy_responsive_display_ad.format_setting":"UNSPECIFIED","metrics.gmail_forwards":0,"metrics.gmail_saves":0,"metrics.gmail_secondary_clicks":0,"ad_group_ad.ad.text_ad.headline":"","ad_group_ad.ad.expanded_text_ad.headline_part1":"","ad_group_ad.ad.expanded_text_ad.headline_part2":"","ad_group_ad.ad.id":592078676857,"ad_group_ad.ad.image_ad.image_url":"","ad_group_ad.ad.image_ad.pixel_height":0,"ad_group_ad.ad.image_ad.pixel_width":0,"ad_group_ad.ad.image_ad.mime_type":"UNSPECIFIED","ad_group_ad.ad.image_ad.name":"","metrics.impressions":28,"metrics.interaction_rate":0.0,"metrics.interaction_event_types":[],"metrics.interactions":0,"ad_group_ad.ad.legacy_responsive_display_ad.long_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.main_color":"","segments.month":"2022-04-01","ad_group_ad.ad.responsive_display_ad.accent_color":"","ad_group_ad.ad.responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.responsive_display_ad.business_name":"","ad_group_ad.ad.responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.responsive_display_ad.descriptions":[],"ad_group_ad.ad.responsive_display_ad.price_prefix":"","ad_group_ad.ad.responsive_display_ad.promo_text":"","ad_group_ad.ad.responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.responsive_display_ad.headlines":[],"ad_group_ad.ad.responsive_display_ad.logo_images":[],"ad_group_ad.ad.responsive_display_ad.square_logo_images":[],"ad_group_ad.ad.responsive_display_ad.long_headline":"","ad_group_ad.ad.responsive_display_ad.main_color":"","ad_group_ad.ad.responsive_display_ad.marketing_images":[],"ad_group_ad.ad.responsive_display_ad.square_marketing_images":[],"ad_group_ad.ad.responsive_display_ad.youtube_videos":[],"ad_group_ad.ad.expanded_text_ad.path1":"","ad_group_ad.ad.expanded_text_ad.path2":"","metrics.percent_new_visitors":0.0,"ad_group_ad.ad.legacy_responsive_display_ad.price_prefix":"","ad_group_ad.ad.legacy_responsive_display_ad.promo_text":"","segments.quarter":"2022-04-01","ad_group_ad.ad.responsive_search_ad.descriptions":["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.headlines":["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.path1":"","ad_group_ad.ad.responsive_search_ad.path2":"","ad_group_ad.ad.legacy_responsive_display_ad.short_headline":"","ad_group_ad.status":"REMOVED","ad_group_ad.ad.system_managed_resource_source":"UNSPECIFIED","metrics.top_impression_percentage":0.0,"ad_group_ad.ad.app_ad.descriptions":[],"ad_group_ad.ad.app_ad.headlines":[],"ad_group_ad.ad.app_ad.html5_media_bundles":[],"ad_group_ad.ad.app_ad.images":[],"ad_group_ad.ad.app_ad.mandatory_ad_text":"","ad_group_ad.ad.app_ad.youtube_videos":[],"metrics.value_per_all_conversions":0.0,"metrics.value_per_conversion":0.0,"metrics.value_per_current_model_attributed_conversion":0.0,"metrics.video_quartile_p100_rate":0.0,"metrics.video_quartile_p25_rate":0.0,"metrics.video_quartile_p50_rate":0.0,"metrics.video_quartile_p75_rate":0.0,"metrics.video_view_rate":0.0,"metrics.video_views":0,"metrics.view_through_conversions":0,"segments.week":"2022-04-04","segments.year":2022},"emitted_at":1679508005481} -{"stream":"ad_group_ads","data":{"ad_group_ad.ad.added_by_google_ads":false,"ad_group_ad.ad.app_ad.descriptions":[],"ad_group_ad.ad.app_ad.headlines":[],"ad_group_ad.ad.app_ad.html5_media_bundles":[],"ad_group_ad.ad.app_ad.images":[],"ad_group_ad.ad.app_ad.mandatory_ad_text":"","ad_group_ad.ad.app_ad.youtube_videos":[],"ad_group_ad.ad.app_engagement_ad.descriptions":[],"ad_group_ad.ad.app_engagement_ad.headlines":[],"ad_group_ad.ad.app_engagement_ad.images":[],"ad_group_ad.ad.app_engagement_ad.videos":[],"ad_group_ad.ad.call_ad.business_name":"","ad_group_ad.ad.call_ad.call_tracked":false,"ad_group_ad.ad.call_ad.conversion_action":"","ad_group_ad.ad.call_ad.conversion_reporting_state":"UNSPECIFIED","ad_group_ad.ad.call_ad.country_code":"","ad_group_ad.ad.call_ad.description1":"","ad_group_ad.ad.call_ad.description2":"","ad_group_ad.ad.call_ad.disable_call_conversion":false,"ad_group_ad.ad.call_ad.headline1":"","ad_group_ad.ad.call_ad.headline2":"","ad_group_ad.ad.call_ad.path1":"","ad_group_ad.ad.call_ad.path2":"","ad_group_ad.ad.call_ad.phone_number":"","ad_group_ad.ad.call_ad.phone_number_verification_url":"","ad_group_ad.ad.device_preference":"UNSPECIFIED","ad_group_ad.ad.display_upload_ad.display_upload_product_type":"UNSPECIFIED","ad_group_ad.ad.display_upload_ad.media_bundle":"","ad_group_ad.ad.display_url":"","ad_group_ad.ad.expanded_dynamic_search_ad.description":"","ad_group_ad.ad.expanded_dynamic_search_ad.description2":"","ad_group_ad.ad.expanded_text_ad.description":"","ad_group_ad.ad.expanded_text_ad.description2":"","ad_group_ad.ad.expanded_text_ad.headline_part1":"","ad_group_ad.ad.expanded_text_ad.headline_part2":"","ad_group_ad.ad.expanded_text_ad.headline_part3":"","ad_group_ad.ad.expanded_text_ad.path1":"","ad_group_ad.ad.expanded_text_ad.path2":"","ad_group_ad.ad.final_app_urls":[],"ad_group_ad.ad.final_mobile_urls":[],"ad_group_ad.ad.final_url_suffix":"","ad_group_ad.ad.final_urls":["https://airbyte.com"],"ad_group_ad.ad.hotel_ad":"","ad_group_ad.ad.id":592078676857,"ad_group_ad.ad.image_ad.image_url":"","ad_group_ad.ad.image_ad.mime_type":"UNSPECIFIED","ad_group_ad.ad.image_ad.name":"","ad_group_ad.ad.image_ad.pixel_height":0,"ad_group_ad.ad.image_ad.pixel_width":0,"ad_group_ad.ad.image_ad.preview_image_url":"","ad_group_ad.ad.image_ad.preview_pixel_height":0,"ad_group_ad.ad.image_ad.preview_pixel_width":0,"ad_group_ad.ad.legacy_app_install_ad":"","ad_group_ad.ad.legacy_responsive_display_ad.accent_color":"","ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.legacy_responsive_display_ad.business_name":"","ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.legacy_responsive_display_ad.description":"","ad_group_ad.ad.legacy_responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.legacy_responsive_display_ad.logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.long_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.main_color":"","ad_group_ad.ad.legacy_responsive_display_ad.marketing_image":"","ad_group_ad.ad.legacy_responsive_display_ad.price_prefix":"","ad_group_ad.ad.legacy_responsive_display_ad.promo_text":"","ad_group_ad.ad.legacy_responsive_display_ad.short_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image":"","ad_group_ad.ad.local_ad.call_to_actions":[],"ad_group_ad.ad.local_ad.descriptions":[],"ad_group_ad.ad.local_ad.headlines":[],"ad_group_ad.ad.local_ad.logo_images":[],"ad_group_ad.ad.local_ad.marketing_images":[],"ad_group_ad.ad.local_ad.path1":"","ad_group_ad.ad.local_ad.path2":"","ad_group_ad.ad.local_ad.videos":[],"ad_group_ad.ad.name":"","ad_group_ad.ad.resource_name":"customers/4651612872/ads/592078676857","ad_group_ad.ad.responsive_display_ad.accent_color":"","ad_group_ad.ad.responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.responsive_display_ad.business_name":"","ad_group_ad.ad.responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.responsive_display_ad.control_spec.enable_asset_enhancements":false,"ad_group_ad.ad.responsive_display_ad.control_spec.enable_autogen_video":false,"ad_group_ad.ad.responsive_display_ad.descriptions":[],"ad_group_ad.ad.responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.responsive_display_ad.headlines":[],"ad_group_ad.ad.responsive_display_ad.logo_images":[],"ad_group_ad.ad.responsive_display_ad.long_headline":"","ad_group_ad.ad.responsive_display_ad.main_color":"","ad_group_ad.ad.responsive_display_ad.marketing_images":[],"ad_group_ad.ad.responsive_display_ad.price_prefix":"","ad_group_ad.ad.responsive_display_ad.promo_text":"","ad_group_ad.ad.responsive_display_ad.square_logo_images":[],"ad_group_ad.ad.responsive_display_ad.square_marketing_images":[],"ad_group_ad.ad.responsive_display_ad.youtube_videos":[],"ad_group_ad.ad.responsive_search_ad.descriptions":["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.headlines":["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.path1":"","ad_group_ad.ad.responsive_search_ad.path2":"","ad_group_ad.ad.shopping_comparison_listing_ad.headline":"","ad_group_ad.ad.shopping_product_ad":"","ad_group_ad.ad.shopping_smart_ad":"","ad_group_ad.ad.smart_campaign_ad.descriptions":[],"ad_group_ad.ad.smart_campaign_ad.headlines":[],"ad_group_ad.ad.system_managed_resource_source":"UNSPECIFIED","ad_group_ad.ad.text_ad.description1":"","ad_group_ad.ad.text_ad.description2":"","ad_group_ad.ad.text_ad.headline":"","ad_group_ad.ad.tracking_url_template":"","ad_group_ad.ad.type":"RESPONSIVE_SEARCH_AD","ad_group_ad.ad.url_collections":[],"ad_group_ad.ad.url_custom_parameters":[],"ad_group_ad.ad.video_ad.in_feed.description1":"","ad_group_ad.ad.video_ad.in_feed.description2":"","ad_group_ad.ad.video_ad.in_feed.headline":"","ad_group_ad.ad.video_ad.in_stream.action_button_label":"","ad_group_ad.ad.video_ad.in_stream.action_headline":"","ad_group_ad.ad.video_ad.out_stream.description":"","ad_group_ad.ad.video_ad.out_stream.headline":"","ad_group_ad.ad.video_responsive_ad.call_to_actions":[],"ad_group_ad.ad.video_responsive_ad.companion_banners":[],"ad_group_ad.ad.video_responsive_ad.descriptions":[],"ad_group_ad.ad.video_responsive_ad.headlines":[],"ad_group_ad.ad.video_responsive_ad.long_headlines":[],"ad_group_ad.ad.video_responsive_ad.videos":[],"ad_group_ad.ad_group":"customers/4651612872/adGroups/137051662444","ad_group_ad.ad_strength":"POOR","ad_group_ad.labels":[],"ad_group_ad.policy_summary.approval_status":"APPROVED","ad_group_ad.policy_summary.policy_topic_entries":[],"ad_group_ad.policy_summary.review_status":"REVIEWED","ad_group_ad.resource_name":"customers/4651612872/adGroupAds/137051662444~592078676857","ad_group_ad.status":"REMOVED","segments.date":"2022-04-08"},"emitted_at":1679577401999} -{"stream":"ad_group_ads","data":{"ad_group_ad.ad.added_by_google_ads":false,"ad_group_ad.ad.app_ad.descriptions":[],"ad_group_ad.ad.app_ad.headlines":[],"ad_group_ad.ad.app_ad.html5_media_bundles":[],"ad_group_ad.ad.app_ad.images":[],"ad_group_ad.ad.app_ad.mandatory_ad_text":"","ad_group_ad.ad.app_ad.youtube_videos":[],"ad_group_ad.ad.app_engagement_ad.descriptions":[],"ad_group_ad.ad.app_engagement_ad.headlines":[],"ad_group_ad.ad.app_engagement_ad.images":[],"ad_group_ad.ad.app_engagement_ad.videos":[],"ad_group_ad.ad.call_ad.business_name":"","ad_group_ad.ad.call_ad.call_tracked":false,"ad_group_ad.ad.call_ad.conversion_action":"","ad_group_ad.ad.call_ad.conversion_reporting_state":"UNSPECIFIED","ad_group_ad.ad.call_ad.country_code":"","ad_group_ad.ad.call_ad.description1":"","ad_group_ad.ad.call_ad.description2":"","ad_group_ad.ad.call_ad.disable_call_conversion":false,"ad_group_ad.ad.call_ad.headline1":"","ad_group_ad.ad.call_ad.headline2":"","ad_group_ad.ad.call_ad.path1":"","ad_group_ad.ad.call_ad.path2":"","ad_group_ad.ad.call_ad.phone_number":"","ad_group_ad.ad.call_ad.phone_number_verification_url":"","ad_group_ad.ad.device_preference":"UNSPECIFIED","ad_group_ad.ad.display_upload_ad.display_upload_product_type":"UNSPECIFIED","ad_group_ad.ad.display_upload_ad.media_bundle":"","ad_group_ad.ad.display_url":"","ad_group_ad.ad.expanded_dynamic_search_ad.description":"","ad_group_ad.ad.expanded_dynamic_search_ad.description2":"","ad_group_ad.ad.expanded_text_ad.description":"","ad_group_ad.ad.expanded_text_ad.description2":"","ad_group_ad.ad.expanded_text_ad.headline_part1":"","ad_group_ad.ad.expanded_text_ad.headline_part2":"","ad_group_ad.ad.expanded_text_ad.headline_part3":"","ad_group_ad.ad.expanded_text_ad.path1":"","ad_group_ad.ad.expanded_text_ad.path2":"","ad_group_ad.ad.final_app_urls":[],"ad_group_ad.ad.final_mobile_urls":[],"ad_group_ad.ad.final_url_suffix":"","ad_group_ad.ad.final_urls":["https://airbyte.com"],"ad_group_ad.ad.hotel_ad":"","ad_group_ad.ad.id":592078631218,"ad_group_ad.ad.image_ad.image_url":"","ad_group_ad.ad.image_ad.mime_type":"UNSPECIFIED","ad_group_ad.ad.image_ad.name":"","ad_group_ad.ad.image_ad.pixel_height":0,"ad_group_ad.ad.image_ad.pixel_width":0,"ad_group_ad.ad.image_ad.preview_image_url":"","ad_group_ad.ad.image_ad.preview_pixel_height":0,"ad_group_ad.ad.image_ad.preview_pixel_width":0,"ad_group_ad.ad.legacy_app_install_ad":"","ad_group_ad.ad.legacy_responsive_display_ad.accent_color":"","ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.legacy_responsive_display_ad.business_name":"","ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.legacy_responsive_display_ad.description":"","ad_group_ad.ad.legacy_responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.legacy_responsive_display_ad.logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.long_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.main_color":"","ad_group_ad.ad.legacy_responsive_display_ad.marketing_image":"","ad_group_ad.ad.legacy_responsive_display_ad.price_prefix":"","ad_group_ad.ad.legacy_responsive_display_ad.promo_text":"","ad_group_ad.ad.legacy_responsive_display_ad.short_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image":"","ad_group_ad.ad.local_ad.call_to_actions":[],"ad_group_ad.ad.local_ad.descriptions":[],"ad_group_ad.ad.local_ad.headlines":[],"ad_group_ad.ad.local_ad.logo_images":[],"ad_group_ad.ad.local_ad.marketing_images":[],"ad_group_ad.ad.local_ad.path1":"","ad_group_ad.ad.local_ad.path2":"","ad_group_ad.ad.local_ad.videos":[],"ad_group_ad.ad.name":"","ad_group_ad.ad.resource_name":"customers/4651612872/ads/592078631218","ad_group_ad.ad.responsive_display_ad.accent_color":"","ad_group_ad.ad.responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.responsive_display_ad.business_name":"","ad_group_ad.ad.responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.responsive_display_ad.control_spec.enable_asset_enhancements":false,"ad_group_ad.ad.responsive_display_ad.control_spec.enable_autogen_video":false,"ad_group_ad.ad.responsive_display_ad.descriptions":[],"ad_group_ad.ad.responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.responsive_display_ad.headlines":[],"ad_group_ad.ad.responsive_display_ad.logo_images":[],"ad_group_ad.ad.responsive_display_ad.long_headline":"","ad_group_ad.ad.responsive_display_ad.main_color":"","ad_group_ad.ad.responsive_display_ad.marketing_images":[],"ad_group_ad.ad.responsive_display_ad.price_prefix":"","ad_group_ad.ad.responsive_display_ad.promo_text":"","ad_group_ad.ad.responsive_display_ad.square_logo_images":[],"ad_group_ad.ad.responsive_display_ad.square_marketing_images":[],"ad_group_ad.ad.responsive_display_ad.youtube_videos":[],"ad_group_ad.ad.responsive_search_ad.descriptions":["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n policy_topic_entries {\n topic: \"TRADEMARKS_IN_AD_TEXT\"\n type_: LIMITED\n evidences {\n text_list {\n texts: \"airbyte\"\n }\n }\n constraints {\n reseller_constraint {\n }\n }\n }\n review_status: REVIEWED\n approval_status: APPROVED_LIMITED\n}\n","text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Consolidate your data in your data warehouses, lakes and databases\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.headlines":["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.path1":"","ad_group_ad.ad.responsive_search_ad.path2":"","ad_group_ad.ad.shopping_comparison_listing_ad.headline":"","ad_group_ad.ad.shopping_product_ad":"","ad_group_ad.ad.shopping_smart_ad":"","ad_group_ad.ad.smart_campaign_ad.descriptions":[],"ad_group_ad.ad.smart_campaign_ad.headlines":[],"ad_group_ad.ad.system_managed_resource_source":"UNSPECIFIED","ad_group_ad.ad.text_ad.description1":"","ad_group_ad.ad.text_ad.description2":"","ad_group_ad.ad.text_ad.headline":"","ad_group_ad.ad.tracking_url_template":"","ad_group_ad.ad.type":"RESPONSIVE_SEARCH_AD","ad_group_ad.ad.url_collections":[],"ad_group_ad.ad.url_custom_parameters":[],"ad_group_ad.ad.video_ad.in_feed.description1":"","ad_group_ad.ad.video_ad.in_feed.description2":"","ad_group_ad.ad.video_ad.in_feed.headline":"","ad_group_ad.ad.video_ad.in_stream.action_button_label":"","ad_group_ad.ad.video_ad.in_stream.action_headline":"","ad_group_ad.ad.video_ad.out_stream.description":"","ad_group_ad.ad.video_ad.out_stream.headline":"","ad_group_ad.ad.video_responsive_ad.call_to_actions":[],"ad_group_ad.ad.video_responsive_ad.companion_banners":[],"ad_group_ad.ad.video_responsive_ad.descriptions":[],"ad_group_ad.ad.video_responsive_ad.headlines":[],"ad_group_ad.ad.video_responsive_ad.long_headlines":[],"ad_group_ad.ad.video_responsive_ad.videos":[],"ad_group_ad.ad_group":"customers/4651612872/adGroups/137020701042","ad_group_ad.ad_strength":"POOR","ad_group_ad.labels":[],"ad_group_ad.policy_summary.approval_status":"APPROVED_LIMITED","ad_group_ad.policy_summary.policy_topic_entries":["topic: \"TRADEMARKS_IN_AD_TEXT\"\ntype_: LIMITED\nevidences {\n text_list {\n texts: \"airbyte\"\n }\n}\nconstraints {\n reseller_constraint {\n }\n}\n"],"ad_group_ad.policy_summary.review_status":"REVIEWED","ad_group_ad.resource_name":"customers/4651612872/adGroupAds/137020701042~592078631218","ad_group_ad.status":"ENABLED","segments.date":"2022-04-09"},"emitted_at":1679577402006} -{"stream":"ad_group_ads","data":{"ad_group_ad.ad.added_by_google_ads":false,"ad_group_ad.ad.app_ad.descriptions":[],"ad_group_ad.ad.app_ad.headlines":[],"ad_group_ad.ad.app_ad.html5_media_bundles":[],"ad_group_ad.ad.app_ad.images":[],"ad_group_ad.ad.app_ad.mandatory_ad_text":"","ad_group_ad.ad.app_ad.youtube_videos":[],"ad_group_ad.ad.app_engagement_ad.descriptions":[],"ad_group_ad.ad.app_engagement_ad.headlines":[],"ad_group_ad.ad.app_engagement_ad.images":[],"ad_group_ad.ad.app_engagement_ad.videos":[],"ad_group_ad.ad.call_ad.business_name":"","ad_group_ad.ad.call_ad.call_tracked":false,"ad_group_ad.ad.call_ad.conversion_action":"","ad_group_ad.ad.call_ad.conversion_reporting_state":"UNSPECIFIED","ad_group_ad.ad.call_ad.country_code":"","ad_group_ad.ad.call_ad.description1":"","ad_group_ad.ad.call_ad.description2":"","ad_group_ad.ad.call_ad.disable_call_conversion":false,"ad_group_ad.ad.call_ad.headline1":"","ad_group_ad.ad.call_ad.headline2":"","ad_group_ad.ad.call_ad.path1":"","ad_group_ad.ad.call_ad.path2":"","ad_group_ad.ad.call_ad.phone_number":"","ad_group_ad.ad.call_ad.phone_number_verification_url":"","ad_group_ad.ad.device_preference":"UNSPECIFIED","ad_group_ad.ad.display_upload_ad.display_upload_product_type":"UNSPECIFIED","ad_group_ad.ad.display_upload_ad.media_bundle":"","ad_group_ad.ad.display_url":"","ad_group_ad.ad.expanded_dynamic_search_ad.description":"","ad_group_ad.ad.expanded_dynamic_search_ad.description2":"","ad_group_ad.ad.expanded_text_ad.description":"","ad_group_ad.ad.expanded_text_ad.description2":"","ad_group_ad.ad.expanded_text_ad.headline_part1":"","ad_group_ad.ad.expanded_text_ad.headline_part2":"","ad_group_ad.ad.expanded_text_ad.headline_part3":"","ad_group_ad.ad.expanded_text_ad.path1":"","ad_group_ad.ad.expanded_text_ad.path2":"","ad_group_ad.ad.final_app_urls":[],"ad_group_ad.ad.final_mobile_urls":[],"ad_group_ad.ad.final_url_suffix":"","ad_group_ad.ad.final_urls":["https://airbyte.com"],"ad_group_ad.ad.hotel_ad":"","ad_group_ad.ad.id":592078676857,"ad_group_ad.ad.image_ad.image_url":"","ad_group_ad.ad.image_ad.mime_type":"UNSPECIFIED","ad_group_ad.ad.image_ad.name":"","ad_group_ad.ad.image_ad.pixel_height":0,"ad_group_ad.ad.image_ad.pixel_width":0,"ad_group_ad.ad.image_ad.preview_image_url":"","ad_group_ad.ad.image_ad.preview_pixel_height":0,"ad_group_ad.ad.image_ad.preview_pixel_width":0,"ad_group_ad.ad.legacy_app_install_ad":"","ad_group_ad.ad.legacy_responsive_display_ad.accent_color":"","ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.legacy_responsive_display_ad.business_name":"","ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.legacy_responsive_display_ad.description":"","ad_group_ad.ad.legacy_responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.legacy_responsive_display_ad.logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.long_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.main_color":"","ad_group_ad.ad.legacy_responsive_display_ad.marketing_image":"","ad_group_ad.ad.legacy_responsive_display_ad.price_prefix":"","ad_group_ad.ad.legacy_responsive_display_ad.promo_text":"","ad_group_ad.ad.legacy_responsive_display_ad.short_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image":"","ad_group_ad.ad.local_ad.call_to_actions":[],"ad_group_ad.ad.local_ad.descriptions":[],"ad_group_ad.ad.local_ad.headlines":[],"ad_group_ad.ad.local_ad.logo_images":[],"ad_group_ad.ad.local_ad.marketing_images":[],"ad_group_ad.ad.local_ad.path1":"","ad_group_ad.ad.local_ad.path2":"","ad_group_ad.ad.local_ad.videos":[],"ad_group_ad.ad.name":"","ad_group_ad.ad.resource_name":"customers/4651612872/ads/592078676857","ad_group_ad.ad.responsive_display_ad.accent_color":"","ad_group_ad.ad.responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.responsive_display_ad.business_name":"","ad_group_ad.ad.responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.responsive_display_ad.control_spec.enable_asset_enhancements":false,"ad_group_ad.ad.responsive_display_ad.control_spec.enable_autogen_video":false,"ad_group_ad.ad.responsive_display_ad.descriptions":[],"ad_group_ad.ad.responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.responsive_display_ad.headlines":[],"ad_group_ad.ad.responsive_display_ad.logo_images":[],"ad_group_ad.ad.responsive_display_ad.long_headline":"","ad_group_ad.ad.responsive_display_ad.main_color":"","ad_group_ad.ad.responsive_display_ad.marketing_images":[],"ad_group_ad.ad.responsive_display_ad.price_prefix":"","ad_group_ad.ad.responsive_display_ad.promo_text":"","ad_group_ad.ad.responsive_display_ad.square_logo_images":[],"ad_group_ad.ad.responsive_display_ad.square_marketing_images":[],"ad_group_ad.ad.responsive_display_ad.youtube_videos":[],"ad_group_ad.ad.responsive_search_ad.descriptions":["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.headlines":["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.path1":"","ad_group_ad.ad.responsive_search_ad.path2":"","ad_group_ad.ad.shopping_comparison_listing_ad.headline":"","ad_group_ad.ad.shopping_product_ad":"","ad_group_ad.ad.shopping_smart_ad":"","ad_group_ad.ad.smart_campaign_ad.descriptions":[],"ad_group_ad.ad.smart_campaign_ad.headlines":[],"ad_group_ad.ad.system_managed_resource_source":"UNSPECIFIED","ad_group_ad.ad.text_ad.description1":"","ad_group_ad.ad.text_ad.description2":"","ad_group_ad.ad.text_ad.headline":"","ad_group_ad.ad.tracking_url_template":"","ad_group_ad.ad.type":"RESPONSIVE_SEARCH_AD","ad_group_ad.ad.url_collections":[],"ad_group_ad.ad.url_custom_parameters":[],"ad_group_ad.ad.video_ad.in_feed.description1":"","ad_group_ad.ad.video_ad.in_feed.description2":"","ad_group_ad.ad.video_ad.in_feed.headline":"","ad_group_ad.ad.video_ad.in_stream.action_button_label":"","ad_group_ad.ad.video_ad.in_stream.action_headline":"","ad_group_ad.ad.video_ad.out_stream.description":"","ad_group_ad.ad.video_ad.out_stream.headline":"","ad_group_ad.ad.video_responsive_ad.call_to_actions":[],"ad_group_ad.ad.video_responsive_ad.companion_banners":[],"ad_group_ad.ad.video_responsive_ad.descriptions":[],"ad_group_ad.ad.video_responsive_ad.headlines":[],"ad_group_ad.ad.video_responsive_ad.long_headlines":[],"ad_group_ad.ad.video_responsive_ad.videos":[],"ad_group_ad.ad_group":"customers/4651612872/adGroups/137051662444","ad_group_ad.ad_strength":"POOR","ad_group_ad.labels":[],"ad_group_ad.policy_summary.approval_status":"APPROVED","ad_group_ad.policy_summary.policy_topic_entries":[],"ad_group_ad.policy_summary.review_status":"REVIEWED","ad_group_ad.resource_name":"customers/4651612872/adGroupAds/137051662444~592078676857","ad_group_ad.status":"REMOVED","segments.date":"2022-04-09"},"emitted_at":1679577402012} -{"stream":"ad_group_ads","data":{"ad_group_ad.ad.added_by_google_ads":false,"ad_group_ad.ad.app_ad.descriptions":[],"ad_group_ad.ad.app_ad.headlines":[],"ad_group_ad.ad.app_ad.html5_media_bundles":[],"ad_group_ad.ad.app_ad.images":[],"ad_group_ad.ad.app_ad.mandatory_ad_text":"","ad_group_ad.ad.app_ad.youtube_videos":[],"ad_group_ad.ad.app_engagement_ad.descriptions":[],"ad_group_ad.ad.app_engagement_ad.headlines":[],"ad_group_ad.ad.app_engagement_ad.images":[],"ad_group_ad.ad.app_engagement_ad.videos":[],"ad_group_ad.ad.call_ad.business_name":"","ad_group_ad.ad.call_ad.call_tracked":false,"ad_group_ad.ad.call_ad.conversion_action":"","ad_group_ad.ad.call_ad.conversion_reporting_state":"UNSPECIFIED","ad_group_ad.ad.call_ad.country_code":"","ad_group_ad.ad.call_ad.description1":"","ad_group_ad.ad.call_ad.description2":"","ad_group_ad.ad.call_ad.disable_call_conversion":false,"ad_group_ad.ad.call_ad.headline1":"","ad_group_ad.ad.call_ad.headline2":"","ad_group_ad.ad.call_ad.path1":"","ad_group_ad.ad.call_ad.path2":"","ad_group_ad.ad.call_ad.phone_number":"","ad_group_ad.ad.call_ad.phone_number_verification_url":"","ad_group_ad.ad.device_preference":"UNSPECIFIED","ad_group_ad.ad.display_upload_ad.display_upload_product_type":"UNSPECIFIED","ad_group_ad.ad.display_upload_ad.media_bundle":"","ad_group_ad.ad.display_url":"","ad_group_ad.ad.expanded_dynamic_search_ad.description":"","ad_group_ad.ad.expanded_dynamic_search_ad.description2":"","ad_group_ad.ad.expanded_text_ad.description":"","ad_group_ad.ad.expanded_text_ad.description2":"","ad_group_ad.ad.expanded_text_ad.headline_part1":"","ad_group_ad.ad.expanded_text_ad.headline_part2":"","ad_group_ad.ad.expanded_text_ad.headline_part3":"","ad_group_ad.ad.expanded_text_ad.path1":"","ad_group_ad.ad.expanded_text_ad.path2":"","ad_group_ad.ad.final_app_urls":[],"ad_group_ad.ad.final_mobile_urls":[],"ad_group_ad.ad.final_url_suffix":"","ad_group_ad.ad.final_urls":["https://airbyte.com"],"ad_group_ad.ad.hotel_ad":"","ad_group_ad.ad.id":592078631218,"ad_group_ad.ad.image_ad.image_url":"","ad_group_ad.ad.image_ad.mime_type":"UNSPECIFIED","ad_group_ad.ad.image_ad.name":"","ad_group_ad.ad.image_ad.pixel_height":0,"ad_group_ad.ad.image_ad.pixel_width":0,"ad_group_ad.ad.image_ad.preview_image_url":"","ad_group_ad.ad.image_ad.preview_pixel_height":0,"ad_group_ad.ad.image_ad.preview_pixel_width":0,"ad_group_ad.ad.legacy_app_install_ad":"","ad_group_ad.ad.legacy_responsive_display_ad.accent_color":"","ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.legacy_responsive_display_ad.business_name":"","ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.legacy_responsive_display_ad.description":"","ad_group_ad.ad.legacy_responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.legacy_responsive_display_ad.logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.long_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.main_color":"","ad_group_ad.ad.legacy_responsive_display_ad.marketing_image":"","ad_group_ad.ad.legacy_responsive_display_ad.price_prefix":"","ad_group_ad.ad.legacy_responsive_display_ad.promo_text":"","ad_group_ad.ad.legacy_responsive_display_ad.short_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image":"","ad_group_ad.ad.local_ad.call_to_actions":[],"ad_group_ad.ad.local_ad.descriptions":[],"ad_group_ad.ad.local_ad.headlines":[],"ad_group_ad.ad.local_ad.logo_images":[],"ad_group_ad.ad.local_ad.marketing_images":[],"ad_group_ad.ad.local_ad.path1":"","ad_group_ad.ad.local_ad.path2":"","ad_group_ad.ad.local_ad.videos":[],"ad_group_ad.ad.name":"","ad_group_ad.ad.resource_name":"customers/4651612872/ads/592078631218","ad_group_ad.ad.responsive_display_ad.accent_color":"","ad_group_ad.ad.responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.responsive_display_ad.business_name":"","ad_group_ad.ad.responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.responsive_display_ad.control_spec.enable_asset_enhancements":false,"ad_group_ad.ad.responsive_display_ad.control_spec.enable_autogen_video":false,"ad_group_ad.ad.responsive_display_ad.descriptions":[],"ad_group_ad.ad.responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.responsive_display_ad.headlines":[],"ad_group_ad.ad.responsive_display_ad.logo_images":[],"ad_group_ad.ad.responsive_display_ad.long_headline":"","ad_group_ad.ad.responsive_display_ad.main_color":"","ad_group_ad.ad.responsive_display_ad.marketing_images":[],"ad_group_ad.ad.responsive_display_ad.price_prefix":"","ad_group_ad.ad.responsive_display_ad.promo_text":"","ad_group_ad.ad.responsive_display_ad.square_logo_images":[],"ad_group_ad.ad.responsive_display_ad.square_marketing_images":[],"ad_group_ad.ad.responsive_display_ad.youtube_videos":[],"ad_group_ad.ad.responsive_search_ad.descriptions":["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n policy_topic_entries {\n topic: \"TRADEMARKS_IN_AD_TEXT\"\n type_: LIMITED\n evidences {\n text_list {\n texts: \"airbyte\"\n }\n }\n constraints {\n reseller_constraint {\n }\n }\n }\n review_status: REVIEWED\n approval_status: APPROVED_LIMITED\n}\n","text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Consolidate your data in your data warehouses, lakes and databases\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.headlines":["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.path1":"","ad_group_ad.ad.responsive_search_ad.path2":"","ad_group_ad.ad.shopping_comparison_listing_ad.headline":"","ad_group_ad.ad.shopping_product_ad":"","ad_group_ad.ad.shopping_smart_ad":"","ad_group_ad.ad.smart_campaign_ad.descriptions":[],"ad_group_ad.ad.smart_campaign_ad.headlines":[],"ad_group_ad.ad.system_managed_resource_source":"UNSPECIFIED","ad_group_ad.ad.text_ad.description1":"","ad_group_ad.ad.text_ad.description2":"","ad_group_ad.ad.text_ad.headline":"","ad_group_ad.ad.tracking_url_template":"","ad_group_ad.ad.type":"RESPONSIVE_SEARCH_AD","ad_group_ad.ad.url_collections":[],"ad_group_ad.ad.url_custom_parameters":[],"ad_group_ad.ad.video_ad.in_feed.description1":"","ad_group_ad.ad.video_ad.in_feed.description2":"","ad_group_ad.ad.video_ad.in_feed.headline":"","ad_group_ad.ad.video_ad.in_stream.action_button_label":"","ad_group_ad.ad.video_ad.in_stream.action_headline":"","ad_group_ad.ad.video_ad.out_stream.description":"","ad_group_ad.ad.video_ad.out_stream.headline":"","ad_group_ad.ad.video_responsive_ad.call_to_actions":[],"ad_group_ad.ad.video_responsive_ad.companion_banners":[],"ad_group_ad.ad.video_responsive_ad.descriptions":[],"ad_group_ad.ad.video_responsive_ad.headlines":[],"ad_group_ad.ad.video_responsive_ad.long_headlines":[],"ad_group_ad.ad.video_responsive_ad.videos":[],"ad_group_ad.ad_group":"customers/4651612872/adGroups/137020701042","ad_group_ad.ad_strength":"POOR","ad_group_ad.labels":[],"ad_group_ad.policy_summary.approval_status":"APPROVED_LIMITED","ad_group_ad.policy_summary.policy_topic_entries":["topic: \"TRADEMARKS_IN_AD_TEXT\"\ntype_: LIMITED\nevidences {\n text_list {\n texts: \"airbyte\"\n }\n}\nconstraints {\n reseller_constraint {\n }\n}\n"],"ad_group_ad.policy_summary.review_status":"REVIEWED","ad_group_ad.resource_name":"customers/4651612872/adGroupAds/137020701042~592078631218","ad_group_ad.status":"ENABLED","segments.date":"2022-04-10"},"emitted_at":1679577402018} -{"stream":"ad_group_ads","data":{"ad_group_ad.ad.added_by_google_ads":false,"ad_group_ad.ad.app_ad.descriptions":[],"ad_group_ad.ad.app_ad.headlines":[],"ad_group_ad.ad.app_ad.html5_media_bundles":[],"ad_group_ad.ad.app_ad.images":[],"ad_group_ad.ad.app_ad.mandatory_ad_text":"","ad_group_ad.ad.app_ad.youtube_videos":[],"ad_group_ad.ad.app_engagement_ad.descriptions":[],"ad_group_ad.ad.app_engagement_ad.headlines":[],"ad_group_ad.ad.app_engagement_ad.images":[],"ad_group_ad.ad.app_engagement_ad.videos":[],"ad_group_ad.ad.call_ad.business_name":"","ad_group_ad.ad.call_ad.call_tracked":false,"ad_group_ad.ad.call_ad.conversion_action":"","ad_group_ad.ad.call_ad.conversion_reporting_state":"UNSPECIFIED","ad_group_ad.ad.call_ad.country_code":"","ad_group_ad.ad.call_ad.description1":"","ad_group_ad.ad.call_ad.description2":"","ad_group_ad.ad.call_ad.disable_call_conversion":false,"ad_group_ad.ad.call_ad.headline1":"","ad_group_ad.ad.call_ad.headline2":"","ad_group_ad.ad.call_ad.path1":"","ad_group_ad.ad.call_ad.path2":"","ad_group_ad.ad.call_ad.phone_number":"","ad_group_ad.ad.call_ad.phone_number_verification_url":"","ad_group_ad.ad.device_preference":"UNSPECIFIED","ad_group_ad.ad.display_upload_ad.display_upload_product_type":"UNSPECIFIED","ad_group_ad.ad.display_upload_ad.media_bundle":"","ad_group_ad.ad.display_url":"","ad_group_ad.ad.expanded_dynamic_search_ad.description":"","ad_group_ad.ad.expanded_dynamic_search_ad.description2":"","ad_group_ad.ad.expanded_text_ad.description":"","ad_group_ad.ad.expanded_text_ad.description2":"","ad_group_ad.ad.expanded_text_ad.headline_part1":"","ad_group_ad.ad.expanded_text_ad.headline_part2":"","ad_group_ad.ad.expanded_text_ad.headline_part3":"","ad_group_ad.ad.expanded_text_ad.path1":"","ad_group_ad.ad.expanded_text_ad.path2":"","ad_group_ad.ad.final_app_urls":[],"ad_group_ad.ad.final_mobile_urls":[],"ad_group_ad.ad.final_url_suffix":"","ad_group_ad.ad.final_urls":["https://airbyte.com"],"ad_group_ad.ad.hotel_ad":"","ad_group_ad.ad.id":592078676857,"ad_group_ad.ad.image_ad.image_url":"","ad_group_ad.ad.image_ad.mime_type":"UNSPECIFIED","ad_group_ad.ad.image_ad.name":"","ad_group_ad.ad.image_ad.pixel_height":0,"ad_group_ad.ad.image_ad.pixel_width":0,"ad_group_ad.ad.image_ad.preview_image_url":"","ad_group_ad.ad.image_ad.preview_pixel_height":0,"ad_group_ad.ad.image_ad.preview_pixel_width":0,"ad_group_ad.ad.legacy_app_install_ad":"","ad_group_ad.ad.legacy_responsive_display_ad.accent_color":"","ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.legacy_responsive_display_ad.business_name":"","ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.legacy_responsive_display_ad.description":"","ad_group_ad.ad.legacy_responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.legacy_responsive_display_ad.logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.long_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.main_color":"","ad_group_ad.ad.legacy_responsive_display_ad.marketing_image":"","ad_group_ad.ad.legacy_responsive_display_ad.price_prefix":"","ad_group_ad.ad.legacy_responsive_display_ad.promo_text":"","ad_group_ad.ad.legacy_responsive_display_ad.short_headline":"","ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image":"","ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image":"","ad_group_ad.ad.local_ad.call_to_actions":[],"ad_group_ad.ad.local_ad.descriptions":[],"ad_group_ad.ad.local_ad.headlines":[],"ad_group_ad.ad.local_ad.logo_images":[],"ad_group_ad.ad.local_ad.marketing_images":[],"ad_group_ad.ad.local_ad.path1":"","ad_group_ad.ad.local_ad.path2":"","ad_group_ad.ad.local_ad.videos":[],"ad_group_ad.ad.name":"","ad_group_ad.ad.resource_name":"customers/4651612872/ads/592078676857","ad_group_ad.ad.responsive_display_ad.accent_color":"","ad_group_ad.ad.responsive_display_ad.allow_flexible_color":false,"ad_group_ad.ad.responsive_display_ad.business_name":"","ad_group_ad.ad.responsive_display_ad.call_to_action_text":"","ad_group_ad.ad.responsive_display_ad.control_spec.enable_asset_enhancements":false,"ad_group_ad.ad.responsive_display_ad.control_spec.enable_autogen_video":false,"ad_group_ad.ad.responsive_display_ad.descriptions":[],"ad_group_ad.ad.responsive_display_ad.format_setting":"UNSPECIFIED","ad_group_ad.ad.responsive_display_ad.headlines":[],"ad_group_ad.ad.responsive_display_ad.logo_images":[],"ad_group_ad.ad.responsive_display_ad.long_headline":"","ad_group_ad.ad.responsive_display_ad.main_color":"","ad_group_ad.ad.responsive_display_ad.marketing_images":[],"ad_group_ad.ad.responsive_display_ad.price_prefix":"","ad_group_ad.ad.responsive_display_ad.promo_text":"","ad_group_ad.ad.responsive_display_ad.square_logo_images":[],"ad_group_ad.ad.responsive_display_ad.square_marketing_images":[],"ad_group_ad.ad.responsive_display_ad.youtube_videos":[],"ad_group_ad.ad.responsive_search_ad.descriptions":["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.headlines":["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n","text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"],"ad_group_ad.ad.responsive_search_ad.path1":"","ad_group_ad.ad.responsive_search_ad.path2":"","ad_group_ad.ad.shopping_comparison_listing_ad.headline":"","ad_group_ad.ad.shopping_product_ad":"","ad_group_ad.ad.shopping_smart_ad":"","ad_group_ad.ad.smart_campaign_ad.descriptions":[],"ad_group_ad.ad.smart_campaign_ad.headlines":[],"ad_group_ad.ad.system_managed_resource_source":"UNSPECIFIED","ad_group_ad.ad.text_ad.description1":"","ad_group_ad.ad.text_ad.description2":"","ad_group_ad.ad.text_ad.headline":"","ad_group_ad.ad.tracking_url_template":"","ad_group_ad.ad.type":"RESPONSIVE_SEARCH_AD","ad_group_ad.ad.url_collections":[],"ad_group_ad.ad.url_custom_parameters":[],"ad_group_ad.ad.video_ad.in_feed.description1":"","ad_group_ad.ad.video_ad.in_feed.description2":"","ad_group_ad.ad.video_ad.in_feed.headline":"","ad_group_ad.ad.video_ad.in_stream.action_button_label":"","ad_group_ad.ad.video_ad.in_stream.action_headline":"","ad_group_ad.ad.video_ad.out_stream.description":"","ad_group_ad.ad.video_ad.out_stream.headline":"","ad_group_ad.ad.video_responsive_ad.call_to_actions":[],"ad_group_ad.ad.video_responsive_ad.companion_banners":[],"ad_group_ad.ad.video_responsive_ad.descriptions":[],"ad_group_ad.ad.video_responsive_ad.headlines":[],"ad_group_ad.ad.video_responsive_ad.long_headlines":[],"ad_group_ad.ad.video_responsive_ad.videos":[],"ad_group_ad.ad_group":"customers/4651612872/adGroups/137051662444","ad_group_ad.ad_strength":"POOR","ad_group_ad.labels":[],"ad_group_ad.policy_summary.approval_status":"APPROVED","ad_group_ad.policy_summary.policy_topic_entries":[],"ad_group_ad.policy_summary.review_status":"REVIEWED","ad_group_ad.resource_name":"customers/4651612872/adGroupAds/137051662444~592078676857","ad_group_ad.status":"REMOVED","segments.date":"2022-04-10"},"emitted_at":1679577402025} -{"stream":"campaigns","data":{"campaign.accessible_bidding_strategy":"","campaign.ad_serving_optimization_status":"OPTIMIZE","campaign.advertising_channel_sub_type":"UNSPECIFIED","campaign.advertising_channel_type":"SEARCH","campaign.app_campaign_setting.app_id":"","campaign.app_campaign_setting.app_store":"UNSPECIFIED","campaign.app_campaign_setting.bidding_strategy_goal_type":"UNSPECIFIED","campaign.base_campaign":"customers/4651612872/campaigns/16820250687","campaign.bidding_strategy":"","campaign.bidding_strategy_type":"TARGET_SPEND","campaign.campaign_budget":"customers/4651612872/campaignBudgets/10695604507","campaign_budget.amount_micros":750000,"campaign.commission.commission_rate_micros":0,"campaign.dynamic_search_ads_setting.domain_name":"","campaign.dynamic_search_ads_setting.feeds":[],"campaign.dynamic_search_ads_setting.language_code":"","campaign.dynamic_search_ads_setting.use_supplied_urls_only":false,"campaign.end_date":"2037-12-30","campaign.excluded_parent_asset_field_types":[],"campaign.experiment_type":"BASE","campaign.final_url_suffix":"","campaign.frequency_caps":[],"campaign.geo_target_type_setting.negative_geo_target_type":"PRESENCE","campaign.geo_target_type_setting.positive_geo_target_type":"PRESENCE_OR_INTEREST","campaign.hotel_setting.hotel_center_id":0,"campaign.id":16820250687,"campaign.labels":[],"campaign.local_campaign_setting.location_source_type":"UNSPECIFIED","campaign.manual_cpc.enhanced_cpc_enabled":false,"campaign.manual_cpm":"","campaign.manual_cpv":"","campaign.maximize_conversion_value.target_roas":0.0,"campaign.maximize_conversions.target_cpa_micros":0,"campaign.name":"Website traffic-Search-15","campaign.network_settings.target_content_network":true,"campaign.network_settings.target_google_search":true,"campaign.network_settings.target_partner_search_network":false,"campaign.network_settings.target_search_network":true,"campaign.optimization_goal_setting.optimization_goal_types":[],"campaign.optimization_score":0.0,"campaign.payment_mode":"CLICKS","campaign.percent_cpc.cpc_bid_ceiling_micros":0,"campaign.percent_cpc.enhanced_cpc_enabled":false,"campaign.real_time_bidding_setting.opt_in":false,"campaign.resource_name":"customers/4651612872/campaigns/16820250687","campaign.selective_optimization.conversion_actions":[],"campaign.serving_status":"SERVING","campaign.shopping_setting.campaign_priority":0,"campaign.shopping_setting.enable_local":false,"campaign.shopping_setting.merchant_id":0,"campaign.shopping_setting.sales_country":"","campaign.start_date":"2022-04-08","campaign.status":"PAUSED","campaign.target_cpa.cpc_bid_ceiling_micros":0,"campaign.target_cpa.cpc_bid_floor_micros":0,"campaign.target_cpa.target_cpa_micros":0,"campaign.target_cpm.target_frequency_goal.target_count":0,"campaign.target_cpm.target_frequency_goal.time_unit":"UNSPECIFIED","campaign.target_impression_share.cpc_bid_ceiling_micros":0,"campaign.target_impression_share.location":"UNSPECIFIED","campaign.target_impression_share.location_fraction_micros":0,"campaign.target_roas.cpc_bid_ceiling_micros":0,"campaign.target_roas.cpc_bid_floor_micros":0,"campaign.target_roas.target_roas":0.0,"campaign.target_spend.cpc_bid_ceiling_micros":0,"campaign.target_spend.target_spend_micros":0,"campaign.targeting_setting.target_restrictions":["targeting_dimension: AUDIENCE\nbid_only: true\n"],"campaign.tracking_setting.tracking_url":"","campaign.tracking_url_template":"","campaign.url_custom_parameters":[],"campaign.vanity_pharma.vanity_pharma_display_url_mode":"UNSPECIFIED","campaign.vanity_pharma.vanity_pharma_text":"UNSPECIFIED","campaign.video_brand_safety_suitability":"UNSPECIFIED","metrics.clicks":0,"metrics.ctr":0.0,"metrics.conversions":0.0,"metrics.conversions_value":0.0,"metrics.cost_micros":0,"metrics.impressions":2.0,"metrics.video_views":0.0,"metrics.video_quartile_p100_rate":0.0,"segments.date":"2022-04-08","segments.hour":21.0},"emitted_at":1679577498472} -{"stream":"campaigns","data":{"campaign.accessible_bidding_strategy":"","campaign.ad_serving_optimization_status":"OPTIMIZE","campaign.advertising_channel_sub_type":"UNSPECIFIED","campaign.advertising_channel_type":"SEARCH","campaign.app_campaign_setting.app_id":"","campaign.app_campaign_setting.app_store":"UNSPECIFIED","campaign.app_campaign_setting.bidding_strategy_goal_type":"UNSPECIFIED","campaign.base_campaign":"customers/4651612872/campaigns/16820250687","campaign.bidding_strategy":"","campaign.bidding_strategy_type":"TARGET_SPEND","campaign.campaign_budget":"customers/4651612872/campaignBudgets/10695604507","campaign_budget.amount_micros":750000,"campaign.commission.commission_rate_micros":0,"campaign.dynamic_search_ads_setting.domain_name":"","campaign.dynamic_search_ads_setting.feeds":[],"campaign.dynamic_search_ads_setting.language_code":"","campaign.dynamic_search_ads_setting.use_supplied_urls_only":false,"campaign.end_date":"2037-12-30","campaign.excluded_parent_asset_field_types":[],"campaign.experiment_type":"BASE","campaign.final_url_suffix":"","campaign.frequency_caps":[],"campaign.geo_target_type_setting.negative_geo_target_type":"PRESENCE","campaign.geo_target_type_setting.positive_geo_target_type":"PRESENCE_OR_INTEREST","campaign.hotel_setting.hotel_center_id":0,"campaign.id":16820250687,"campaign.labels":[],"campaign.local_campaign_setting.location_source_type":"UNSPECIFIED","campaign.manual_cpc.enhanced_cpc_enabled":false,"campaign.manual_cpm":"","campaign.manual_cpv":"","campaign.maximize_conversion_value.target_roas":0.0,"campaign.maximize_conversions.target_cpa_micros":0,"campaign.name":"Website traffic-Search-15","campaign.network_settings.target_content_network":true,"campaign.network_settings.target_google_search":true,"campaign.network_settings.target_partner_search_network":false,"campaign.network_settings.target_search_network":true,"campaign.optimization_goal_setting.optimization_goal_types":[],"campaign.optimization_score":0.0,"campaign.payment_mode":"CLICKS","campaign.percent_cpc.cpc_bid_ceiling_micros":0,"campaign.percent_cpc.enhanced_cpc_enabled":false,"campaign.real_time_bidding_setting.opt_in":false,"campaign.resource_name":"customers/4651612872/campaigns/16820250687","campaign.selective_optimization.conversion_actions":[],"campaign.serving_status":"SERVING","campaign.shopping_setting.campaign_priority":0,"campaign.shopping_setting.enable_local":false,"campaign.shopping_setting.merchant_id":0,"campaign.shopping_setting.sales_country":"","campaign.start_date":"2022-04-08","campaign.status":"PAUSED","campaign.target_cpa.cpc_bid_ceiling_micros":0,"campaign.target_cpa.cpc_bid_floor_micros":0,"campaign.target_cpa.target_cpa_micros":0,"campaign.target_cpm.target_frequency_goal.target_count":0,"campaign.target_cpm.target_frequency_goal.time_unit":"UNSPECIFIED","campaign.target_impression_share.cpc_bid_ceiling_micros":0,"campaign.target_impression_share.location":"UNSPECIFIED","campaign.target_impression_share.location_fraction_micros":0,"campaign.target_roas.cpc_bid_ceiling_micros":0,"campaign.target_roas.cpc_bid_floor_micros":0,"campaign.target_roas.target_roas":0.0,"campaign.target_spend.cpc_bid_ceiling_micros":0,"campaign.target_spend.target_spend_micros":0,"campaign.targeting_setting.target_restrictions":["targeting_dimension: AUDIENCE\nbid_only: true\n"],"campaign.tracking_setting.tracking_url":"","campaign.tracking_url_template":"","campaign.url_custom_parameters":[],"campaign.vanity_pharma.vanity_pharma_display_url_mode":"UNSPECIFIED","campaign.vanity_pharma.vanity_pharma_text":"UNSPECIFIED","campaign.video_brand_safety_suitability":"UNSPECIFIED","metrics.clicks":0,"metrics.ctr":0.0,"metrics.conversions":0.0,"metrics.conversions_value":0.0,"metrics.cost_micros":0,"metrics.impressions":1.0,"metrics.video_views":0.0,"metrics.video_quartile_p100_rate":0.0,"segments.date":"2022-04-09","segments.hour":2.0},"emitted_at":1679577498477} -{"stream":"campaigns","data":{"campaign.accessible_bidding_strategy":"","campaign.ad_serving_optimization_status":"OPTIMIZE","campaign.advertising_channel_sub_type":"UNSPECIFIED","campaign.advertising_channel_type":"SEARCH","campaign.app_campaign_setting.app_id":"","campaign.app_campaign_setting.app_store":"UNSPECIFIED","campaign.app_campaign_setting.bidding_strategy_goal_type":"UNSPECIFIED","campaign.base_campaign":"customers/4651612872/campaigns/16820250687","campaign.bidding_strategy":"","campaign.bidding_strategy_type":"TARGET_SPEND","campaign.campaign_budget":"customers/4651612872/campaignBudgets/10695604507","campaign_budget.amount_micros":750000,"campaign.commission.commission_rate_micros":0,"campaign.dynamic_search_ads_setting.domain_name":"","campaign.dynamic_search_ads_setting.feeds":[],"campaign.dynamic_search_ads_setting.language_code":"","campaign.dynamic_search_ads_setting.use_supplied_urls_only":false,"campaign.end_date":"2037-12-30","campaign.excluded_parent_asset_field_types":[],"campaign.experiment_type":"BASE","campaign.final_url_suffix":"","campaign.frequency_caps":[],"campaign.geo_target_type_setting.negative_geo_target_type":"PRESENCE","campaign.geo_target_type_setting.positive_geo_target_type":"PRESENCE_OR_INTEREST","campaign.hotel_setting.hotel_center_id":0,"campaign.id":16820250687,"campaign.labels":[],"campaign.local_campaign_setting.location_source_type":"UNSPECIFIED","campaign.manual_cpc.enhanced_cpc_enabled":false,"campaign.manual_cpm":"","campaign.manual_cpv":"","campaign.maximize_conversion_value.target_roas":0.0,"campaign.maximize_conversions.target_cpa_micros":0,"campaign.name":"Website traffic-Search-15","campaign.network_settings.target_content_network":true,"campaign.network_settings.target_google_search":true,"campaign.network_settings.target_partner_search_network":false,"campaign.network_settings.target_search_network":true,"campaign.optimization_goal_setting.optimization_goal_types":[],"campaign.optimization_score":0.0,"campaign.payment_mode":"CLICKS","campaign.percent_cpc.cpc_bid_ceiling_micros":0,"campaign.percent_cpc.enhanced_cpc_enabled":false,"campaign.real_time_bidding_setting.opt_in":false,"campaign.resource_name":"customers/4651612872/campaigns/16820250687","campaign.selective_optimization.conversion_actions":[],"campaign.serving_status":"SERVING","campaign.shopping_setting.campaign_priority":0,"campaign.shopping_setting.enable_local":false,"campaign.shopping_setting.merchant_id":0,"campaign.shopping_setting.sales_country":"","campaign.start_date":"2022-04-08","campaign.status":"PAUSED","campaign.target_cpa.cpc_bid_ceiling_micros":0,"campaign.target_cpa.cpc_bid_floor_micros":0,"campaign.target_cpa.target_cpa_micros":0,"campaign.target_cpm.target_frequency_goal.target_count":0,"campaign.target_cpm.target_frequency_goal.time_unit":"UNSPECIFIED","campaign.target_impression_share.cpc_bid_ceiling_micros":0,"campaign.target_impression_share.location":"UNSPECIFIED","campaign.target_impression_share.location_fraction_micros":0,"campaign.target_roas.cpc_bid_ceiling_micros":0,"campaign.target_roas.cpc_bid_floor_micros":0,"campaign.target_roas.target_roas":0.0,"campaign.target_spend.cpc_bid_ceiling_micros":0,"campaign.target_spend.target_spend_micros":0,"campaign.targeting_setting.target_restrictions":["targeting_dimension: AUDIENCE\nbid_only: true\n"],"campaign.tracking_setting.tracking_url":"","campaign.tracking_url_template":"","campaign.url_custom_parameters":[],"campaign.vanity_pharma.vanity_pharma_display_url_mode":"UNSPECIFIED","campaign.vanity_pharma.vanity_pharma_text":"UNSPECIFIED","campaign.video_brand_safety_suitability":"UNSPECIFIED","metrics.clicks":0,"metrics.ctr":0.0,"metrics.conversions":0.0,"metrics.conversions_value":0.0,"metrics.cost_micros":0,"metrics.impressions":4.0,"metrics.video_views":0.0,"metrics.video_quartile_p100_rate":0.0,"segments.date":"2022-04-09","segments.hour":7.0},"emitted_at":1679577498481} -{"stream":"campaigns","data":{"campaign.accessible_bidding_strategy":"","campaign.ad_serving_optimization_status":"OPTIMIZE","campaign.advertising_channel_sub_type":"UNSPECIFIED","campaign.advertising_channel_type":"SEARCH","campaign.app_campaign_setting.app_id":"","campaign.app_campaign_setting.app_store":"UNSPECIFIED","campaign.app_campaign_setting.bidding_strategy_goal_type":"UNSPECIFIED","campaign.base_campaign":"customers/4651612872/campaigns/16820250687","campaign.bidding_strategy":"","campaign.bidding_strategy_type":"TARGET_SPEND","campaign.campaign_budget":"customers/4651612872/campaignBudgets/10695604507","campaign_budget.amount_micros":750000,"campaign.commission.commission_rate_micros":0,"campaign.dynamic_search_ads_setting.domain_name":"","campaign.dynamic_search_ads_setting.feeds":[],"campaign.dynamic_search_ads_setting.language_code":"","campaign.dynamic_search_ads_setting.use_supplied_urls_only":false,"campaign.end_date":"2037-12-30","campaign.excluded_parent_asset_field_types":[],"campaign.experiment_type":"BASE","campaign.final_url_suffix":"","campaign.frequency_caps":[],"campaign.geo_target_type_setting.negative_geo_target_type":"PRESENCE","campaign.geo_target_type_setting.positive_geo_target_type":"PRESENCE_OR_INTEREST","campaign.hotel_setting.hotel_center_id":0,"campaign.id":16820250687,"campaign.labels":[],"campaign.local_campaign_setting.location_source_type":"UNSPECIFIED","campaign.manual_cpc.enhanced_cpc_enabled":false,"campaign.manual_cpm":"","campaign.manual_cpv":"","campaign.maximize_conversion_value.target_roas":0.0,"campaign.maximize_conversions.target_cpa_micros":0,"campaign.name":"Website traffic-Search-15","campaign.network_settings.target_content_network":true,"campaign.network_settings.target_google_search":true,"campaign.network_settings.target_partner_search_network":false,"campaign.network_settings.target_search_network":true,"campaign.optimization_goal_setting.optimization_goal_types":[],"campaign.optimization_score":0.0,"campaign.payment_mode":"CLICKS","campaign.percent_cpc.cpc_bid_ceiling_micros":0,"campaign.percent_cpc.enhanced_cpc_enabled":false,"campaign.real_time_bidding_setting.opt_in":false,"campaign.resource_name":"customers/4651612872/campaigns/16820250687","campaign.selective_optimization.conversion_actions":[],"campaign.serving_status":"SERVING","campaign.shopping_setting.campaign_priority":0,"campaign.shopping_setting.enable_local":false,"campaign.shopping_setting.merchant_id":0,"campaign.shopping_setting.sales_country":"","campaign.start_date":"2022-04-08","campaign.status":"PAUSED","campaign.target_cpa.cpc_bid_ceiling_micros":0,"campaign.target_cpa.cpc_bid_floor_micros":0,"campaign.target_cpa.target_cpa_micros":0,"campaign.target_cpm.target_frequency_goal.target_count":0,"campaign.target_cpm.target_frequency_goal.time_unit":"UNSPECIFIED","campaign.target_impression_share.cpc_bid_ceiling_micros":0,"campaign.target_impression_share.location":"UNSPECIFIED","campaign.target_impression_share.location_fraction_micros":0,"campaign.target_roas.cpc_bid_ceiling_micros":0,"campaign.target_roas.cpc_bid_floor_micros":0,"campaign.target_roas.target_roas":0.0,"campaign.target_spend.cpc_bid_ceiling_micros":0,"campaign.target_spend.target_spend_micros":0,"campaign.targeting_setting.target_restrictions":["targeting_dimension: AUDIENCE\nbid_only: true\n"],"campaign.tracking_setting.tracking_url":"","campaign.tracking_url_template":"","campaign.url_custom_parameters":[],"campaign.vanity_pharma.vanity_pharma_display_url_mode":"UNSPECIFIED","campaign.vanity_pharma.vanity_pharma_text":"UNSPECIFIED","campaign.video_brand_safety_suitability":"UNSPECIFIED","metrics.clicks":0,"metrics.ctr":0.0,"metrics.conversions":0.0,"metrics.conversions_value":0.0,"metrics.cost_micros":0,"metrics.impressions":1.0,"metrics.video_views":0.0,"metrics.video_quartile_p100_rate":0.0,"segments.date":"2022-04-09","segments.hour":8.0},"emitted_at":1679577498485} -{"stream":"campaigns","data":{"campaign.accessible_bidding_strategy":"","campaign.ad_serving_optimization_status":"OPTIMIZE","campaign.advertising_channel_sub_type":"UNSPECIFIED","campaign.advertising_channel_type":"SEARCH","campaign.app_campaign_setting.app_id":"","campaign.app_campaign_setting.app_store":"UNSPECIFIED","campaign.app_campaign_setting.bidding_strategy_goal_type":"UNSPECIFIED","campaign.base_campaign":"customers/4651612872/campaigns/16820250687","campaign.bidding_strategy":"","campaign.bidding_strategy_type":"TARGET_SPEND","campaign.campaign_budget":"customers/4651612872/campaignBudgets/10695604507","campaign_budget.amount_micros":750000,"campaign.commission.commission_rate_micros":0,"campaign.dynamic_search_ads_setting.domain_name":"","campaign.dynamic_search_ads_setting.feeds":[],"campaign.dynamic_search_ads_setting.language_code":"","campaign.dynamic_search_ads_setting.use_supplied_urls_only":false,"campaign.end_date":"2037-12-30","campaign.excluded_parent_asset_field_types":[],"campaign.experiment_type":"BASE","campaign.final_url_suffix":"","campaign.frequency_caps":[],"campaign.geo_target_type_setting.negative_geo_target_type":"PRESENCE","campaign.geo_target_type_setting.positive_geo_target_type":"PRESENCE_OR_INTEREST","campaign.hotel_setting.hotel_center_id":0,"campaign.id":16820250687,"campaign.labels":[],"campaign.local_campaign_setting.location_source_type":"UNSPECIFIED","campaign.manual_cpc.enhanced_cpc_enabled":false,"campaign.manual_cpm":"","campaign.manual_cpv":"","campaign.maximize_conversion_value.target_roas":0.0,"campaign.maximize_conversions.target_cpa_micros":0,"campaign.name":"Website traffic-Search-15","campaign.network_settings.target_content_network":true,"campaign.network_settings.target_google_search":true,"campaign.network_settings.target_partner_search_network":false,"campaign.network_settings.target_search_network":true,"campaign.optimization_goal_setting.optimization_goal_types":[],"campaign.optimization_score":0.0,"campaign.payment_mode":"CLICKS","campaign.percent_cpc.cpc_bid_ceiling_micros":0,"campaign.percent_cpc.enhanced_cpc_enabled":false,"campaign.real_time_bidding_setting.opt_in":false,"campaign.resource_name":"customers/4651612872/campaigns/16820250687","campaign.selective_optimization.conversion_actions":[],"campaign.serving_status":"SERVING","campaign.shopping_setting.campaign_priority":0,"campaign.shopping_setting.enable_local":false,"campaign.shopping_setting.merchant_id":0,"campaign.shopping_setting.sales_country":"","campaign.start_date":"2022-04-08","campaign.status":"PAUSED","campaign.target_cpa.cpc_bid_ceiling_micros":0,"campaign.target_cpa.cpc_bid_floor_micros":0,"campaign.target_cpa.target_cpa_micros":0,"campaign.target_cpm.target_frequency_goal.target_count":0,"campaign.target_cpm.target_frequency_goal.time_unit":"UNSPECIFIED","campaign.target_impression_share.cpc_bid_ceiling_micros":0,"campaign.target_impression_share.location":"UNSPECIFIED","campaign.target_impression_share.location_fraction_micros":0,"campaign.target_roas.cpc_bid_ceiling_micros":0,"campaign.target_roas.cpc_bid_floor_micros":0,"campaign.target_roas.target_roas":0.0,"campaign.target_spend.cpc_bid_ceiling_micros":0,"campaign.target_spend.target_spend_micros":0,"campaign.targeting_setting.target_restrictions":["targeting_dimension: AUDIENCE\nbid_only: true\n"],"campaign.tracking_setting.tracking_url":"","campaign.tracking_url_template":"","campaign.url_custom_parameters":[],"campaign.vanity_pharma.vanity_pharma_display_url_mode":"UNSPECIFIED","campaign.vanity_pharma.vanity_pharma_text":"UNSPECIFIED","campaign.video_brand_safety_suitability":"UNSPECIFIED","metrics.clicks":1,"metrics.ctr":0.25,"metrics.conversions":0.0,"metrics.conversions_value":0.0,"metrics.cost_micros":70000,"metrics.impressions":4.0,"metrics.video_views":0.0,"metrics.video_quartile_p100_rate":0.0,"segments.date":"2022-04-09","segments.hour":9.0},"emitted_at":1679577498489} -{"stream":"ad_groups","data":{"ad_group.ad_rotation_mode":"UNSPECIFIED","ad_group.base_ad_group":"customers/4651612872/adGroups/137051662444","ad_group.campaign":"customers/4651612872/campaigns/16820250687","ad_group.cpc_bid_micros":10000,"ad_group.cpm_bid_micros":10000,"ad_group.cpv_bid_micros":0,"ad_group.display_custom_bid_dimension":"UNSPECIFIED","ad_group.effective_target_cpa_micros":0,"ad_group.effective_target_cpa_source":"UNSPECIFIED","ad_group.effective_target_roas":0.0,"ad_group.effective_target_roas_source":"UNSPECIFIED","ad_group.excluded_parent_asset_field_types":[],"ad_group.optimized_targeting_enabled":false,"ad_group.final_url_suffix":"","ad_group.id":137051662444,"ad_group.labels":[],"ad_group.name":"Группа объявлений 1","ad_group.percent_cpc_bid_micros":0,"ad_group.resource_name":"customers/4651612872/adGroups/137051662444","ad_group.status":"ENABLED","ad_group.target_cpa_micros":0,"ad_group.target_cpm_micros":10000,"ad_group.target_roas":0.0,"ad_group.targeting_setting.target_restrictions":["targeting_dimension: AUDIENCE\nbid_only: true\n","targeting_dimension: AGE_RANGE\nbid_only: true\n","targeting_dimension: GENDER\nbid_only: true\n","targeting_dimension: PARENTAL_STATUS\nbid_only: true\n","targeting_dimension: INCOME_RANGE\nbid_only: true\n"],"ad_group.tracking_url_template":"","ad_group.type":"SEARCH_STANDARD","ad_group.url_custom_parameters":[],"segments.date":"2022-04-08"},"emitted_at":1679577823324} -{"stream":"ad_groups","data":{"ad_group.ad_rotation_mode":"UNSPECIFIED","ad_group.base_ad_group":"customers/4651612872/adGroups/137020701042","ad_group.campaign":"customers/4651612872/campaigns/16820250687","ad_group.cpc_bid_micros":10000,"ad_group.cpm_bid_micros":10000,"ad_group.cpv_bid_micros":0,"ad_group.display_custom_bid_dimension":"UNSPECIFIED","ad_group.effective_target_cpa_micros":0,"ad_group.effective_target_cpa_source":"UNSPECIFIED","ad_group.effective_target_roas":0.0,"ad_group.effective_target_roas_source":"UNSPECIFIED","ad_group.excluded_parent_asset_field_types":[],"ad_group.optimized_targeting_enabled":false,"ad_group.final_url_suffix":"","ad_group.id":137020701042,"ad_group.labels":[],"ad_group.name":"Группа объявлений 2","ad_group.percent_cpc_bid_micros":0,"ad_group.resource_name":"customers/4651612872/adGroups/137020701042","ad_group.status":"ENABLED","ad_group.target_cpa_micros":0,"ad_group.target_cpm_micros":10000,"ad_group.target_roas":0.0,"ad_group.targeting_setting.target_restrictions":["targeting_dimension: AUDIENCE\nbid_only: true\n","targeting_dimension: AGE_RANGE\nbid_only: true\n","targeting_dimension: GENDER\nbid_only: true\n","targeting_dimension: PARENTAL_STATUS\nbid_only: true\n","targeting_dimension: INCOME_RANGE\nbid_only: true\n"],"ad_group.tracking_url_template":"","ad_group.type":"SEARCH_STANDARD","ad_group.url_custom_parameters":[],"segments.date":"2022-04-09"},"emitted_at":1679577823326} -{"stream":"ad_groups","data":{"ad_group.ad_rotation_mode":"UNSPECIFIED","ad_group.base_ad_group":"customers/4651612872/adGroups/137051662444","ad_group.campaign":"customers/4651612872/campaigns/16820250687","ad_group.cpc_bid_micros":10000,"ad_group.cpm_bid_micros":10000,"ad_group.cpv_bid_micros":0,"ad_group.display_custom_bid_dimension":"UNSPECIFIED","ad_group.effective_target_cpa_micros":0,"ad_group.effective_target_cpa_source":"UNSPECIFIED","ad_group.effective_target_roas":0.0,"ad_group.effective_target_roas_source":"UNSPECIFIED","ad_group.excluded_parent_asset_field_types":[],"ad_group.optimized_targeting_enabled":false,"ad_group.final_url_suffix":"","ad_group.id":137051662444,"ad_group.labels":[],"ad_group.name":"Группа объявлений 1","ad_group.percent_cpc_bid_micros":0,"ad_group.resource_name":"customers/4651612872/adGroups/137051662444","ad_group.status":"ENABLED","ad_group.target_cpa_micros":0,"ad_group.target_cpm_micros":10000,"ad_group.target_roas":0.0,"ad_group.targeting_setting.target_restrictions":["targeting_dimension: AUDIENCE\nbid_only: true\n","targeting_dimension: AGE_RANGE\nbid_only: true\n","targeting_dimension: GENDER\nbid_only: true\n","targeting_dimension: PARENTAL_STATUS\nbid_only: true\n","targeting_dimension: INCOME_RANGE\nbid_only: true\n"],"ad_group.tracking_url_template":"","ad_group.type":"SEARCH_STANDARD","ad_group.url_custom_parameters":[],"segments.date":"2022-04-09"},"emitted_at":1679577823327} -{"stream":"ad_groups","data":{"ad_group.ad_rotation_mode":"UNSPECIFIED","ad_group.base_ad_group":"customers/4651612872/adGroups/137020701042","ad_group.campaign":"customers/4651612872/campaigns/16820250687","ad_group.cpc_bid_micros":10000,"ad_group.cpm_bid_micros":10000,"ad_group.cpv_bid_micros":0,"ad_group.display_custom_bid_dimension":"UNSPECIFIED","ad_group.effective_target_cpa_micros":0,"ad_group.effective_target_cpa_source":"UNSPECIFIED","ad_group.effective_target_roas":0.0,"ad_group.effective_target_roas_source":"UNSPECIFIED","ad_group.excluded_parent_asset_field_types":[],"ad_group.optimized_targeting_enabled":false,"ad_group.final_url_suffix":"","ad_group.id":137020701042,"ad_group.labels":[],"ad_group.name":"Группа объявлений 2","ad_group.percent_cpc_bid_micros":0,"ad_group.resource_name":"customers/4651612872/adGroups/137020701042","ad_group.status":"ENABLED","ad_group.target_cpa_micros":0,"ad_group.target_cpm_micros":10000,"ad_group.target_roas":0.0,"ad_group.targeting_setting.target_restrictions":["targeting_dimension: AUDIENCE\nbid_only: true\n","targeting_dimension: AGE_RANGE\nbid_only: true\n","targeting_dimension: GENDER\nbid_only: true\n","targeting_dimension: PARENTAL_STATUS\nbid_only: true\n","targeting_dimension: INCOME_RANGE\nbid_only: true\n"],"ad_group.tracking_url_template":"","ad_group.type":"SEARCH_STANDARD","ad_group.url_custom_parameters":[],"segments.date":"2022-04-10"},"emitted_at":1679577823328} -{"stream":"ad_groups","data":{"ad_group.ad_rotation_mode":"UNSPECIFIED","ad_group.base_ad_group":"customers/4651612872/adGroups/137051662444","ad_group.campaign":"customers/4651612872/campaigns/16820250687","ad_group.cpc_bid_micros":10000,"ad_group.cpm_bid_micros":10000,"ad_group.cpv_bid_micros":0,"ad_group.display_custom_bid_dimension":"UNSPECIFIED","ad_group.effective_target_cpa_micros":0,"ad_group.effective_target_cpa_source":"UNSPECIFIED","ad_group.effective_target_roas":0.0,"ad_group.effective_target_roas_source":"UNSPECIFIED","ad_group.excluded_parent_asset_field_types":[],"ad_group.optimized_targeting_enabled":false,"ad_group.final_url_suffix":"","ad_group.id":137051662444,"ad_group.labels":[],"ad_group.name":"Группа объявлений 1","ad_group.percent_cpc_bid_micros":0,"ad_group.resource_name":"customers/4651612872/adGroups/137051662444","ad_group.status":"ENABLED","ad_group.target_cpa_micros":0,"ad_group.target_cpm_micros":10000,"ad_group.target_roas":0.0,"ad_group.targeting_setting.target_restrictions":["targeting_dimension: AUDIENCE\nbid_only: true\n","targeting_dimension: AGE_RANGE\nbid_only: true\n","targeting_dimension: GENDER\nbid_only: true\n","targeting_dimension: PARENTAL_STATUS\nbid_only: true\n","targeting_dimension: INCOME_RANGE\nbid_only: true\n"],"ad_group.tracking_url_template":"","ad_group.type":"SEARCH_STANDARD","ad_group.url_custom_parameters":[],"segments.date":"2022-04-10"},"emitted_at":1679577823329} +{"stream": "ad_group_ad_legacy", "data": {"ad_group_ad.ad.legacy_responsive_display_ad.accent_color": "", "ad_group.id": 137020701042, "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "ad_group_ad.ad_group": "customers/4651612872/adGroups/137020701042", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.status": "ENABLED", "segments.ad_network_type": "SEARCH", "ad_group_ad.ad_strength": "POOR", "ad_group_ad.ad.type": "RESPONSIVE_SEARCH_AD", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.added_by_google_ads": false, "metrics.average_cost": 197500.0, "metrics.average_cpc": 197500.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 19750000.0, "metrics.average_cpv": 0.0, "metrics.average_page_views": 0.0, "metrics.average_time_on_site": 0.0, "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "metrics.bounce_rate": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.business_name": "", "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": "", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "metrics.clicks": 4, "ad_group_ad.policy_summary.approval_status": "APPROVED", "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 790000, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cost_per_current_model_attributed_conversion": 0.0, "ad_group_ad.ad.final_mobile_urls": [], "ad_group_ad.ad.final_urls": ["https://airbyte.com"], "ad_group_ad.ad.tracking_url_template": "", "ad_group_ad.ad.url_custom_parameters": [], "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.1, "metrics.current_model_attributed_conversions_value": 0.0, "metrics.current_model_attributed_conversions": 0.0, "segments.date": "2022-05-18", "segments.day_of_week": "WEDNESDAY", "ad_group_ad.ad.expanded_text_ad.description": "", "ad_group_ad.ad.text_ad.description1": "", "ad_group_ad.ad.text_ad.description2": "", "ad_group_ad.ad.device_preference": "UNSPECIFIED", "ad_group_ad.ad.display_url": "", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description": "", "ad_group_ad.ad.expanded_text_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.headline_part3": "", "customer.id": 4651612872, "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": "UNSPECIFIED", "metrics.gmail_forwards": 0, "metrics.gmail_saves": 0, "metrics.gmail_secondary_clicks": 0, "ad_group_ad.ad.text_ad.headline": "", "ad_group_ad.ad.expanded_text_ad.headline_part1": "", "ad_group_ad.ad.expanded_text_ad.headline_part2": "", "ad_group_ad.ad.id": 592078631218, "ad_group_ad.ad.image_ad.image_url": "", "ad_group_ad.ad.image_ad.pixel_height": 0, "ad_group_ad.ad.image_ad.pixel_width": 0, "ad_group_ad.ad.image_ad.mime_type": "UNSPECIFIED", "ad_group_ad.ad.image_ad.name": "", "metrics.impressions": 40, "metrics.interaction_rate": 0.1, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interactions": 4, "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.main_color": "", "segments.month": "2022-05-01", "ad_group_ad.ad.responsive_display_ad.accent_color": "", "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.responsive_display_ad.business_name": "", "ad_group_ad.ad.responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.responsive_display_ad.descriptions": [], "ad_group_ad.ad.responsive_display_ad.price_prefix": "", "ad_group_ad.ad.responsive_display_ad.promo_text": "", "ad_group_ad.ad.responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.responsive_display_ad.headlines": [], "ad_group_ad.ad.responsive_display_ad.logo_images": [], "ad_group_ad.ad.responsive_display_ad.square_logo_images": [], "ad_group_ad.ad.responsive_display_ad.long_headline": "", "ad_group_ad.ad.responsive_display_ad.main_color": "", "ad_group_ad.ad.responsive_display_ad.marketing_images": [], "ad_group_ad.ad.responsive_display_ad.square_marketing_images": [], "ad_group_ad.ad.responsive_display_ad.youtube_videos": [], "ad_group_ad.ad.expanded_text_ad.path1": "", "ad_group_ad.ad.expanded_text_ad.path2": "", "metrics.percent_new_visitors": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": "", "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": "", "segments.quarter": "2022-04-01", "ad_group_ad.ad.responsive_search_ad.descriptions": ["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Consolidate your data in your data warehouses, lakes and databases\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.headlines": ["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.path1": "", "ad_group_ad.ad.responsive_search_ad.path2": "", "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": "", "ad_group_ad.status": "ENABLED", "ad_group_ad.ad.system_managed_resource_source": "UNSPECIFIED", "metrics.top_impression_percentage": 0.75, "ad_group_ad.ad.app_ad.descriptions": [], "ad_group_ad.ad.app_ad.headlines": [], "ad_group_ad.ad.app_ad.html5_media_bundles": [], "ad_group_ad.ad.app_ad.images": [], "ad_group_ad.ad.app_ad.mandatory_ad_text": "", "ad_group_ad.ad.app_ad.youtube_videos": [], "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.value_per_current_model_attributed_conversion": 0.0, "metrics.video_quartile_p100_rate": 0.0, "metrics.video_quartile_p25_rate": 0.0, "metrics.video_quartile_p50_rate": 0.0, "metrics.video_quartile_p75_rate": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-05-16", "segments.year": 2022}, "emitted_at": 1704407744443} +{"stream": "ad_group_ad_legacy", "data": {"ad_group_ad.ad.legacy_responsive_display_ad.accent_color": "", "ad_group.id": 137020701042, "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "ad_group_ad.ad_group": "customers/4651612872/adGroups/137020701042", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.status": "ENABLED", "segments.ad_network_type": "SEARCH_PARTNERS", "ad_group_ad.ad_strength": "POOR", "ad_group_ad.ad.type": "RESPONSIVE_SEARCH_AD", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.added_by_google_ads": false, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.average_page_views": 0.0, "metrics.average_time_on_site": 0.0, "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "metrics.bounce_rate": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.business_name": "", "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": "", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "metrics.clicks": 0, "ad_group_ad.policy_summary.approval_status": "APPROVED", "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cost_per_current_model_attributed_conversion": 0.0, "ad_group_ad.ad.final_mobile_urls": [], "ad_group_ad.ad.final_urls": ["https://airbyte.com"], "ad_group_ad.ad.tracking_url_template": "", "ad_group_ad.ad.url_custom_parameters": [], "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.current_model_attributed_conversions_value": 0.0, "metrics.current_model_attributed_conversions": 0.0, "segments.date": "2022-05-18", "segments.day_of_week": "WEDNESDAY", "ad_group_ad.ad.expanded_text_ad.description": "", "ad_group_ad.ad.text_ad.description1": "", "ad_group_ad.ad.text_ad.description2": "", "ad_group_ad.ad.device_preference": "UNSPECIFIED", "ad_group_ad.ad.display_url": "", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description": "", "ad_group_ad.ad.expanded_text_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.headline_part3": "", "customer.id": 4651612872, "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": "UNSPECIFIED", "metrics.gmail_forwards": 0, "metrics.gmail_saves": 0, "metrics.gmail_secondary_clicks": 0, "ad_group_ad.ad.text_ad.headline": "", "ad_group_ad.ad.expanded_text_ad.headline_part1": "", "ad_group_ad.ad.expanded_text_ad.headline_part2": "", "ad_group_ad.ad.id": 592078631218, "ad_group_ad.ad.image_ad.image_url": "", "ad_group_ad.ad.image_ad.pixel_height": 0, "ad_group_ad.ad.image_ad.pixel_width": 0, "ad_group_ad.ad.image_ad.mime_type": "UNSPECIFIED", "ad_group_ad.ad.image_ad.name": "", "metrics.impressions": 11, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.main_color": "", "segments.month": "2022-05-01", "ad_group_ad.ad.responsive_display_ad.accent_color": "", "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.responsive_display_ad.business_name": "", "ad_group_ad.ad.responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.responsive_display_ad.descriptions": [], "ad_group_ad.ad.responsive_display_ad.price_prefix": "", "ad_group_ad.ad.responsive_display_ad.promo_text": "", "ad_group_ad.ad.responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.responsive_display_ad.headlines": [], "ad_group_ad.ad.responsive_display_ad.logo_images": [], "ad_group_ad.ad.responsive_display_ad.square_logo_images": [], "ad_group_ad.ad.responsive_display_ad.long_headline": "", "ad_group_ad.ad.responsive_display_ad.main_color": "", "ad_group_ad.ad.responsive_display_ad.marketing_images": [], "ad_group_ad.ad.responsive_display_ad.square_marketing_images": [], "ad_group_ad.ad.responsive_display_ad.youtube_videos": [], "ad_group_ad.ad.expanded_text_ad.path1": "", "ad_group_ad.ad.expanded_text_ad.path2": "", "metrics.percent_new_visitors": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": "", "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": "", "segments.quarter": "2022-04-01", "ad_group_ad.ad.responsive_search_ad.descriptions": ["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Consolidate your data in your data warehouses, lakes and databases\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.headlines": ["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.path1": "", "ad_group_ad.ad.responsive_search_ad.path2": "", "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": "", "ad_group_ad.status": "ENABLED", "ad_group_ad.ad.system_managed_resource_source": "UNSPECIFIED", "metrics.top_impression_percentage": 0.0, "ad_group_ad.ad.app_ad.descriptions": [], "ad_group_ad.ad.app_ad.headlines": [], "ad_group_ad.ad.app_ad.html5_media_bundles": [], "ad_group_ad.ad.app_ad.images": [], "ad_group_ad.ad.app_ad.mandatory_ad_text": "", "ad_group_ad.ad.app_ad.youtube_videos": [], "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.value_per_current_model_attributed_conversion": 0.0, "metrics.video_quartile_p100_rate": 0.0, "metrics.video_quartile_p25_rate": 0.0, "metrics.video_quartile_p50_rate": 0.0, "metrics.video_quartile_p75_rate": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-05-16", "segments.year": 2022}, "emitted_at": 1704407744444} +{"stream": "ad_group_ad_legacy", "data": {"ad_group_ad.ad.legacy_responsive_display_ad.accent_color": "", "ad_group.id": 137020701042, "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "ad_group_ad.ad_group": "customers/4651612872/adGroups/137020701042", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.status": "ENABLED", "segments.ad_network_type": "SEARCH", "ad_group_ad.ad_strength": "POOR", "ad_group_ad.ad.type": "RESPONSIVE_SEARCH_AD", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.added_by_google_ads": false, "metrics.average_cost": 143333.33333333334, "metrics.average_cpc": 143333.33333333334, "metrics.average_cpe": 0.0, "metrics.average_cpm": 37391304.347826086, "metrics.average_cpv": 0.0, "metrics.average_page_views": 0.0, "metrics.average_time_on_site": 0.0, "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "metrics.bounce_rate": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.business_name": "", "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": "", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "metrics.clicks": 6, "ad_group_ad.policy_summary.approval_status": "APPROVED", "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 860000, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cost_per_current_model_attributed_conversion": 0.0, "ad_group_ad.ad.final_mobile_urls": [], "ad_group_ad.ad.final_urls": ["https://airbyte.com"], "ad_group_ad.ad.tracking_url_template": "", "ad_group_ad.ad.url_custom_parameters": [], "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.2608695652173913, "metrics.current_model_attributed_conversions_value": 0.0, "metrics.current_model_attributed_conversions": 0.0, "segments.date": "2022-05-19", "segments.day_of_week": "THURSDAY", "ad_group_ad.ad.expanded_text_ad.description": "", "ad_group_ad.ad.text_ad.description1": "", "ad_group_ad.ad.text_ad.description2": "", "ad_group_ad.ad.device_preference": "UNSPECIFIED", "ad_group_ad.ad.display_url": "", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description": "", "ad_group_ad.ad.expanded_text_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.headline_part3": "", "customer.id": 4651612872, "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": "UNSPECIFIED", "metrics.gmail_forwards": 0, "metrics.gmail_saves": 0, "metrics.gmail_secondary_clicks": 0, "ad_group_ad.ad.text_ad.headline": "", "ad_group_ad.ad.expanded_text_ad.headline_part1": "", "ad_group_ad.ad.expanded_text_ad.headline_part2": "", "ad_group_ad.ad.id": 592078631218, "ad_group_ad.ad.image_ad.image_url": "", "ad_group_ad.ad.image_ad.pixel_height": 0, "ad_group_ad.ad.image_ad.pixel_width": 0, "ad_group_ad.ad.image_ad.mime_type": "UNSPECIFIED", "ad_group_ad.ad.image_ad.name": "", "metrics.impressions": 23, "metrics.interaction_rate": 0.2608695652173913, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interactions": 6, "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.main_color": "", "segments.month": "2022-05-01", "ad_group_ad.ad.responsive_display_ad.accent_color": "", "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.responsive_display_ad.business_name": "", "ad_group_ad.ad.responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.responsive_display_ad.descriptions": [], "ad_group_ad.ad.responsive_display_ad.price_prefix": "", "ad_group_ad.ad.responsive_display_ad.promo_text": "", "ad_group_ad.ad.responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.responsive_display_ad.headlines": [], "ad_group_ad.ad.responsive_display_ad.logo_images": [], "ad_group_ad.ad.responsive_display_ad.square_logo_images": [], "ad_group_ad.ad.responsive_display_ad.long_headline": "", "ad_group_ad.ad.responsive_display_ad.main_color": "", "ad_group_ad.ad.responsive_display_ad.marketing_images": [], "ad_group_ad.ad.responsive_display_ad.square_marketing_images": [], "ad_group_ad.ad.responsive_display_ad.youtube_videos": [], "ad_group_ad.ad.expanded_text_ad.path1": "", "ad_group_ad.ad.expanded_text_ad.path2": "", "metrics.percent_new_visitors": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": "", "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": "", "segments.quarter": "2022-04-01", "ad_group_ad.ad.responsive_search_ad.descriptions": ["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Consolidate your data in your data warehouses, lakes and databases\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.headlines": ["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.path1": "", "ad_group_ad.ad.responsive_search_ad.path2": "", "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": "", "ad_group_ad.status": "ENABLED", "ad_group_ad.ad.system_managed_resource_source": "UNSPECIFIED", "metrics.top_impression_percentage": 0.7391304347826086, "ad_group_ad.ad.app_ad.descriptions": [], "ad_group_ad.ad.app_ad.headlines": [], "ad_group_ad.ad.app_ad.html5_media_bundles": [], "ad_group_ad.ad.app_ad.images": [], "ad_group_ad.ad.app_ad.mandatory_ad_text": "", "ad_group_ad.ad.app_ad.youtube_videos": [], "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.value_per_current_model_attributed_conversion": 0.0, "metrics.video_quartile_p100_rate": 0.0, "metrics.video_quartile_p25_rate": 0.0, "metrics.video_quartile_p50_rate": 0.0, "metrics.video_quartile_p75_rate": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-05-16", "segments.year": 2022}, "emitted_at": 1704407744444} +{"stream": "campaign_budget", "data": {"customer.id": 4651612872, "campaign.id": 16820250687, "campaign_budget.aligned_bidding_strategy_id": 0, "campaign_budget.amount_micros": 750000, "campaign_budget.delivery_method": "STANDARD", "campaign_budget.explicitly_shared": false, "campaign_budget.has_recommended_budget": false, "campaign_budget.id": 10695604507, "campaign_budget.name": "Website traffic-Search-15", "campaign_budget.period": "DAILY", "campaign_budget.recommended_budget_amount_micros": 0, "campaign_budget.recommended_budget_estimated_change_weekly_clicks": 0, "campaign_budget.recommended_budget_estimated_change_weekly_cost_micros": 0, "campaign_budget.recommended_budget_estimated_change_weekly_interactions": 0, "campaign_budget.recommended_budget_estimated_change_weekly_views": 0, "campaign_budget.reference_count": 0, "campaign_budget.resource_name": "customers/4651612872/campaignBudgets/10695604507", "campaign_budget.status": "REMOVED", "campaign_budget.total_amount_micros": 0, "campaign_budget.type": "STANDARD", "segments.date": "2022-05-18", "segments.budget_campaign_association_status.campaign": "customers/4651612872/campaigns/16820250687", "segments.budget_campaign_association_status.status": "REMOVED", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 197500.0, "metrics.average_cpc": 197500.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 15490196.078431372, "metrics.average_cpv": 0.0, "metrics.clicks": 4, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 790000, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0784313725490196, "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "metrics.impressions": 51, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interaction_rate": 0.0784313725490196, "metrics.interactions": 4, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1704407746549} +{"stream": "campaign_budget", "data": {"customer.id": 4651612872, "campaign.id": 16820250687, "campaign_budget.aligned_bidding_strategy_id": 0, "campaign_budget.amount_micros": 750000, "campaign_budget.delivery_method": "STANDARD", "campaign_budget.explicitly_shared": false, "campaign_budget.has_recommended_budget": false, "campaign_budget.id": 10695604507, "campaign_budget.name": "Website traffic-Search-15", "campaign_budget.period": "DAILY", "campaign_budget.recommended_budget_amount_micros": 0, "campaign_budget.recommended_budget_estimated_change_weekly_clicks": 0, "campaign_budget.recommended_budget_estimated_change_weekly_cost_micros": 0, "campaign_budget.recommended_budget_estimated_change_weekly_interactions": 0, "campaign_budget.recommended_budget_estimated_change_weekly_views": 0, "campaign_budget.reference_count": 0, "campaign_budget.resource_name": "customers/4651612872/campaignBudgets/10695604507", "campaign_budget.status": "REMOVED", "campaign_budget.total_amount_micros": 0, "campaign_budget.type": "STANDARD", "segments.date": "2022-05-19", "segments.budget_campaign_association_status.campaign": "customers/4651612872/campaigns/16820250687", "segments.budget_campaign_association_status.status": "REMOVED", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 143333.33333333334, "metrics.average_cpc": 143333.33333333334, "metrics.average_cpe": 0.0, "metrics.average_cpm": 31851851.85185185, "metrics.average_cpv": 0.0, "metrics.clicks": 6, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 860000, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.2222222222222222, "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "metrics.impressions": 27, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interaction_rate": 0.2222222222222222, "metrics.interactions": 6, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1704407746559} +{"stream": "campaign_budget", "data": {"customer.id": 4651612872, "campaign.id": 16820250687, "campaign_budget.aligned_bidding_strategy_id": 0, "campaign_budget.amount_micros": 750000, "campaign_budget.delivery_method": "STANDARD", "campaign_budget.explicitly_shared": false, "campaign_budget.has_recommended_budget": false, "campaign_budget.id": 10695604507, "campaign_budget.name": "Website traffic-Search-15", "campaign_budget.period": "DAILY", "campaign_budget.recommended_budget_amount_micros": 0, "campaign_budget.recommended_budget_estimated_change_weekly_clicks": 0, "campaign_budget.recommended_budget_estimated_change_weekly_cost_micros": 0, "campaign_budget.recommended_budget_estimated_change_weekly_interactions": 0, "campaign_budget.recommended_budget_estimated_change_weekly_views": 0, "campaign_budget.reference_count": 0, "campaign_budget.resource_name": "customers/4651612872/campaignBudgets/10695604507", "campaign_budget.status": "REMOVED", "campaign_budget.total_amount_micros": 0, "campaign_budget.type": "STANDARD", "segments.date": "2022-05-20", "segments.budget_campaign_association_status.campaign": "customers/4651612872/campaigns/16820250687", "segments.budget_campaign_association_status.status": "REMOVED", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 215000.0, "metrics.average_cpc": 215000.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 16538461.53846154, "metrics.average_cpv": 0.0, "metrics.clicks": 2, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 430000, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.07692307692307693, "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "metrics.impressions": 26, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interaction_rate": 0.07692307692307693, "metrics.interactions": 2, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1704407746561} +{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-05-18"}, "emitted_at": 1704407754204} +{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-05-19"}, "emitted_at": 1704407754210} +{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2022-05-20"}, "emitted_at": 1704407754210} +{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 253333.33333333334, "metrics.average_cpc": 253333.33333333334, "metrics.average_cpe": 0.0, "metrics.average_cpm": 27142857.14285714, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 3, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 760000, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.10714285714285714, "segments.date": "2022-05-18", "segments.day_of_week": "WEDNESDAY", "segments.device": "DESKTOP", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 28, "metrics.interaction_rate": 0.10714285714285714, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interactions": 3, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-05-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.6935849056603773, "metrics.search_exact_match_impression_share": 0.0999, "metrics.search_impression_share": 0.0999, "metrics.search_rank_lost_impression_share": 0.2852830188679245, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-05-16", "segments.year": 2022}, "emitted_at": 1704407755279} +{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 30000.0, "metrics.average_cpc": 30000.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 2500000.0, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 1, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 30000, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.08333333333333333, "segments.date": "2022-05-18", "segments.day_of_week": "WEDNESDAY", "segments.device": "MOBILE", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 12, "metrics.interaction_rate": 0.08333333333333333, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interactions": 1, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-05-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.7254437869822485, "metrics.search_exact_match_impression_share": 0.0999, "metrics.search_impression_share": 0.0999, "metrics.search_rank_lost_impression_share": 0.2603550295857988, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-05-16", "segments.year": 2022}, "emitted_at": 1704407755286} +{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 0, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.date": "2022-05-18", "segments.day_of_week": "WEDNESDAY", "segments.device": "TABLET", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 0, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2022-05-01", "segments.quarter": "2022-04-01", "metrics.search_budget_lost_impression_share": 0.9001, "metrics.search_exact_match_impression_share": 0.0999, "metrics.search_impression_share": 0.0999, "metrics.search_rank_lost_impression_share": 0.0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-05-16", "segments.year": 2022}, "emitted_at": 1704407755286} +{"stream": "geographic_view", "data": {"customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "geographic_view.country_criterion_id": 2840, "geographic_view.location_type": "AREA_OF_INTEREST", "ad_group.id": 137020701042, "segments.date": "2022-05-18"}, "emitted_at": 1704407756403} +{"stream": "geographic_view", "data": {"customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "geographic_view.country_criterion_id": 2124, "geographic_view.location_type": "LOCATION_OF_PRESENCE", "ad_group.id": 137020701042, "segments.date": "2022-05-18"}, "emitted_at": 1704407756404} +{"stream": "geographic_view", "data": {"customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "geographic_view.country_criterion_id": 2840, "geographic_view.location_type": "LOCATION_OF_PRESENCE", "ad_group.id": 137020701042, "segments.date": "2022-05-18"}, "emitted_at": 1704407756405} +{"stream": "keyword_view", "data": {"customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "campaign.id": 16820250687, "ad_group.id": 137020701042, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "data integration software", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 0, "metrics.ctr": 0.0, "segments.date": "2022-05-18", "campaign.bidding_strategy_type": "MAXIMIZE_CONVERSIONS", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 2, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "metrics.conversions": 0.0, "metrics.conversions_value": 0.0, "metrics.interactions": 0, "metrics.interaction_event_types": [], "metrics.view_through_conversions": 0, "ad_group_criterion.criterion_id": 18697003}, "emitted_at": 1704407757564} +{"stream": "keyword_view", "data": {"customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "campaign.id": 16820250687, "ad_group.id": 137020701042, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "informatica software", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 0, "metrics.ctr": 0.0, "segments.date": "2022-05-18", "campaign.bidding_strategy_type": "MAXIMIZE_CONVERSIONS", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 3, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "metrics.conversions": 0.0, "metrics.conversions_value": 0.0, "metrics.interactions": 0, "metrics.interaction_event_types": [], "metrics.view_through_conversions": 0, "ad_group_criterion.criterion_id": 27723800}, "emitted_at": 1704407757565} +{"stream": "keyword_view", "data": {"customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "campaign.id": 16820250687, "ad_group.id": 137020701042, "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.keyword.text": "etl extract transform load", "ad_group_criterion.negative": false, "ad_group_criterion.keyword.match_type": "BROAD", "metrics.historical_quality_score": 0, "metrics.ctr": 0.0, "segments.date": "2022-05-18", "campaign.bidding_strategy_type": "MAXIMIZE_CONVERSIONS", "metrics.clicks": 0, "metrics.cost_micros": 0, "metrics.impressions": 4, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "metrics.conversions": 0.0, "metrics.conversions_value": 0.0, "metrics.interactions": 0, "metrics.interaction_event_types": [], "metrics.view_through_conversions": 0, "ad_group_criterion.criterion_id": 439152736}, "emitted_at": 1704407757565} +{"stream": "display_keyword_view", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 10012000.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 1, "metrics.active_view_measurability": 1.0, "metrics.active_view_measurable_cost_micros": 10012, "metrics.active_view_measurable_impressions": 1, "metrics.active_view_viewability": 1.0, "ad_group.id": 143992182864, "ad_group.name": "Video Non-skippable - 2022-05-30", "ad_group.status": "ENABLED", "segments.ad_network_type": "YOUTUBE", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 10012000.0, "metrics.average_cpv": 0.0, "ad_group.base_ad_group": "customers/4651612872/adGroups/143992182864", "campaign.base_campaign": "customers/4651612872/campaigns/17354032686", "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "TARGET_CPM", "campaign.id": 17354032686, "campaign.name": "Video Non-skippable - 2022-05-30", "campaign.status": "ENABLED", "metrics.clicks": 0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 10012, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "ad_group_criterion.effective_cpc_bid_micros": 10000, "ad_group_criterion.effective_cpc_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpm_bid_micros": 10000, "ad_group_criterion.effective_cpm_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpv_bid_micros": 10000, "ad_group_criterion.effective_cpv_bid_source": "AD_GROUP", "ad_group_criterion.keyword.text": "big data software", "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.day_of_week": "TUESDAY", "segments.device": "MOBILE", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "ad_group_criterion.final_mobile_urls": [], "ad_group_criterion.final_urls": [], "metrics.gmail_forwards": 0, "metrics.gmail_saves": 0, "metrics.gmail_secondary_clicks": 0, "ad_group_criterion.criterion_id": 26160872903, "metrics.impressions": 1, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "ad_group_criterion.negative": false, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n", "targeting_dimension: TOPIC\nbid_only: false\n"], "segments.month": "2022-05-01", "segments.quarter": "2022-04-01", "ad_group_criterion.status": "ENABLED", "ad_group_criterion.tracking_url_template": "", "ad_group_criterion.keyword.match_type": "BROAD", "ad_group_criterion.url_custom_parameters": [], "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_quartile_p100_rate": 0.0, "metrics.video_quartile_p25_rate": 0.0, "metrics.video_quartile_p50_rate": 0.0, "metrics.video_quartile_p75_rate": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2022-05-30", "segments.year": 2022, "segments.date": "2022-05-31"}, "emitted_at": 1704407759165} +{"stream": "ad_group_ad", "data": {"ad_group.id": 137020701042, "ad_group_ad.ad.added_by_google_ads": false, "ad_group_ad.ad.app_ad.descriptions": [], "ad_group_ad.ad.app_ad.headlines": [], "ad_group_ad.ad.app_ad.html5_media_bundles": [], "ad_group_ad.ad.app_ad.images": [], "ad_group_ad.ad.app_ad.mandatory_ad_text": "", "ad_group_ad.ad.app_ad.youtube_videos": [], "ad_group_ad.ad.app_engagement_ad.descriptions": [], "ad_group_ad.ad.app_engagement_ad.headlines": [], "ad_group_ad.ad.app_engagement_ad.images": [], "ad_group_ad.ad.app_engagement_ad.videos": [], "ad_group_ad.ad.call_ad.business_name": "", "ad_group_ad.ad.call_ad.call_tracked": false, "ad_group_ad.ad.call_ad.conversion_action": "", "ad_group_ad.ad.call_ad.conversion_reporting_state": "UNSPECIFIED", "ad_group_ad.ad.call_ad.country_code": "", "ad_group_ad.ad.call_ad.description1": "", "ad_group_ad.ad.call_ad.description2": "", "ad_group_ad.ad.call_ad.disable_call_conversion": false, "ad_group_ad.ad.call_ad.headline1": "", "ad_group_ad.ad.call_ad.headline2": "", "ad_group_ad.ad.call_ad.path1": "", "ad_group_ad.ad.call_ad.path2": "", "ad_group_ad.ad.call_ad.phone_number": "", "ad_group_ad.ad.call_ad.phone_number_verification_url": "", "ad_group_ad.ad.device_preference": "UNSPECIFIED", "ad_group_ad.ad.display_upload_ad.display_upload_product_type": "UNSPECIFIED", "ad_group_ad.ad.display_upload_ad.media_bundle": "", "ad_group_ad.ad.display_url": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.description": "", "ad_group_ad.ad.expanded_text_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.headline_part1": "", "ad_group_ad.ad.expanded_text_ad.headline_part2": "", "ad_group_ad.ad.expanded_text_ad.headline_part3": "", "ad_group_ad.ad.expanded_text_ad.path1": "", "ad_group_ad.ad.expanded_text_ad.path2": "", "ad_group_ad.ad.final_app_urls": [], "ad_group_ad.ad.final_mobile_urls": [], "ad_group_ad.ad.final_url_suffix": "", "ad_group_ad.ad.final_urls": ["https://airbyte.com"], "ad_group_ad.ad.hotel_ad": "", "ad_group_ad.ad.id": 592078631218, "ad_group_ad.ad.image_ad.image_url": "", "ad_group_ad.ad.image_ad.mime_type": "UNSPECIFIED", "ad_group_ad.ad.image_ad.name": "", "ad_group_ad.ad.image_ad.pixel_height": 0, "ad_group_ad.ad.image_ad.pixel_width": 0, "ad_group_ad.ad.image_ad.preview_image_url": "", "ad_group_ad.ad.image_ad.preview_pixel_height": 0, "ad_group_ad.ad.image_ad.preview_pixel_width": 0, "ad_group_ad.ad.legacy_app_install_ad": "", "ad_group_ad.ad.legacy_responsive_display_ad.accent_color": "", "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.legacy_responsive_display_ad.business_name": "", "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.legacy_responsive_display_ad.description": "", "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.main_color": "", "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": "", "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": "", "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": "", "ad_group_ad.ad.local_ad.call_to_actions": [], "ad_group_ad.ad.local_ad.descriptions": [], "ad_group_ad.ad.local_ad.headlines": [], "ad_group_ad.ad.local_ad.logo_images": [], "ad_group_ad.ad.local_ad.marketing_images": [], "ad_group_ad.ad.local_ad.path1": "", "ad_group_ad.ad.local_ad.path2": "", "ad_group_ad.ad.local_ad.videos": [], "ad_group_ad.ad.name": "", "ad_group_ad.ad.resource_name": "customers/4651612872/ads/592078631218", "ad_group_ad.ad.responsive_display_ad.accent_color": "", "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.responsive_display_ad.business_name": "", "ad_group_ad.ad.responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.responsive_display_ad.control_spec.enable_asset_enhancements": false, "ad_group_ad.ad.responsive_display_ad.control_spec.enable_autogen_video": false, "ad_group_ad.ad.responsive_display_ad.descriptions": [], "ad_group_ad.ad.responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.responsive_display_ad.headlines": [], "ad_group_ad.ad.responsive_display_ad.logo_images": [], "ad_group_ad.ad.responsive_display_ad.long_headline": "", "ad_group_ad.ad.responsive_display_ad.main_color": "", "ad_group_ad.ad.responsive_display_ad.marketing_images": [], "ad_group_ad.ad.responsive_display_ad.price_prefix": "", "ad_group_ad.ad.responsive_display_ad.promo_text": "", "ad_group_ad.ad.responsive_display_ad.square_logo_images": [], "ad_group_ad.ad.responsive_display_ad.square_marketing_images": [], "ad_group_ad.ad.responsive_display_ad.youtube_videos": [], "ad_group_ad.ad.responsive_search_ad.descriptions": ["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Consolidate your data in your data warehouses, lakes and databases\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.headlines": ["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.path1": "", "ad_group_ad.ad.responsive_search_ad.path2": "", "ad_group_ad.ad.shopping_comparison_listing_ad.headline": "", "ad_group_ad.ad.shopping_product_ad": "", "ad_group_ad.ad.shopping_smart_ad": "", "ad_group_ad.ad.smart_campaign_ad.descriptions": [], "ad_group_ad.ad.smart_campaign_ad.headlines": [], "ad_group_ad.ad.system_managed_resource_source": "UNSPECIFIED", "ad_group_ad.ad.text_ad.description1": "", "ad_group_ad.ad.text_ad.description2": "", "ad_group_ad.ad.text_ad.headline": "", "ad_group_ad.ad.tracking_url_template": "", "ad_group_ad.ad.type": "RESPONSIVE_SEARCH_AD", "ad_group_ad.ad.url_collections": [], "ad_group_ad.ad.url_custom_parameters": [], "ad_group_ad.ad.video_ad.in_feed.description1": "", "ad_group_ad.ad.video_ad.in_feed.description2": "", "ad_group_ad.ad.video_ad.in_feed.headline": "", "ad_group_ad.ad.video_ad.in_stream.action_button_label": "", "ad_group_ad.ad.video_ad.in_stream.action_headline": "", "ad_group_ad.ad.video_ad.out_stream.description": "", "ad_group_ad.ad.video_ad.out_stream.headline": "", "ad_group_ad.ad.video_responsive_ad.call_to_actions": [], "ad_group_ad.ad.video_responsive_ad.companion_banners": [], "ad_group_ad.ad.video_responsive_ad.descriptions": [], "ad_group_ad.ad.video_responsive_ad.headlines": [], "ad_group_ad.ad.video_responsive_ad.long_headlines": [], "ad_group_ad.ad.video_responsive_ad.videos": [], "ad_group_ad.ad_group": "customers/4651612872/adGroups/137020701042", "ad_group_ad.ad_strength": "POOR", "ad_group_ad.labels": ["customers/4651612872/labels/21906377810"], "ad_group_ad.policy_summary.approval_status": "APPROVED", "ad_group_ad.policy_summary.policy_topic_entries": [], "ad_group_ad.policy_summary.review_status": "REVIEWED", "ad_group_ad.resource_name": "customers/4651612872/adGroupAds/137020701042~592078631218", "ad_group_ad.status": "ENABLED", "segments.date": "2022-05-18"}, "emitted_at": 1704407765438} +{"stream": "ad_group_ad", "data": {"ad_group.id": 137020701042, "ad_group_ad.ad.added_by_google_ads": false, "ad_group_ad.ad.app_ad.descriptions": [], "ad_group_ad.ad.app_ad.headlines": [], "ad_group_ad.ad.app_ad.html5_media_bundles": [], "ad_group_ad.ad.app_ad.images": [], "ad_group_ad.ad.app_ad.mandatory_ad_text": "", "ad_group_ad.ad.app_ad.youtube_videos": [], "ad_group_ad.ad.app_engagement_ad.descriptions": [], "ad_group_ad.ad.app_engagement_ad.headlines": [], "ad_group_ad.ad.app_engagement_ad.images": [], "ad_group_ad.ad.app_engagement_ad.videos": [], "ad_group_ad.ad.call_ad.business_name": "", "ad_group_ad.ad.call_ad.call_tracked": false, "ad_group_ad.ad.call_ad.conversion_action": "", "ad_group_ad.ad.call_ad.conversion_reporting_state": "UNSPECIFIED", "ad_group_ad.ad.call_ad.country_code": "", "ad_group_ad.ad.call_ad.description1": "", "ad_group_ad.ad.call_ad.description2": "", "ad_group_ad.ad.call_ad.disable_call_conversion": false, "ad_group_ad.ad.call_ad.headline1": "", "ad_group_ad.ad.call_ad.headline2": "", "ad_group_ad.ad.call_ad.path1": "", "ad_group_ad.ad.call_ad.path2": "", "ad_group_ad.ad.call_ad.phone_number": "", "ad_group_ad.ad.call_ad.phone_number_verification_url": "", "ad_group_ad.ad.device_preference": "UNSPECIFIED", "ad_group_ad.ad.display_upload_ad.display_upload_product_type": "UNSPECIFIED", "ad_group_ad.ad.display_upload_ad.media_bundle": "", "ad_group_ad.ad.display_url": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.description": "", "ad_group_ad.ad.expanded_text_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.headline_part1": "", "ad_group_ad.ad.expanded_text_ad.headline_part2": "", "ad_group_ad.ad.expanded_text_ad.headline_part3": "", "ad_group_ad.ad.expanded_text_ad.path1": "", "ad_group_ad.ad.expanded_text_ad.path2": "", "ad_group_ad.ad.final_app_urls": [], "ad_group_ad.ad.final_mobile_urls": [], "ad_group_ad.ad.final_url_suffix": "", "ad_group_ad.ad.final_urls": ["https://airbyte.com"], "ad_group_ad.ad.hotel_ad": "", "ad_group_ad.ad.id": 592078631218, "ad_group_ad.ad.image_ad.image_url": "", "ad_group_ad.ad.image_ad.mime_type": "UNSPECIFIED", "ad_group_ad.ad.image_ad.name": "", "ad_group_ad.ad.image_ad.pixel_height": 0, "ad_group_ad.ad.image_ad.pixel_width": 0, "ad_group_ad.ad.image_ad.preview_image_url": "", "ad_group_ad.ad.image_ad.preview_pixel_height": 0, "ad_group_ad.ad.image_ad.preview_pixel_width": 0, "ad_group_ad.ad.legacy_app_install_ad": "", "ad_group_ad.ad.legacy_responsive_display_ad.accent_color": "", "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.legacy_responsive_display_ad.business_name": "", "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.legacy_responsive_display_ad.description": "", "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.main_color": "", "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": "", "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": "", "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": "", "ad_group_ad.ad.local_ad.call_to_actions": [], "ad_group_ad.ad.local_ad.descriptions": [], "ad_group_ad.ad.local_ad.headlines": [], "ad_group_ad.ad.local_ad.logo_images": [], "ad_group_ad.ad.local_ad.marketing_images": [], "ad_group_ad.ad.local_ad.path1": "", "ad_group_ad.ad.local_ad.path2": "", "ad_group_ad.ad.local_ad.videos": [], "ad_group_ad.ad.name": "", "ad_group_ad.ad.resource_name": "customers/4651612872/ads/592078631218", "ad_group_ad.ad.responsive_display_ad.accent_color": "", "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.responsive_display_ad.business_name": "", "ad_group_ad.ad.responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.responsive_display_ad.control_spec.enable_asset_enhancements": false, "ad_group_ad.ad.responsive_display_ad.control_spec.enable_autogen_video": false, "ad_group_ad.ad.responsive_display_ad.descriptions": [], "ad_group_ad.ad.responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.responsive_display_ad.headlines": [], "ad_group_ad.ad.responsive_display_ad.logo_images": [], "ad_group_ad.ad.responsive_display_ad.long_headline": "", "ad_group_ad.ad.responsive_display_ad.main_color": "", "ad_group_ad.ad.responsive_display_ad.marketing_images": [], "ad_group_ad.ad.responsive_display_ad.price_prefix": "", "ad_group_ad.ad.responsive_display_ad.promo_text": "", "ad_group_ad.ad.responsive_display_ad.square_logo_images": [], "ad_group_ad.ad.responsive_display_ad.square_marketing_images": [], "ad_group_ad.ad.responsive_display_ad.youtube_videos": [], "ad_group_ad.ad.responsive_search_ad.descriptions": ["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Consolidate your data in your data warehouses, lakes and databases\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.headlines": ["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.path1": "", "ad_group_ad.ad.responsive_search_ad.path2": "", "ad_group_ad.ad.shopping_comparison_listing_ad.headline": "", "ad_group_ad.ad.shopping_product_ad": "", "ad_group_ad.ad.shopping_smart_ad": "", "ad_group_ad.ad.smart_campaign_ad.descriptions": [], "ad_group_ad.ad.smart_campaign_ad.headlines": [], "ad_group_ad.ad.system_managed_resource_source": "UNSPECIFIED", "ad_group_ad.ad.text_ad.description1": "", "ad_group_ad.ad.text_ad.description2": "", "ad_group_ad.ad.text_ad.headline": "", "ad_group_ad.ad.tracking_url_template": "", "ad_group_ad.ad.type": "RESPONSIVE_SEARCH_AD", "ad_group_ad.ad.url_collections": [], "ad_group_ad.ad.url_custom_parameters": [], "ad_group_ad.ad.video_ad.in_feed.description1": "", "ad_group_ad.ad.video_ad.in_feed.description2": "", "ad_group_ad.ad.video_ad.in_feed.headline": "", "ad_group_ad.ad.video_ad.in_stream.action_button_label": "", "ad_group_ad.ad.video_ad.in_stream.action_headline": "", "ad_group_ad.ad.video_ad.out_stream.description": "", "ad_group_ad.ad.video_ad.out_stream.headline": "", "ad_group_ad.ad.video_responsive_ad.call_to_actions": [], "ad_group_ad.ad.video_responsive_ad.companion_banners": [], "ad_group_ad.ad.video_responsive_ad.descriptions": [], "ad_group_ad.ad.video_responsive_ad.headlines": [], "ad_group_ad.ad.video_responsive_ad.long_headlines": [], "ad_group_ad.ad.video_responsive_ad.videos": [], "ad_group_ad.ad_group": "customers/4651612872/adGroups/137020701042", "ad_group_ad.ad_strength": "POOR", "ad_group_ad.labels": ["customers/4651612872/labels/21906377810"], "ad_group_ad.policy_summary.approval_status": "APPROVED", "ad_group_ad.policy_summary.policy_topic_entries": [], "ad_group_ad.policy_summary.review_status": "REVIEWED", "ad_group_ad.resource_name": "customers/4651612872/adGroupAds/137020701042~592078631218", "ad_group_ad.status": "ENABLED", "segments.date": "2022-05-19"}, "emitted_at": 1704407765455} +{"stream": "ad_group_ad", "data": {"ad_group.id": 137020701042, "ad_group_ad.ad.added_by_google_ads": false, "ad_group_ad.ad.app_ad.descriptions": [], "ad_group_ad.ad.app_ad.headlines": [], "ad_group_ad.ad.app_ad.html5_media_bundles": [], "ad_group_ad.ad.app_ad.images": [], "ad_group_ad.ad.app_ad.mandatory_ad_text": "", "ad_group_ad.ad.app_ad.youtube_videos": [], "ad_group_ad.ad.app_engagement_ad.descriptions": [], "ad_group_ad.ad.app_engagement_ad.headlines": [], "ad_group_ad.ad.app_engagement_ad.images": [], "ad_group_ad.ad.app_engagement_ad.videos": [], "ad_group_ad.ad.call_ad.business_name": "", "ad_group_ad.ad.call_ad.call_tracked": false, "ad_group_ad.ad.call_ad.conversion_action": "", "ad_group_ad.ad.call_ad.conversion_reporting_state": "UNSPECIFIED", "ad_group_ad.ad.call_ad.country_code": "", "ad_group_ad.ad.call_ad.description1": "", "ad_group_ad.ad.call_ad.description2": "", "ad_group_ad.ad.call_ad.disable_call_conversion": false, "ad_group_ad.ad.call_ad.headline1": "", "ad_group_ad.ad.call_ad.headline2": "", "ad_group_ad.ad.call_ad.path1": "", "ad_group_ad.ad.call_ad.path2": "", "ad_group_ad.ad.call_ad.phone_number": "", "ad_group_ad.ad.call_ad.phone_number_verification_url": "", "ad_group_ad.ad.device_preference": "UNSPECIFIED", "ad_group_ad.ad.display_upload_ad.display_upload_product_type": "UNSPECIFIED", "ad_group_ad.ad.display_upload_ad.media_bundle": "", "ad_group_ad.ad.display_url": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.description": "", "ad_group_ad.ad.expanded_text_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.headline_part1": "", "ad_group_ad.ad.expanded_text_ad.headline_part2": "", "ad_group_ad.ad.expanded_text_ad.headline_part3": "", "ad_group_ad.ad.expanded_text_ad.path1": "", "ad_group_ad.ad.expanded_text_ad.path2": "", "ad_group_ad.ad.final_app_urls": [], "ad_group_ad.ad.final_mobile_urls": [], "ad_group_ad.ad.final_url_suffix": "", "ad_group_ad.ad.final_urls": ["https://airbyte.com"], "ad_group_ad.ad.hotel_ad": "", "ad_group_ad.ad.id": 592078631218, "ad_group_ad.ad.image_ad.image_url": "", "ad_group_ad.ad.image_ad.mime_type": "UNSPECIFIED", "ad_group_ad.ad.image_ad.name": "", "ad_group_ad.ad.image_ad.pixel_height": 0, "ad_group_ad.ad.image_ad.pixel_width": 0, "ad_group_ad.ad.image_ad.preview_image_url": "", "ad_group_ad.ad.image_ad.preview_pixel_height": 0, "ad_group_ad.ad.image_ad.preview_pixel_width": 0, "ad_group_ad.ad.legacy_app_install_ad": "", "ad_group_ad.ad.legacy_responsive_display_ad.accent_color": "", "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.legacy_responsive_display_ad.business_name": "", "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.legacy_responsive_display_ad.description": "", "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.main_color": "", "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": "", "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": "", "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": "", "ad_group_ad.ad.local_ad.call_to_actions": [], "ad_group_ad.ad.local_ad.descriptions": [], "ad_group_ad.ad.local_ad.headlines": [], "ad_group_ad.ad.local_ad.logo_images": [], "ad_group_ad.ad.local_ad.marketing_images": [], "ad_group_ad.ad.local_ad.path1": "", "ad_group_ad.ad.local_ad.path2": "", "ad_group_ad.ad.local_ad.videos": [], "ad_group_ad.ad.name": "", "ad_group_ad.ad.resource_name": "customers/4651612872/ads/592078631218", "ad_group_ad.ad.responsive_display_ad.accent_color": "", "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.responsive_display_ad.business_name": "", "ad_group_ad.ad.responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.responsive_display_ad.control_spec.enable_asset_enhancements": false, "ad_group_ad.ad.responsive_display_ad.control_spec.enable_autogen_video": false, "ad_group_ad.ad.responsive_display_ad.descriptions": [], "ad_group_ad.ad.responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.responsive_display_ad.headlines": [], "ad_group_ad.ad.responsive_display_ad.logo_images": [], "ad_group_ad.ad.responsive_display_ad.long_headline": "", "ad_group_ad.ad.responsive_display_ad.main_color": "", "ad_group_ad.ad.responsive_display_ad.marketing_images": [], "ad_group_ad.ad.responsive_display_ad.price_prefix": "", "ad_group_ad.ad.responsive_display_ad.promo_text": "", "ad_group_ad.ad.responsive_display_ad.square_logo_images": [], "ad_group_ad.ad.responsive_display_ad.square_marketing_images": [], "ad_group_ad.ad.responsive_display_ad.youtube_videos": [], "ad_group_ad.ad.responsive_search_ad.descriptions": ["text: \"Behind The Scenes: Testing The Airbyte Maintainer Program\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Airbyte | Open-Source Data Integration Platform | ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Upgrading Our Discourse And Slack To Support Our Community Growth\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Consolidate your data in your data warehouses, lakes and databases\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.headlines": ["text: \"Airbyte\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"ELT tool\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Open-source Data Integration\"\nasset_performance_label: PENDING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.path1": "", "ad_group_ad.ad.responsive_search_ad.path2": "", "ad_group_ad.ad.shopping_comparison_listing_ad.headline": "", "ad_group_ad.ad.shopping_product_ad": "", "ad_group_ad.ad.shopping_smart_ad": "", "ad_group_ad.ad.smart_campaign_ad.descriptions": [], "ad_group_ad.ad.smart_campaign_ad.headlines": [], "ad_group_ad.ad.system_managed_resource_source": "UNSPECIFIED", "ad_group_ad.ad.text_ad.description1": "", "ad_group_ad.ad.text_ad.description2": "", "ad_group_ad.ad.text_ad.headline": "", "ad_group_ad.ad.tracking_url_template": "", "ad_group_ad.ad.type": "RESPONSIVE_SEARCH_AD", "ad_group_ad.ad.url_collections": [], "ad_group_ad.ad.url_custom_parameters": [], "ad_group_ad.ad.video_ad.in_feed.description1": "", "ad_group_ad.ad.video_ad.in_feed.description2": "", "ad_group_ad.ad.video_ad.in_feed.headline": "", "ad_group_ad.ad.video_ad.in_stream.action_button_label": "", "ad_group_ad.ad.video_ad.in_stream.action_headline": "", "ad_group_ad.ad.video_ad.out_stream.description": "", "ad_group_ad.ad.video_ad.out_stream.headline": "", "ad_group_ad.ad.video_responsive_ad.call_to_actions": [], "ad_group_ad.ad.video_responsive_ad.companion_banners": [], "ad_group_ad.ad.video_responsive_ad.descriptions": [], "ad_group_ad.ad.video_responsive_ad.headlines": [], "ad_group_ad.ad.video_responsive_ad.long_headlines": [], "ad_group_ad.ad.video_responsive_ad.videos": [], "ad_group_ad.ad_group": "customers/4651612872/adGroups/137020701042", "ad_group_ad.ad_strength": "POOR", "ad_group_ad.labels": ["customers/4651612872/labels/21906377810"], "ad_group_ad.policy_summary.approval_status": "APPROVED", "ad_group_ad.policy_summary.policy_topic_entries": [], "ad_group_ad.policy_summary.review_status": "REVIEWED", "ad_group_ad.resource_name": "customers/4651612872/adGroupAds/137020701042~592078631218", "ad_group_ad.status": "ENABLED", "segments.date": "2022-05-20"}, "emitted_at": 1704407765456} +{"stream": "ad_group", "data": {"campaign.id": 16820250687, "ad_group.ad_rotation_mode": "UNSPECIFIED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "ad_group.campaign": "customers/4651612872/campaigns/16820250687", "metrics.cost_micros": 790000, "ad_group.cpc_bid_micros": 10000, "ad_group.cpm_bid_micros": 10000, "ad_group.cpv_bid_micros": 0, "ad_group.display_custom_bid_dimension": "UNSPECIFIED", "ad_group.effective_target_cpa_micros": 0, "ad_group.effective_target_cpa_source": "UNSPECIFIED", "ad_group.effective_target_roas": 0.0, "ad_group.effective_target_roas_source": "UNSPECIFIED", "ad_group.excluded_parent_asset_field_types": [], "ad_group.optimized_targeting_enabled": false, "ad_group.final_url_suffix": "", "ad_group.id": 137020701042, "ad_group.labels": ["customers/4651612872/labels/21906377810"], "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.percent_cpc_bid_micros": 0, "ad_group.resource_name": "customers/4651612872/adGroups/137020701042", "ad_group.status": "ENABLED", "ad_group.target_cpa_micros": 0, "ad_group.target_cpm_micros": 10000, "ad_group.target_roas": 0.0, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "ad_group.tracking_url_template": "", "ad_group.type": "SEARCH_STANDARD", "ad_group.url_custom_parameters": [], "segments.date": "2022-05-18"}, "emitted_at": 1704715893659} +{"stream": "ad_group", "data": {"campaign.id": 16820250687, "ad_group.ad_rotation_mode": "UNSPECIFIED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "ad_group.campaign": "customers/4651612872/campaigns/16820250687", "metrics.cost_micros": 860000, "ad_group.cpc_bid_micros": 10000, "ad_group.cpm_bid_micros": 10000, "ad_group.cpv_bid_micros": 0, "ad_group.display_custom_bid_dimension": "UNSPECIFIED", "ad_group.effective_target_cpa_micros": 0, "ad_group.effective_target_cpa_source": "UNSPECIFIED", "ad_group.effective_target_roas": 0.0, "ad_group.effective_target_roas_source": "UNSPECIFIED", "ad_group.excluded_parent_asset_field_types": [], "ad_group.optimized_targeting_enabled": false, "ad_group.final_url_suffix": "", "ad_group.id": 137020701042, "ad_group.labels": ["customers/4651612872/labels/21906377810"], "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.percent_cpc_bid_micros": 0, "ad_group.resource_name": "customers/4651612872/adGroups/137020701042", "ad_group.status": "ENABLED", "ad_group.target_cpa_micros": 0, "ad_group.target_cpm_micros": 10000, "ad_group.target_roas": 0.0, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "ad_group.tracking_url_template": "", "ad_group.type": "SEARCH_STANDARD", "ad_group.url_custom_parameters": [], "segments.date": "2022-05-19"}, "emitted_at": 1704715893662} +{"stream": "ad_group", "data": {"campaign.id": 16820250687, "ad_group.ad_rotation_mode": "UNSPECIFIED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "ad_group.campaign": "customers/4651612872/campaigns/16820250687", "metrics.cost_micros": 430000, "ad_group.cpc_bid_micros": 10000, "ad_group.cpm_bid_micros": 10000, "ad_group.cpv_bid_micros": 0, "ad_group.display_custom_bid_dimension": "UNSPECIFIED", "ad_group.effective_target_cpa_micros": 0, "ad_group.effective_target_cpa_source": "UNSPECIFIED", "ad_group.effective_target_roas": 0.0, "ad_group.effective_target_roas_source": "UNSPECIFIED", "ad_group.excluded_parent_asset_field_types": [], "ad_group.optimized_targeting_enabled": false, "ad_group.final_url_suffix": "", "ad_group.id": 137020701042, "ad_group.labels": ["customers/4651612872/labels/21906377810"], "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.percent_cpc_bid_micros": 0, "ad_group.resource_name": "customers/4651612872/adGroups/137020701042", "ad_group.status": "ENABLED", "ad_group.target_cpa_micros": 0, "ad_group.target_cpm_micros": 10000, "ad_group.target_roas": 0.0, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "ad_group.tracking_url_template": "", "ad_group.type": "SEARCH_STANDARD", "ad_group.url_custom_parameters": [], "segments.date": "2022-05-20"}, "emitted_at": 1704715893662} +{"stream": "customer", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.7609283000000001, "customer.optimization_score_weight": 3182.4700059999996, "customer.pay_per_conversion_eligibility_failure_reasons": [], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "{lpurl}?utm_term={keyword}&utm_campaign={_utmcampaign}&utm_source=adwords&utm_medium=ppc&hsa_acc=4651612872&hsa_cam={campaignid}&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3", "segments.date": "2022-05-18"}, "emitted_at": 1704407768194} +{"stream": "customer", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.7609283000000001, "customer.optimization_score_weight": 3182.4700059999996, "customer.pay_per_conversion_eligibility_failure_reasons": [], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "{lpurl}?utm_term={keyword}&utm_campaign={_utmcampaign}&utm_source=adwords&utm_medium=ppc&hsa_acc=4651612872&hsa_cam={campaignid}&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3", "segments.date": "2022-05-19"}, "emitted_at": 1704407768194} +{"stream": "customer", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.7609283000000001, "customer.optimization_score_weight": 3182.4700059999996, "customer.pay_per_conversion_eligibility_failure_reasons": [], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "{lpurl}?utm_term={keyword}&utm_campaign={_utmcampaign}&utm_source=adwords&utm_medium=ppc&hsa_acc=4651612872&hsa_cam={campaignid}&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3", "segments.date": "2022-05-20"}, "emitted_at": 1704407768195} +{"stream": "campaign", "data": {"campaign.accessible_bidding_strategy": "", "campaign.ad_serving_optimization_status": "OPTIMIZE", "campaign.advertising_channel_sub_type": "UNSPECIFIED", "campaign.advertising_channel_type": "SEARCH", "campaign.app_campaign_setting.app_id": "", "campaign.app_campaign_setting.app_store": "UNSPECIFIED", "campaign.app_campaign_setting.bidding_strategy_goal_type": "UNSPECIFIED", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "MAXIMIZE_CONVERSIONS", "campaign.campaign_budget": "customers/4651612872/campaignBudgets/12862729190", "campaign_budget.amount_micros": 1000000, "campaign.commission.commission_rate_micros": 0, "campaign.dynamic_search_ads_setting.domain_name": "", "campaign.dynamic_search_ads_setting.feeds": [], "campaign.dynamic_search_ads_setting.language_code": "", "campaign.dynamic_search_ads_setting.use_supplied_urls_only": false, "campaign.end_date": "2037-12-30", "campaign.excluded_parent_asset_field_types": [], "campaign.experiment_type": "BASE", "campaign.final_url_suffix": "", "campaign.frequency_caps": [], "campaign.geo_target_type_setting.negative_geo_target_type": "PRESENCE", "campaign.geo_target_type_setting.positive_geo_target_type": "PRESENCE_OR_INTEREST", "campaign.hotel_setting.hotel_center_id": 0, "campaign.id": 16820250687, "campaign.labels": ["customers/4651612872/labels/21906377810"], "campaign.local_campaign_setting.location_source_type": "UNSPECIFIED", "campaign.manual_cpc.enhanced_cpc_enabled": false, "campaign.manual_cpm": "", "campaign.manual_cpv": "", "campaign.maximize_conversion_value.target_roas": 0.0, "campaign.maximize_conversions.target_cpa_micros": 0, "campaign.name": "Website traffic-Search-15", "campaign.network_settings.target_content_network": true, "campaign.network_settings.target_google_search": true, "campaign.network_settings.target_partner_search_network": false, "campaign.network_settings.target_search_network": true, "campaign.optimization_goal_setting.optimization_goal_types": [], "campaign.optimization_score": 0.0, "campaign.payment_mode": "CLICKS", "campaign.percent_cpc.cpc_bid_ceiling_micros": 0, "campaign.percent_cpc.enhanced_cpc_enabled": false, "campaign.real_time_bidding_setting.opt_in": false, "campaign.resource_name": "customers/4651612872/campaigns/16820250687", "campaign.selective_optimization.conversion_actions": [], "campaign.serving_status": "SERVING", "campaign.shopping_setting.campaign_priority": 0, "campaign.shopping_setting.enable_local": false, "campaign.shopping_setting.merchant_id": 0, "campaign.start_date": "2022-04-08", "campaign.status": "PAUSED", "campaign.target_cpa.cpc_bid_ceiling_micros": 0, "campaign.target_cpa.cpc_bid_floor_micros": 0, "campaign.target_cpa.target_cpa_micros": 0, "campaign.target_cpm.target_frequency_goal.target_count": 0, "campaign.target_cpm.target_frequency_goal.time_unit": "UNSPECIFIED", "campaign.target_impression_share.cpc_bid_ceiling_micros": 0, "campaign.target_impression_share.location": "UNSPECIFIED", "campaign.target_impression_share.location_fraction_micros": 0, "campaign.target_roas.cpc_bid_ceiling_micros": 0, "campaign.target_roas.cpc_bid_floor_micros": 0, "campaign.target_roas.target_roas": 0.0, "campaign.target_spend.cpc_bid_ceiling_micros": 0, "campaign.target_spend.target_spend_micros": 0, "campaign.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n"], "campaign.tracking_setting.tracking_url": "", "campaign.tracking_url_template": "{lpurl}?utm_term={keyword}&utm_campaign=Website+traffic-Search-15&utm_source=adwords&utm_medium=ppc&hsa_acc=4651612872&hsa_cam=16820250687&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3", "campaign.url_custom_parameters": [], "campaign.vanity_pharma.vanity_pharma_display_url_mode": "UNSPECIFIED", "campaign.vanity_pharma.vanity_pharma_text": "UNSPECIFIED", "campaign.video_brand_safety_suitability": "UNSPECIFIED", "metrics.clicks": 0, "metrics.ctr": 0.0, "metrics.conversions": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.impressions": 1, "metrics.video_views": 0, "metrics.video_quartile_p100_rate": 0.0, "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.interactions": 0, "metrics.interaction_event_types": [], "metrics.value_per_conversion": 0.0, "metrics.cost_per_conversion": 0.0, "segments.date": "2022-05-18", "segments.hour": 1, "segments.ad_network_type": "SEARCH"}, "emitted_at": 1704407769633} +{"stream": "campaign", "data": {"campaign.accessible_bidding_strategy": "", "campaign.ad_serving_optimization_status": "OPTIMIZE", "campaign.advertising_channel_sub_type": "UNSPECIFIED", "campaign.advertising_channel_type": "SEARCH", "campaign.app_campaign_setting.app_id": "", "campaign.app_campaign_setting.app_store": "UNSPECIFIED", "campaign.app_campaign_setting.bidding_strategy_goal_type": "UNSPECIFIED", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "MAXIMIZE_CONVERSIONS", "campaign.campaign_budget": "customers/4651612872/campaignBudgets/12862729190", "campaign_budget.amount_micros": 1000000, "campaign.commission.commission_rate_micros": 0, "campaign.dynamic_search_ads_setting.domain_name": "", "campaign.dynamic_search_ads_setting.feeds": [], "campaign.dynamic_search_ads_setting.language_code": "", "campaign.dynamic_search_ads_setting.use_supplied_urls_only": false, "campaign.end_date": "2037-12-30", "campaign.excluded_parent_asset_field_types": [], "campaign.experiment_type": "BASE", "campaign.final_url_suffix": "", "campaign.frequency_caps": [], "campaign.geo_target_type_setting.negative_geo_target_type": "PRESENCE", "campaign.geo_target_type_setting.positive_geo_target_type": "PRESENCE_OR_INTEREST", "campaign.hotel_setting.hotel_center_id": 0, "campaign.id": 16820250687, "campaign.labels": ["customers/4651612872/labels/21906377810"], "campaign.local_campaign_setting.location_source_type": "UNSPECIFIED", "campaign.manual_cpc.enhanced_cpc_enabled": false, "campaign.manual_cpm": "", "campaign.manual_cpv": "", "campaign.maximize_conversion_value.target_roas": 0.0, "campaign.maximize_conversions.target_cpa_micros": 0, "campaign.name": "Website traffic-Search-15", "campaign.network_settings.target_content_network": true, "campaign.network_settings.target_google_search": true, "campaign.network_settings.target_partner_search_network": false, "campaign.network_settings.target_search_network": true, "campaign.optimization_goal_setting.optimization_goal_types": [], "campaign.optimization_score": 0.0, "campaign.payment_mode": "CLICKS", "campaign.percent_cpc.cpc_bid_ceiling_micros": 0, "campaign.percent_cpc.enhanced_cpc_enabled": false, "campaign.real_time_bidding_setting.opt_in": false, "campaign.resource_name": "customers/4651612872/campaigns/16820250687", "campaign.selective_optimization.conversion_actions": [], "campaign.serving_status": "SERVING", "campaign.shopping_setting.campaign_priority": 0, "campaign.shopping_setting.enable_local": false, "campaign.shopping_setting.merchant_id": 0, "campaign.start_date": "2022-04-08", "campaign.status": "PAUSED", "campaign.target_cpa.cpc_bid_ceiling_micros": 0, "campaign.target_cpa.cpc_bid_floor_micros": 0, "campaign.target_cpa.target_cpa_micros": 0, "campaign.target_cpm.target_frequency_goal.target_count": 0, "campaign.target_cpm.target_frequency_goal.time_unit": "UNSPECIFIED", "campaign.target_impression_share.cpc_bid_ceiling_micros": 0, "campaign.target_impression_share.location": "UNSPECIFIED", "campaign.target_impression_share.location_fraction_micros": 0, "campaign.target_roas.cpc_bid_ceiling_micros": 0, "campaign.target_roas.cpc_bid_floor_micros": 0, "campaign.target_roas.target_roas": 0.0, "campaign.target_spend.cpc_bid_ceiling_micros": 0, "campaign.target_spend.target_spend_micros": 0, "campaign.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n"], "campaign.tracking_setting.tracking_url": "", "campaign.tracking_url_template": "{lpurl}?utm_term={keyword}&utm_campaign=Website+traffic-Search-15&utm_source=adwords&utm_medium=ppc&hsa_acc=4651612872&hsa_cam=16820250687&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3", "campaign.url_custom_parameters": [], "campaign.vanity_pharma.vanity_pharma_display_url_mode": "UNSPECIFIED", "campaign.vanity_pharma.vanity_pharma_text": "UNSPECIFIED", "campaign.video_brand_safety_suitability": "UNSPECIFIED", "metrics.clicks": 0, "metrics.ctr": 0.0, "metrics.conversions": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.impressions": 2, "metrics.video_views": 0, "metrics.video_quartile_p100_rate": 0.0, "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.interactions": 0, "metrics.interaction_event_types": [], "metrics.value_per_conversion": 0.0, "metrics.cost_per_conversion": 0.0, "segments.date": "2022-05-18", "segments.hour": 2, "segments.ad_network_type": "SEARCH"}, "emitted_at": 1704407769640} +{"stream": "campaign", "data": {"campaign.accessible_bidding_strategy": "", "campaign.ad_serving_optimization_status": "OPTIMIZE", "campaign.advertising_channel_sub_type": "UNSPECIFIED", "campaign.advertising_channel_type": "SEARCH", "campaign.app_campaign_setting.app_id": "", "campaign.app_campaign_setting.app_store": "UNSPECIFIED", "campaign.app_campaign_setting.bidding_strategy_goal_type": "UNSPECIFIED", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "MAXIMIZE_CONVERSIONS", "campaign.campaign_budget": "customers/4651612872/campaignBudgets/12862729190", "campaign_budget.amount_micros": 1000000, "campaign.commission.commission_rate_micros": 0, "campaign.dynamic_search_ads_setting.domain_name": "", "campaign.dynamic_search_ads_setting.feeds": [], "campaign.dynamic_search_ads_setting.language_code": "", "campaign.dynamic_search_ads_setting.use_supplied_urls_only": false, "campaign.end_date": "2037-12-30", "campaign.excluded_parent_asset_field_types": [], "campaign.experiment_type": "BASE", "campaign.final_url_suffix": "", "campaign.frequency_caps": [], "campaign.geo_target_type_setting.negative_geo_target_type": "PRESENCE", "campaign.geo_target_type_setting.positive_geo_target_type": "PRESENCE_OR_INTEREST", "campaign.hotel_setting.hotel_center_id": 0, "campaign.id": 16820250687, "campaign.labels": ["customers/4651612872/labels/21906377810"], "campaign.local_campaign_setting.location_source_type": "UNSPECIFIED", "campaign.manual_cpc.enhanced_cpc_enabled": false, "campaign.manual_cpm": "", "campaign.manual_cpv": "", "campaign.maximize_conversion_value.target_roas": 0.0, "campaign.maximize_conversions.target_cpa_micros": 0, "campaign.name": "Website traffic-Search-15", "campaign.network_settings.target_content_network": true, "campaign.network_settings.target_google_search": true, "campaign.network_settings.target_partner_search_network": false, "campaign.network_settings.target_search_network": true, "campaign.optimization_goal_setting.optimization_goal_types": [], "campaign.optimization_score": 0.0, "campaign.payment_mode": "CLICKS", "campaign.percent_cpc.cpc_bid_ceiling_micros": 0, "campaign.percent_cpc.enhanced_cpc_enabled": false, "campaign.real_time_bidding_setting.opt_in": false, "campaign.resource_name": "customers/4651612872/campaigns/16820250687", "campaign.selective_optimization.conversion_actions": [], "campaign.serving_status": "SERVING", "campaign.shopping_setting.campaign_priority": 0, "campaign.shopping_setting.enable_local": false, "campaign.shopping_setting.merchant_id": 0, "campaign.start_date": "2022-04-08", "campaign.status": "PAUSED", "campaign.target_cpa.cpc_bid_ceiling_micros": 0, "campaign.target_cpa.cpc_bid_floor_micros": 0, "campaign.target_cpa.target_cpa_micros": 0, "campaign.target_cpm.target_frequency_goal.target_count": 0, "campaign.target_cpm.target_frequency_goal.time_unit": "UNSPECIFIED", "campaign.target_impression_share.cpc_bid_ceiling_micros": 0, "campaign.target_impression_share.location": "UNSPECIFIED", "campaign.target_impression_share.location_fraction_micros": 0, "campaign.target_roas.cpc_bid_ceiling_micros": 0, "campaign.target_roas.cpc_bid_floor_micros": 0, "campaign.target_roas.target_roas": 0.0, "campaign.target_spend.cpc_bid_ceiling_micros": 0, "campaign.target_spend.target_spend_micros": 0, "campaign.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n"], "campaign.tracking_setting.tracking_url": "", "campaign.tracking_url_template": "{lpurl}?utm_term={keyword}&utm_campaign=Website+traffic-Search-15&utm_source=adwords&utm_medium=ppc&hsa_acc=4651612872&hsa_cam=16820250687&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3", "campaign.url_custom_parameters": [], "campaign.vanity_pharma.vanity_pharma_display_url_mode": "UNSPECIFIED", "campaign.vanity_pharma.vanity_pharma_text": "UNSPECIFIED", "campaign.video_brand_safety_suitability": "UNSPECIFIED", "metrics.clicks": 0, "metrics.ctr": 0.0, "metrics.conversions": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.impressions": 2, "metrics.video_views": 0, "metrics.video_quartile_p100_rate": 0.0, "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.interactions": 0, "metrics.interaction_event_types": [], "metrics.value_per_conversion": 0.0, "metrics.cost_per_conversion": 0.0, "segments.date": "2022-05-18", "segments.hour": 3, "segments.ad_network_type": "SEARCH"}, "emitted_at": 1704407769646} +{"stream": "campaign_label", "data": {"campaign.id": 12124071339, "label.id": 21585034471, "campaign.resource_name": "customers/4651612872/campaigns/12124071339", "campaign_label.resource_name": "customers/4651612872/campaignLabels/12124071339~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471"}, "emitted_at": 1704407771173} +{"stream": "campaign_label", "data": {"campaign.id": 13284356762, "label.id": 21585034471, "campaign.resource_name": "customers/4651612872/campaigns/13284356762", "campaign_label.resource_name": "customers/4651612872/campaignLabels/13284356762~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471"}, "emitted_at": 1704407771175} +{"stream": "campaign_label", "data": {"campaign.id": 16820250687, "label.id": 21906377810, "campaign.resource_name": "customers/4651612872/campaigns/16820250687", "campaign_label.resource_name": "customers/4651612872/campaignLabels/16820250687~21906377810", "label.name": "Test Delete label customer", "label.resource_name": "customers/4651612872/labels/21906377810"}, "emitted_at": 1704407771175} +{"stream": "ad_group_label", "data": {"ad_group.id": 123273719655, "label.id": 21585034471, "ad_group.resource_name": "customers/4651612872/adGroups/123273719655", "ad_group_label.resource_name": "customers/4651612872/adGroupLabels/123273719655~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471"}, "emitted_at": 1704407771465} +{"stream": "ad_group_label", "data": {"ad_group.id": 138643385242, "label.id": 21585034471, "ad_group.resource_name": "customers/4651612872/adGroups/138643385242", "ad_group_label.resource_name": "customers/4651612872/adGroupLabels/138643385242~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471"}, "emitted_at": 1704407771468} +{"stream": "ad_group_label", "data": {"ad_group.id": 137020701042, "label.id": 21906377810, "ad_group.resource_name": "customers/4651612872/adGroups/137020701042", "ad_group_label.resource_name": "customers/4651612872/adGroupLabels/137020701042~21906377810", "label.name": "Test Delete label customer", "label.resource_name": "customers/4651612872/labels/21906377810"}, "emitted_at": 1704407771468} +{"stream": "ad_group_ad_label", "data": {"ad_group.id": 123273719655, "ad_group_ad.ad.id": 524518584182, "ad_group_ad.ad.resource_name": "customers/4651612872/ads/524518584182", "ad_group_ad_label.resource_name": "customers/4651612872/adGroupAdLabels/123273719655~524518584182~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471", "label.id": 21585034471}, "emitted_at": 1704407771926} +{"stream": "ad_group_ad_label", "data": {"ad_group.id": 137020701042, "ad_group_ad.ad.id": 592078631218, "ad_group_ad.ad.resource_name": "customers/4651612872/ads/592078631218", "ad_group_ad_label.resource_name": "customers/4651612872/adGroupAdLabels/137020701042~592078631218~21906377810", "label.name": "Test Delete label customer", "label.resource_name": "customers/4651612872/labels/21906377810", "label.id": 21906377810}, "emitted_at": 1704407771929} +{"stream": "user_location_view", "data": {"segments.date": "2022-05-18", "segments.day_of_week": "WEDNESDAY", "segments.month": "2022-05-01", "segments.week": "2022-05-16", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2356, "user_location_view.targeting_location": false, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2356~false", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 3, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1704407772615} +{"stream": "user_location_view", "data": {"segments.date": "2022-05-18", "segments.day_of_week": "WEDNESDAY", "segments.month": "2022-05-01", "segments.week": "2022-05-16", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2484, "user_location_view.targeting_location": false, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2484~false", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 1, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1704407772615} +{"stream": "user_location_view", "data": {"segments.date": "2022-05-18", "segments.day_of_week": "WEDNESDAY", "segments.month": "2022-05-01", "segments.week": "2022-05-16", "segments.quarter": "2022-04-01", "segments.year": 2022, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2124, "user_location_view.targeting_location": true, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2124~true", "campaign.base_campaign": "customers/4651612872/campaigns/16820250687", "campaign.id": 16820250687, "campaign.name": "Website traffic-Search-15", "campaign.status": "PAUSED", "ad_group.name": "\u0413\u0440\u0443\u043f\u043f\u0430 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439\u00a02", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/137020701042", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 253333.33333333334, "metrics.average_cpc": 253333.33333333334, "metrics.average_cpm": 36190476.190476194, "metrics.average_cpv": 0.0, "metrics.clicks": 3, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 760000, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.14285714285714285, "metrics.impressions": 21, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interaction_rate": 0.14285714285714285, "metrics.interactions": 3, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1704407772616} +{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-05-18"}, "emitted_at": 1704407774246} +{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-05-19"}, "emitted_at": 1704407774254} +{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2022-04-08", "campaign.end_date": "2037-12-30", "segments.date": "2022-05-20"}, "emitted_at": 1704407774254} +{"stream": "custom_audience", "data": {"custom_audience.description": "", "custom_audience.name": "Airbyte", "custom_audience.id": 523469909, "custom_audience.members": ["member_type: KEYWORD\nkeyword: \"etl elt\"\n", "member_type: KEYWORD\nkeyword: \"cloud data management and analytics\"\n", "member_type: KEYWORD\nkeyword: \"data integration\"\n", "member_type: KEYWORD\nkeyword: \"big data analytics database\"\n", "member_type: KEYWORD\nkeyword: \"data\"\n", "member_type: KEYWORD\nkeyword: \"data sherid nada\"\n", "member_type: KEYWORD\nkeyword: \"airbyteforeveryone\"\n", "member_type: KEYWORD\nkeyword: \"Airbyte\"\n"], "custom_audience.resource_name": "customers/4651612872/customAudiences/523469909", "custom_audience.status": "ENABLED", "custom_audience.type": "AUTO"}, "emitted_at": 1704407775427} +{"stream": "audience", "data": {"customer.id": 4651612872, "audience.description": "", "audience.dimensions": ["audience_segments {\n segments {\n custom_audience {\n custom_audience: \"customers/4651612872/customAudiences/523469909\"\n }\n }\n}\n"], "audience.exclusion_dimension": "", "audience.id": 47792633, "audience.name": "Audience name 1", "audience.resource_name": "customers/4651612872/audiences/47792633", "audience.status": "ENABLED"}, "emitted_at": 1704407775721} +{"stream": "audience", "data": {"customer.id": 4651612872, "audience.description": "", "audience.dimensions": ["audience_segments {\n segments {\n user_interest {\n user_interest_category: \"customers/4651612872/userInterests/80276\"\n }\n }\n segments {\n user_interest {\n user_interest_category: \"customers/4651612872/userInterests/80279\"\n }\n }\n segments {\n user_interest {\n user_interest_category: \"customers/4651612872/userInterests/80520\"\n }\n }\n segments {\n user_interest {\n user_interest_category: \"customers/4651612872/userInterests/80530\"\n }\n }\n segments {\n user_interest {\n user_interest_category: \"customers/4651612872/userInterests/92931\"\n }\n }\n}\n"], "audience.exclusion_dimension": "", "audience.id": 97300129, "audience.name": "Upgraded Audience 1", "audience.resource_name": "customers/4651612872/audiences/97300129", "audience.status": "ENABLED"}, "emitted_at": 1704407775723} +{"stream": "user_interest", "data": {"user_interest.availabilities": [], "user_interest.launched_to_all": true, "user_interest.name": "Arts & Entertainment", "user_interest.resource_name": "customers/4651612872/userInterests/3", "user_interest.taxonomy_type": "VERTICAL_GEO", "user_interest.user_interest_id": 3, "user_interest.user_interest_parent": ""}, "emitted_at": 1704407777549} +{"stream": "user_interest", "data": {"user_interest.availabilities": [], "user_interest.launched_to_all": true, "user_interest.name": "Computers & Electronics", "user_interest.resource_name": "customers/4651612872/userInterests/5", "user_interest.taxonomy_type": "VERTICAL_GEO", "user_interest.user_interest_id": 5, "user_interest.user_interest_parent": ""}, "emitted_at": 1704407777550} +{"stream": "user_interest", "data": {"user_interest.availabilities": [], "user_interest.launched_to_all": true, "user_interest.name": "Finance", "user_interest.resource_name": "customers/4651612872/userInterests/7", "user_interest.taxonomy_type": "VERTICAL_GEO", "user_interest.user_interest_id": 7, "user_interest.user_interest_parent": ""}, "emitted_at": 1704407777551} +{"stream": "label", "data": {"customer.id": 4651612872, "label.id": 21585034471, "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471", "label.status": "ENABLED", "label.text_label.background_color": "#E993EB", "label.text_label.description": "example label for edgao"}, "emitted_at": 1704407779851} +{"stream": "label", "data": {"customer.id": 4651612872, "label.id": 21902092838, "label.name": "Test Label", "label.resource_name": "customers/4651612872/labels/21902092838", "label.status": "ENABLED", "label.text_label.background_color": "#8BCBD2", "label.text_label.description": "Description to test label"}, "emitted_at": 1704407779852} +{"stream": "label", "data": {"customer.id": 4651612872, "label.id": 21906377810, "label.name": "Test Delete label customer", "label.resource_name": "customers/4651612872/labels/21906377810", "label.status": "ENABLED", "label.text_label.background_color": "#8266C9", "label.text_label.description": ""}, "emitted_at": 1704407779852} +{"stream": "campaign_bidding_strategy", "data": {"customer.id": 4651612872, "campaign.id": 16820250687, "bidding_strategy.aligned_campaign_budget_id": 0, "bidding_strategy.campaign_count": 0, "bidding_strategy.currency_code": "", "bidding_strategy.effective_currency_code": "", "bidding_strategy.enhanced_cpc": "", "bidding_strategy.id": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversion_value.target_roas": 0.0, "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversions.target_cpa_micros": 0, "bidding_strategy.name": "", "bidding_strategy.non_removed_campaign_count": 0, "bidding_strategy.resource_name": "", "bidding_strategy.status": "UNSPECIFIED", "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_cpa.cpc_bid_floor_micros": 0, "bidding_strategy.target_cpa.target_cpa_micros": 0, "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_impression_share.location": "UNSPECIFIED", "bidding_strategy.target_impression_share.location_fraction_micros": 0, "bidding_strategy.target_roas.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_roas.cpc_bid_floor_micros": 0, "bidding_strategy.target_roas.target_roas": 0.0, "bidding_strategy.target_spend.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_spend.target_spend_micros": 0, "bidding_strategy.type": "UNSPECIFIED", "segments.date": "2022-05-18"}, "emitted_at": 1704407780704} +{"stream": "campaign_bidding_strategy", "data": {"customer.id": 4651612872, "campaign.id": 16820250687, "bidding_strategy.aligned_campaign_budget_id": 0, "bidding_strategy.campaign_count": 0, "bidding_strategy.currency_code": "", "bidding_strategy.effective_currency_code": "", "bidding_strategy.enhanced_cpc": "", "bidding_strategy.id": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversion_value.target_roas": 0.0, "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversions.target_cpa_micros": 0, "bidding_strategy.name": "", "bidding_strategy.non_removed_campaign_count": 0, "bidding_strategy.resource_name": "", "bidding_strategy.status": "UNSPECIFIED", "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_cpa.cpc_bid_floor_micros": 0, "bidding_strategy.target_cpa.target_cpa_micros": 0, "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_impression_share.location": "UNSPECIFIED", "bidding_strategy.target_impression_share.location_fraction_micros": 0, "bidding_strategy.target_roas.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_roas.cpc_bid_floor_micros": 0, "bidding_strategy.target_roas.target_roas": 0.0, "bidding_strategy.target_spend.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_spend.target_spend_micros": 0, "bidding_strategy.type": "UNSPECIFIED", "segments.date": "2022-05-19"}, "emitted_at": 1704407780707} +{"stream": "campaign_bidding_strategy", "data": {"customer.id": 4651612872, "campaign.id": 16820250687, "bidding_strategy.aligned_campaign_budget_id": 0, "bidding_strategy.campaign_count": 0, "bidding_strategy.currency_code": "", "bidding_strategy.effective_currency_code": "", "bidding_strategy.enhanced_cpc": "", "bidding_strategy.id": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversion_value.target_roas": 0.0, "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversions.target_cpa_micros": 0, "bidding_strategy.name": "", "bidding_strategy.non_removed_campaign_count": 0, "bidding_strategy.resource_name": "", "bidding_strategy.status": "UNSPECIFIED", "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_cpa.cpc_bid_floor_micros": 0, "bidding_strategy.target_cpa.target_cpa_micros": 0, "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_impression_share.location": "UNSPECIFIED", "bidding_strategy.target_impression_share.location_fraction_micros": 0, "bidding_strategy.target_roas.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_roas.cpc_bid_floor_micros": 0, "bidding_strategy.target_roas.target_roas": 0.0, "bidding_strategy.target_spend.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_spend.target_spend_micros": 0, "bidding_strategy.type": "UNSPECIFIED", "segments.date": "2022-05-20"}, "emitted_at": 1704407780713} +{"stream": "ad_group_bidding_strategy", "data": {"ad_group.id": 137020701042, "bidding_strategy.aligned_campaign_budget_id": 0, "bidding_strategy.campaign_count": 0, "bidding_strategy.currency_code": "", "bidding_strategy.effective_currency_code": "", "bidding_strategy.enhanced_cpc": "", "bidding_strategy.id": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversion_value.target_roas": 0.0, "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversions.target_cpa_micros": 0, "bidding_strategy.name": "", "bidding_strategy.non_removed_campaign_count": 0, "bidding_strategy.resource_name": "", "bidding_strategy.status": "UNSPECIFIED", "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_cpa.cpc_bid_floor_micros": 0, "bidding_strategy.target_cpa.target_cpa_micros": 0, "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_impression_share.location": "UNSPECIFIED", "bidding_strategy.target_impression_share.location_fraction_micros": 0, "bidding_strategy.target_roas.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_roas.cpc_bid_floor_micros": 0, "bidding_strategy.target_roas.target_roas": 0.0, "bidding_strategy.target_spend.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_spend.target_spend_micros": 0, "bidding_strategy.type": "UNSPECIFIED", "segments.date": "2022-05-18"}, "emitted_at": 1704407781887} +{"stream": "ad_group_bidding_strategy", "data": {"ad_group.id": 137020701042, "bidding_strategy.aligned_campaign_budget_id": 0, "bidding_strategy.campaign_count": 0, "bidding_strategy.currency_code": "", "bidding_strategy.effective_currency_code": "", "bidding_strategy.enhanced_cpc": "", "bidding_strategy.id": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversion_value.target_roas": 0.0, "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversions.target_cpa_micros": 0, "bidding_strategy.name": "", "bidding_strategy.non_removed_campaign_count": 0, "bidding_strategy.resource_name": "", "bidding_strategy.status": "UNSPECIFIED", "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_cpa.cpc_bid_floor_micros": 0, "bidding_strategy.target_cpa.target_cpa_micros": 0, "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_impression_share.location": "UNSPECIFIED", "bidding_strategy.target_impression_share.location_fraction_micros": 0, "bidding_strategy.target_roas.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_roas.cpc_bid_floor_micros": 0, "bidding_strategy.target_roas.target_roas": 0.0, "bidding_strategy.target_spend.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_spend.target_spend_micros": 0, "bidding_strategy.type": "UNSPECIFIED", "segments.date": "2022-05-19"}, "emitted_at": 1704407781888} +{"stream": "ad_group_bidding_strategy", "data": {"ad_group.id": 137020701042, "bidding_strategy.aligned_campaign_budget_id": 0, "bidding_strategy.campaign_count": 0, "bidding_strategy.currency_code": "", "bidding_strategy.effective_currency_code": "", "bidding_strategy.enhanced_cpc": "", "bidding_strategy.id": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversion_value.target_roas": 0.0, "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversions.target_cpa_micros": 0, "bidding_strategy.name": "", "bidding_strategy.non_removed_campaign_count": 0, "bidding_strategy.resource_name": "", "bidding_strategy.status": "UNSPECIFIED", "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_cpa.cpc_bid_floor_micros": 0, "bidding_strategy.target_cpa.target_cpa_micros": 0, "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_impression_share.location": "UNSPECIFIED", "bidding_strategy.target_impression_share.location_fraction_micros": 0, "bidding_strategy.target_roas.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_roas.cpc_bid_floor_micros": 0, "bidding_strategy.target_roas.target_roas": 0.0, "bidding_strategy.target_spend.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_spend.target_spend_micros": 0, "bidding_strategy.type": "UNSPECIFIED", "segments.date": "2022-05-20"}, "emitted_at": 1704407781889} +{"stream": "ad_group_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "ad_group.id": 117036054899, "ad_group_criterion.ad_group": "customers/4651612872/adGroups/117036054899", "ad_group_criterion.age_range.type": "UNSPECIFIED", "ad_group_criterion.app_payment_model.type": "UNSPECIFIED", "ad_group_criterion.approval_status": "APPROVED", "ad_group_criterion.audience.audience": "", "ad_group_criterion.bid_modifier": 0.0, "ad_group_criterion.combined_audience.combined_audience": "", "ad_group_criterion.cpc_bid_micros": 0, "ad_group_criterion.cpm_bid_micros": 0, "ad_group_criterion.cpv_bid_micros": 0, "ad_group_criterion.criterion_id": 18696703, "ad_group_criterion.custom_affinity.custom_affinity": "", "ad_group_criterion.custom_audience.custom_audience": "", "ad_group_criterion.custom_intent.custom_intent": "", "ad_group_criterion.disapproval_reasons": [], "ad_group_criterion.display_name": "data integrations", "ad_group_criterion.effective_cpc_bid_micros": 1000000, "ad_group_criterion.effective_cpc_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpm_bid_micros": 10000, "ad_group_criterion.effective_cpm_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpv_bid_micros": 0, "ad_group_criterion.effective_cpv_bid_source": "UNSPECIFIED", "ad_group_criterion.effective_percent_cpc_bid_micros": 0, "ad_group_criterion.effective_percent_cpc_bid_source": "UNSPECIFIED", "ad_group_criterion.final_mobile_urls": [], "ad_group_criterion.final_url_suffix": "", "ad_group_criterion.final_urls": [], "ad_group_criterion.gender.type": "UNSPECIFIED", "ad_group_criterion.income_range.type": "UNSPECIFIED", "ad_group_criterion.keyword.match_type": "BROAD", "ad_group_criterion.keyword.text": "data integrations", "ad_group_criterion.labels": [], "ad_group_criterion.mobile_app_category.mobile_app_category_constant": "", "ad_group_criterion.mobile_application.app_id": "", "ad_group_criterion.mobile_application.name": "", "ad_group_criterion.negative": false, "ad_group_criterion.parental_status.type": "UNSPECIFIED", "ad_group_criterion.percent_cpc_bid_micros": 0, "ad_group_criterion.placement.url": "", "ad_group_criterion.position_estimates.estimated_add_clicks_at_first_position_cpc": 0, "ad_group_criterion.position_estimates.estimated_add_cost_at_first_position_cpc": 0, "ad_group_criterion.position_estimates.first_page_cpc_micros": 0, "ad_group_criterion.position_estimates.first_position_cpc_micros": 0, "ad_group_criterion.position_estimates.top_of_page_cpc_micros": 0, "ad_group_criterion.quality_info.creative_quality_score": "UNSPECIFIED", "ad_group_criterion.quality_info.post_click_quality_score": "UNSPECIFIED", "ad_group_criterion.quality_info.quality_score": 0, "ad_group_criterion.quality_info.search_predicted_ctr": "UNSPECIFIED", "ad_group_criterion.resource_name": "customers/4651612872/adGroupCriteria/117036054899~18696703", "ad_group_criterion.status": "ENABLED", "ad_group_criterion.system_serving_status": "ELIGIBLE", "ad_group_criterion.topic.path": [], "ad_group_criterion.topic.topic_constant": "", "ad_group_criterion.tracking_url_template": "", "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.url_custom_parameters": [], "ad_group_criterion.user_interest.user_interest_category": "", "ad_group_criterion.user_list.user_list": "", "ad_group_criterion.webpage.conditions": [], "ad_group_criterion.webpage.coverage_percentage": 0.0, "ad_group_criterion.webpage.criterion_name": "", "ad_group_criterion.webpage.sample.sample_urls": [], "ad_group_criterion.youtube_channel.channel_id": "", "ad_group_criterion.youtube_video.video_id": ""}, "emitted_at": 1704407786207} +{"stream": "ad_group_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "ad_group.id": 117036054899, "ad_group_criterion.ad_group": "customers/4651612872/adGroups/117036054899", "ad_group_criterion.age_range.type": "UNSPECIFIED", "ad_group_criterion.app_payment_model.type": "UNSPECIFIED", "ad_group_criterion.approval_status": "APPROVED", "ad_group_criterion.audience.audience": "", "ad_group_criterion.bid_modifier": 0.0, "ad_group_criterion.combined_audience.combined_audience": "", "ad_group_criterion.cpc_bid_micros": 0, "ad_group_criterion.cpm_bid_micros": 0, "ad_group_criterion.cpv_bid_micros": 0, "ad_group_criterion.criterion_id": 376833662, "ad_group_criterion.custom_affinity.custom_affinity": "", "ad_group_criterion.custom_audience.custom_audience": "", "ad_group_criterion.custom_intent.custom_intent": "", "ad_group_criterion.disapproval_reasons": [], "ad_group_criterion.display_name": "data integration services", "ad_group_criterion.effective_cpc_bid_micros": 1000000, "ad_group_criterion.effective_cpc_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpm_bid_micros": 10000, "ad_group_criterion.effective_cpm_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpv_bid_micros": 0, "ad_group_criterion.effective_cpv_bid_source": "UNSPECIFIED", "ad_group_criterion.effective_percent_cpc_bid_micros": 0, "ad_group_criterion.effective_percent_cpc_bid_source": "UNSPECIFIED", "ad_group_criterion.final_mobile_urls": [], "ad_group_criterion.final_url_suffix": "", "ad_group_criterion.final_urls": [], "ad_group_criterion.gender.type": "UNSPECIFIED", "ad_group_criterion.income_range.type": "UNSPECIFIED", "ad_group_criterion.keyword.match_type": "BROAD", "ad_group_criterion.keyword.text": "data integration services", "ad_group_criterion.labels": [], "ad_group_criterion.mobile_app_category.mobile_app_category_constant": "", "ad_group_criterion.mobile_application.app_id": "", "ad_group_criterion.mobile_application.name": "", "ad_group_criterion.negative": false, "ad_group_criterion.parental_status.type": "UNSPECIFIED", "ad_group_criterion.percent_cpc_bid_micros": 0, "ad_group_criterion.placement.url": "", "ad_group_criterion.position_estimates.estimated_add_clicks_at_first_position_cpc": 0, "ad_group_criterion.position_estimates.estimated_add_cost_at_first_position_cpc": 0, "ad_group_criterion.position_estimates.first_page_cpc_micros": 0, "ad_group_criterion.position_estimates.first_position_cpc_micros": 0, "ad_group_criterion.position_estimates.top_of_page_cpc_micros": 0, "ad_group_criterion.quality_info.creative_quality_score": "UNSPECIFIED", "ad_group_criterion.quality_info.post_click_quality_score": "UNSPECIFIED", "ad_group_criterion.quality_info.quality_score": 0, "ad_group_criterion.quality_info.search_predicted_ctr": "UNSPECIFIED", "ad_group_criterion.resource_name": "customers/4651612872/adGroupCriteria/117036054899~376833662", "ad_group_criterion.status": "ENABLED", "ad_group_criterion.system_serving_status": "ELIGIBLE", "ad_group_criterion.topic.path": [], "ad_group_criterion.topic.topic_constant": "", "ad_group_criterion.tracking_url_template": "", "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.url_custom_parameters": [], "ad_group_criterion.user_interest.user_interest_category": "", "ad_group_criterion.user_list.user_list": "", "ad_group_criterion.webpage.conditions": [], "ad_group_criterion.webpage.coverage_percentage": 0.0, "ad_group_criterion.webpage.criterion_name": "", "ad_group_criterion.webpage.sample.sample_urls": [], "ad_group_criterion.youtube_channel.channel_id": "", "ad_group_criterion.youtube_video.video_id": ""}, "emitted_at": 1704407786208} +{"stream": "ad_group_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "ad_group.id": 117036054899, "ad_group_criterion.ad_group": "customers/4651612872/adGroups/117036054899", "ad_group_criterion.age_range.type": "UNSPECIFIED", "ad_group_criterion.app_payment_model.type": "UNSPECIFIED", "ad_group_criterion.approval_status": "APPROVED", "ad_group_criterion.audience.audience": "", "ad_group_criterion.bid_modifier": 0.0, "ad_group_criterion.combined_audience.combined_audience": "", "ad_group_criterion.cpc_bid_micros": 0, "ad_group_criterion.cpm_bid_micros": 0, "ad_group_criterion.cpv_bid_micros": 0, "ad_group_criterion.criterion_id": 13099056325, "ad_group_criterion.custom_affinity.custom_affinity": "", "ad_group_criterion.custom_audience.custom_audience": "", "ad_group_criterion.custom_intent.custom_intent": "", "ad_group_criterion.disapproval_reasons": [], "ad_group_criterion.display_name": "cloud data integration", "ad_group_criterion.effective_cpc_bid_micros": 1000000, "ad_group_criterion.effective_cpc_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpm_bid_micros": 10000, "ad_group_criterion.effective_cpm_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpv_bid_micros": 0, "ad_group_criterion.effective_cpv_bid_source": "UNSPECIFIED", "ad_group_criterion.effective_percent_cpc_bid_micros": 0, "ad_group_criterion.effective_percent_cpc_bid_source": "UNSPECIFIED", "ad_group_criterion.final_mobile_urls": [], "ad_group_criterion.final_url_suffix": "", "ad_group_criterion.final_urls": [], "ad_group_criterion.gender.type": "UNSPECIFIED", "ad_group_criterion.income_range.type": "UNSPECIFIED", "ad_group_criterion.keyword.match_type": "BROAD", "ad_group_criterion.keyword.text": "cloud data integration", "ad_group_criterion.labels": [], "ad_group_criterion.mobile_app_category.mobile_app_category_constant": "", "ad_group_criterion.mobile_application.app_id": "", "ad_group_criterion.mobile_application.name": "", "ad_group_criterion.negative": false, "ad_group_criterion.parental_status.type": "UNSPECIFIED", "ad_group_criterion.percent_cpc_bid_micros": 0, "ad_group_criterion.placement.url": "", "ad_group_criterion.position_estimates.estimated_add_clicks_at_first_position_cpc": 0, "ad_group_criterion.position_estimates.estimated_add_cost_at_first_position_cpc": 0, "ad_group_criterion.position_estimates.first_page_cpc_micros": 0, "ad_group_criterion.position_estimates.first_position_cpc_micros": 0, "ad_group_criterion.position_estimates.top_of_page_cpc_micros": 0, "ad_group_criterion.quality_info.creative_quality_score": "UNSPECIFIED", "ad_group_criterion.quality_info.post_click_quality_score": "UNSPECIFIED", "ad_group_criterion.quality_info.quality_score": 0, "ad_group_criterion.quality_info.search_predicted_ctr": "UNSPECIFIED", "ad_group_criterion.resource_name": "customers/4651612872/adGroupCriteria/117036054899~13099056325", "ad_group_criterion.status": "ENABLED", "ad_group_criterion.system_serving_status": "ELIGIBLE", "ad_group_criterion.topic.path": [], "ad_group_criterion.topic.topic_constant": "", "ad_group_criterion.tracking_url_template": "", "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.url_custom_parameters": [], "ad_group_criterion.user_interest.user_interest_category": "", "ad_group_criterion.user_list.user_list": "", "ad_group_criterion.webpage.conditions": [], "ad_group_criterion.webpage.coverage_percentage": 0.0, "ad_group_criterion.webpage.criterion_name": "", "ad_group_criterion.webpage.sample.sample_urls": [], "ad_group_criterion.youtube_channel.channel_id": "", "ad_group_criterion.youtube_video.video_id": ""}, "emitted_at": 1704407786209} +{"stream": "ad_listing_group_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "ad_group_criterion.resource_name": "customers/4651612872/adGroupCriteria/117036054899~18696703", "ad_group.id": 117036054899, "ad_group_criterion.criterion_id": 18696703, "ad_group_criterion.listing_group.case_value.activity_country.value": "", "ad_group_criterion.listing_group.case_value.activity_id.value": "", "ad_group_criterion.listing_group.case_value.activity_rating.value": 0, "ad_group_criterion.listing_group.case_value.hotel_city.city_criterion": "", "ad_group_criterion.listing_group.case_value.hotel_class.value": 0, "ad_group_criterion.listing_group.case_value.hotel_country_region.country_region_criterion": "", "ad_group_criterion.listing_group.case_value.hotel_id.value": "", "ad_group_criterion.listing_group.case_value.hotel_state.state_criterion": "", "ad_group_criterion.listing_group.case_value.product_category.category_id": 0, "ad_group_criterion.listing_group.case_value.product_category.level": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_brand.value": "", "ad_group_criterion.listing_group.case_value.product_channel.channel": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_channel_exclusivity.channel_exclusivity": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_condition.condition": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_custom_attribute.index": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_custom_attribute.value": "", "ad_group_criterion.listing_group.case_value.product_item_id.value": "", "ad_group_criterion.listing_group.case_value.product_type.level": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_type.value": "", "ad_group_criterion.listing_group.parent_ad_group_criterion": "", "ad_group_criterion.listing_group.type": "UNSPECIFIED"}, "emitted_at": 1704407823748} +{"stream": "ad_listing_group_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "ad_group_criterion.resource_name": "customers/4651612872/adGroupCriteria/117036054899~376833662", "ad_group.id": 117036054899, "ad_group_criterion.criterion_id": 376833662, "ad_group_criterion.listing_group.case_value.activity_country.value": "", "ad_group_criterion.listing_group.case_value.activity_id.value": "", "ad_group_criterion.listing_group.case_value.activity_rating.value": 0, "ad_group_criterion.listing_group.case_value.hotel_city.city_criterion": "", "ad_group_criterion.listing_group.case_value.hotel_class.value": 0, "ad_group_criterion.listing_group.case_value.hotel_country_region.country_region_criterion": "", "ad_group_criterion.listing_group.case_value.hotel_id.value": "", "ad_group_criterion.listing_group.case_value.hotel_state.state_criterion": "", "ad_group_criterion.listing_group.case_value.product_category.category_id": 0, "ad_group_criterion.listing_group.case_value.product_category.level": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_brand.value": "", "ad_group_criterion.listing_group.case_value.product_channel.channel": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_channel_exclusivity.channel_exclusivity": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_condition.condition": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_custom_attribute.index": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_custom_attribute.value": "", "ad_group_criterion.listing_group.case_value.product_item_id.value": "", "ad_group_criterion.listing_group.case_value.product_type.level": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_type.value": "", "ad_group_criterion.listing_group.parent_ad_group_criterion": "", "ad_group_criterion.listing_group.type": "UNSPECIFIED"}, "emitted_at": 1704407823749} +{"stream": "ad_listing_group_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "ad_group_criterion.resource_name": "customers/4651612872/adGroupCriteria/117036054899~13099056325", "ad_group.id": 117036054899, "ad_group_criterion.criterion_id": 13099056325, "ad_group_criterion.listing_group.case_value.activity_country.value": "", "ad_group_criterion.listing_group.case_value.activity_id.value": "", "ad_group_criterion.listing_group.case_value.activity_rating.value": 0, "ad_group_criterion.listing_group.case_value.hotel_city.city_criterion": "", "ad_group_criterion.listing_group.case_value.hotel_class.value": 0, "ad_group_criterion.listing_group.case_value.hotel_country_region.country_region_criterion": "", "ad_group_criterion.listing_group.case_value.hotel_id.value": "", "ad_group_criterion.listing_group.case_value.hotel_state.state_criterion": "", "ad_group_criterion.listing_group.case_value.product_category.category_id": 0, "ad_group_criterion.listing_group.case_value.product_category.level": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_brand.value": "", "ad_group_criterion.listing_group.case_value.product_channel.channel": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_channel_exclusivity.channel_exclusivity": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_condition.condition": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_custom_attribute.index": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_custom_attribute.value": "", "ad_group_criterion.listing_group.case_value.product_item_id.value": "", "ad_group_criterion.listing_group.case_value.product_type.level": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_type.value": "", "ad_group_criterion.listing_group.parent_ad_group_criterion": "", "ad_group_criterion.listing_group.type": "UNSPECIFIED"}, "emitted_at": 1704407823750} +{"stream": "ad_group_criterion_label", "data": {"ad_group.id": 137051662444, "label.id": 21902092838, "ad_group_criterion_label.ad_group_criterion": "customers/4651612872/adGroupCriteria/137051662444~10766861", "ad_group_criterion_label.label": "customers/4651612872/labels/21902092838", "ad_group_criterion_label.resource_name": "customers/4651612872/adGroupCriterionLabels/137051662444~10766861~21902092838", "ad_group_criterion.criterion_id": 10766861}, "emitted_at": 1704407848182} +{"stream": "ad_group_criterion_label", "data": {"ad_group.id": 137051662444, "label.id": 21906377810, "ad_group_criterion_label.ad_group_criterion": "customers/4651612872/adGroupCriteria/137051662444~528912986", "ad_group_criterion_label.label": "customers/4651612872/labels/21906377810", "ad_group_criterion_label.resource_name": "customers/4651612872/adGroupCriterionLabels/137051662444~528912986~21906377810", "ad_group_criterion.criterion_id": 528912986}, "emitted_at": 1704407848186} +{"stream": "campaign_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "campaign.id": 9660123292, "campaign_criterion.resource_name": "customers/4651612872/campaignCriteria/9660123292~2124", "campaign_criterion.campaign": "customers/4651612872/campaigns/9660123292", "campaign_criterion.age_range.type": "UNSPECIFIED", "campaign_criterion.mobile_application.name": "", "campaign_criterion.negative": false, "campaign_criterion.youtube_channel.channel_id": "", "campaign_criterion.youtube_video.video_id": ""}, "emitted_at": 1704407849655} +{"stream": "campaign_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "campaign.id": 9660123292, "campaign_criterion.resource_name": "customers/4651612872/campaignCriteria/9660123292~2250", "campaign_criterion.campaign": "customers/4651612872/campaigns/9660123292", "campaign_criterion.age_range.type": "UNSPECIFIED", "campaign_criterion.mobile_application.name": "", "campaign_criterion.negative": false, "campaign_criterion.youtube_channel.channel_id": "", "campaign_criterion.youtube_video.video_id": ""}, "emitted_at": 1704407849656} +{"stream": "campaign_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "campaign.id": 9660123292, "campaign_criterion.resource_name": "customers/4651612872/campaignCriteria/9660123292~2276", "campaign_criterion.campaign": "customers/4651612872/campaigns/9660123292", "campaign_criterion.age_range.type": "UNSPECIFIED", "campaign_criterion.mobile_application.name": "", "campaign_criterion.negative": false, "campaign_criterion.youtube_channel.channel_id": "", "campaign_criterion.youtube_video.video_id": ""}, "emitted_at": 1704407849656} \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-google-ads/integration_tests/expected_records_click.jsonl b/airbyte-integrations/connectors/source-google-ads/integration_tests/expected_records_click.jsonl new file mode 100644 index 0000000000000..46f5b1b428ad9 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/integration_tests/expected_records_click.jsonl @@ -0,0 +1,69 @@ +{"stream": "ad_group_ad_legacy", "data": {"ad_group_ad.ad.legacy_responsive_display_ad.accent_color": "", "ad_group.id": 155311392438, "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "ad_group_ad.ad_group": "customers/4651612872/adGroups/155311392438", "ad_group.name": "Airbyte", "ad_group.status": "ENABLED", "segments.ad_network_type": "SEARCH", "ad_group_ad.ad_strength": "EXCELLENT", "ad_group_ad.ad.type": "RESPONSIVE_SEARCH_AD", "metrics.all_conversions_from_interactions_rate": 4.9339207, "metrics.all_conversions_value": 803.783622, "metrics.all_conversions": 148.017621, "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.added_by_google_ads": false, "metrics.average_cost": 5602666.666666667, "metrics.average_cpc": 5602666.666666667, "metrics.average_cpe": 0.0, "metrics.average_cpm": 1031165644.1717792, "metrics.average_cpv": 0.0, "metrics.average_page_views": 0.0, "metrics.average_time_on_site": 0.0, "ad_group.base_ad_group": "customers/4651612872/adGroups/155311392438", "campaign.base_campaign": "customers/4651612872/campaigns/20643300404", "metrics.bounce_rate": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.business_name": "", "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": "", "campaign.id": 20643300404, "campaign.name": "mm_search_brand", "campaign.status": "PAUSED", "metrics.clicks": 30, "ad_group_ad.policy_summary.approval_status": "APPROVED", "metrics.conversions_from_interactions_rate": 0.22079663333333333, "metrics.conversions_value": 662.3899, "metrics.conversions": 6.623899, "metrics.cost_micros": 168080000, "metrics.cost_per_all_conversions": 1135540.4773057392, "metrics.cost_per_conversion": 25374783.039415307, "metrics.cost_per_current_model_attributed_conversion": 25374783.039415307, "ad_group_ad.ad.final_mobile_urls": [], "ad_group_ad.ad.final_urls": ["https://airbyte.com/"], "ad_group_ad.ad.tracking_url_template": "", "ad_group_ad.ad.url_custom_parameters": [], "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.18404907975460122, "metrics.current_model_attributed_conversions_value": 662.3899, "metrics.current_model_attributed_conversions": 6.623899, "segments.date": "2023-12-31", "segments.day_of_week": "SUNDAY", "ad_group_ad.ad.expanded_text_ad.description": "", "ad_group_ad.ad.text_ad.description1": "", "ad_group_ad.ad.text_ad.description2": "", "ad_group_ad.ad.device_preference": "UNSPECIFIED", "ad_group_ad.ad.display_url": "", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description": "", "ad_group_ad.ad.expanded_text_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.headline_part3": "", "customer.id": 4651612872, "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": "UNSPECIFIED", "metrics.gmail_forwards": 0, "metrics.gmail_saves": 0, "metrics.gmail_secondary_clicks": 0, "ad_group_ad.ad.text_ad.headline": "", "ad_group_ad.ad.expanded_text_ad.headline_part1": "", "ad_group_ad.ad.expanded_text_ad.headline_part2": "", "ad_group_ad.ad.id": 676665180945, "ad_group_ad.ad.image_ad.image_url": "", "ad_group_ad.ad.image_ad.pixel_height": 0, "ad_group_ad.ad.image_ad.pixel_width": 0, "ad_group_ad.ad.image_ad.mime_type": "UNSPECIFIED", "ad_group_ad.ad.image_ad.name": "", "metrics.impressions": 163, "metrics.interaction_rate": 0.18404907975460122, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interactions": 30, "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.main_color": "", "segments.month": "2023-12-01", "ad_group_ad.ad.responsive_display_ad.accent_color": "", "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.responsive_display_ad.business_name": "", "ad_group_ad.ad.responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.responsive_display_ad.descriptions": [], "ad_group_ad.ad.responsive_display_ad.price_prefix": "", "ad_group_ad.ad.responsive_display_ad.promo_text": "", "ad_group_ad.ad.responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.responsive_display_ad.headlines": [], "ad_group_ad.ad.responsive_display_ad.logo_images": [], "ad_group_ad.ad.responsive_display_ad.square_logo_images": [], "ad_group_ad.ad.responsive_display_ad.long_headline": "", "ad_group_ad.ad.responsive_display_ad.main_color": "", "ad_group_ad.ad.responsive_display_ad.marketing_images": [], "ad_group_ad.ad.responsive_display_ad.square_marketing_images": [], "ad_group_ad.ad.responsive_display_ad.youtube_videos": [], "ad_group_ad.ad.expanded_text_ad.path1": "", "ad_group_ad.ad.expanded_text_ad.path2": "", "metrics.percent_new_visitors": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": "", "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": "", "segments.quarter": "2023-10-01", "ad_group_ad.ad.responsive_search_ad.descriptions": ["text: \"The most comprehensive catalog of connectors, trusted by 40,000K engineers\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"A high-performing and scalable data integration platform with advanced features.\"\nasset_performance_label: BEST\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Try Airbyte for free! Connect Any Data, Any User, & Any Application Effortlessly.\"\nasset_performance_label: BEST\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Build custom connectors in 10 min with our no-code connector builder.\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.headlines": ["text: \"Airbyte\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"The only ETL tool you need\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Build ELT Pipelines In Minutes\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"No code, ELT Tool\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Replicate Data in Minutes\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Open Source Integration\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Try Airbyte Cloud Free\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Browse Our Catalog\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Trusted by over 40K Engineers\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"14 Day Free Trial\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"300+ off-the-shelf connectors\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"No-Code Connector Builder\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Get started in minutes\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Extract, Load & Transform\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Streamlined Data Pipeline\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.path1": "", "ad_group_ad.ad.responsive_search_ad.path2": "", "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": "", "ad_group_ad.status": "ENABLED", "ad_group_ad.ad.system_managed_resource_source": "UNSPECIFIED", "metrics.top_impression_percentage": 0.8834355828220859, "ad_group_ad.ad.app_ad.descriptions": [], "ad_group_ad.ad.app_ad.headlines": [], "ad_group_ad.ad.app_ad.html5_media_bundles": [], "ad_group_ad.ad.app_ad.images": [], "ad_group_ad.ad.app_ad.mandatory_ad_text": "", "ad_group_ad.ad.app_ad.youtube_videos": [], "metrics.value_per_all_conversions": 5.430323880154783, "metrics.value_per_conversion": 100.0, "metrics.value_per_current_model_attributed_conversion": 100.0, "metrics.video_quartile_p100_rate": 0.0, "metrics.video_quartile_p25_rate": 0.0, "metrics.video_quartile_p50_rate": 0.0, "metrics.video_quartile_p75_rate": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2023-12-25", "segments.year": 2023}, "emitted_at": 1705321896341} +{"stream": "ad_group_ad_legacy", "data": {"ad_group_ad.ad.legacy_responsive_display_ad.accent_color": "", "ad_group.id": 155311392438, "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "ad_group_ad.ad_group": "customers/4651612872/adGroups/155311392438", "ad_group.name": "Airbyte", "ad_group.status": "ENABLED", "segments.ad_network_type": "SEARCH", "ad_group_ad.ad_strength": "EXCELLENT", "ad_group_ad.ad.type": "RESPONSIVE_SEARCH_AD", "metrics.all_conversions_from_interactions_rate": 5.129510513513513, "metrics.all_conversions_value": 1315.049854, "metrics.all_conversions": 189.791889, "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.added_by_google_ads": false, "metrics.average_cost": 8890000.0, "metrics.average_cpc": 8890000.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 1279883268.4824903, "metrics.average_cpv": 0.0, "metrics.average_page_views": 0.0, "metrics.average_time_on_site": 0.0, "ad_group.base_ad_group": "customers/4651612872/adGroups/155311392438", "campaign.base_campaign": "customers/4651612872/campaigns/20643300404", "metrics.bounce_rate": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.business_name": "", "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": "", "campaign.id": 20643300404, "campaign.name": "mm_search_brand", "campaign.status": "PAUSED", "metrics.clicks": 37, "ad_group_ad.policy_summary.approval_status": "APPROVED", "metrics.conversions_from_interactions_rate": 0.35933878378378376, "metrics.conversions_value": 1129.5535, "metrics.conversions": 13.295535, "metrics.cost_micros": 328930000, "metrics.cost_per_all_conversions": 1733108.8369113603, "metrics.cost_per_conversion": 24739884.480015285, "metrics.cost_per_current_model_attributed_conversion": 24739884.480015285, "ad_group_ad.ad.final_mobile_urls": [], "ad_group_ad.ad.final_urls": ["https://airbyte.com/"], "ad_group_ad.ad.tracking_url_template": "", "ad_group_ad.ad.url_custom_parameters": [], "metrics.cross_device_conversions": 3.0, "metrics.ctr": 0.14396887159533073, "metrics.current_model_attributed_conversions_value": 1129.5535, "metrics.current_model_attributed_conversions": 13.295535, "segments.date": "2024-01-01", "segments.day_of_week": "MONDAY", "ad_group_ad.ad.expanded_text_ad.description": "", "ad_group_ad.ad.text_ad.description1": "", "ad_group_ad.ad.text_ad.description2": "", "ad_group_ad.ad.device_preference": "UNSPECIFIED", "ad_group_ad.ad.display_url": "", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description": "", "ad_group_ad.ad.expanded_text_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.headline_part3": "", "customer.id": 4651612872, "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": "UNSPECIFIED", "metrics.gmail_forwards": 0, "metrics.gmail_saves": 0, "metrics.gmail_secondary_clicks": 0, "ad_group_ad.ad.text_ad.headline": "", "ad_group_ad.ad.expanded_text_ad.headline_part1": "", "ad_group_ad.ad.expanded_text_ad.headline_part2": "", "ad_group_ad.ad.id": 676665180945, "ad_group_ad.ad.image_ad.image_url": "", "ad_group_ad.ad.image_ad.pixel_height": 0, "ad_group_ad.ad.image_ad.pixel_width": 0, "ad_group_ad.ad.image_ad.mime_type": "UNSPECIFIED", "ad_group_ad.ad.image_ad.name": "", "metrics.impressions": 257, "metrics.interaction_rate": 0.14396887159533073, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interactions": 37, "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.main_color": "", "segments.month": "2024-01-01", "ad_group_ad.ad.responsive_display_ad.accent_color": "", "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.responsive_display_ad.business_name": "", "ad_group_ad.ad.responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.responsive_display_ad.descriptions": [], "ad_group_ad.ad.responsive_display_ad.price_prefix": "", "ad_group_ad.ad.responsive_display_ad.promo_text": "", "ad_group_ad.ad.responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.responsive_display_ad.headlines": [], "ad_group_ad.ad.responsive_display_ad.logo_images": [], "ad_group_ad.ad.responsive_display_ad.square_logo_images": [], "ad_group_ad.ad.responsive_display_ad.long_headline": "", "ad_group_ad.ad.responsive_display_ad.main_color": "", "ad_group_ad.ad.responsive_display_ad.marketing_images": [], "ad_group_ad.ad.responsive_display_ad.square_marketing_images": [], "ad_group_ad.ad.responsive_display_ad.youtube_videos": [], "ad_group_ad.ad.expanded_text_ad.path1": "", "ad_group_ad.ad.expanded_text_ad.path2": "", "metrics.percent_new_visitors": 0.0, "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": "", "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": "", "segments.quarter": "2024-01-01", "ad_group_ad.ad.responsive_search_ad.descriptions": ["text: \"The most comprehensive catalog of connectors, trusted by 40,000K engineers\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"A high-performing and scalable data integration platform with advanced features.\"\nasset_performance_label: BEST\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Try Airbyte for free! Connect Any Data, Any User, & Any Application Effortlessly.\"\nasset_performance_label: BEST\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Build custom connectors in 10 min with our no-code connector builder.\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.headlines": ["text: \"Airbyte\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"The only ETL tool you need\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Build ELT Pipelines In Minutes\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"No code, ELT Tool\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Replicate Data in Minutes\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Open Source Integration\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Try Airbyte Cloud Free\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Browse Our Catalog\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Trusted by over 40K Engineers\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"14 Day Free Trial\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"300+ off-the-shelf connectors\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"No-Code Connector Builder\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Get started in minutes\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Extract, Load & Transform\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Streamlined Data Pipeline\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.path1": "", "ad_group_ad.ad.responsive_search_ad.path2": "", "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": "", "ad_group_ad.status": "ENABLED", "ad_group_ad.ad.system_managed_resource_source": "UNSPECIFIED", "metrics.top_impression_percentage": 0.9688715953307393, "ad_group_ad.ad.app_ad.descriptions": [], "ad_group_ad.ad.app_ad.headlines": [], "ad_group_ad.ad.app_ad.html5_media_bundles": [], "ad_group_ad.ad.app_ad.images": [], "ad_group_ad.ad.app_ad.mandatory_ad_text": "", "ad_group_ad.ad.app_ad.youtube_videos": [], "metrics.value_per_all_conversions": 6.928904395909143, "metrics.value_per_conversion": 84.9573559845467, "metrics.value_per_current_model_attributed_conversion": 84.9573559845467, "metrics.video_quartile_p100_rate": 0.0, "metrics.video_quartile_p25_rate": 0.0, "metrics.video_quartile_p50_rate": 0.0, "metrics.video_quartile_p75_rate": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2024-01-01", "segments.year": 2024}, "emitted_at": 1705321896352} +{"stream": "campaign_budget", "data": {"customer.id": 4651612872, "campaign.id": 20643300404, "campaign_budget.aligned_bidding_strategy_id": 0, "campaign_budget.amount_micros": 330000000, "campaign_budget.delivery_method": "STANDARD", "campaign_budget.explicitly_shared": false, "campaign_budget.has_recommended_budget": false, "campaign_budget.id": 13022493317, "campaign_budget.name": "mm_search_brand", "campaign_budget.period": "DAILY", "campaign_budget.recommended_budget_amount_micros": 0, "campaign_budget.recommended_budget_estimated_change_weekly_clicks": 0, "campaign_budget.recommended_budget_estimated_change_weekly_cost_micros": 0, "campaign_budget.recommended_budget_estimated_change_weekly_interactions": 0, "campaign_budget.recommended_budget_estimated_change_weekly_views": 0, "campaign_budget.reference_count": 1, "campaign_budget.resource_name": "customers/4651612872/campaignBudgets/13022493317", "campaign_budget.status": "ENABLED", "campaign_budget.total_amount_micros": 0, "campaign_budget.type": "STANDARD", "segments.date": "2023-12-31", "segments.budget_campaign_association_status.campaign": "customers/4651612872/campaigns/20643300404", "segments.budget_campaign_association_status.status": "ENABLED", "metrics.all_conversions": 148.017621, "metrics.all_conversions_from_interactions_rate": 4.9339207, "metrics.all_conversions_value": 803.783622, "metrics.average_cost": 5602666.666666667, "metrics.average_cpc": 5602666.666666667, "metrics.average_cpe": 0.0, "metrics.average_cpm": 1031165644.1717792, "metrics.average_cpv": 0.0, "metrics.clicks": 30, "metrics.conversions": 6.623899, "metrics.conversions_from_interactions_rate": 0.22079663333333333, "metrics.conversions_value": 662.3899, "metrics.cost_micros": 168080000, "metrics.cost_per_all_conversions": 1135540.4773057392, "metrics.cost_per_conversion": 25374783.039415307, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.18404907975460122, "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "metrics.impressions": 163, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interaction_rate": 0.18404907975460122, "metrics.interactions": 30, "metrics.value_per_all_conversions": 5.430323880154783, "metrics.value_per_conversion": 100.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1705322166925} +{"stream": "campaign_budget", "data": {"customer.id": 4651612872, "campaign.id": 20643300404, "campaign_budget.aligned_bidding_strategy_id": 0, "campaign_budget.amount_micros": 330000000, "campaign_budget.delivery_method": "STANDARD", "campaign_budget.explicitly_shared": false, "campaign_budget.has_recommended_budget": false, "campaign_budget.id": 13022493317, "campaign_budget.name": "mm_search_brand", "campaign_budget.period": "DAILY", "campaign_budget.recommended_budget_amount_micros": 0, "campaign_budget.recommended_budget_estimated_change_weekly_clicks": 0, "campaign_budget.recommended_budget_estimated_change_weekly_cost_micros": 0, "campaign_budget.recommended_budget_estimated_change_weekly_interactions": 0, "campaign_budget.recommended_budget_estimated_change_weekly_views": 0, "campaign_budget.reference_count": 1, "campaign_budget.resource_name": "customers/4651612872/campaignBudgets/13022493317", "campaign_budget.status": "ENABLED", "campaign_budget.total_amount_micros": 0, "campaign_budget.type": "STANDARD", "segments.date": "2024-01-01", "segments.budget_campaign_association_status.campaign": "customers/4651612872/campaigns/20643300404", "segments.budget_campaign_association_status.status": "ENABLED", "metrics.all_conversions": 189.791889, "metrics.all_conversions_from_interactions_rate": 5.129510513513513, "metrics.all_conversions_value": 1315.049854, "metrics.average_cost": 8890000.0, "metrics.average_cpc": 8890000.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 1279883268.4824903, "metrics.average_cpv": 0.0, "metrics.clicks": 37, "metrics.conversions": 13.295535, "metrics.conversions_from_interactions_rate": 0.35933878378378376, "metrics.conversions_value": 1129.5535, "metrics.cost_micros": 328930000, "metrics.cost_per_all_conversions": 1733108.8369113603, "metrics.cost_per_conversion": 24739884.480015285, "metrics.cross_device_conversions": 3.0, "metrics.ctr": 0.14396887159533073, "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "metrics.impressions": 257, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interaction_rate": 0.14396887159533073, "metrics.interactions": 37, "metrics.value_per_all_conversions": 6.928904395909143, "metrics.value_per_conversion": 84.9573559845467, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1705322166935} +{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2024-01-03"}, "emitted_at": 1704408105935} +{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n", "targeting_dimension: TOPIC\nbid_only: true\n"], "segments.date": "2024-01-03"}, "emitted_at": 1704408105942} +{"stream": "ad_group_custom", "data": {"ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "segments.date": "2024-01-02"}, "emitted_at": 1704408105943} +{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH", "metrics.all_conversions_from_interactions_rate": 2.9861930909090906, "metrics.all_conversions_value": 32.848124, "metrics.all_conversions": 32.848124, "metrics.average_cost": 1398181.8181818181, "metrics.average_cpc": 1398181.8181818181, "metrics.average_cpe": 0.0, "metrics.average_cpm": 640833333.3333334, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 11, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 15380000, "metrics.cost_per_all_conversions": 468215.4755626227, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.4583333333333333, "segments.date": "2023-12-31", "segments.day_of_week": "SUNDAY", "segments.device": "MOBILE", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 24, "metrics.interaction_rate": 0.4583333333333333, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.interactions": 11, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2023-12-01", "segments.quarter": "2023-10-01", "metrics.search_budget_lost_impression_share": 0.0, "metrics.search_exact_match_impression_share": 0.6666666666666666, "metrics.search_impression_share": 0.6153846153846154, "metrics.search_rank_lost_impression_share": 0.38461538461538464, "metrics.value_per_all_conversions": 1.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2023-12-25", "segments.year": 2023}, "emitted_at": 1704408106623} +{"stream": "account_performance_report", "data": {"customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "segments.ad_network_type": "SEARCH", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "customer.manager": false, "metrics.clicks": 0, "metrics.content_budget_lost_impression_share": 0.0, "metrics.content_impression_share": 0.0, "metrics.content_rank_lost_impression_share": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.date": "2023-12-31", "segments.day_of_week": "SUNDAY", "segments.device": "TABLET", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "metrics.impressions": 2, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "customer.auto_tagging_enabled": true, "customer.test_account": false, "segments.month": "2023-12-01", "segments.quarter": "2023-10-01", "metrics.search_budget_lost_impression_share": 0.0, "metrics.search_exact_match_impression_share": 1.0, "metrics.search_impression_share": 1.0, "metrics.search_rank_lost_impression_share": 0.0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2023-12-25", "segments.year": 2023}, "emitted_at": 1704408106623} +{"stream": "click_view", "data": {"ad_group.name": "Airbyte", "click_view.gclid": "Cj0KCQiAv8SsBhC7ARIsALIkVT0aoRchs-JIhSNfsaUU1GQLPOaNU15XNhGEkNLQ0kpOpYoV_VDNNogaAl-2EALw_wcB", "click_view.ad_group_ad": "customers/4651612872/adGroupAds/155311392438~676665180945", "click_view.keyword": "", "click_view.keyword_info.match_type": "UNSPECIFIED", "click_view.keyword_info.text": "", "campaign.id": 20643300404, "ad_group.id": 155311392438, "segments.date": "2023-12-31", "customer.id": 4651612872, "campaign.name": "mm_search_brand", "segments.ad_network_type": "SEARCH", "campaign.network_settings.target_content_network": false, "campaign.network_settings.target_google_search": true, "campaign.network_settings.target_partner_search_network": false, "campaign.network_settings.target_search_network": false}, "emitted_at": 1704408107339} +{"stream": "click_view", "data": {"ad_group.name": "Airbyte", "click_view.gclid": "Cj0KCQiAv8SsBhC7ARIsALIkVT17gRC4RsmoYczHLguLKTaojzCB4bPA0GjBSa3x44kKTbWVCvXEe58aAkeHEALw_wcB", "click_view.ad_group_ad": "customers/4651612872/adGroupAds/155311392438~676665180945", "click_view.keyword": "", "click_view.keyword_info.match_type": "UNSPECIFIED", "click_view.keyword_info.text": "", "campaign.id": 20643300404, "ad_group.id": 155311392438, "segments.date": "2023-12-31", "customer.id": 4651612872, "campaign.name": "mm_search_brand", "segments.ad_network_type": "SEARCH", "campaign.network_settings.target_content_network": false, "campaign.network_settings.target_google_search": true, "campaign.network_settings.target_partner_search_network": false, "campaign.network_settings.target_search_network": false}, "emitted_at": 1704408107340} +{"stream": "click_view", "data": {"ad_group.name": "Airbyte", "click_view.gclid": "Cj0KCQiAv8SsBhC7ARIsALIkVT1H36_GC-jRtw1xNj-9Y5IdIZWa-1j-BqhYt5JSB82QzNE5-7OxgB4aAlU4EALw_wcB", "click_view.ad_group_ad": "customers/4651612872/adGroupAds/155311392438~676665180945", "click_view.keyword": "", "click_view.keyword_info.match_type": "UNSPECIFIED", "click_view.keyword_info.text": "", "campaign.id": 20643300404, "ad_group.id": 155311392438, "segments.date": "2023-12-31", "customer.id": 4651612872, "campaign.name": "mm_search_brand", "segments.ad_network_type": "SEARCH", "campaign.network_settings.target_content_network": false, "campaign.network_settings.target_google_search": true, "campaign.network_settings.target_partner_search_network": false, "campaign.network_settings.target_search_network": false}, "emitted_at": 1704408107340} +{"stream": "geographic_view", "data": {"customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "geographic_view.country_criterion_id": 2840, "geographic_view.location_type": "AREA_OF_INTEREST", "ad_group.id": 155311392438, "segments.date": "2023-12-31"}, "emitted_at": 1704408109676} +{"stream": "geographic_view", "data": {"customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "geographic_view.country_criterion_id": 2840, "geographic_view.location_type": "LOCATION_OF_PRESENCE", "ad_group.id": 155311392438, "segments.date": "2023-12-31"}, "emitted_at": 1704408109677} +{"stream": "geographic_view", "data": {"customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "geographic_view.country_criterion_id": 2840, "geographic_view.location_type": "AREA_OF_INTEREST", "ad_group.id": 155311392438, "segments.date": "2024-01-01"}, "emitted_at": 1704408109677} +{"stream": "topic_view", "data": {"topic_view.resource_name": "customers/4651612872/topicViews/144799120517~945751797", "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 264196.96969696967, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 66, "metrics.active_view_measurability": 1.0, "metrics.active_view_measurable_cost_micros": 17437, "metrics.active_view_measurable_impressions": 90, "metrics.active_view_viewability": 0.7333333333333333, "ad_group.id": 144799120517, "ad_group.name": "Ad group 1", "ad_group.status": "ENABLED", "segments.ad_network_type": "CONTENT", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 193744.44444444444, "metrics.average_cpv": 0.0, "ad_group.base_ad_group": "customers/4651612872/adGroups/144799120517", "campaign.base_campaign": "customers/4651612872/campaigns/19410069806", "ad_group_criterion.bid_modifier": 0.0, "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "MANUAL_CPM", "campaign.id": 19410069806, "campaign.name": "Brand awareness and reach-Display-1", "campaign.status": "PAUSED", "metrics.clicks": 0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 17437, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "ad_group_criterion.effective_cpc_bid_micros": 10000, "ad_group_criterion.effective_cpc_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpm_bid_micros": 2000000, "ad_group_criterion.effective_cpm_bid_source": "AD_GROUP", "ad_group_criterion.topic.path": ["", "Online Communities"], "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.date": "2024-01-03", "segments.day_of_week": "WEDNESDAY", "segments.device": "DESKTOP", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "ad_group_criterion.final_mobile_urls": [], "ad_group_criterion.final_urls": [], "metrics.gmail_forwards": 0, "metrics.gmail_saves": 0, "metrics.gmail_secondary_clicks": 0, "ad_group_criterion.criterion_id": 945751797, "metrics.impressions": 90, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "ad_group_criterion.negative": false, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n", "targeting_dimension: TOPIC\nbid_only: true\n"], "segments.month": "2024-01-01", "segments.quarter": "2024-01-01", "ad_group_criterion.status": "ENABLED", "ad_group_criterion.tracking_url_template": "", "ad_group_criterion.url_custom_parameters": [], "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "ad_group_criterion.topic.topic_constant": "topicConstants/299", "metrics.video_quartile_p100_rate": 0.0, "metrics.video_quartile_p25_rate": 0.0, "metrics.video_quartile_p50_rate": 0.0, "metrics.video_quartile_p75_rate": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2024-01-01", "segments.year": 2024}, "emitted_at": 1704408113977} +{"stream": "topic_view", "data": {"topic_view.resource_name": "customers/4651612872/topicViews/144799120517~1543464477", "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 862000.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 2, "metrics.active_view_measurability": 1.0, "metrics.active_view_measurable_cost_micros": 1724, "metrics.active_view_measurable_impressions": 4, "metrics.active_view_viewability": 0.5, "ad_group.id": 144799120517, "ad_group.name": "Ad group 1", "ad_group.status": "ENABLED", "segments.ad_network_type": "CONTENT", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 431000.0, "metrics.average_cpv": 0.0, "ad_group.base_ad_group": "customers/4651612872/adGroups/144799120517", "campaign.base_campaign": "customers/4651612872/campaigns/19410069806", "ad_group_criterion.bid_modifier": 0.0, "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "MANUAL_CPM", "campaign.id": 19410069806, "campaign.name": "Brand awareness and reach-Display-1", "campaign.status": "PAUSED", "metrics.clicks": 0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 1724, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "ad_group_criterion.effective_cpc_bid_micros": 10000, "ad_group_criterion.effective_cpc_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpm_bid_micros": 2000000, "ad_group_criterion.effective_cpm_bid_source": "AD_GROUP", "ad_group_criterion.topic.path": ["", "Shopping"], "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.date": "2024-01-03", "segments.day_of_week": "WEDNESDAY", "segments.device": "DESKTOP", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "ad_group_criterion.final_mobile_urls": [], "ad_group_criterion.final_urls": [], "metrics.gmail_forwards": 0, "metrics.gmail_saves": 0, "metrics.gmail_secondary_clicks": 0, "ad_group_criterion.criterion_id": 1543464477, "metrics.impressions": 4, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "ad_group_criterion.negative": false, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n", "targeting_dimension: TOPIC\nbid_only: true\n"], "segments.month": "2024-01-01", "segments.quarter": "2024-01-01", "ad_group_criterion.status": "ENABLED", "ad_group_criterion.tracking_url_template": "", "ad_group_criterion.url_custom_parameters": [], "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "ad_group_criterion.topic.topic_constant": "topicConstants/18", "metrics.video_quartile_p100_rate": 0.0, "metrics.video_quartile_p25_rate": 0.0, "metrics.video_quartile_p50_rate": 0.0, "metrics.video_quartile_p75_rate": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2024-01-01", "segments.year": 2024}, "emitted_at": 1704408113979} +{"stream": "topic_view", "data": {"topic_view.resource_name": "customers/4651612872/topicViews/144799120517~1543465137", "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "metrics.active_view_cpm": 338986.6666666667, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 75, "metrics.active_view_measurability": 1.0, "metrics.active_view_measurable_cost_micros": 25424, "metrics.active_view_measurable_impressions": 104, "metrics.active_view_viewability": 0.7211538461538461, "ad_group.id": 144799120517, "ad_group.name": "Ad group 1", "ad_group.status": "ENABLED", "segments.ad_network_type": "CONTENT", "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.all_conversions": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpe": 0.0, "metrics.average_cpm": 244461.53846153844, "metrics.average_cpv": 0.0, "ad_group.base_ad_group": "customers/4651612872/adGroups/144799120517", "campaign.base_campaign": "customers/4651612872/campaigns/19410069806", "ad_group_criterion.bid_modifier": 0.0, "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "MANUAL_CPM", "campaign.id": 19410069806, "campaign.name": "Brand awareness and reach-Display-1", "campaign.status": "PAUSED", "metrics.clicks": 0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.conversions": 0.0, "metrics.cost_micros": 25424, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "ad_group_criterion.effective_cpc_bid_micros": 10000, "ad_group_criterion.effective_cpc_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpm_bid_micros": 2000000, "ad_group_criterion.effective_cpm_bid_source": "AD_GROUP", "ad_group_criterion.topic.path": ["", "Arts & Entertainment"], "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "segments.date": "2024-01-03", "segments.day_of_week": "WEDNESDAY", "segments.device": "DESKTOP", "metrics.engagement_rate": 0.0, "metrics.engagements": 0, "customer.id": 4651612872, "ad_group_criterion.final_mobile_urls": [], "ad_group_criterion.final_urls": [], "metrics.gmail_forwards": 0, "metrics.gmail_saves": 0, "metrics.gmail_secondary_clicks": 0, "ad_group_criterion.criterion_id": 1543465137, "metrics.impressions": 104, "metrics.interaction_rate": 0.0, "metrics.interaction_event_types": [], "metrics.interactions": 0, "ad_group_criterion.negative": false, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n", "targeting_dimension: TOPIC\nbid_only: true\n"], "segments.month": "2024-01-01", "segments.quarter": "2024-01-01", "ad_group_criterion.status": "ENABLED", "ad_group_criterion.tracking_url_template": "", "ad_group_criterion.url_custom_parameters": [], "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "ad_group_criterion.topic.topic_constant": "topicConstants/3", "metrics.video_quartile_p100_rate": 0.0, "metrics.video_quartile_p25_rate": 0.0, "metrics.video_quartile_p50_rate": 0.0, "metrics.video_quartile_p75_rate": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0, "segments.week": "2024-01-01", "segments.year": 2024}, "emitted_at": 1704408113986} +{"stream": "ad_group_ad", "data": {"ad_group.id": 155311392438, "ad_group_ad.ad.added_by_google_ads": false, "ad_group_ad.ad.app_ad.descriptions": [], "ad_group_ad.ad.app_ad.headlines": [], "ad_group_ad.ad.app_ad.html5_media_bundles": [], "ad_group_ad.ad.app_ad.images": [], "ad_group_ad.ad.app_ad.mandatory_ad_text": "", "ad_group_ad.ad.app_ad.youtube_videos": [], "ad_group_ad.ad.app_engagement_ad.descriptions": [], "ad_group_ad.ad.app_engagement_ad.headlines": [], "ad_group_ad.ad.app_engagement_ad.images": [], "ad_group_ad.ad.app_engagement_ad.videos": [], "ad_group_ad.ad.call_ad.business_name": "", "ad_group_ad.ad.call_ad.call_tracked": false, "ad_group_ad.ad.call_ad.conversion_action": "", "ad_group_ad.ad.call_ad.conversion_reporting_state": "UNSPECIFIED", "ad_group_ad.ad.call_ad.country_code": "", "ad_group_ad.ad.call_ad.description1": "", "ad_group_ad.ad.call_ad.description2": "", "ad_group_ad.ad.call_ad.disable_call_conversion": false, "ad_group_ad.ad.call_ad.headline1": "", "ad_group_ad.ad.call_ad.headline2": "", "ad_group_ad.ad.call_ad.path1": "", "ad_group_ad.ad.call_ad.path2": "", "ad_group_ad.ad.call_ad.phone_number": "", "ad_group_ad.ad.call_ad.phone_number_verification_url": "", "ad_group_ad.ad.device_preference": "UNSPECIFIED", "ad_group_ad.ad.display_upload_ad.display_upload_product_type": "UNSPECIFIED", "ad_group_ad.ad.display_upload_ad.media_bundle": "", "ad_group_ad.ad.display_url": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.description": "", "ad_group_ad.ad.expanded_text_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.headline_part1": "", "ad_group_ad.ad.expanded_text_ad.headline_part2": "", "ad_group_ad.ad.expanded_text_ad.headline_part3": "", "ad_group_ad.ad.expanded_text_ad.path1": "", "ad_group_ad.ad.expanded_text_ad.path2": "", "ad_group_ad.ad.final_app_urls": [], "ad_group_ad.ad.final_mobile_urls": [], "ad_group_ad.ad.final_url_suffix": "", "ad_group_ad.ad.final_urls": ["https://airbyte.com/"], "ad_group_ad.ad.hotel_ad": "", "ad_group_ad.ad.id": 676665180945, "ad_group_ad.ad.image_ad.image_url": "", "ad_group_ad.ad.image_ad.mime_type": "UNSPECIFIED", "ad_group_ad.ad.image_ad.name": "", "ad_group_ad.ad.image_ad.pixel_height": 0, "ad_group_ad.ad.image_ad.pixel_width": 0, "ad_group_ad.ad.image_ad.preview_image_url": "", "ad_group_ad.ad.image_ad.preview_pixel_height": 0, "ad_group_ad.ad.image_ad.preview_pixel_width": 0, "ad_group_ad.ad.legacy_app_install_ad": "", "ad_group_ad.ad.legacy_responsive_display_ad.accent_color": "", "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.legacy_responsive_display_ad.business_name": "", "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.legacy_responsive_display_ad.description": "", "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.main_color": "", "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": "", "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": "", "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": "", "ad_group_ad.ad.local_ad.call_to_actions": [], "ad_group_ad.ad.local_ad.descriptions": [], "ad_group_ad.ad.local_ad.headlines": [], "ad_group_ad.ad.local_ad.logo_images": [], "ad_group_ad.ad.local_ad.marketing_images": [], "ad_group_ad.ad.local_ad.path1": "", "ad_group_ad.ad.local_ad.path2": "", "ad_group_ad.ad.local_ad.videos": [], "ad_group_ad.ad.name": "", "ad_group_ad.ad.resource_name": "customers/4651612872/ads/676665180945", "ad_group_ad.ad.responsive_display_ad.accent_color": "", "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.responsive_display_ad.business_name": "", "ad_group_ad.ad.responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.responsive_display_ad.control_spec.enable_asset_enhancements": false, "ad_group_ad.ad.responsive_display_ad.control_spec.enable_autogen_video": false, "ad_group_ad.ad.responsive_display_ad.descriptions": [], "ad_group_ad.ad.responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.responsive_display_ad.headlines": [], "ad_group_ad.ad.responsive_display_ad.logo_images": [], "ad_group_ad.ad.responsive_display_ad.long_headline": "", "ad_group_ad.ad.responsive_display_ad.main_color": "", "ad_group_ad.ad.responsive_display_ad.marketing_images": [], "ad_group_ad.ad.responsive_display_ad.price_prefix": "", "ad_group_ad.ad.responsive_display_ad.promo_text": "", "ad_group_ad.ad.responsive_display_ad.square_logo_images": [], "ad_group_ad.ad.responsive_display_ad.square_marketing_images": [], "ad_group_ad.ad.responsive_display_ad.youtube_videos": [], "ad_group_ad.ad.responsive_search_ad.descriptions": ["text: \"The most comprehensive catalog of connectors, trusted by 40,000K engineers\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"A high-performing and scalable data integration platform with advanced features.\"\nasset_performance_label: BEST\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Try Airbyte for free! Connect Any Data, Any User, & Any Application Effortlessly.\"\nasset_performance_label: BEST\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Build custom connectors in 10 min with our no-code connector builder.\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.headlines": ["text: \"Airbyte\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"The only ETL tool you need\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Build ELT Pipelines In Minutes\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"No code, ELT Tool\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Replicate Data in Minutes\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Open Source Integration\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Try Airbyte Cloud Free\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Browse Our Catalog\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Trusted by over 40K Engineers\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"14 Day Free Trial\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"300+ off-the-shelf connectors\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"No-Code Connector Builder\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Get started in minutes\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Extract, Load & Transform\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Streamlined Data Pipeline\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.path1": "", "ad_group_ad.ad.responsive_search_ad.path2": "", "ad_group_ad.ad.shopping_comparison_listing_ad.headline": "", "ad_group_ad.ad.shopping_product_ad": "", "ad_group_ad.ad.shopping_smart_ad": "", "ad_group_ad.ad.smart_campaign_ad.descriptions": [], "ad_group_ad.ad.smart_campaign_ad.headlines": [], "ad_group_ad.ad.system_managed_resource_source": "UNSPECIFIED", "ad_group_ad.ad.text_ad.description1": "", "ad_group_ad.ad.text_ad.description2": "", "ad_group_ad.ad.text_ad.headline": "", "ad_group_ad.ad.tracking_url_template": "", "ad_group_ad.ad.type": "RESPONSIVE_SEARCH_AD", "ad_group_ad.ad.url_collections": [], "ad_group_ad.ad.url_custom_parameters": [], "ad_group_ad.ad.video_ad.in_feed.description1": "", "ad_group_ad.ad.video_ad.in_feed.description2": "", "ad_group_ad.ad.video_ad.in_feed.headline": "", "ad_group_ad.ad.video_ad.in_stream.action_button_label": "", "ad_group_ad.ad.video_ad.in_stream.action_headline": "", "ad_group_ad.ad.video_ad.out_stream.description": "", "ad_group_ad.ad.video_ad.out_stream.headline": "", "ad_group_ad.ad.video_responsive_ad.call_to_actions": [], "ad_group_ad.ad.video_responsive_ad.companion_banners": [], "ad_group_ad.ad.video_responsive_ad.descriptions": [], "ad_group_ad.ad.video_responsive_ad.headlines": [], "ad_group_ad.ad.video_responsive_ad.long_headlines": [], "ad_group_ad.ad.video_responsive_ad.videos": [], "ad_group_ad.ad_group": "customers/4651612872/adGroups/155311392438", "ad_group_ad.ad_strength": "EXCELLENT", "ad_group_ad.labels": [], "ad_group_ad.policy_summary.approval_status": "APPROVED", "ad_group_ad.policy_summary.policy_topic_entries": [], "ad_group_ad.policy_summary.review_status": "REVIEWED", "ad_group_ad.resource_name": "customers/4651612872/adGroupAds/155311392438~676665180945", "ad_group_ad.status": "ENABLED", "segments.date": "2023-12-31"}, "emitted_at": 1704408116313} +{"stream": "ad_group_ad", "data": {"ad_group.id": 155311392438, "ad_group_ad.ad.added_by_google_ads": false, "ad_group_ad.ad.app_ad.descriptions": [], "ad_group_ad.ad.app_ad.headlines": [], "ad_group_ad.ad.app_ad.html5_media_bundles": [], "ad_group_ad.ad.app_ad.images": [], "ad_group_ad.ad.app_ad.mandatory_ad_text": "", "ad_group_ad.ad.app_ad.youtube_videos": [], "ad_group_ad.ad.app_engagement_ad.descriptions": [], "ad_group_ad.ad.app_engagement_ad.headlines": [], "ad_group_ad.ad.app_engagement_ad.images": [], "ad_group_ad.ad.app_engagement_ad.videos": [], "ad_group_ad.ad.call_ad.business_name": "", "ad_group_ad.ad.call_ad.call_tracked": false, "ad_group_ad.ad.call_ad.conversion_action": "", "ad_group_ad.ad.call_ad.conversion_reporting_state": "UNSPECIFIED", "ad_group_ad.ad.call_ad.country_code": "", "ad_group_ad.ad.call_ad.description1": "", "ad_group_ad.ad.call_ad.description2": "", "ad_group_ad.ad.call_ad.disable_call_conversion": false, "ad_group_ad.ad.call_ad.headline1": "", "ad_group_ad.ad.call_ad.headline2": "", "ad_group_ad.ad.call_ad.path1": "", "ad_group_ad.ad.call_ad.path2": "", "ad_group_ad.ad.call_ad.phone_number": "", "ad_group_ad.ad.call_ad.phone_number_verification_url": "", "ad_group_ad.ad.device_preference": "UNSPECIFIED", "ad_group_ad.ad.display_upload_ad.display_upload_product_type": "UNSPECIFIED", "ad_group_ad.ad.display_upload_ad.media_bundle": "", "ad_group_ad.ad.display_url": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.description": "", "ad_group_ad.ad.expanded_text_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.headline_part1": "", "ad_group_ad.ad.expanded_text_ad.headline_part2": "", "ad_group_ad.ad.expanded_text_ad.headline_part3": "", "ad_group_ad.ad.expanded_text_ad.path1": "", "ad_group_ad.ad.expanded_text_ad.path2": "", "ad_group_ad.ad.final_app_urls": [], "ad_group_ad.ad.final_mobile_urls": [], "ad_group_ad.ad.final_url_suffix": "", "ad_group_ad.ad.final_urls": ["https://airbyte.com/"], "ad_group_ad.ad.hotel_ad": "", "ad_group_ad.ad.id": 676665180945, "ad_group_ad.ad.image_ad.image_url": "", "ad_group_ad.ad.image_ad.mime_type": "UNSPECIFIED", "ad_group_ad.ad.image_ad.name": "", "ad_group_ad.ad.image_ad.pixel_height": 0, "ad_group_ad.ad.image_ad.pixel_width": 0, "ad_group_ad.ad.image_ad.preview_image_url": "", "ad_group_ad.ad.image_ad.preview_pixel_height": 0, "ad_group_ad.ad.image_ad.preview_pixel_width": 0, "ad_group_ad.ad.legacy_app_install_ad": "", "ad_group_ad.ad.legacy_responsive_display_ad.accent_color": "", "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.legacy_responsive_display_ad.business_name": "", "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.legacy_responsive_display_ad.description": "", "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.main_color": "", "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": "", "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": "", "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": "", "ad_group_ad.ad.local_ad.call_to_actions": [], "ad_group_ad.ad.local_ad.descriptions": [], "ad_group_ad.ad.local_ad.headlines": [], "ad_group_ad.ad.local_ad.logo_images": [], "ad_group_ad.ad.local_ad.marketing_images": [], "ad_group_ad.ad.local_ad.path1": "", "ad_group_ad.ad.local_ad.path2": "", "ad_group_ad.ad.local_ad.videos": [], "ad_group_ad.ad.name": "", "ad_group_ad.ad.resource_name": "customers/4651612872/ads/676665180945", "ad_group_ad.ad.responsive_display_ad.accent_color": "", "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.responsive_display_ad.business_name": "", "ad_group_ad.ad.responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.responsive_display_ad.control_spec.enable_asset_enhancements": false, "ad_group_ad.ad.responsive_display_ad.control_spec.enable_autogen_video": false, "ad_group_ad.ad.responsive_display_ad.descriptions": [], "ad_group_ad.ad.responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.responsive_display_ad.headlines": [], "ad_group_ad.ad.responsive_display_ad.logo_images": [], "ad_group_ad.ad.responsive_display_ad.long_headline": "", "ad_group_ad.ad.responsive_display_ad.main_color": "", "ad_group_ad.ad.responsive_display_ad.marketing_images": [], "ad_group_ad.ad.responsive_display_ad.price_prefix": "", "ad_group_ad.ad.responsive_display_ad.promo_text": "", "ad_group_ad.ad.responsive_display_ad.square_logo_images": [], "ad_group_ad.ad.responsive_display_ad.square_marketing_images": [], "ad_group_ad.ad.responsive_display_ad.youtube_videos": [], "ad_group_ad.ad.responsive_search_ad.descriptions": ["text: \"The most comprehensive catalog of connectors, trusted by 40,000K engineers\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"A high-performing and scalable data integration platform with advanced features.\"\nasset_performance_label: BEST\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Try Airbyte for free! Connect Any Data, Any User, & Any Application Effortlessly.\"\nasset_performance_label: BEST\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Build custom connectors in 10 min with our no-code connector builder.\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.headlines": ["text: \"Airbyte\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"The only ETL tool you need\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Build ELT Pipelines In Minutes\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"No code, ELT Tool\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Replicate Data in Minutes\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Open Source Integration\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Try Airbyte Cloud Free\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Browse Our Catalog\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Trusted by over 40K Engineers\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"14 Day Free Trial\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"300+ off-the-shelf connectors\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"No-Code Connector Builder\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Get started in minutes\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Extract, Load & Transform\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Streamlined Data Pipeline\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.path1": "", "ad_group_ad.ad.responsive_search_ad.path2": "", "ad_group_ad.ad.shopping_comparison_listing_ad.headline": "", "ad_group_ad.ad.shopping_product_ad": "", "ad_group_ad.ad.shopping_smart_ad": "", "ad_group_ad.ad.smart_campaign_ad.descriptions": [], "ad_group_ad.ad.smart_campaign_ad.headlines": [], "ad_group_ad.ad.system_managed_resource_source": "UNSPECIFIED", "ad_group_ad.ad.text_ad.description1": "", "ad_group_ad.ad.text_ad.description2": "", "ad_group_ad.ad.text_ad.headline": "", "ad_group_ad.ad.tracking_url_template": "", "ad_group_ad.ad.type": "RESPONSIVE_SEARCH_AD", "ad_group_ad.ad.url_collections": [], "ad_group_ad.ad.url_custom_parameters": [], "ad_group_ad.ad.video_ad.in_feed.description1": "", "ad_group_ad.ad.video_ad.in_feed.description2": "", "ad_group_ad.ad.video_ad.in_feed.headline": "", "ad_group_ad.ad.video_ad.in_stream.action_button_label": "", "ad_group_ad.ad.video_ad.in_stream.action_headline": "", "ad_group_ad.ad.video_ad.out_stream.description": "", "ad_group_ad.ad.video_ad.out_stream.headline": "", "ad_group_ad.ad.video_responsive_ad.call_to_actions": [], "ad_group_ad.ad.video_responsive_ad.companion_banners": [], "ad_group_ad.ad.video_responsive_ad.descriptions": [], "ad_group_ad.ad.video_responsive_ad.headlines": [], "ad_group_ad.ad.video_responsive_ad.long_headlines": [], "ad_group_ad.ad.video_responsive_ad.videos": [], "ad_group_ad.ad_group": "customers/4651612872/adGroups/155311392438", "ad_group_ad.ad_strength": "EXCELLENT", "ad_group_ad.labels": [], "ad_group_ad.policy_summary.approval_status": "APPROVED", "ad_group_ad.policy_summary.policy_topic_entries": [], "ad_group_ad.policy_summary.review_status": "REVIEWED", "ad_group_ad.resource_name": "customers/4651612872/adGroupAds/155311392438~676665180945", "ad_group_ad.status": "ENABLED", "segments.date": "2024-01-01"}, "emitted_at": 1704408116319} +{"stream": "ad_group_ad", "data": {"ad_group.id": 155311392438, "ad_group_ad.ad.added_by_google_ads": false, "ad_group_ad.ad.app_ad.descriptions": [], "ad_group_ad.ad.app_ad.headlines": [], "ad_group_ad.ad.app_ad.html5_media_bundles": [], "ad_group_ad.ad.app_ad.images": [], "ad_group_ad.ad.app_ad.mandatory_ad_text": "", "ad_group_ad.ad.app_ad.youtube_videos": [], "ad_group_ad.ad.app_engagement_ad.descriptions": [], "ad_group_ad.ad.app_engagement_ad.headlines": [], "ad_group_ad.ad.app_engagement_ad.images": [], "ad_group_ad.ad.app_engagement_ad.videos": [], "ad_group_ad.ad.call_ad.business_name": "", "ad_group_ad.ad.call_ad.call_tracked": false, "ad_group_ad.ad.call_ad.conversion_action": "", "ad_group_ad.ad.call_ad.conversion_reporting_state": "UNSPECIFIED", "ad_group_ad.ad.call_ad.country_code": "", "ad_group_ad.ad.call_ad.description1": "", "ad_group_ad.ad.call_ad.description2": "", "ad_group_ad.ad.call_ad.disable_call_conversion": false, "ad_group_ad.ad.call_ad.headline1": "", "ad_group_ad.ad.call_ad.headline2": "", "ad_group_ad.ad.call_ad.path1": "", "ad_group_ad.ad.call_ad.path2": "", "ad_group_ad.ad.call_ad.phone_number": "", "ad_group_ad.ad.call_ad.phone_number_verification_url": "", "ad_group_ad.ad.device_preference": "UNSPECIFIED", "ad_group_ad.ad.display_upload_ad.display_upload_product_type": "UNSPECIFIED", "ad_group_ad.ad.display_upload_ad.media_bundle": "", "ad_group_ad.ad.display_url": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description": "", "ad_group_ad.ad.expanded_dynamic_search_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.description": "", "ad_group_ad.ad.expanded_text_ad.description2": "", "ad_group_ad.ad.expanded_text_ad.headline_part1": "", "ad_group_ad.ad.expanded_text_ad.headline_part2": "", "ad_group_ad.ad.expanded_text_ad.headline_part3": "", "ad_group_ad.ad.expanded_text_ad.path1": "", "ad_group_ad.ad.expanded_text_ad.path2": "", "ad_group_ad.ad.final_app_urls": [], "ad_group_ad.ad.final_mobile_urls": [], "ad_group_ad.ad.final_url_suffix": "", "ad_group_ad.ad.final_urls": ["https://airbyte.com/"], "ad_group_ad.ad.hotel_ad": "", "ad_group_ad.ad.id": 676665180945, "ad_group_ad.ad.image_ad.image_url": "", "ad_group_ad.ad.image_ad.mime_type": "UNSPECIFIED", "ad_group_ad.ad.image_ad.name": "", "ad_group_ad.ad.image_ad.pixel_height": 0, "ad_group_ad.ad.image_ad.pixel_width": 0, "ad_group_ad.ad.image_ad.preview_image_url": "", "ad_group_ad.ad.image_ad.preview_pixel_height": 0, "ad_group_ad.ad.image_ad.preview_pixel_width": 0, "ad_group_ad.ad.legacy_app_install_ad": "", "ad_group_ad.ad.legacy_responsive_display_ad.accent_color": "", "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.legacy_responsive_display_ad.business_name": "", "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.legacy_responsive_display_ad.description": "", "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.main_color": "", "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": "", "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": "", "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": "", "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": "", "ad_group_ad.ad.local_ad.call_to_actions": [], "ad_group_ad.ad.local_ad.descriptions": [], "ad_group_ad.ad.local_ad.headlines": [], "ad_group_ad.ad.local_ad.logo_images": [], "ad_group_ad.ad.local_ad.marketing_images": [], "ad_group_ad.ad.local_ad.path1": "", "ad_group_ad.ad.local_ad.path2": "", "ad_group_ad.ad.local_ad.videos": [], "ad_group_ad.ad.name": "", "ad_group_ad.ad.resource_name": "customers/4651612872/ads/676665180945", "ad_group_ad.ad.responsive_display_ad.accent_color": "", "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": false, "ad_group_ad.ad.responsive_display_ad.business_name": "", "ad_group_ad.ad.responsive_display_ad.call_to_action_text": "", "ad_group_ad.ad.responsive_display_ad.control_spec.enable_asset_enhancements": false, "ad_group_ad.ad.responsive_display_ad.control_spec.enable_autogen_video": false, "ad_group_ad.ad.responsive_display_ad.descriptions": [], "ad_group_ad.ad.responsive_display_ad.format_setting": "UNSPECIFIED", "ad_group_ad.ad.responsive_display_ad.headlines": [], "ad_group_ad.ad.responsive_display_ad.logo_images": [], "ad_group_ad.ad.responsive_display_ad.long_headline": "", "ad_group_ad.ad.responsive_display_ad.main_color": "", "ad_group_ad.ad.responsive_display_ad.marketing_images": [], "ad_group_ad.ad.responsive_display_ad.price_prefix": "", "ad_group_ad.ad.responsive_display_ad.promo_text": "", "ad_group_ad.ad.responsive_display_ad.square_logo_images": [], "ad_group_ad.ad.responsive_display_ad.square_marketing_images": [], "ad_group_ad.ad.responsive_display_ad.youtube_videos": [], "ad_group_ad.ad.responsive_search_ad.descriptions": ["text: \"The most comprehensive catalog of connectors, trusted by 40,000K engineers\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"A high-performing and scalable data integration platform with advanced features.\"\nasset_performance_label: BEST\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Try Airbyte for free! Connect Any Data, Any User, & Any Application Effortlessly.\"\nasset_performance_label: BEST\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Build custom connectors in 10 min with our no-code connector builder.\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.headlines": ["text: \"Airbyte\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"The only ETL tool you need\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Build ELT Pipelines In Minutes\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"No code, ELT Tool\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Replicate Data in Minutes\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Open Source Integration\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Try Airbyte Cloud Free\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Browse Our Catalog\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Trusted by over 40K Engineers\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"14 Day Free Trial\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"300+ off-the-shelf connectors\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"No-Code Connector Builder\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Get started in minutes\"\nasset_performance_label: GOOD\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Extract, Load & Transform\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n", "text: \"Streamlined Data Pipeline\"\nasset_performance_label: LEARNING\npolicy_summary_info {\n review_status: REVIEWED\n approval_status: APPROVED\n}\n"], "ad_group_ad.ad.responsive_search_ad.path1": "", "ad_group_ad.ad.responsive_search_ad.path2": "", "ad_group_ad.ad.shopping_comparison_listing_ad.headline": "", "ad_group_ad.ad.shopping_product_ad": "", "ad_group_ad.ad.shopping_smart_ad": "", "ad_group_ad.ad.smart_campaign_ad.descriptions": [], "ad_group_ad.ad.smart_campaign_ad.headlines": [], "ad_group_ad.ad.system_managed_resource_source": "UNSPECIFIED", "ad_group_ad.ad.text_ad.description1": "", "ad_group_ad.ad.text_ad.description2": "", "ad_group_ad.ad.text_ad.headline": "", "ad_group_ad.ad.tracking_url_template": "", "ad_group_ad.ad.type": "RESPONSIVE_SEARCH_AD", "ad_group_ad.ad.url_collections": [], "ad_group_ad.ad.url_custom_parameters": [], "ad_group_ad.ad.video_ad.in_feed.description1": "", "ad_group_ad.ad.video_ad.in_feed.description2": "", "ad_group_ad.ad.video_ad.in_feed.headline": "", "ad_group_ad.ad.video_ad.in_stream.action_button_label": "", "ad_group_ad.ad.video_ad.in_stream.action_headline": "", "ad_group_ad.ad.video_ad.out_stream.description": "", "ad_group_ad.ad.video_ad.out_stream.headline": "", "ad_group_ad.ad.video_responsive_ad.call_to_actions": [], "ad_group_ad.ad.video_responsive_ad.companion_banners": [], "ad_group_ad.ad.video_responsive_ad.descriptions": [], "ad_group_ad.ad.video_responsive_ad.headlines": [], "ad_group_ad.ad.video_responsive_ad.long_headlines": [], "ad_group_ad.ad.video_responsive_ad.videos": [], "ad_group_ad.ad_group": "customers/4651612872/adGroups/155311392438", "ad_group_ad.ad_strength": "EXCELLENT", "ad_group_ad.labels": [], "ad_group_ad.policy_summary.approval_status": "APPROVED", "ad_group_ad.policy_summary.policy_topic_entries": [], "ad_group_ad.policy_summary.review_status": "REVIEWED", "ad_group_ad.resource_name": "customers/4651612872/adGroupAds/155311392438~676665180945", "ad_group_ad.status": "ENABLED", "segments.date": "2024-01-02"}, "emitted_at": 1704408116320} +{"stream": "ad_group", "data": {"campaign.id": 20643300404, "ad_group.ad_rotation_mode": "UNSPECIFIED", "ad_group.base_ad_group": "customers/4651612872/adGroups/155311392438", "ad_group.campaign": "customers/4651612872/campaigns/20643300404", "metrics.cost_micros": 168080000, "ad_group.cpc_bid_micros": 10000, "ad_group.cpm_bid_micros": 10000, "ad_group.cpv_bid_micros": 0, "ad_group.display_custom_bid_dimension": "UNSPECIFIED", "ad_group.effective_target_cpa_micros": 0, "ad_group.effective_target_cpa_source": "UNSPECIFIED", "ad_group.effective_target_roas": 0.0, "ad_group.effective_target_roas_source": "UNSPECIFIED", "ad_group.excluded_parent_asset_field_types": [], "ad_group.optimized_targeting_enabled": false, "ad_group.final_url_suffix": "", "ad_group.id": 155311392438, "ad_group.labels": [], "ad_group.name": "Airbyte", "ad_group.percent_cpc_bid_micros": 0, "ad_group.resource_name": "customers/4651612872/adGroups/155311392438", "ad_group.status": "ENABLED", "ad_group.target_cpa_micros": 0, "ad_group.target_cpm_micros": 10000, "ad_group.target_roas": 0.0, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "ad_group.tracking_url_template": "", "ad_group.type": "SEARCH_STANDARD", "ad_group.url_custom_parameters": ["key: \"adgroup\"\nvalue: \"Airbyte\"\n", "key: \"campaign\"\nvalue: \"mm_search_brand\"\n"], "segments.date": "2023-12-31"}, "emitted_at": 1704717743436} +{"stream": "ad_group", "data": {"campaign.id": 20643300404, "ad_group.ad_rotation_mode": "UNSPECIFIED", "ad_group.base_ad_group": "customers/4651612872/adGroups/155311392438", "ad_group.campaign": "customers/4651612872/campaigns/20643300404", "metrics.cost_micros": 328930000, "ad_group.cpc_bid_micros": 10000, "ad_group.cpm_bid_micros": 10000, "ad_group.cpv_bid_micros": 0, "ad_group.display_custom_bid_dimension": "UNSPECIFIED", "ad_group.effective_target_cpa_micros": 0, "ad_group.effective_target_cpa_source": "UNSPECIFIED", "ad_group.effective_target_roas": 0.0, "ad_group.effective_target_roas_source": "UNSPECIFIED", "ad_group.excluded_parent_asset_field_types": [], "ad_group.optimized_targeting_enabled": false, "ad_group.final_url_suffix": "", "ad_group.id": 155311392438, "ad_group.labels": [], "ad_group.name": "Airbyte", "ad_group.percent_cpc_bid_micros": 0, "ad_group.resource_name": "customers/4651612872/adGroups/155311392438", "ad_group.status": "ENABLED", "ad_group.target_cpa_micros": 0, "ad_group.target_cpm_micros": 10000, "ad_group.target_roas": 0.0, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "ad_group.tracking_url_template": "", "ad_group.type": "SEARCH_STANDARD", "ad_group.url_custom_parameters": ["key: \"adgroup\"\nvalue: \"Airbyte\"\n", "key: \"campaign\"\nvalue: \"mm_search_brand\"\n"], "segments.date": "2024-01-01"}, "emitted_at": 1704717743438} +{"stream": "ad_group", "data": {"campaign.id": 20655886237, "ad_group.ad_rotation_mode": "UNSPECIFIED", "ad_group.base_ad_group": "customers/4651612872/adGroups/153930342465", "ad_group.campaign": "customers/4651612872/campaigns/20655886237", "metrics.cost_micros": 27110000, "ad_group.cpc_bid_micros": 10000, "ad_group.cpm_bid_micros": 10000, "ad_group.cpv_bid_micros": 0, "ad_group.display_custom_bid_dimension": "UNSPECIFIED", "ad_group.effective_target_cpa_micros": 0, "ad_group.effective_target_cpa_source": "UNSPECIFIED", "ad_group.effective_target_roas": 0.0, "ad_group.effective_target_roas_source": "UNSPECIFIED", "ad_group.excluded_parent_asset_field_types": [], "ad_group.optimized_targeting_enabled": false, "ad_group.final_url_suffix": "", "ad_group.id": 153930342465, "ad_group.labels": [], "ad_group.name": "Airflow", "ad_group.percent_cpc_bid_micros": 0, "ad_group.resource_name": "customers/4651612872/adGroups/153930342465", "ad_group.status": "ENABLED", "ad_group.target_cpa_micros": 0, "ad_group.target_cpm_micros": 10000, "ad_group.target_roas": 0.0, "ad_group.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n", "targeting_dimension: AGE_RANGE\nbid_only: true\n", "targeting_dimension: GENDER\nbid_only: true\n", "targeting_dimension: PARENTAL_STATUS\nbid_only: true\n", "targeting_dimension: INCOME_RANGE\nbid_only: true\n"], "ad_group.tracking_url_template": "", "ad_group.type": "SEARCH_STANDARD", "ad_group.url_custom_parameters": ["key: \"adgroup\"\nvalue: \"Airflow\"\n", "key: \"campaign\"\nvalue: \"mm_search_competitors\"\n"], "segments.date": "2024-01-02"}, "emitted_at": 1704717743440} +{"stream": "customer", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.7609283000000001, "customer.optimization_score_weight": 3182.4700060000005, "customer.pay_per_conversion_eligibility_failure_reasons": [], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "{lpurl}?utm_term={keyword}&utm_campaign={_utmcampaign}&utm_source=adwords&utm_medium=ppc&hsa_acc=4651612872&hsa_cam={campaignid}&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3", "segments.date": "2023-12-31"}, "emitted_at": 1704408117407} +{"stream": "customer", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.7609283000000001, "customer.optimization_score_weight": 3182.4700060000005, "customer.pay_per_conversion_eligibility_failure_reasons": [], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "{lpurl}?utm_term={keyword}&utm_campaign={_utmcampaign}&utm_source=adwords&utm_medium=ppc&hsa_acc=4651612872&hsa_cam={campaignid}&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3", "segments.date": "2024-01-01"}, "emitted_at": 1704408117408} +{"stream": "customer", "data": {"customer.auto_tagging_enabled": true, "customer.call_reporting_setting.call_conversion_action": "customers/4651612872/conversionActions/179", "customer.call_reporting_setting.call_conversion_reporting_enabled": true, "customer.call_reporting_setting.call_reporting_enabled": true, "customer.conversion_tracking_setting.conversion_tracking_id": 657981234, "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": 0, "customer.currency_code": "USD", "customer.descriptive_name": "Airbyte", "customer.final_url_suffix": "", "customer.has_partners_badge": false, "customer.id": 4651612872, "customer.manager": false, "customer.optimization_score": 0.7609283000000001, "customer.optimization_score_weight": 3182.4700060000005, "customer.pay_per_conversion_eligibility_failure_reasons": [], "customer.remarketing_setting.google_global_site_tag": "\n\n\n", "customer.resource_name": "customers/4651612872", "customer.test_account": false, "customer.time_zone": "America/Los_Angeles", "customer.tracking_url_template": "{lpurl}?utm_term={keyword}&utm_campaign={_utmcampaign}&utm_source=adwords&utm_medium=ppc&hsa_acc=4651612872&hsa_cam={campaignid}&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3", "segments.date": "2024-01-02"}, "emitted_at": 1704408117408} +{"stream": "campaign", "data": {"campaign.accessible_bidding_strategy": "", "campaign.ad_serving_optimization_status": "OPTIMIZE", "campaign.advertising_channel_sub_type": "UNSPECIFIED", "campaign.advertising_channel_type": "SEARCH", "campaign.app_campaign_setting.app_id": "", "campaign.app_campaign_setting.app_store": "UNSPECIFIED", "campaign.app_campaign_setting.bidding_strategy_goal_type": "UNSPECIFIED", "campaign.base_campaign": "customers/4651612872/campaigns/20643300404", "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "MAXIMIZE_CONVERSIONS", "campaign.campaign_budget": "customers/4651612872/campaignBudgets/13022493317", "campaign_budget.amount_micros": 330000000, "campaign.commission.commission_rate_micros": 0, "campaign.dynamic_search_ads_setting.domain_name": "", "campaign.dynamic_search_ads_setting.feeds": [], "campaign.dynamic_search_ads_setting.language_code": "", "campaign.dynamic_search_ads_setting.use_supplied_urls_only": false, "campaign.end_date": "2037-12-30", "campaign.excluded_parent_asset_field_types": [], "campaign.experiment_type": "BASE", "campaign.final_url_suffix": "", "campaign.frequency_caps": [], "campaign.geo_target_type_setting.negative_geo_target_type": "PRESENCE", "campaign.geo_target_type_setting.positive_geo_target_type": "PRESENCE_OR_INTEREST", "campaign.hotel_setting.hotel_center_id": 0, "campaign.id": 20643300404, "campaign.labels": [], "campaign.local_campaign_setting.location_source_type": "UNSPECIFIED", "campaign.manual_cpc.enhanced_cpc_enabled": false, "campaign.manual_cpm": "", "campaign.manual_cpv": "", "campaign.maximize_conversion_value.target_roas": 0.0, "campaign.maximize_conversions.target_cpa_micros": 0, "campaign.name": "mm_search_brand", "campaign.network_settings.target_content_network": false, "campaign.network_settings.target_google_search": true, "campaign.network_settings.target_partner_search_network": false, "campaign.network_settings.target_search_network": false, "campaign.optimization_goal_setting.optimization_goal_types": [], "campaign.optimization_score": 0.0, "campaign.payment_mode": "CLICKS", "campaign.percent_cpc.cpc_bid_ceiling_micros": 0, "campaign.percent_cpc.enhanced_cpc_enabled": false, "campaign.real_time_bidding_setting.opt_in": false, "campaign.resource_name": "customers/4651612872/campaigns/20643300404", "campaign.selective_optimization.conversion_actions": [], "campaign.serving_status": "SERVING", "campaign.shopping_setting.campaign_priority": 0, "campaign.shopping_setting.enable_local": false, "campaign.shopping_setting.merchant_id": 0, "campaign.start_date": "2023-10-10", "campaign.status": "PAUSED", "campaign.target_cpa.cpc_bid_ceiling_micros": 0, "campaign.target_cpa.cpc_bid_floor_micros": 0, "campaign.target_cpa.target_cpa_micros": 0, "campaign.target_cpm.target_frequency_goal.target_count": 0, "campaign.target_cpm.target_frequency_goal.time_unit": "UNSPECIFIED", "campaign.target_impression_share.cpc_bid_ceiling_micros": 0, "campaign.target_impression_share.location": "UNSPECIFIED", "campaign.target_impression_share.location_fraction_micros": 0, "campaign.target_roas.cpc_bid_ceiling_micros": 0, "campaign.target_roas.cpc_bid_floor_micros": 0, "campaign.target_roas.target_roas": 0.0, "campaign.target_spend.cpc_bid_ceiling_micros": 0, "campaign.target_spend.target_spend_micros": 0, "campaign.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n"], "campaign.tracking_setting.tracking_url": "", "campaign.tracking_url_template": "{lpurl}?utm_term={keyword}&utm_campaign=mm_search_brand&utm_source=adwords&utm_medium=ppc&hsa_acc=4651612872&hsa_cam=20643300404&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3", "campaign.url_custom_parameters": [], "campaign.vanity_pharma.vanity_pharma_display_url_mode": "UNSPECIFIED", "campaign.vanity_pharma.vanity_pharma_text": "UNSPECIFIED", "campaign.video_brand_safety_suitability": "UNSPECIFIED", "metrics.clicks": 1, "metrics.ctr": 0.3333333333333333, "metrics.conversions": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 2980000, "metrics.impressions": 3, "metrics.video_views": 0, "metrics.video_quartile_p100_rate": 0.0, "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "metrics.average_cost": 2980000.0, "metrics.average_cpc": 2980000.0, "metrics.average_cpm": 993333333.3333334, "metrics.interactions": 1, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.value_per_conversion": 0.0, "metrics.cost_per_conversion": 0.0, "segments.date": "2023-12-31", "segments.hour": 0, "segments.ad_network_type": "SEARCH"}, "emitted_at": 1704408118506} +{"stream": "campaign", "data": {"campaign.accessible_bidding_strategy": "", "campaign.ad_serving_optimization_status": "OPTIMIZE", "campaign.advertising_channel_sub_type": "UNSPECIFIED", "campaign.advertising_channel_type": "SEARCH", "campaign.app_campaign_setting.app_id": "", "campaign.app_campaign_setting.app_store": "UNSPECIFIED", "campaign.app_campaign_setting.bidding_strategy_goal_type": "UNSPECIFIED", "campaign.base_campaign": "customers/4651612872/campaigns/20643300404", "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "MAXIMIZE_CONVERSIONS", "campaign.campaign_budget": "customers/4651612872/campaignBudgets/13022493317", "campaign_budget.amount_micros": 330000000, "campaign.commission.commission_rate_micros": 0, "campaign.dynamic_search_ads_setting.domain_name": "", "campaign.dynamic_search_ads_setting.feeds": [], "campaign.dynamic_search_ads_setting.language_code": "", "campaign.dynamic_search_ads_setting.use_supplied_urls_only": false, "campaign.end_date": "2037-12-30", "campaign.excluded_parent_asset_field_types": [], "campaign.experiment_type": "BASE", "campaign.final_url_suffix": "", "campaign.frequency_caps": [], "campaign.geo_target_type_setting.negative_geo_target_type": "PRESENCE", "campaign.geo_target_type_setting.positive_geo_target_type": "PRESENCE_OR_INTEREST", "campaign.hotel_setting.hotel_center_id": 0, "campaign.id": 20643300404, "campaign.labels": [], "campaign.local_campaign_setting.location_source_type": "UNSPECIFIED", "campaign.manual_cpc.enhanced_cpc_enabled": false, "campaign.manual_cpm": "", "campaign.manual_cpv": "", "campaign.maximize_conversion_value.target_roas": 0.0, "campaign.maximize_conversions.target_cpa_micros": 0, "campaign.name": "mm_search_brand", "campaign.network_settings.target_content_network": false, "campaign.network_settings.target_google_search": true, "campaign.network_settings.target_partner_search_network": false, "campaign.network_settings.target_search_network": false, "campaign.optimization_goal_setting.optimization_goal_types": [], "campaign.optimization_score": 0.0, "campaign.payment_mode": "CLICKS", "campaign.percent_cpc.cpc_bid_ceiling_micros": 0, "campaign.percent_cpc.enhanced_cpc_enabled": false, "campaign.real_time_bidding_setting.opt_in": false, "campaign.resource_name": "customers/4651612872/campaigns/20643300404", "campaign.selective_optimization.conversion_actions": [], "campaign.serving_status": "SERVING", "campaign.shopping_setting.campaign_priority": 0, "campaign.shopping_setting.enable_local": false, "campaign.shopping_setting.merchant_id": 0, "campaign.start_date": "2023-10-10", "campaign.status": "PAUSED", "campaign.target_cpa.cpc_bid_ceiling_micros": 0, "campaign.target_cpa.cpc_bid_floor_micros": 0, "campaign.target_cpa.target_cpa_micros": 0, "campaign.target_cpm.target_frequency_goal.target_count": 0, "campaign.target_cpm.target_frequency_goal.time_unit": "UNSPECIFIED", "campaign.target_impression_share.cpc_bid_ceiling_micros": 0, "campaign.target_impression_share.location": "UNSPECIFIED", "campaign.target_impression_share.location_fraction_micros": 0, "campaign.target_roas.cpc_bid_ceiling_micros": 0, "campaign.target_roas.cpc_bid_floor_micros": 0, "campaign.target_roas.target_roas": 0.0, "campaign.target_spend.cpc_bid_ceiling_micros": 0, "campaign.target_spend.target_spend_micros": 0, "campaign.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n"], "campaign.tracking_setting.tracking_url": "", "campaign.tracking_url_template": "{lpurl}?utm_term={keyword}&utm_campaign=mm_search_brand&utm_source=adwords&utm_medium=ppc&hsa_acc=4651612872&hsa_cam=20643300404&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3", "campaign.url_custom_parameters": [], "campaign.vanity_pharma.vanity_pharma_display_url_mode": "UNSPECIFIED", "campaign.vanity_pharma.vanity_pharma_text": "UNSPECIFIED", "campaign.video_brand_safety_suitability": "UNSPECIFIED", "metrics.clicks": 0, "metrics.ctr": 0.0, "metrics.conversions": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.impressions": 2, "metrics.video_views": 0, "metrics.video_quartile_p100_rate": 0.0, "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.interactions": 0, "metrics.interaction_event_types": [], "metrics.value_per_conversion": 0.0, "metrics.cost_per_conversion": 0.0, "segments.date": "2023-12-31", "segments.hour": 3, "segments.ad_network_type": "SEARCH"}, "emitted_at": 1704408118507} +{"stream": "campaign", "data": {"campaign.accessible_bidding_strategy": "", "campaign.ad_serving_optimization_status": "OPTIMIZE", "campaign.advertising_channel_sub_type": "UNSPECIFIED", "campaign.advertising_channel_type": "SEARCH", "campaign.app_campaign_setting.app_id": "", "campaign.app_campaign_setting.app_store": "UNSPECIFIED", "campaign.app_campaign_setting.bidding_strategy_goal_type": "UNSPECIFIED", "campaign.base_campaign": "customers/4651612872/campaigns/20643300404", "campaign.bidding_strategy": "", "campaign.bidding_strategy_type": "MAXIMIZE_CONVERSIONS", "campaign.campaign_budget": "customers/4651612872/campaignBudgets/13022493317", "campaign_budget.amount_micros": 330000000, "campaign.commission.commission_rate_micros": 0, "campaign.dynamic_search_ads_setting.domain_name": "", "campaign.dynamic_search_ads_setting.feeds": [], "campaign.dynamic_search_ads_setting.language_code": "", "campaign.dynamic_search_ads_setting.use_supplied_urls_only": false, "campaign.end_date": "2037-12-30", "campaign.excluded_parent_asset_field_types": [], "campaign.experiment_type": "BASE", "campaign.final_url_suffix": "", "campaign.frequency_caps": [], "campaign.geo_target_type_setting.negative_geo_target_type": "PRESENCE", "campaign.geo_target_type_setting.positive_geo_target_type": "PRESENCE_OR_INTEREST", "campaign.hotel_setting.hotel_center_id": 0, "campaign.id": 20643300404, "campaign.labels": [], "campaign.local_campaign_setting.location_source_type": "UNSPECIFIED", "campaign.manual_cpc.enhanced_cpc_enabled": false, "campaign.manual_cpm": "", "campaign.manual_cpv": "", "campaign.maximize_conversion_value.target_roas": 0.0, "campaign.maximize_conversions.target_cpa_micros": 0, "campaign.name": "mm_search_brand", "campaign.network_settings.target_content_network": false, "campaign.network_settings.target_google_search": true, "campaign.network_settings.target_partner_search_network": false, "campaign.network_settings.target_search_network": false, "campaign.optimization_goal_setting.optimization_goal_types": [], "campaign.optimization_score": 0.0, "campaign.payment_mode": "CLICKS", "campaign.percent_cpc.cpc_bid_ceiling_micros": 0, "campaign.percent_cpc.enhanced_cpc_enabled": false, "campaign.real_time_bidding_setting.opt_in": false, "campaign.resource_name": "customers/4651612872/campaigns/20643300404", "campaign.selective_optimization.conversion_actions": [], "campaign.serving_status": "SERVING", "campaign.shopping_setting.campaign_priority": 0, "campaign.shopping_setting.enable_local": false, "campaign.shopping_setting.merchant_id": 0, "campaign.start_date": "2023-10-10", "campaign.status": "PAUSED", "campaign.target_cpa.cpc_bid_ceiling_micros": 0, "campaign.target_cpa.cpc_bid_floor_micros": 0, "campaign.target_cpa.target_cpa_micros": 0, "campaign.target_cpm.target_frequency_goal.target_count": 0, "campaign.target_cpm.target_frequency_goal.time_unit": "UNSPECIFIED", "campaign.target_impression_share.cpc_bid_ceiling_micros": 0, "campaign.target_impression_share.location": "UNSPECIFIED", "campaign.target_impression_share.location_fraction_micros": 0, "campaign.target_roas.cpc_bid_ceiling_micros": 0, "campaign.target_roas.cpc_bid_floor_micros": 0, "campaign.target_roas.target_roas": 0.0, "campaign.target_spend.cpc_bid_ceiling_micros": 0, "campaign.target_spend.target_spend_micros": 0, "campaign.targeting_setting.target_restrictions": ["targeting_dimension: AUDIENCE\nbid_only: true\n"], "campaign.tracking_setting.tracking_url": "", "campaign.tracking_url_template": "{lpurl}?utm_term={keyword}&utm_campaign=mm_search_brand&utm_source=adwords&utm_medium=ppc&hsa_acc=4651612872&hsa_cam=20643300404&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3", "campaign.url_custom_parameters": [], "campaign.vanity_pharma.vanity_pharma_display_url_mode": "UNSPECIFIED", "campaign.vanity_pharma.vanity_pharma_text": "UNSPECIFIED", "campaign.video_brand_safety_suitability": "UNSPECIFIED", "metrics.clicks": 2, "metrics.ctr": 0.5, "metrics.conversions": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 1180000, "metrics.impressions": 4, "metrics.video_views": 0, "metrics.video_quartile_p100_rate": 0.0, "metrics.active_view_cpm": 0.0, "metrics.active_view_ctr": 0.0, "metrics.active_view_impressions": 0, "metrics.active_view_measurability": 0.0, "metrics.active_view_measurable_cost_micros": 0, "metrics.active_view_measurable_impressions": 0, "metrics.active_view_viewability": 0.0, "metrics.average_cost": 590000.0, "metrics.average_cpc": 590000.0, "metrics.average_cpm": 295000000.0, "metrics.interactions": 2, "metrics.interaction_event_types": ["InteractionEventType.CLICK"], "metrics.value_per_conversion": 0.0, "metrics.cost_per_conversion": 0.0, "segments.date": "2023-12-31", "segments.hour": 5, "segments.ad_network_type": "SEARCH"}, "emitted_at": 1704408118508} +{"stream": "campaign_label", "data": {"campaign.id": 12124071339, "label.id": 21585034471, "campaign.resource_name": "customers/4651612872/campaigns/12124071339", "campaign_label.resource_name": "customers/4651612872/campaignLabels/12124071339~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471"}, "emitted_at": 1704408119170} +{"stream": "campaign_label", "data": {"campaign.id": 13284356762, "label.id": 21585034471, "campaign.resource_name": "customers/4651612872/campaigns/13284356762", "campaign_label.resource_name": "customers/4651612872/campaignLabels/13284356762~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471"}, "emitted_at": 1704408119172} +{"stream": "campaign_label", "data": {"campaign.id": 16820250687, "label.id": 21906377810, "campaign.resource_name": "customers/4651612872/campaigns/16820250687", "campaign_label.resource_name": "customers/4651612872/campaignLabels/16820250687~21906377810", "label.name": "Test Delete label customer", "label.resource_name": "customers/4651612872/labels/21906377810"}, "emitted_at": 1704408119173} +{"stream": "ad_group_label", "data": {"ad_group.id": 123273719655, "label.id": 21585034471, "ad_group.resource_name": "customers/4651612872/adGroups/123273719655", "ad_group_label.resource_name": "customers/4651612872/adGroupLabels/123273719655~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471"}, "emitted_at": 1704408119522} +{"stream": "ad_group_label", "data": {"ad_group.id": 138643385242, "label.id": 21585034471, "ad_group.resource_name": "customers/4651612872/adGroups/138643385242", "ad_group_label.resource_name": "customers/4651612872/adGroupLabels/138643385242~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471"}, "emitted_at": 1704408119524} +{"stream": "ad_group_label", "data": {"ad_group.id": 137020701042, "label.id": 21906377810, "ad_group.resource_name": "customers/4651612872/adGroups/137020701042", "ad_group_label.resource_name": "customers/4651612872/adGroupLabels/137020701042~21906377810", "label.name": "Test Delete label customer", "label.resource_name": "customers/4651612872/labels/21906377810"}, "emitted_at": 1704408119525} +{"stream": "ad_group_ad_label", "data": {"ad_group.id": 123273719655, "ad_group_ad.ad.id": 524518584182, "ad_group_ad.ad.resource_name": "customers/4651612872/ads/524518584182", "ad_group_ad_label.resource_name": "customers/4651612872/adGroupAdLabels/123273719655~524518584182~21585034471", "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471", "label.id": 21585034471}, "emitted_at": 1704408119841} +{"stream": "ad_group_ad_label", "data": {"ad_group.id": 137020701042, "ad_group_ad.ad.id": 592078631218, "ad_group_ad.ad.resource_name": "customers/4651612872/ads/592078631218", "ad_group_ad_label.resource_name": "customers/4651612872/adGroupAdLabels/137020701042~592078631218~21906377810", "label.name": "Test Delete label customer", "label.resource_name": "customers/4651612872/labels/21906377810", "label.id": 21906377810}, "emitted_at": 1704408119844} +{"stream": "user_location_view", "data": {"segments.date": "2023-12-31", "segments.day_of_week": "SUNDAY", "segments.month": "2023-12-01", "segments.week": "2023-12-25", "segments.quarter": "2023-10-01", "segments.year": 2023, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2124, "user_location_view.targeting_location": false, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2124~false", "campaign.base_campaign": "customers/4651612872/campaigns/20643300404", "campaign.id": 20643300404, "campaign.name": "mm_search_brand", "campaign.status": "PAUSED", "ad_group.name": "Airbyte", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/155311392438", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 3, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1704408120544} +{"stream": "user_location_view", "data": {"segments.date": "2023-12-31", "segments.day_of_week": "SUNDAY", "segments.month": "2023-12-01", "segments.week": "2023-12-25", "segments.quarter": "2023-10-01", "segments.year": 2023, "segments.ad_network_type": "SEARCH", "customer.currency_code": "USD", "customer.id": 4651612872, "customer.descriptive_name": "Airbyte", "customer.time_zone": "America/Los_Angeles", "user_location_view.country_criterion_id": 2356, "user_location_view.targeting_location": false, "user_location_view.resource_name": "customers/4651612872/userLocationViews/2356~false", "campaign.base_campaign": "customers/4651612872/campaigns/20643300404", "campaign.id": 20643300404, "campaign.name": "mm_search_brand", "campaign.status": "PAUSED", "ad_group.name": "Airbyte", "ad_group.status": "ENABLED", "ad_group.base_ad_group": "customers/4651612872/adGroups/155311392438", "metrics.all_conversions": 0.0, "metrics.all_conversions_from_interactions_rate": 0.0, "metrics.all_conversions_value": 0.0, "metrics.average_cost": 0.0, "metrics.average_cpc": 0.0, "metrics.average_cpm": 0.0, "metrics.average_cpv": 0.0, "metrics.clicks": 0, "metrics.conversions": 0.0, "metrics.conversions_from_interactions_rate": 0.0, "metrics.conversions_value": 0.0, "metrics.cost_micros": 0, "metrics.cost_per_all_conversions": 0.0, "metrics.cost_per_conversion": 0.0, "metrics.cross_device_conversions": 0.0, "metrics.ctr": 0.0, "metrics.impressions": 1, "metrics.interaction_event_types": [], "metrics.interaction_rate": 0.0, "metrics.interactions": 0, "metrics.value_per_all_conversions": 0.0, "metrics.value_per_conversion": 0.0, "metrics.video_view_rate": 0.0, "metrics.video_views": 0, "metrics.view_through_conversions": 0}, "emitted_at": 1704408120545} +{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2023-10-10", "campaign.end_date": "2037-12-30", "segments.date": "2023-12-31"}, "emitted_at": 1704408121315} +{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2023-10-10", "campaign.end_date": "2037-12-30", "segments.date": "2024-01-01"}, "emitted_at": 1704408121315} +{"stream": "happytable", "data": {"campaign.accessible_bidding_strategy": "", "segments.ad_destination_type": "NOT_APPLICABLE", "campaign.start_date": "2023-10-10", "campaign.end_date": "2037-12-30", "segments.date": "2024-01-02"}, "emitted_at": 1704408121315} +{"stream": "custom_audience", "data": {"custom_audience.description": "", "custom_audience.name": "Airbyte", "custom_audience.id": 523469909, "custom_audience.members": ["member_type: KEYWORD\nkeyword: \"etl elt\"\n", "member_type: KEYWORD\nkeyword: \"cloud data management and analytics\"\n", "member_type: KEYWORD\nkeyword: \"data integration\"\n", "member_type: KEYWORD\nkeyword: \"big data analytics database\"\n", "member_type: KEYWORD\nkeyword: \"data\"\n", "member_type: KEYWORD\nkeyword: \"data sherid nada\"\n", "member_type: KEYWORD\nkeyword: \"airbyteforeveryone\"\n", "member_type: KEYWORD\nkeyword: \"Airbyte\"\n"], "custom_audience.resource_name": "customers/4651612872/customAudiences/523469909", "custom_audience.status": "ENABLED", "custom_audience.type": "AUTO"}, "emitted_at": 1704408121936} +{"stream": "audience", "data": {"customer.id": 4651612872, "audience.description": "", "audience.dimensions": ["audience_segments {\n segments {\n custom_audience {\n custom_audience: \"customers/4651612872/customAudiences/523469909\"\n }\n }\n}\n"], "audience.exclusion_dimension": "", "audience.id": 47792633, "audience.name": "Audience name 1", "audience.resource_name": "customers/4651612872/audiences/47792633", "audience.status": "ENABLED"}, "emitted_at": 1704408122314} +{"stream": "audience", "data": {"customer.id": 4651612872, "audience.description": "", "audience.dimensions": ["audience_segments {\n segments {\n user_interest {\n user_interest_category: \"customers/4651612872/userInterests/80276\"\n }\n }\n segments {\n user_interest {\n user_interest_category: \"customers/4651612872/userInterests/80279\"\n }\n }\n segments {\n user_interest {\n user_interest_category: \"customers/4651612872/userInterests/80520\"\n }\n }\n segments {\n user_interest {\n user_interest_category: \"customers/4651612872/userInterests/80530\"\n }\n }\n segments {\n user_interest {\n user_interest_category: \"customers/4651612872/userInterests/92931\"\n }\n }\n}\n"], "audience.exclusion_dimension": "", "audience.id": 97300129, "audience.name": "Upgraded Audience 1", "audience.resource_name": "customers/4651612872/audiences/97300129", "audience.status": "ENABLED"}, "emitted_at": 1704408122315} +{"stream": "user_interest", "data": {"user_interest.availabilities": [], "user_interest.launched_to_all": true, "user_interest.name": "Arts & Entertainment", "user_interest.resource_name": "customers/4651612872/userInterests/3", "user_interest.taxonomy_type": "VERTICAL_GEO", "user_interest.user_interest_id": 3, "user_interest.user_interest_parent": ""}, "emitted_at": 1704408124247} +{"stream": "user_interest", "data": {"user_interest.availabilities": [], "user_interest.launched_to_all": true, "user_interest.name": "Computers & Electronics", "user_interest.resource_name": "customers/4651612872/userInterests/5", "user_interest.taxonomy_type": "VERTICAL_GEO", "user_interest.user_interest_id": 5, "user_interest.user_interest_parent": ""}, "emitted_at": 1704408124249} +{"stream": "user_interest", "data": {"user_interest.availabilities": [], "user_interest.launched_to_all": true, "user_interest.name": "Finance", "user_interest.resource_name": "customers/4651612872/userInterests/7", "user_interest.taxonomy_type": "VERTICAL_GEO", "user_interest.user_interest_id": 7, "user_interest.user_interest_parent": ""}, "emitted_at": 1704408124250} +{"stream": "label", "data": {"customer.id": 4651612872, "label.id": 21585034471, "label.name": "edgao-example-label", "label.resource_name": "customers/4651612872/labels/21585034471", "label.status": "ENABLED", "label.text_label.background_color": "#E993EB", "label.text_label.description": "example label for edgao"}, "emitted_at": 1704408126496} +{"stream": "label", "data": {"customer.id": 4651612872, "label.id": 21902092838, "label.name": "Test Label", "label.resource_name": "customers/4651612872/labels/21902092838", "label.status": "ENABLED", "label.text_label.background_color": "#8BCBD2", "label.text_label.description": "Description to test label"}, "emitted_at": 1704408126498} +{"stream": "label", "data": {"customer.id": 4651612872, "label.id": 21906377810, "label.name": "Test Delete label customer", "label.resource_name": "customers/4651612872/labels/21906377810", "label.status": "ENABLED", "label.text_label.background_color": "#8266C9", "label.text_label.description": ""}, "emitted_at": 1704408126499} +{"stream": "campaign_bidding_strategy", "data": {"customer.id": 4651612872, "campaign.id": 20643300404, "bidding_strategy.aligned_campaign_budget_id": 0, "bidding_strategy.campaign_count": 0, "bidding_strategy.currency_code": "", "bidding_strategy.effective_currency_code": "", "bidding_strategy.enhanced_cpc": "", "bidding_strategy.id": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversion_value.target_roas": 0.0, "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversions.target_cpa_micros": 0, "bidding_strategy.name": "", "bidding_strategy.non_removed_campaign_count": 0, "bidding_strategy.resource_name": "", "bidding_strategy.status": "UNSPECIFIED", "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_cpa.cpc_bid_floor_micros": 0, "bidding_strategy.target_cpa.target_cpa_micros": 0, "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_impression_share.location": "UNSPECIFIED", "bidding_strategy.target_impression_share.location_fraction_micros": 0, "bidding_strategy.target_roas.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_roas.cpc_bid_floor_micros": 0, "bidding_strategy.target_roas.target_roas": 0.0, "bidding_strategy.target_spend.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_spend.target_spend_micros": 0, "bidding_strategy.type": "UNSPECIFIED", "segments.date": "2023-12-31"}, "emitted_at": 1704408127194} +{"stream": "campaign_bidding_strategy", "data": {"customer.id": 4651612872, "campaign.id": 20643300404, "bidding_strategy.aligned_campaign_budget_id": 0, "bidding_strategy.campaign_count": 0, "bidding_strategy.currency_code": "", "bidding_strategy.effective_currency_code": "", "bidding_strategy.enhanced_cpc": "", "bidding_strategy.id": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversion_value.target_roas": 0.0, "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversions.target_cpa_micros": 0, "bidding_strategy.name": "", "bidding_strategy.non_removed_campaign_count": 0, "bidding_strategy.resource_name": "", "bidding_strategy.status": "UNSPECIFIED", "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_cpa.cpc_bid_floor_micros": 0, "bidding_strategy.target_cpa.target_cpa_micros": 0, "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_impression_share.location": "UNSPECIFIED", "bidding_strategy.target_impression_share.location_fraction_micros": 0, "bidding_strategy.target_roas.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_roas.cpc_bid_floor_micros": 0, "bidding_strategy.target_roas.target_roas": 0.0, "bidding_strategy.target_spend.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_spend.target_spend_micros": 0, "bidding_strategy.type": "UNSPECIFIED", "segments.date": "2024-01-01"}, "emitted_at": 1704408127198} +{"stream": "campaign_bidding_strategy", "data": {"customer.id": 4651612872, "campaign.id": 20637264648, "bidding_strategy.aligned_campaign_budget_id": 0, "bidding_strategy.campaign_count": 0, "bidding_strategy.currency_code": "", "bidding_strategy.effective_currency_code": "", "bidding_strategy.enhanced_cpc": "", "bidding_strategy.id": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversion_value.target_roas": 0.0, "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversions.target_cpa_micros": 0, "bidding_strategy.name": "", "bidding_strategy.non_removed_campaign_count": 0, "bidding_strategy.resource_name": "", "bidding_strategy.status": "UNSPECIFIED", "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_cpa.cpc_bid_floor_micros": 0, "bidding_strategy.target_cpa.target_cpa_micros": 0, "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_impression_share.location": "UNSPECIFIED", "bidding_strategy.target_impression_share.location_fraction_micros": 0, "bidding_strategy.target_roas.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_roas.cpc_bid_floor_micros": 0, "bidding_strategy.target_roas.target_roas": 0.0, "bidding_strategy.target_spend.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_spend.target_spend_micros": 0, "bidding_strategy.type": "UNSPECIFIED", "segments.date": "2024-01-02"}, "emitted_at": 1704408127200} +{"stream": "ad_group_bidding_strategy", "data": {"ad_group.id": 155311392438, "bidding_strategy.aligned_campaign_budget_id": 0, "bidding_strategy.campaign_count": 0, "bidding_strategy.currency_code": "", "bidding_strategy.effective_currency_code": "", "bidding_strategy.enhanced_cpc": "", "bidding_strategy.id": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversion_value.target_roas": 0.0, "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversions.target_cpa_micros": 0, "bidding_strategy.name": "", "bidding_strategy.non_removed_campaign_count": 0, "bidding_strategy.resource_name": "", "bidding_strategy.status": "UNSPECIFIED", "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_cpa.cpc_bid_floor_micros": 0, "bidding_strategy.target_cpa.target_cpa_micros": 0, "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_impression_share.location": "UNSPECIFIED", "bidding_strategy.target_impression_share.location_fraction_micros": 0, "bidding_strategy.target_roas.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_roas.cpc_bid_floor_micros": 0, "bidding_strategy.target_roas.target_roas": 0.0, "bidding_strategy.target_spend.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_spend.target_spend_micros": 0, "bidding_strategy.type": "UNSPECIFIED", "segments.date": "2023-12-31"}, "emitted_at": 1704408127574} +{"stream": "ad_group_bidding_strategy", "data": {"ad_group.id": 155311392438, "bidding_strategy.aligned_campaign_budget_id": 0, "bidding_strategy.campaign_count": 0, "bidding_strategy.currency_code": "", "bidding_strategy.effective_currency_code": "", "bidding_strategy.enhanced_cpc": "", "bidding_strategy.id": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversion_value.target_roas": 0.0, "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversions.target_cpa_micros": 0, "bidding_strategy.name": "", "bidding_strategy.non_removed_campaign_count": 0, "bidding_strategy.resource_name": "", "bidding_strategy.status": "UNSPECIFIED", "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_cpa.cpc_bid_floor_micros": 0, "bidding_strategy.target_cpa.target_cpa_micros": 0, "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_impression_share.location": "UNSPECIFIED", "bidding_strategy.target_impression_share.location_fraction_micros": 0, "bidding_strategy.target_roas.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_roas.cpc_bid_floor_micros": 0, "bidding_strategy.target_roas.target_roas": 0.0, "bidding_strategy.target_spend.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_spend.target_spend_micros": 0, "bidding_strategy.type": "UNSPECIFIED", "segments.date": "2024-01-01"}, "emitted_at": 1704408127581} +{"stream": "ad_group_bidding_strategy", "data": {"ad_group.id": 154050719199, "bidding_strategy.aligned_campaign_budget_id": 0, "bidding_strategy.campaign_count": 0, "bidding_strategy.currency_code": "", "bidding_strategy.effective_currency_code": "", "bidding_strategy.enhanced_cpc": "", "bidding_strategy.id": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversion_value.target_roas": 0.0, "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": 0, "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": 0, "bidding_strategy.maximize_conversions.target_cpa_micros": 0, "bidding_strategy.name": "", "bidding_strategy.non_removed_campaign_count": 0, "bidding_strategy.resource_name": "", "bidding_strategy.status": "UNSPECIFIED", "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_cpa.cpc_bid_floor_micros": 0, "bidding_strategy.target_cpa.target_cpa_micros": 0, "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_impression_share.location": "UNSPECIFIED", "bidding_strategy.target_impression_share.location_fraction_micros": 0, "bidding_strategy.target_roas.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_roas.cpc_bid_floor_micros": 0, "bidding_strategy.target_roas.target_roas": 0.0, "bidding_strategy.target_spend.cpc_bid_ceiling_micros": 0, "bidding_strategy.target_spend.target_spend_micros": 0, "bidding_strategy.type": "UNSPECIFIED", "segments.date": "2024-01-02"}, "emitted_at": 1704408127583} +{"stream": "ad_group_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "ad_group.id": 117036054899, "ad_group_criterion.ad_group": "customers/4651612872/adGroups/117036054899", "ad_group_criterion.age_range.type": "UNSPECIFIED", "ad_group_criterion.app_payment_model.type": "UNSPECIFIED", "ad_group_criterion.approval_status": "APPROVED", "ad_group_criterion.audience.audience": "", "ad_group_criterion.bid_modifier": 0.0, "ad_group_criterion.combined_audience.combined_audience": "", "ad_group_criterion.cpc_bid_micros": 0, "ad_group_criterion.cpm_bid_micros": 0, "ad_group_criterion.cpv_bid_micros": 0, "ad_group_criterion.criterion_id": 18696703, "ad_group_criterion.custom_affinity.custom_affinity": "", "ad_group_criterion.custom_audience.custom_audience": "", "ad_group_criterion.custom_intent.custom_intent": "", "ad_group_criterion.disapproval_reasons": [], "ad_group_criterion.display_name": "data integrations", "ad_group_criterion.effective_cpc_bid_micros": 1000000, "ad_group_criterion.effective_cpc_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpm_bid_micros": 10000, "ad_group_criterion.effective_cpm_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpv_bid_micros": 0, "ad_group_criterion.effective_cpv_bid_source": "UNSPECIFIED", "ad_group_criterion.effective_percent_cpc_bid_micros": 0, "ad_group_criterion.effective_percent_cpc_bid_source": "UNSPECIFIED", "ad_group_criterion.final_mobile_urls": [], "ad_group_criterion.final_url_suffix": "", "ad_group_criterion.final_urls": [], "ad_group_criterion.gender.type": "UNSPECIFIED", "ad_group_criterion.income_range.type": "UNSPECIFIED", "ad_group_criterion.keyword.match_type": "BROAD", "ad_group_criterion.keyword.text": "data integrations", "ad_group_criterion.labels": [], "ad_group_criterion.mobile_app_category.mobile_app_category_constant": "", "ad_group_criterion.mobile_application.app_id": "", "ad_group_criterion.mobile_application.name": "", "ad_group_criterion.negative": false, "ad_group_criterion.parental_status.type": "UNSPECIFIED", "ad_group_criterion.percent_cpc_bid_micros": 0, "ad_group_criterion.placement.url": "", "ad_group_criterion.position_estimates.estimated_add_clicks_at_first_position_cpc": 0, "ad_group_criterion.position_estimates.estimated_add_cost_at_first_position_cpc": 0, "ad_group_criterion.position_estimates.first_page_cpc_micros": 0, "ad_group_criterion.position_estimates.first_position_cpc_micros": 0, "ad_group_criterion.position_estimates.top_of_page_cpc_micros": 0, "ad_group_criterion.quality_info.creative_quality_score": "UNSPECIFIED", "ad_group_criterion.quality_info.post_click_quality_score": "UNSPECIFIED", "ad_group_criterion.quality_info.quality_score": 0, "ad_group_criterion.quality_info.search_predicted_ctr": "UNSPECIFIED", "ad_group_criterion.resource_name": "customers/4651612872/adGroupCriteria/117036054899~18696703", "ad_group_criterion.status": "ENABLED", "ad_group_criterion.system_serving_status": "ELIGIBLE", "ad_group_criterion.topic.path": [], "ad_group_criterion.topic.topic_constant": "", "ad_group_criterion.tracking_url_template": "", "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.url_custom_parameters": [], "ad_group_criterion.user_interest.user_interest_category": "", "ad_group_criterion.user_list.user_list": "", "ad_group_criterion.webpage.conditions": [], "ad_group_criterion.webpage.coverage_percentage": 0.0, "ad_group_criterion.webpage.criterion_name": "", "ad_group_criterion.webpage.sample.sample_urls": [], "ad_group_criterion.youtube_channel.channel_id": "", "ad_group_criterion.youtube_video.video_id": ""}, "emitted_at": 1704408130758} +{"stream": "ad_group_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "ad_group.id": 117036054899, "ad_group_criterion.ad_group": "customers/4651612872/adGroups/117036054899", "ad_group_criterion.age_range.type": "UNSPECIFIED", "ad_group_criterion.app_payment_model.type": "UNSPECIFIED", "ad_group_criterion.approval_status": "APPROVED", "ad_group_criterion.audience.audience": "", "ad_group_criterion.bid_modifier": 0.0, "ad_group_criterion.combined_audience.combined_audience": "", "ad_group_criterion.cpc_bid_micros": 0, "ad_group_criterion.cpm_bid_micros": 0, "ad_group_criterion.cpv_bid_micros": 0, "ad_group_criterion.criterion_id": 376833662, "ad_group_criterion.custom_affinity.custom_affinity": "", "ad_group_criterion.custom_audience.custom_audience": "", "ad_group_criterion.custom_intent.custom_intent": "", "ad_group_criterion.disapproval_reasons": [], "ad_group_criterion.display_name": "data integration services", "ad_group_criterion.effective_cpc_bid_micros": 1000000, "ad_group_criterion.effective_cpc_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpm_bid_micros": 10000, "ad_group_criterion.effective_cpm_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpv_bid_micros": 0, "ad_group_criterion.effective_cpv_bid_source": "UNSPECIFIED", "ad_group_criterion.effective_percent_cpc_bid_micros": 0, "ad_group_criterion.effective_percent_cpc_bid_source": "UNSPECIFIED", "ad_group_criterion.final_mobile_urls": [], "ad_group_criterion.final_url_suffix": "", "ad_group_criterion.final_urls": [], "ad_group_criterion.gender.type": "UNSPECIFIED", "ad_group_criterion.income_range.type": "UNSPECIFIED", "ad_group_criterion.keyword.match_type": "BROAD", "ad_group_criterion.keyword.text": "data integration services", "ad_group_criterion.labels": [], "ad_group_criterion.mobile_app_category.mobile_app_category_constant": "", "ad_group_criterion.mobile_application.app_id": "", "ad_group_criterion.mobile_application.name": "", "ad_group_criterion.negative": false, "ad_group_criterion.parental_status.type": "UNSPECIFIED", "ad_group_criterion.percent_cpc_bid_micros": 0, "ad_group_criterion.placement.url": "", "ad_group_criterion.position_estimates.estimated_add_clicks_at_first_position_cpc": 0, "ad_group_criterion.position_estimates.estimated_add_cost_at_first_position_cpc": 0, "ad_group_criterion.position_estimates.first_page_cpc_micros": 0, "ad_group_criterion.position_estimates.first_position_cpc_micros": 0, "ad_group_criterion.position_estimates.top_of_page_cpc_micros": 0, "ad_group_criterion.quality_info.creative_quality_score": "UNSPECIFIED", "ad_group_criterion.quality_info.post_click_quality_score": "UNSPECIFIED", "ad_group_criterion.quality_info.quality_score": 0, "ad_group_criterion.quality_info.search_predicted_ctr": "UNSPECIFIED", "ad_group_criterion.resource_name": "customers/4651612872/adGroupCriteria/117036054899~376833662", "ad_group_criterion.status": "ENABLED", "ad_group_criterion.system_serving_status": "ELIGIBLE", "ad_group_criterion.topic.path": [], "ad_group_criterion.topic.topic_constant": "", "ad_group_criterion.tracking_url_template": "", "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.url_custom_parameters": [], "ad_group_criterion.user_interest.user_interest_category": "", "ad_group_criterion.user_list.user_list": "", "ad_group_criterion.webpage.conditions": [], "ad_group_criterion.webpage.coverage_percentage": 0.0, "ad_group_criterion.webpage.criterion_name": "", "ad_group_criterion.webpage.sample.sample_urls": [], "ad_group_criterion.youtube_channel.channel_id": "", "ad_group_criterion.youtube_video.video_id": ""}, "emitted_at": 1704408130764} +{"stream": "ad_group_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "ad_group.id": 117036054899, "ad_group_criterion.ad_group": "customers/4651612872/adGroups/117036054899", "ad_group_criterion.age_range.type": "UNSPECIFIED", "ad_group_criterion.app_payment_model.type": "UNSPECIFIED", "ad_group_criterion.approval_status": "APPROVED", "ad_group_criterion.audience.audience": "", "ad_group_criterion.bid_modifier": 0.0, "ad_group_criterion.combined_audience.combined_audience": "", "ad_group_criterion.cpc_bid_micros": 0, "ad_group_criterion.cpm_bid_micros": 0, "ad_group_criterion.cpv_bid_micros": 0, "ad_group_criterion.criterion_id": 13099056325, "ad_group_criterion.custom_affinity.custom_affinity": "", "ad_group_criterion.custom_audience.custom_audience": "", "ad_group_criterion.custom_intent.custom_intent": "", "ad_group_criterion.disapproval_reasons": [], "ad_group_criterion.display_name": "cloud data integration", "ad_group_criterion.effective_cpc_bid_micros": 1000000, "ad_group_criterion.effective_cpc_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpm_bid_micros": 10000, "ad_group_criterion.effective_cpm_bid_source": "AD_GROUP", "ad_group_criterion.effective_cpv_bid_micros": 0, "ad_group_criterion.effective_cpv_bid_source": "UNSPECIFIED", "ad_group_criterion.effective_percent_cpc_bid_micros": 0, "ad_group_criterion.effective_percent_cpc_bid_source": "UNSPECIFIED", "ad_group_criterion.final_mobile_urls": [], "ad_group_criterion.final_url_suffix": "", "ad_group_criterion.final_urls": [], "ad_group_criterion.gender.type": "UNSPECIFIED", "ad_group_criterion.income_range.type": "UNSPECIFIED", "ad_group_criterion.keyword.match_type": "BROAD", "ad_group_criterion.keyword.text": "cloud data integration", "ad_group_criterion.labels": [], "ad_group_criterion.mobile_app_category.mobile_app_category_constant": "", "ad_group_criterion.mobile_application.app_id": "", "ad_group_criterion.mobile_application.name": "", "ad_group_criterion.negative": false, "ad_group_criterion.parental_status.type": "UNSPECIFIED", "ad_group_criterion.percent_cpc_bid_micros": 0, "ad_group_criterion.placement.url": "", "ad_group_criterion.position_estimates.estimated_add_clicks_at_first_position_cpc": 0, "ad_group_criterion.position_estimates.estimated_add_cost_at_first_position_cpc": 0, "ad_group_criterion.position_estimates.first_page_cpc_micros": 0, "ad_group_criterion.position_estimates.first_position_cpc_micros": 0, "ad_group_criterion.position_estimates.top_of_page_cpc_micros": 0, "ad_group_criterion.quality_info.creative_quality_score": "UNSPECIFIED", "ad_group_criterion.quality_info.post_click_quality_score": "UNSPECIFIED", "ad_group_criterion.quality_info.quality_score": 0, "ad_group_criterion.quality_info.search_predicted_ctr": "UNSPECIFIED", "ad_group_criterion.resource_name": "customers/4651612872/adGroupCriteria/117036054899~13099056325", "ad_group_criterion.status": "ENABLED", "ad_group_criterion.system_serving_status": "ELIGIBLE", "ad_group_criterion.topic.path": [], "ad_group_criterion.topic.topic_constant": "", "ad_group_criterion.tracking_url_template": "", "ad_group_criterion.type": "KEYWORD", "ad_group_criterion.url_custom_parameters": [], "ad_group_criterion.user_interest.user_interest_category": "", "ad_group_criterion.user_list.user_list": "", "ad_group_criterion.webpage.conditions": [], "ad_group_criterion.webpage.coverage_percentage": 0.0, "ad_group_criterion.webpage.criterion_name": "", "ad_group_criterion.webpage.sample.sample_urls": [], "ad_group_criterion.youtube_channel.channel_id": "", "ad_group_criterion.youtube_video.video_id": ""}, "emitted_at": 1704408130766} +{"stream": "ad_listing_group_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "ad_group_criterion.resource_name": "customers/4651612872/adGroupCriteria/117036054899~18696703", "ad_group.id": 117036054899, "ad_group_criterion.criterion_id": 18696703, "ad_group_criterion.listing_group.case_value.activity_country.value": "", "ad_group_criterion.listing_group.case_value.activity_id.value": "", "ad_group_criterion.listing_group.case_value.activity_rating.value": 0, "ad_group_criterion.listing_group.case_value.hotel_city.city_criterion": "", "ad_group_criterion.listing_group.case_value.hotel_class.value": 0, "ad_group_criterion.listing_group.case_value.hotel_country_region.country_region_criterion": "", "ad_group_criterion.listing_group.case_value.hotel_id.value": "", "ad_group_criterion.listing_group.case_value.hotel_state.state_criterion": "", "ad_group_criterion.listing_group.case_value.product_category.category_id": 0, "ad_group_criterion.listing_group.case_value.product_category.level": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_brand.value": "", "ad_group_criterion.listing_group.case_value.product_channel.channel": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_channel_exclusivity.channel_exclusivity": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_condition.condition": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_custom_attribute.index": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_custom_attribute.value": "", "ad_group_criterion.listing_group.case_value.product_item_id.value": "", "ad_group_criterion.listing_group.case_value.product_type.level": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_type.value": "", "ad_group_criterion.listing_group.parent_ad_group_criterion": "", "ad_group_criterion.listing_group.type": "UNSPECIFIED"}, "emitted_at": 1704408168252} +{"stream": "ad_listing_group_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "ad_group_criterion.resource_name": "customers/4651612872/adGroupCriteria/117036054899~376833662", "ad_group.id": 117036054899, "ad_group_criterion.criterion_id": 376833662, "ad_group_criterion.listing_group.case_value.activity_country.value": "", "ad_group_criterion.listing_group.case_value.activity_id.value": "", "ad_group_criterion.listing_group.case_value.activity_rating.value": 0, "ad_group_criterion.listing_group.case_value.hotel_city.city_criterion": "", "ad_group_criterion.listing_group.case_value.hotel_class.value": 0, "ad_group_criterion.listing_group.case_value.hotel_country_region.country_region_criterion": "", "ad_group_criterion.listing_group.case_value.hotel_id.value": "", "ad_group_criterion.listing_group.case_value.hotel_state.state_criterion": "", "ad_group_criterion.listing_group.case_value.product_category.category_id": 0, "ad_group_criterion.listing_group.case_value.product_category.level": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_brand.value": "", "ad_group_criterion.listing_group.case_value.product_channel.channel": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_channel_exclusivity.channel_exclusivity": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_condition.condition": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_custom_attribute.index": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_custom_attribute.value": "", "ad_group_criterion.listing_group.case_value.product_item_id.value": "", "ad_group_criterion.listing_group.case_value.product_type.level": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_type.value": "", "ad_group_criterion.listing_group.parent_ad_group_criterion": "", "ad_group_criterion.listing_group.type": "UNSPECIFIED"}, "emitted_at": 1704408168257} +{"stream": "ad_listing_group_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "ad_group_criterion.resource_name": "customers/4651612872/adGroupCriteria/117036054899~13099056325", "ad_group.id": 117036054899, "ad_group_criterion.criterion_id": 13099056325, "ad_group_criterion.listing_group.case_value.activity_country.value": "", "ad_group_criterion.listing_group.case_value.activity_id.value": "", "ad_group_criterion.listing_group.case_value.activity_rating.value": 0, "ad_group_criterion.listing_group.case_value.hotel_city.city_criterion": "", "ad_group_criterion.listing_group.case_value.hotel_class.value": 0, "ad_group_criterion.listing_group.case_value.hotel_country_region.country_region_criterion": "", "ad_group_criterion.listing_group.case_value.hotel_id.value": "", "ad_group_criterion.listing_group.case_value.hotel_state.state_criterion": "", "ad_group_criterion.listing_group.case_value.product_category.category_id": 0, "ad_group_criterion.listing_group.case_value.product_category.level": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_brand.value": "", "ad_group_criterion.listing_group.case_value.product_channel.channel": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_channel_exclusivity.channel_exclusivity": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_condition.condition": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_custom_attribute.index": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_custom_attribute.value": "", "ad_group_criterion.listing_group.case_value.product_item_id.value": "", "ad_group_criterion.listing_group.case_value.product_type.level": "UNSPECIFIED", "ad_group_criterion.listing_group.case_value.product_type.value": "", "ad_group_criterion.listing_group.parent_ad_group_criterion": "", "ad_group_criterion.listing_group.type": "UNSPECIFIED"}, "emitted_at": 1704408168258} +{"stream": "ad_group_criterion_label", "data": {"ad_group.id": 137051662444, "label.id": 21902092838, "ad_group_criterion_label.ad_group_criterion": "customers/4651612872/adGroupCriteria/137051662444~10766861", "ad_group_criterion_label.label": "customers/4651612872/labels/21902092838", "ad_group_criterion_label.resource_name": "customers/4651612872/adGroupCriterionLabels/137051662444~10766861~21902092838", "ad_group_criterion.criterion_id": 10766861}, "emitted_at": 1704408192425} +{"stream": "ad_group_criterion_label", "data": {"ad_group.id": 137051662444, "label.id": 21906377810, "ad_group_criterion_label.ad_group_criterion": "customers/4651612872/adGroupCriteria/137051662444~528912986", "ad_group_criterion_label.label": "customers/4651612872/labels/21906377810", "ad_group_criterion_label.resource_name": "customers/4651612872/adGroupCriterionLabels/137051662444~528912986~21906377810", "ad_group_criterion.criterion_id": 528912986}, "emitted_at": 1704408192426} +{"stream": "campaign_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "campaign.id": 9660123292, "campaign_criterion.resource_name": "customers/4651612872/campaignCriteria/9660123292~2124", "campaign_criterion.campaign": "customers/4651612872/campaigns/9660123292", "campaign_criterion.age_range.type": "UNSPECIFIED", "campaign_criterion.mobile_application.name": "", "campaign_criterion.negative": false, "campaign_criterion.youtube_channel.channel_id": "", "campaign_criterion.youtube_video.video_id": ""}, "emitted_at": 1704408194062} +{"stream": "campaign_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "campaign.id": 9660123292, "campaign_criterion.resource_name": "customers/4651612872/campaignCriteria/9660123292~2250", "campaign_criterion.campaign": "customers/4651612872/campaigns/9660123292", "campaign_criterion.age_range.type": "UNSPECIFIED", "campaign_criterion.mobile_application.name": "", "campaign_criterion.negative": false, "campaign_criterion.youtube_channel.channel_id": "", "campaign_criterion.youtube_video.video_id": ""}, "emitted_at": 1704408194068} +{"stream": "campaign_criterion", "data": {"deleted_at": null, "change_status.last_change_date_time": null, "campaign.id": 9660123292, "campaign_criterion.resource_name": "customers/4651612872/campaignCriteria/9660123292~2276", "campaign_criterion.campaign": "customers/4651612872/campaigns/9660123292", "campaign_criterion.age_range.type": "UNSPECIFIED", "campaign_criterion.mobile_application.name": "", "campaign_criterion.negative": false, "campaign_criterion.youtube_channel.channel_id": "", "campaign_criterion.youtube_video.video_id": ""}, "emitted_at": 1704408194068} \ No newline at end of file diff --git a/airbyte-integrations/connectors/source-google-ads/integration_tests/incremental_catalog.json b/airbyte-integrations/connectors/source-google-ads/integration_tests/incremental_catalog.json index bfe6dbf07f885..34604ac525ffc 100644 --- a/airbyte-integrations/connectors/source-google-ads/integration_tests/incremental_catalog.json +++ b/airbyte-integrations/connectors/source-google-ads/integration_tests/incremental_catalog.json @@ -5,11 +5,23 @@ "name": "account_performance_report", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["customer.id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], "source_defined_cursor": true, "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", + "primary_key": [ + ["customer.id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], "cursor_field": ["segments.date"] }, { @@ -18,69 +30,132 @@ "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, - "source_defined_primary_key": [["click_view.gclid"], ["segments.date"]], + "source_defined_primary_key": [ + ["customer.id"], + ["click_view.gclid"], + ["segments.date"], + ["segments.ad_network_type"] + ], "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", "cursor_field": ["segments.date"], - "primary_key": [["click_view.gclid"], ["segments.date"]] + "primary_key": [ + ["customer.id"], + ["click_view.gclid"], + ["segments.date"], + ["segments.ad_network_type"] + ] }, { "stream": { - "name": "geographic_report", + "name": "geographic_view", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["customer.id"], + ["geographic_view.country_criterion_id"], + ["geographic_view.location_type"], + ["segments.date"] + ], "source_defined_cursor": true, "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", + "primary_key": [ + ["customer.id"], + ["geographic_view.country_criterion_id"], + ["geographic_view.location_type"], + ["segments.date"] + ], "cursor_field": ["segments.date"] }, { "stream": { - "name": "keyword_report", + "name": "keyword_view", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["customer.id"], + ["ad_group_criterion.criterion_id"], + ["ad_group.id"], + ["segments.date"] + ], "source_defined_cursor": true, "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", + "primary_key": [ + ["customer.id"], + ["ad_group_criterion.criterion_id"], + ["ad_group.id"], + ["segments.date"] + ], "cursor_field": ["segments.date"] }, { "stream": { - "name": "display_topics_performance_report", + "name": "topic_view", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["customer.id"], + ["ad_group.id"], + ["ad_group_criterion.criterion_id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], "source_defined_cursor": true, "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", - "cursor_field": ["segments.date"] + "cursor_field": ["segments.date"], + "primary_key": [ + ["customer.id"], + ["ad_group.id"], + ["ad_group_criterion.criterion_id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ] }, { "stream": { - "name": "shopping_performance_report", + "name": "shopping_performance_view", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["customer.id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], "source_defined_cursor": true, "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", + "primary_key": [ + ["customer.id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], "destination_sync_mode": "overwrite", "cursor_field": ["segments.date"] }, { "stream": { - "name": "ad_group_ads", + "name": "ad_group_ad", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, "source_defined_primary_key": [ + ["customer.id"], ["ad_group_ad.ad.id"], ["segments.date"] ], @@ -89,25 +164,29 @@ "sync_mode": "incremental", "destination_sync_mode": "overwrite", "cursor_field": ["segments.date"], - "primary_key": [["ad_group_ad.ad.id"], ["segments.date"]] + "primary_key": [["customer.id"], ["ad_group_ad.ad.id"], ["segments.date"]] }, { "stream": { - "name": "ad_groups", + "name": "ad_group", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, "default_cursor_field": ["segments.date"], - "source_defined_primary_key": [["ad_group.id"], ["segments.date"]] + "source_defined_primary_key": [ + ["customer.id"], + ["ad_group.id"], + ["segments.date"] + ] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", "cursor_field": ["segments.date"], - "primary_key": [["ad_group.id"], ["segments.date"]] + "primary_key": [["customer.id"], ["ad_group.id"], ["segments.date"]] }, { "stream": { - "name": "accounts", + "name": "customer", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, @@ -121,7 +200,7 @@ }, { "stream": { - "name": "campaigns", + "name": "campaign", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, @@ -135,39 +214,168 @@ }, { "stream": { - "name": "user_location_report", + "name": "campaign_budget", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_cursor": true, + "default_cursor_field": ["segments.date"], + "source_defined_primary_key": [ + ["campaign_budget.id"], + ["segments.date"] + ] + }, + "sync_mode": "incremental", + "destination_sync_mode": "overwrite", + "cursor_field": ["segments.date"], + "primary_key": [["campaign_budget.id"], ["segments.date"]] + }, + { + "stream": { + "name": "user_location_view", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, + "source_defined_primary_key": [ + ["customer.id"], + ["user_location_view.country_criterion_id"], + ["user_location_view.targeting_location"], + ["segments.date"], + ["segments.ad_network_type"] + ], "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", + "primary_key": [ + ["customer.id"], + ["user_location_view.country_criterion_id"], + ["user_location_view.targeting_location"], + ["segments.date"], + ["segments.ad_network_type"] + ], "cursor_field": ["segments.date"] }, { "stream": { - "name": "ad_group_ad_report", + "name": "ad_group_ad_legacy", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], "source_defined_cursor": true, + "source_defined_primary_key": [ + ["customer.id"], + ["ad_group_ad.ad.id"], + ["segments.date"], + ["segments.ad_network_type"] + ], "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", + "primary_key": [ + ["customer.id"], + ["ad_group_ad.ad.id"], + ["segments.date"], + ["segments.ad_network_type"] + ], "cursor_field": ["segments.date"] }, { "stream": { - "name": "display_keyword_performance_report", + "name": "display_keyword_view", "json_schema": {}, "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["customer.id"], + ["ad_group.id"], + ["ad_group_criterion.criterion_id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], "source_defined_cursor": true, "default_cursor_field": ["segments.date"] }, "sync_mode": "incremental", "destination_sync_mode": "overwrite", + "primary_key": [ + ["customer.id"], + ["ad_group.id"], + ["ad_group_criterion.criterion_id"], + ["segments.date"], + ["segments.ad_network_type"], + ["segments.device"] + ], + "cursor_field": ["segments.date"] + }, + { + "stream": { + "name": "campaign_bidding_strategy", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["customer.id"], + ["campaign.id"], + ["bidding_strategy.id"], + ["segments.date"] + ], + "source_defined_cursor": true, + "default_cursor_field": ["segments.date"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite", + "primary_key": [ + ["customer.id"], + ["campaign.id"], + ["bidding_strategy.id"], + ["segments.date"] + ], + "cursor_field": ["segments.date"] + }, + { + "stream": { + "name": "ad_group_bidding_strategy", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [ + ["customer.id"], + ["ad_group.id"], + ["bidding_strategy.id"], + ["segments.date"] + ], + "source_defined_cursor": true, + "default_cursor_field": ["segments.date"] + }, + "sync_mode": "full_refresh", + "destination_sync_mode": "overwrite", + "primary_key": [ + ["customer.id"], + ["ad_group.id"], + ["bidding_strategy.id"], + ["segments.date"] + ], "cursor_field": ["segments.date"] + }, + { + "stream": { + "name": "ad_group_criterion", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [["ad_group_criterion.resource_name"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "overwrite", + "primary_key": [["ad_group_criterion.resource_name"]] + }, + { + "stream": { + "name": "campaign_criterion", + "json_schema": {}, + "supported_sync_modes": ["full_refresh", "incremental"], + "source_defined_primary_key": [["campaign_criterion.resource_name"]] + }, + "sync_mode": "incremental", + "destination_sync_mode": "overwrite", + "primary_key": [["campaign_criterion.resource_name"]] } ] } diff --git a/airbyte-integrations/connectors/source-google-ads/integration_tests/integration_tests.py b/airbyte-integrations/connectors/source-google-ads/integration_tests/integration_tests.py new file mode 100644 index 0000000000000..65f544425f635 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/integration_tests/integration_tests.py @@ -0,0 +1,225 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + +import json +from pathlib import Path + +import pytest +from airbyte_cdk.models import SyncMode +from google.ads.googleads.v15.services.types.google_ads_service import GoogleAdsRow +from source_google_ads.source import SourceGoogleAds + + +@pytest.fixture(scope="module") +def config(): + with open(Path(__file__).parent.parent / "secrets/config.json", "r") as file: + return json.loads(file.read()) + + +@pytest.fixture(scope="module") +def streams(config): + return SourceGoogleAds().streams(config=config) + + +@pytest.fixture(scope="module") +def account_labels(streams): + return next(filter(lambda s: s.name == "account_labels", streams)) + + +@pytest.fixture(scope="module") +def shopping_performance_report(streams): + return next(filter(lambda s: s.name == "shopping_performance_report", streams)) + + +def create_google_ads_row_from_dict(data: dict) -> GoogleAdsRow: + row = GoogleAdsRow() + + for key, value in data.items(): + # Split the key to check for nested fields + parts = key.split(".") + + # Handle nested fields + if len(parts) > 1: + parent_field = parts[0] + nested_field = parts[1] + + # Check if the parent field exists and create if not + if not hasattr(row, parent_field): + setattr( + row, parent_field, row.__class__() + ) # Assuming the nested message type is the same as the parent. Adjust if different. + + # Set the nested field value + nested_obj = getattr(row, parent_field) + setattr(nested_obj, nested_field, value) + else: + # Handle non-nested fields + if hasattr(row, key): + setattr(row, key, value) + else: + print(f"Warning: Unknown field '{key}' for GoogleAdsRow") + + return row + + +@pytest.mark.parametrize( + "stream_fixture_name, expected_records", + [ + ( + "account_labels", + [ + { + "customer_label.resource_name": "123", + "customer_label.customer": "customer", + "customer.id": 123, + "customer_label.label": "customer_label", + }, + { + "customer_label.resource_name": "1234", + "customer_label.customer": "customer", + "customer.id": 123, + "customer_label.label": "customer_label1", + }, + ], + ), + ( + "shopping_performance_report", + [ + { + "customer.descriptive_name": "Customer ABC", + "ad_group.id": 12345, + "ad_group.name": "Ad Group 1", + "ad_group.status": "REMOVED", + "segments.ad_network_type": "UNKNOWN", + "segments.product_aggregator_id": 67890, + "metrics.all_conversions_from_interactions_rate": 0.75, + "metrics.all_conversions_value": 150.25, + "metrics.all_conversions": 5.0, + "metrics.average_cpc": 0.5, + "segments.product_brand": "Brand XYZ", + "campaign.id": 11112, + "campaign.name": "Campaign 1", + "campaign.status": "UNKNOWN", + "segments.product_category_level1": "Electronics", + "segments.product_category_level2": "Mobile Phones", + "segments.product_category_level3": "Smartphones", + "segments.product_category_level4": "Android", + "segments.product_category_level5": "Samsung", + "segments.product_channel": "UNSPECIFIED", + "segments.product_channel_exclusivity": "SINGLE_CHANNEL", + "segments.click_type": "APP_DEEPLINK", + "metrics.clicks": 10, + "metrics.conversions_from_interactions_rate": 0.5, + "metrics.conversions_value": 100.5, + "metrics.conversions": 4.0, + "metrics.cost_micros": 5000000, + "metrics.cost_per_all_conversions": 25.05, + "metrics.cost_per_conversion": 6.25, + "segments.product_country": "US", + "metrics.cross_device_conversions": 2.0, + "metrics.ctr": 0.1, + "segments.product_custom_attribute0": "Attribute 0", + "segments.product_custom_attribute1": "Attribute 1", + "segments.product_custom_attribute2": "Attribute 2", + "segments.product_custom_attribute3": "Attribute 3", + "segments.product_custom_attribute4": "Attribute 4", + "segments.date": "2023-09-22", + "segments.day_of_week": "FRIDAY", + "segments.device": "TABLET", + "customer.id": 123, + "metrics.impressions": 100, + "segments.product_language": "English", + "segments.product_merchant_id": 54321, + "segments.month": "September", + "segments.product_item_id": "ITEM123", + "segments.product_condition": 2, + "segments.product_title": "Samsung Galaxy S23", + "segments.product_type_l1": "Electronics", + "segments.product_type_l2": "Phones", + "segments.product_type_l3": "Smartphones", + "segments.product_type_l4": "Android", + "segments.product_type_l5": "Samsung", + "segments.quarter": "Q3", + "segments.product_store_id": "STORE123", + "metrics.value_per_all_conversions": 30.05, + "metrics.value_per_conversion": 7.5, + "segments.week": "38", + "segments.year": 2023, + }, + { + "customer.descriptive_name": "Customer ABC", + "ad_group.id": 12345, + "ad_group.name": "Ad Group 1", + "ad_group.status": "REMOVED", + "segments.ad_network_type": "UNKNOWN", + "segments.product_aggregator_id": 67890, + "metrics.all_conversions_from_interactions_rate": 0.75, + "metrics.all_conversions_value": 150.25, + "metrics.all_conversions": 5.0, + "metrics.average_cpc": 0.5, + "segments.product_brand": "Brand XYZ", + "campaign.id": 11112, + "campaign.name": "Campaign 1", + "campaign.status": "UNKNOWN", + "segments.product_category_level1": "Electronics", + "segments.product_category_level2": "Mobile Phones", + "segments.product_category_level3": "Smartphones", + "segments.product_category_level4": "Android", + "segments.product_category_level5": "Samsung", + "segments.product_channel": "UNSPECIFIED", + "segments.product_channel_exclusivity": "SINGLE_CHANNEL", + "segments.click_type": "APP_DEEPLINK", + "metrics.clicks": 10, + "metrics.conversions_from_interactions_rate": 0.5, + "metrics.conversions_value": 100.5, + "metrics.conversions": 4.0, + "metrics.cost_micros": 5000000, + "metrics.cost_per_all_conversions": 25.05, + "metrics.cost_per_conversion": 6.25, + "segments.product_country": "US", + "metrics.cross_device_conversions": 2.0, + "metrics.ctr": 0.1, + "segments.product_custom_attribute0": "Attribute 0", + "segments.product_custom_attribute1": "Attribute 1", + "segments.product_custom_attribute2": "Attribute 2", + "segments.product_custom_attribute3": "Attribute 3", + "segments.product_custom_attribute4": "Attribute 4", + "segments.date": "2023-11-22", + "segments.day_of_week": "FRIDAY", + "segments.device": "TABLET", + "customer.id": 123, + "metrics.impressions": 100, + "segments.product_language": "English", + "segments.product_merchant_id": 54321, + "segments.month": "November", + "segments.product_item_id": "ITEM123", + "segments.product_condition": 2, + "segments.product_title": "Samsung Galaxy S23", + "segments.product_type_l1": "Electronics", + "segments.product_type_l2": "Phones", + "segments.product_type_l3": "Smartphones", + "segments.product_type_l4": "Android", + "segments.product_type_l5": "Samsung", + "segments.quarter": "Q4", + "segments.product_store_id": "STORE123", + "metrics.value_per_all_conversions": 30.05, + "metrics.value_per_conversion": 7.5, + "segments.week": "38", + "segments.year": 2023, + }, + ], + ), + ], +) +def test_empty_streams(mocker, stream_fixture_name, expected_records, request): + """ + A test with synthetic data since we are not able to test `annotations_stream` and `cohorts_stream` streams + due to free subscription plan for the sandbox + """ + stream = request.getfixturevalue(stream_fixture_name) + records_reader = stream.read_records(sync_mode=SyncMode.full_refresh, cursor_field=None, stream_slice={"customer_id": "123"}) + send_request_result = [create_google_ads_row_from_dict(expected_record) for expected_record in expected_records] + mocker.patch("source_google_ads.google_ads.GoogleAds.send_request", return_value=[send_request_result]) + + assert list(records_reader) == expected_records diff --git a/airbyte-integrations/connectors/source-google-ads/integration_tests/state.json b/airbyte-integrations/connectors/source-google-ads/integration_tests/state.json new file mode 100644 index 0000000000000..60ad9790af5fa --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/integration_tests/state.json @@ -0,0 +1,73 @@ +[ + { + "type": "STREAM", + "stream": { + "stream_descriptor": { + "name": "ad_groups" + }, + "stream_state": { + "4651612872": { + "segments.date": "2022-04-09" + } + } + } + }, + { + "type": "STREAM", + "stream": { + "stream_descriptor": { + "name": "campaigns" + }, + "stream_state": { + "4651612872": { + "segments.date": "2022-04-09" + } + } + } + }, + { + "type": "STREAM", + "stream": { + "stream_descriptor": { + "name": "ad_group_criterion" + }, + "stream_state": { + "change_status": { + "4651612872": { + "change_status.last_change_date_time": "2023-11-01 13:20:01.003295" + } + } + } + } + }, + { + "type": "STREAM", + "stream": { + "stream_descriptor": { + "name": "ad_listing_group_criterion" + }, + "stream_state": { + "change_status": { + "4651612872": { + "change_status.last_change_date_time": "2023-11-01 13:20:01.003295" + } + } + } + } + }, + { + "type": "STREAM", + "stream": { + "stream_descriptor": { + "name": "campaign_criterion" + }, + "stream_state": { + "change_status": { + "4651612872": { + "change_status.last_change_date_time": "2023-11-01 13:20:01.003295" + } + } + } + } + } +] diff --git a/airbyte-integrations/connectors/source-google-ads/main.py b/airbyte-integrations/connectors/source-google-ads/main.py index 74d3215025261..2824c49559439 100644 --- a/airbyte-integrations/connectors/source-google-ads/main.py +++ b/airbyte-integrations/connectors/source-google-ads/main.py @@ -2,12 +2,7 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # - -import sys - -from airbyte_cdk.entrypoint import launch -from source_google_ads import SourceGoogleAds +from source_google_ads.run import run if __name__ == "__main__": - source = SourceGoogleAds() - launch(source, sys.argv[1:]) + run() diff --git a/airbyte-integrations/connectors/source-google-ads/metadata.yaml b/airbyte-integrations/connectors/source-google-ads/metadata.yaml new file mode 100644 index 0000000000000..4c09baf87a5c6 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/metadata.yaml @@ -0,0 +1,68 @@ +data: + ab_internal: + ql: 400 + sl: 300 + allowedHosts: + hosts: + - accounts.google.com + - googleads.googleapis.com + connectorBuildOptions: + baseImage: docker.io/airbyte/python-connector-base:1.2.0@sha256:c22a9d97464b69d6ef01898edf3f8612dc11614f05a84984451dde195f337db9 + connectorSubtype: api + connectorType: source + definitionId: 253487c0-2246-43ba-a21f-5116b20a2c50 + dockerImageTag: 3.3.1 + dockerRepository: airbyte/source-google-ads + documentationUrl: https://docs.airbyte.com/integrations/sources/google-ads + githubIssueLabel: source-google-ads + icon: google-adwords.svg + license: Elv2 + name: Google Ads + registries: + cloud: + enabled: true + oss: + enabled: true + releaseStage: generally_available + releases: + breakingChanges: + 1.0.0: + message: + This release introduces fixes to custom query schema creation. Users + should refresh the source schema and reset affected streams after upgrading + to ensure uninterrupted syncs. + upgradeDeadline: "2023-10-31" + 2.0.0: + message: + This release updates the Source Google Ads connector so that its + default streams and stream names match the related resources in Google Ads + API. Users should refresh the source schema and reset affected streams after + upgrading to ensure uninterrupted syncs. + upgradeDeadline: "2023-11-30" + 3.0.0: + message: Google is deprecating v13 of the Google Ads API in January. + This release upgrades the Google Ads API to the latest version (v15), which causes changes in several schemas. + Users should refresh the source schema and reset affected streams after upgrading to ensure uninterrupted syncs. + upgradeDeadline: "2024-01-12" + suggestedStreams: + streams: + - campaigns + - accounts + - ad_group_ads + - ad_group_ad_report + - ad_groups + - click_view + - account_performance_report + - keyword_report + - campaign_labels + - ad_group_labels + - ad_group_ad_labels + - user_location_report + - geographic_report + - display_keyword_performance_report + - shopping_performance_report + - display_topics_performance_report + supportLevel: certified + tags: + - language:python +metadataSpecVersion: "1.0" diff --git a/airbyte-integrations/connectors/source-google-ads/requirements.txt b/airbyte-integrations/connectors/source-google-ads/requirements.txt index cc57334ef619a..d6e1198b1ab1f 100644 --- a/airbyte-integrations/connectors/source-google-ads/requirements.txt +++ b/airbyte-integrations/connectors/source-google-ads/requirements.txt @@ -1,2 +1 @@ --e ../../bases/connector-acceptance-test -e . diff --git a/airbyte-integrations/connectors/source-google-ads/setup.py b/airbyte-integrations/connectors/source-google-ads/setup.py index 35bfce507db08..7211a092ff545 100644 --- a/airbyte-integrations/connectors/source-google-ads/setup.py +++ b/airbyte-integrations/connectors/source-google-ads/setup.py @@ -7,11 +7,18 @@ # pin protobuf==3.20.0 as other versions may cause problems on different architectures # (see https://github.com/airbytehq/airbyte/issues/13580) -MAIN_REQUIREMENTS = ["airbyte-cdk>=0.2.2", "google-ads==20.0.0", "protobuf", "pendulum"] +# pendulum <3.0.0 is required to align with the CDK version, and should be updated once the next issue is resolved: +# https://github.com/airbytehq/airbyte/issues/33573 +MAIN_REQUIREMENTS = ["airbyte-cdk>=0.51.3", "google-ads==22.1.0", "protobuf", "pendulum<3.0.0"] TEST_REQUIREMENTS = ["pytest~=6.1", "pytest-mock", "freezegun", "requests-mock"] setup( + entry_points={ + "console_scripts": [ + "source-google-ads=source_google_ads.run:run", + ], + }, name="source_google_ads", description="Source implementation for Google Ads.", author="Airbyte", diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/__init__.py b/airbyte-integrations/connectors/source-google-ads/source_google_ads/__init__.py index 39f872c4c095f..4e4e5e100d993 100644 --- a/airbyte-integrations/connectors/source-google-ads/source_google_ads/__init__.py +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/__init__.py @@ -1,3 +1,6 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# """ MIT License diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/config_migrations.py b/airbyte-integrations/connectors/source-google-ads/source_google_ads/config_migrations.py new file mode 100644 index 0000000000000..be206ee13e623 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/config_migrations.py @@ -0,0 +1,131 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import logging +from typing import Any, List, Mapping + +from airbyte_cdk.config_observation import create_connector_config_control_message +from airbyte_cdk.entrypoint import AirbyteEntrypoint +from airbyte_cdk.models import FailureType +from airbyte_cdk.sources import Source +from airbyte_cdk.sources.message import InMemoryMessageRepository, MessageRepository +from airbyte_cdk.utils import AirbyteTracedException + +from .utils import GAQL + +logger = logging.getLogger("airbyte_logger") + +FULL_REFRESH_CUSTOM_TABLE = [ + "asset", + "asset_group_listing_group_filter", + "custom_audience", + "geo_target_constant", + "change_event", + "change_status", +] + + +class MigrateCustomQuery: + """ + This class stands for migrating the config at runtime. + This migration is backwards compatible with the previous version, as new property will be created. + When falling back to the previous source version connector will use old property `custom_queries`. + + Add `segments.date` for all queries where it was previously added by IncrementalCustomQuery class. + """ + + message_repository: MessageRepository = InMemoryMessageRepository() + + @classmethod + def should_migrate(cls, config: Mapping[str, Any]) -> bool: + """ + Determines if a configuration requires migration. + + Args: + - config (Mapping[str, Any]): The configuration data to check. + + Returns: + - True: If the configuration requires migration. + - False: Otherwise. + """ + return "custom_queries_array" not in config + + @classmethod + def update_custom_queries(cls, config: Mapping[str, Any], source: Source = None) -> Mapping[str, Any]: + """ + Update custom queries with segments.date field. + + Args: + - config (Mapping[str, Any]): The configuration from which the key should be removed. + - source (Source, optional): The data source. Defaults to None. + + Returns: + - Mapping[str, Any]: The configuration after removing the key. + """ + custom_queries = [] + for query in config.get("custom_queries", []): + new_query = query.copy() + try: + query_object = GAQL.parse(query["query"]) + except ValueError: + message = f"The custom GAQL query {query['table_name']} failed. Validate your GAQL query with the Google Ads query validator. https://developers.google.com/google-ads/api/fields/v13/query_validator" + raise AirbyteTracedException(message=message, failure_type=FailureType.config_error) + + if query_object.resource_name not in FULL_REFRESH_CUSTOM_TABLE and "segments.date" not in query_object.fields: + query_object = query_object.append_field("segments.date") + + new_query["query"] = str(query_object) + custom_queries.append(new_query) + + config["custom_queries_array"] = custom_queries + return config + + @classmethod + def modify_and_save(cls, config_path: str, source: Source, config: Mapping[str, Any]) -> Mapping[str, Any]: + """ + Modifies the configuration and then saves it back to the source. + + Args: + - config_path (str): The path where the configuration is stored. + - source (Source): The data source. + - config (Mapping[str, Any]): The current configuration. + + Returns: + - Mapping[str, Any]: The updated configuration. + """ + migrated_config = cls.update_custom_queries(config, source) + source.write_config(migrated_config, config_path) + return migrated_config + + @classmethod + def emit_control_message(cls, migrated_config: Mapping[str, Any]) -> None: + """ + Emits the control messages related to configuration migration. + + Args: + - migrated_config (Mapping[str, Any]): The migrated configuration. + """ + cls.message_repository.emit_message(create_connector_config_control_message(migrated_config)) + for message in cls.message_repository._message_queue: + print(message.json(exclude_unset=True)) + + @classmethod + def migrate(cls, args: List[str], source: Source) -> None: + """ + Orchestrates the configuration migration process. + + It first checks if the `--config` argument is provided, and if so, + determines whether migration is needed, and then performs the migration + if required. + + Args: + - args (List[str]): List of command-line arguments. + - source (Source): The data source. + """ + config_path = AirbyteEntrypoint(source).extract_config(args) + if config_path: + config = source.read_config(config_path) + if cls.should_migrate(config): + cls.emit_control_message(cls.modify_and_save(config_path, source, config)) diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/custom_query_stream.py b/airbyte-integrations/connectors/source-google-ads/source_google_ads/custom_query_stream.py index f8e9a35af0180..4a3ac096cfdd6 100644 --- a/airbyte-integrations/connectors/source-google-ads/source_google_ads/custom_query_stream.py +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/custom_query_stream.py @@ -2,12 +2,15 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # + from functools import lru_cache from typing import Any, Dict, Mapping from .streams import GoogleAdsStream, IncrementalGoogleAdsStream from .utils import GAQL +DATE_TYPES = ("segments.date", "segments.month", "segments.quarter", "segments.week") + class CustomQueryMixin: def __init__(self, config, **kwargs): @@ -52,6 +55,8 @@ def get_json_schema(self) -> Dict[str, Any]: "STRING": "string", "BOOLEAN": "boolean", "DATE": "string", + "MESSAGE": "string", + "ENUM": "string", } fields = list(self.config["query"].fields) if self.cursor_field: @@ -62,23 +67,17 @@ def get_json_schema(self) -> Dict[str, Any]: node = google_schema.get(field) # Data type return in enum format: "GoogleAdsFieldDataType." google_data_type = node.data_type.name + field_value = {"type": [google_datatype_mapping.get(google_data_type, "string"), "null"]} + + # Google Ads doesn't differentiate between DATE and DATETIME, so we need to manually check for fields with known type + if google_data_type == "DATE" and field in DATE_TYPES: + field_value["format"] = "date" + if google_data_type == "ENUM": field_value = {"type": "string", "enum": list(node.enum_values)} - elif google_data_type == "MESSAGE": - # Represents protobuf message and could be anything, set custom - # attribute "protobuf_message" to convert it to a string (or - # array of strings) later. - # https://developers.google.com/google-ads/api/reference/rpc/v11/GoogleAdsFieldDataTypeEnum.GoogleAdsFieldDataType?hl=en#message - if node.is_repeated: - output_type = ["array", "null"] - else: - output_type = ["string", "null"] - field_value = {"type": output_type, "protobuf_message": True} - else: - output_type = [google_datatype_mapping.get(google_data_type, "string"), "null"] - field_value = {"type": output_type} - if google_data_type == "DATE": - field_value["format"] = "date" + + if node.is_repeated: + field_value = {"type": ["null", "array"], "items": field_value} local_json_schema["properties"][field] = field_value diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/google_ads.py b/airbyte-integrations/connectors/source-google-ads/source_google_ads/google_ads.py index 40e96a964086f..c34833154ce67 100644 --- a/airbyte-integrations/connectors/source-google-ads/source_google_ads/google_ads.py +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/google_ads.py @@ -5,35 +5,18 @@ import logging from enum import Enum -from typing import Any, Iterator, List, Mapping, MutableMapping +from typing import Any, Iterable, Iterator, List, Mapping, MutableMapping import backoff -import pendulum +from airbyte_cdk.models import FailureType +from airbyte_cdk.utils import AirbyteTracedException from google.ads.googleads.client import GoogleAdsClient -from google.ads.googleads.v13.services.types.google_ads_service import GoogleAdsRow, SearchGoogleAdsResponse -from google.api_core.exceptions import ServerError, TooManyRequests +from google.ads.googleads.v15.services.types.google_ads_service import GoogleAdsRow, SearchGoogleAdsResponse +from google.api_core.exceptions import InternalServerError, ServerError, TooManyRequests +from google.auth import exceptions from proto.marshal.collections import Repeated, RepeatedComposite -REPORT_MAPPING = { - "accounts": "customer", - "service_accounts": "customer", - "ad_group_ads": "ad_group_ad", - "ad_group_ad_labels": "ad_group_ad_label", - "ad_groups": "ad_group", - "ad_group_labels": "ad_group_label", - "campaigns": "campaign", - "campaign_labels": "campaign_label", - "account_performance_report": "customer", - "ad_group_ad_report": "ad_group_ad", - "display_keyword_performance_report": "display_keyword_view", - "display_topics_performance_report": "topic_view", - "shopping_performance_report": "shopping_performance_view", - "user_location_report": "user_location_view", - "click_view": "click_view", - "geographic_report": "geographic_view", - "keyword_report": "keyword_view", -} -API_VERSION = "v13" +API_VERSION = "v15" logger = logging.getLogger("airbyte") @@ -44,24 +27,60 @@ def __init__(self, credentials: MutableMapping[str, Any]): # `google-ads` library version `14.0.0` and higher requires an additional required parameter `use_proto_plus`. # More details can be found here: https://developers.google.com/google-ads/api/docs/client-libs/python/protobuf-messages credentials["use_proto_plus"] = True - self.client = GoogleAdsClient.load_from_dict(credentials, version=API_VERSION) - self.ga_service = self.client.get_service("GoogleAdsService") + self.clients = {} + self.ga_services = {} + self.credentials = credentials + + self.clients["default"] = self.get_google_ads_client(credentials) + self.ga_services["default"] = self.clients["default"].get_service("GoogleAdsService") + + self.customer_service = self.clients["default"].get_service("CustomerService") + + def get_client(self, login_customer_id="default"): + if login_customer_id in self.clients: + return self.clients[login_customer_id] + new_creds = self.credentials.copy() + new_creds["login_customer_id"] = login_customer_id + self.clients[login_customer_id] = self.get_google_ads_client(new_creds) + return self.clients[login_customer_id] + + def ga_service(self, login_customer_id="default"): + if login_customer_id in self.ga_services: + return self.ga_services[login_customer_id] + self.ga_services[login_customer_id] = self.clients[login_customer_id].get_service("GoogleAdsService") + return self.ga_services[login_customer_id] + + @staticmethod + def get_google_ads_client(credentials) -> GoogleAdsClient: + try: + return GoogleAdsClient.load_from_dict(credentials, version=API_VERSION) + except exceptions.RefreshError as e: + message = "The authentication to Google Ads has expired. Re-authenticate to restore access to Google Ads." + raise AirbyteTracedException(message=message, failure_type=FailureType.config_error) from e + + def get_accessible_accounts(self): + customer_resource_names = self.customer_service.list_accessible_customers().resource_names + logger.info(f"Found {len(customer_resource_names)} accessible accounts: {customer_resource_names}") + + for customer_resource_name in customer_resource_names: + customer_id = self.ga_service().parse_customer_path(customer_resource_name)["customer_id"] + yield customer_id @backoff.on_exception( backoff.expo, - (ServerError, TooManyRequests), + (InternalServerError, ServerError, TooManyRequests), on_backoff=lambda details: logger.info( f"Caught retryable error after {details['tries']} tries. Waiting {details['wait']} seconds then retrying..." ), max_tries=5, ) - def send_request(self, query: str, customer_id: str) -> Iterator[SearchGoogleAdsResponse]: - client = self.client + def send_request(self, query: str, customer_id: str, login_customer_id: str = "default") -> Iterator[SearchGoogleAdsResponse]: + client = self.get_client(login_customer_id) search_request = client.get_type("SearchGoogleAdsRequest") search_request.query = query search_request.page_size = self.DEFAULT_PAGE_SIZE search_request.customer_id = customer_id - return [self.ga_service.search(search_request)] + return [self.ga_service(login_customer_id).search(search_request)] def get_fields_metadata(self, fields: List[str]) -> Mapping[str, Any]: """ @@ -70,8 +89,8 @@ def get_fields_metadata(self, fields: List[str]) -> Mapping[str, Any]: :return dict of fields type info. """ - ga_field_service = self.client.get_service("GoogleAdsFieldService") - request = self.client.get_type("SearchGoogleAdsFieldsRequest") + ga_field_service = self.get_client().get_service("GoogleAdsFieldService") + request = self.get_client().get_type("SearchGoogleAdsFieldsRequest") request.page_size = len(fields) fields_sql = ",".join([f"'{field}'" for field in fields]) request.query = f""" @@ -92,19 +111,36 @@ def get_fields_from_schema(schema: Mapping[str, Any]) -> List[str]: @staticmethod def convert_schema_into_query( - schema: Mapping[str, Any], report_name: str, from_date: str = None, to_date: str = None, cursor_field: str = None + fields: Iterable[str], + table_name: str, + conditions: List[str] = None, + order_field: str = None, + limit: int = None, ) -> str: - from_category = REPORT_MAPPING[report_name] - fields = GoogleAds.get_fields_from_schema(schema) - fields = ",\n".join(fields) + """ + Constructs a Google Ads query based on the provided parameters. + + Args: + - fields (Iterable[str]): List of fields to be selected in the query. + - table_name (str): Name of the table from which data will be selected. + - conditions (List[str], optional): List of conditions to be applied in the WHERE clause. Defaults to None. + - order_field (str, optional): Field by which the results should be ordered. Defaults to None. + - limit (int, optional): Maximum number of results to be returned. Defaults to None. + + Returns: + - str: Constructed Google Ads query. + """ + + query_template = f"SELECT {', '.join(fields)} FROM {table_name}" - query_template = f"SELECT {fields} FROM {from_category} " + if conditions: + query_template += " WHERE " + " AND ".join(conditions) - if cursor_field: - end_date_inclusive = "<=" if (pendulum.parse(to_date) - pendulum.parse(from_date)).days > 1 else "<" - query_template += ( - f"WHERE {cursor_field} >= '{from_date}' AND {cursor_field} {end_date_inclusive} '{to_date}' ORDER BY {cursor_field} ASC" - ) + if order_field: + query_template += f" ORDER BY {order_field} ASC" + + if limit: + query_template += f" LIMIT {limit}" return query_template @@ -162,25 +198,18 @@ def get_field_value(field_value: GoogleAdsRow, field: str, schema_type: Mapping[ elif isinstance(field_value, (Repeated, RepeatedComposite)): field_value = [str(value) for value in field_value] - # Google Ads has a lot of entities inside itself and we cannot process them all separately, because: + # Google Ads has a lot of entities inside itself, and we cannot process them all separately, because: # 1. It will take a long time # 2. We have no way to get data on absolutely all entities to test. # # To prevent JSON from throwing an error during deserialization, we made such a hack. # For example: - # 1. ad_group_ad.ad.responsive_display_ad.long_headline - type AdTextAsset (https://developers.google.com/google-ads/api/reference/rpc/v6/AdTextAsset?hl=en). - # 2. ad_group_ad.ad.legacy_app_install_ad - type LegacyAppInstallAdInfo (https://developers.google.com/google-ads/api/reference/rpc/v7/LegacyAppInstallAdInfo?hl=en). - # - if not (isinstance(field_value, (list, int, float, str, bool, dict)) or field_value is None): + # 1. ad_group_ad.ad.responsive_display_ad.long_headline - type AdTextAsset + # (https://developers.google.com/google-ads/api/reference/rpc/v6/AdTextAsset?hl=en). + # 2. ad_group_ad.ad.legacy_app_install_ad - type LegacyAppInstallAdInfo + # (https://developers.google.com/google-ads/api/reference/rpc/v7/LegacyAppInstallAdInfo?hl=en). + if not isinstance(field_value, (list, int, float, str, bool, dict)) and field_value is not None: field_value = str(field_value) - # In case of custom query field has MESSAGE type it represents protobuf - # message and could be anything, convert it to a string or array of - # string if it has "repeated" flag on metadata - if schema_type.get("protobuf_message"): - if "array" in schema_type.get("type"): - field_value = [str(field) for field in field_value] - else: - field_value = str(field_value) return field_value diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/models.py b/airbyte-integrations/connectors/source-google-ads/source_google_ads/models.py index 768f0c61dba8c..7da4ed7c2b9c9 100644 --- a/airbyte-integrations/connectors/source-google-ads/source_google_ads/models.py +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/models.py @@ -2,28 +2,34 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # + from dataclasses import dataclass -from typing import Any, Iterable, Mapping, Union +from typing import Any, Iterable, Mapping -from pendulum import timezone +from pendulum import local_timezone, timezone from pendulum.tz.timezone import Timezone @dataclass -class Customer: +class CustomerModel: id: str - time_zone: Union[timezone, str] = "local" + time_zone: timezone = local_timezone() is_manager_account: bool = False + login_customer_id: str = None @classmethod - def from_accounts(cls, accounts: Iterable[Iterable[Mapping[str, Any]]]): + def from_accounts(cls, accounts: Iterable[Mapping[str, Any]]) -> Iterable["CustomerModel"]: data_objects = [] - for account_list in accounts: - for account in account_list: - time_zone_name = account.get("customer.time_zone") - tz = Timezone(time_zone_name) if time_zone_name else "local" + for account in accounts: + time_zone_name = account.get("customer_client.time_zone") + tz = Timezone(time_zone_name) if time_zone_name else local_timezone() - data_objects.append( - cls(id=str(account["customer.id"]), time_zone=tz, is_manager_account=bool(account.get("customer.manager"))) + data_objects.append( + cls( + id=str(account["customer_client.id"]), + time_zone=tz, + is_manager_account=bool(account.get("customer_client.manager")), + login_customer_id=account.get("login_customer_id"), ) + ) return data_objects diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/run.py b/airbyte-integrations/connectors/source-google-ads/source_google_ads/run.py new file mode 100644 index 0000000000000..dd759a035015c --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/run.py @@ -0,0 +1,16 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import sys + +from airbyte_cdk.entrypoint import launch +from source_google_ads import SourceGoogleAds +from source_google_ads.config_migrations import MigrateCustomQuery + + +def run(): + source = SourceGoogleAds() + MigrateCustomQuery.migrate(sys.argv[1:], source) + launch(source, sys.argv[1:]) diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group.json new file mode 100644 index 0000000000000..96dbdc94edea5 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group.json @@ -0,0 +1,109 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "campaign.id": { + "type": ["null", "integer"] + }, + "ad_group.ad_rotation_mode": { + "type": ["null", "string"] + }, + "ad_group.base_ad_group": { + "type": ["null", "string"] + }, + "ad_group.campaign": { + "type": ["null", "string"] + }, + "metrics.cost_micros": { + "type": ["null", "integer"] + }, + "ad_group.cpc_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group.cpm_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group.cpv_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group.display_custom_bid_dimension": { + "type": ["null", "string"] + }, + "ad_group.effective_target_cpa_micros": { + "type": ["null", "integer"] + }, + "ad_group.effective_target_cpa_source": { + "type": ["null", "string"] + }, + "ad_group.effective_target_roas": { + "type": ["null", "number"] + }, + "ad_group.effective_target_roas_source": { + "type": ["null", "string"] + }, + "ad_group.excluded_parent_asset_field_types": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group.optimized_targeting_enabled": { + "type": ["null", "boolean"] + }, + "ad_group.final_url_suffix": { + "type": ["null", "string"] + }, + "ad_group.id": { + "type": ["null", "integer"] + }, + "ad_group.labels": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group.name": { + "type": ["null", "string"] + }, + "ad_group.percent_cpc_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group.resource_name": { + "type": ["null", "string"] + }, + "ad_group.status": { + "type": ["null", "string"] + }, + "ad_group.target_cpa_micros": { + "type": ["null", "integer"] + }, + "ad_group.target_cpm_micros": { + "type": ["null", "integer"] + }, + "ad_group.target_roas": { + "type": ["null", "number"] + }, + "ad_group.targeting_setting.target_restrictions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group.tracking_url_template": { + "type": ["null", "string"] + }, + "ad_group.type": { + "type": ["null", "string"] + }, + "ad_group.url_custom_parameters": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_ad.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_ad.json new file mode 100644 index 0000000000000..f11c82c5489bb --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_ad.json @@ -0,0 +1,532 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "ad_group.id": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.added_by_google_ads": { + "type": ["null", "boolean"] + }, + "ad_group_ad.ad.app_ad.descriptions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.app_ad.headlines": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.app_ad.html5_media_bundles": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.app_ad.images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.app_ad.mandatory_ad_text": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.app_ad.youtube_videos": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.app_engagement_ad.descriptions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.app_engagement_ad.headlines": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.app_engagement_ad.images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.app_engagement_ad.videos": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.call_ad.business_name": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.call_ad.call_tracked": { + "type": ["null", "boolean"] + }, + "ad_group_ad.ad.call_ad.conversion_action": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.call_ad.conversion_reporting_state": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.call_ad.country_code": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.call_ad.description1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.call_ad.description2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.call_ad.disable_call_conversion": { + "type": ["null", "boolean"] + }, + "ad_group_ad.ad.call_ad.headline1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.call_ad.headline2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.call_ad.path1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.call_ad.path2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.call_ad.phone_number": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.call_ad.phone_number_verification_url": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.device_preference": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.display_upload_ad.display_upload_product_type": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.display_upload_ad.media_bundle": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.display_url": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_dynamic_search_ad.description": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_dynamic_search_ad.description2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.description": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.description2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.headline_part1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.headline_part2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.headline_part3": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.path1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.path2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.final_app_urls": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.final_mobile_urls": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.final_url_suffix": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.final_urls": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.hotel_ad": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.id": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.image_ad.image_url": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.image_ad.mime_type": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.image_ad.name": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.image_ad.pixel_height": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.image_ad.pixel_width": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.image_ad.preview_image_url": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.image_ad.preview_pixel_height": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.image_ad.preview_pixel_width": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.legacy_app_install_ad": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.accent_color": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": { + "type": ["null", "boolean"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.business_name": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.description": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.main_color": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.local_ad.call_to_actions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.local_ad.descriptions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.local_ad.headlines": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.local_ad.logo_images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.local_ad.marketing_images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.local_ad.path1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.local_ad.path2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.local_ad.videos": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.name": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.resource_name": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.accent_color": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": { + "type": ["null", "boolean"] + }, + "ad_group_ad.ad.responsive_display_ad.business_name": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.call_to_action_text": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.control_spec.enable_asset_enhancements": { + "type": ["null", "boolean"] + }, + "ad_group_ad.ad.responsive_display_ad.control_spec.enable_autogen_video": { + "type": ["null", "boolean"] + }, + "ad_group_ad.ad.responsive_display_ad.descriptions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_display_ad.format_setting": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.headlines": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_display_ad.logo_images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_display_ad.long_headline": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.main_color": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.marketing_images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_display_ad.price_prefix": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.promo_text": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.square_logo_images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_display_ad.square_marketing_images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_display_ad.youtube_videos": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_search_ad.descriptions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_search_ad.headlines": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_search_ad.path1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_search_ad.path2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.shopping_comparison_listing_ad.headline": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.shopping_product_ad": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.shopping_smart_ad": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.smart_campaign_ad.descriptions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.smart_campaign_ad.headlines": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.system_managed_resource_source": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.text_ad.description1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.text_ad.description2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.text_ad.headline": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.tracking_url_template": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.type": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.url_collections": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.url_custom_parameters": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.video_ad.in_feed.description1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.video_ad.in_feed.description2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.video_ad.in_feed.headline": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.video_ad.in_stream.action_button_label": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.video_ad.in_stream.action_headline": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.video_ad.out_stream.description": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.video_ad.out_stream.headline": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.video_responsive_ad.call_to_actions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.video_responsive_ad.companion_banners": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.video_responsive_ad.descriptions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.video_responsive_ad.headlines": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.video_responsive_ad.long_headlines": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.video_responsive_ad.videos": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad_group": { + "type": ["null", "string"] + }, + "ad_group_ad.ad_strength": { + "type": ["null", "string"] + }, + "ad_group_ad.labels": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.policy_summary.approval_status": { + "type": ["null", "string"] + }, + "ad_group_ad.policy_summary.policy_topic_entries": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.policy_summary.review_status": { + "type": ["null", "string"] + }, + "ad_group_ad.resource_name": { + "type": ["null", "string"] + }, + "ad_group_ad.status": { + "type": ["null", "string"] + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_ad_label.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_ad_label.json new file mode 100644 index 0000000000000..266649b8f1255 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_ad_label.json @@ -0,0 +1,27 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "ad_group.id": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.id": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.resource_name": { + "type": ["null", "string"] + }, + "ad_group_ad_label.resource_name": { + "type": ["null", "string"] + }, + "label.name": { + "type": ["null", "string"] + }, + "label.resource_name": { + "type": ["null", "string"] + }, + "label.id": { + "type": ["null", "integer"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_ad_legacy.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_ad_legacy.json new file mode 100644 index 0000000000000..529a18bf03377 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_ad_legacy.json @@ -0,0 +1,484 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "ad_group_ad.ad.legacy_responsive_display_ad.accent_color": { + "type": ["null", "string"] + }, + "ad_group.id": { + "type": ["null", "integer"] + }, + "customer.currency_code": { + "type": ["null", "string"] + }, + "customer.descriptive_name": { + "type": ["null", "string"] + }, + "customer.time_zone": { + "type": ["null", "string"] + }, + "metrics.active_view_cpm": { + "type": ["null", "number"] + }, + "metrics.active_view_ctr": { + "type": ["null", "number"] + }, + "metrics.active_view_impressions": { + "type": ["null", "integer"] + }, + "metrics.active_view_measurability": { + "type": ["null", "number"] + }, + "metrics.active_view_measurable_cost_micros": { + "type": ["null", "integer"] + }, + "metrics.active_view_measurable_impressions": { + "type": ["null", "integer"] + }, + "metrics.active_view_viewability": { + "type": ["null", "number"] + }, + "ad_group_ad.ad_group": { + "type": ["null", "string"] + }, + "ad_group.name": { + "type": ["null", "string"] + }, + "ad_group.status": { + "type": ["null", "string"] + }, + "segments.ad_network_type": { + "type": ["null", "string"] + }, + "ad_group_ad.ad_strength": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.type": { + "type": ["null", "string"] + }, + "metrics.all_conversions_from_interactions_rate": { + "type": ["null", "number"] + }, + "metrics.all_conversions_value": { + "type": ["null", "number"] + }, + "metrics.all_conversions": { + "type": ["null", "number"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.allow_flexible_color": { + "type": ["null", "boolean"] + }, + "ad_group_ad.ad.added_by_google_ads": { + "type": ["null", "boolean"] + }, + "metrics.average_cost": { + "type": ["null", "number"] + }, + "metrics.average_cpc": { + "type": ["null", "number"] + }, + "metrics.average_cpe": { + "type": ["null", "number"] + }, + "metrics.average_cpm": { + "type": ["null", "number"] + }, + "metrics.average_cpv": { + "type": ["null", "number"] + }, + "metrics.average_page_views": { + "type": ["null", "number"] + }, + "metrics.average_time_on_site": { + "type": ["null", "number"] + }, + "ad_group.base_ad_group": { + "type": ["null", "string"] + }, + "campaign.base_campaign": { + "type": ["null", "string"] + }, + "metrics.bounce_rate": { + "type": ["null", "number"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.business_name": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.call_to_action_text": { + "type": ["null", "string"] + }, + "campaign.id": { + "type": ["null", "integer"] + }, + "campaign.name": { + "type": ["null", "string"] + }, + "campaign.status": { + "type": ["null", "string"] + }, + "metrics.clicks": { + "type": ["null", "integer"] + }, + "ad_group_ad.policy_summary.approval_status": { + "type": ["null", "string"] + }, + "metrics.conversions_from_interactions_rate": { + "type": ["null", "number"] + }, + "metrics.conversions_value": { + "type": ["null", "number"] + }, + "metrics.conversions": { + "type": ["null", "number"] + }, + "metrics.cost_micros": { + "type": ["null", "integer"] + }, + "metrics.cost_per_all_conversions": { + "type": ["null", "number"] + }, + "metrics.cost_per_conversion": { + "type": ["null", "number"] + }, + "metrics.cost_per_current_model_attributed_conversion": { + "type": ["null", "number"] + }, + "ad_group_ad.ad.final_mobile_urls": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.final_urls": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.tracking_url_template": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.url_custom_parameters": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "metrics.cross_device_conversions": { + "type": ["null", "number"] + }, + "metrics.ctr": { + "type": ["null", "number"] + }, + "metrics.current_model_attributed_conversions_value": { + "type": ["null", "number"] + }, + "metrics.current_model_attributed_conversions": { + "type": ["null", "number"] + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + }, + "segments.day_of_week": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.description": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.text_ad.description1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.text_ad.description2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.device_preference": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.display_url": { + "type": ["null", "string"] + }, + "metrics.engagement_rate": { + "type": ["null", "number"] + }, + "metrics.engagements": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.logo_image": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.square_logo_image": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.marketing_image": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.square_marketing_image": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_dynamic_search_ad.description": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.description2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.headline_part3": { + "type": ["null", "string"] + }, + "customer.id": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.format_setting": { + "type": ["null", "string"] + }, + "metrics.gmail_forwards": { + "type": ["null", "integer"] + }, + "metrics.gmail_saves": { + "type": ["null", "integer"] + }, + "metrics.gmail_secondary_clicks": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.text_ad.headline": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.headline_part1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.headline_part2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.id": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.image_ad.image_url": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.image_ad.pixel_height": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.image_ad.pixel_width": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.image_ad.mime_type": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.image_ad.name": { + "type": ["null", "string"] + }, + "metrics.impressions": { + "type": ["null", "integer"] + }, + "metrics.interaction_rate": { + "type": ["null", "number"] + }, + "metrics.interaction_event_types": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "metrics.interactions": { + "type": ["null", "integer"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.long_headline": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.main_color": { + "type": ["null", "string"] + }, + "segments.month": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.accent_color": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.allow_flexible_color": { + "type": ["null", "boolean"] + }, + "ad_group_ad.ad.responsive_display_ad.business_name": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.call_to_action_text": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.descriptions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_display_ad.price_prefix": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.promo_text": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.format_setting": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.headlines": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_display_ad.logo_images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_display_ad.square_logo_images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_display_ad.long_headline": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.main_color": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_display_ad.marketing_images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_display_ad.square_marketing_images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_display_ad.youtube_videos": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.expanded_text_ad.path1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.expanded_text_ad.path2": { + "type": ["null", "string"] + }, + "metrics.percent_new_visitors": { + "type": ["null", "number"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.price_prefix": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.promo_text": { + "type": ["null", "string"] + }, + "segments.quarter": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_search_ad.descriptions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_search_ad.headlines": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.responsive_search_ad.path1": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.responsive_search_ad.path2": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.legacy_responsive_display_ad.short_headline": { + "type": ["null", "string"] + }, + "ad_group_ad.status": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.system_managed_resource_source": { + "type": ["null", "string"] + }, + "metrics.top_impression_percentage": { + "type": ["null", "number"] + }, + "ad_group_ad.ad.app_ad.descriptions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.app_ad.headlines": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.app_ad.html5_media_bundles": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.app_ad.images": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_ad.ad.app_ad.mandatory_ad_text": { + "type": ["null", "string"] + }, + "ad_group_ad.ad.app_ad.youtube_videos": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "metrics.value_per_all_conversions": { + "type": ["null", "number"] + }, + "metrics.value_per_conversion": { + "type": ["null", "number"] + }, + "metrics.value_per_current_model_attributed_conversion": { + "type": ["null", "number"] + }, + "metrics.video_quartile_p100_rate": { + "type": ["null", "number"] + }, + "metrics.video_quartile_p25_rate": { + "type": ["null", "number"] + }, + "metrics.video_quartile_p50_rate": { + "type": ["null", "number"] + }, + "metrics.video_quartile_p75_rate": { + "type": ["null", "number"] + }, + "metrics.video_view_rate": { + "type": ["null", "number"] + }, + "metrics.video_views": { + "type": ["null", "integer"] + }, + "metrics.view_through_conversions": { + "type": ["null", "integer"] + }, + "segments.week": { + "type": ["null", "string"] + }, + "segments.year": { + "type": ["null", "integer"] + }, + "segments.keyword.ad_group_criterion": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_bidding_strategy.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_bidding_strategy.json new file mode 100644 index 0000000000000..cd9390b1f622e --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_bidding_strategy.json @@ -0,0 +1,97 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "ad_group.id": { + "type": ["null", "integer"] + }, + "bidding_strategy.aligned_campaign_budget_id": { + "type": ["null", "integer"] + }, + "bidding_strategy.campaign_count": { + "type": ["null", "integer"] + }, + "bidding_strategy.currency_code": { + "type": ["null", "string"] + }, + "bidding_strategy.effective_currency_code": { + "type": ["null", "string"] + }, + "bidding_strategy.enhanced_cpc": { + "type": ["null", "string"] + }, + "bidding_strategy.id": { + "type": ["null", "integer"] + }, + "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.maximize_conversion_value.target_roas": { + "type": ["null", "number"] + }, + "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.maximize_conversions.target_cpa_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.name": { + "type": ["null", "string"] + }, + "bidding_strategy.non_removed_campaign_count": { + "type": ["null", "integer"] + }, + "bidding_strategy.resource_name": { + "type": ["null", "string"] + }, + "bidding_strategy.status": { + "type": ["null", "string"] + }, + "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_cpa.cpc_bid_floor_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_cpa.target_cpa_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_impression_share.location": { + "type": ["null", "string"] + }, + "bidding_strategy.target_impression_share.location_fraction_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_roas.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_roas.cpc_bid_floor_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_roas.target_roas": { + "type": ["null", "number"] + }, + "bidding_strategy.target_spend.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_spend.target_spend_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.type": { + "type": ["null", "string"] + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_criterion.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_criterion.json new file mode 100644 index 0000000000000..48564345f31f2 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_criterion.json @@ -0,0 +1,231 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "deleted_at": { + "type": ["null", "string"] + }, + "change_status.last_change_date_time": { + "type": ["null", "string"] + }, + "ad_group.id": { + "type": ["null", "integer"] + }, + "ad_group_criterion.ad_group": { + "type": ["null", "string"] + }, + "ad_group_criterion.age_range.type": { + "type": ["null", "string"] + }, + "ad_group_criterion.app_payment_model.type": { + "type": ["null", "string"] + }, + "ad_group_criterion.approval_status": { + "type": ["null", "string"] + }, + "ad_group_criterion.audience.audience": { + "type": ["null", "string"] + }, + "ad_group_criterion.bid_modifier": { + "type": ["null", "number"] + }, + "ad_group_criterion.combined_audience.combined_audience": { + "type": ["null", "string"] + }, + "ad_group_criterion.cpc_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.cpm_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.cpv_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.criterion_id": { + "type": ["null", "integer"] + }, + "ad_group_criterion.custom_affinity.custom_affinity": { + "type": ["null", "string"] + }, + "ad_group_criterion.custom_audience.custom_audience": { + "type": ["null", "string"] + }, + "ad_group_criterion.custom_intent.custom_intent": { + "type": ["null", "string"] + }, + "ad_group_criterion.disapproval_reasons": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "ad_group_criterion.display_name": { + "type": ["null", "string"] + }, + "ad_group_criterion.effective_cpc_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.effective_cpc_bid_source": { + "type": ["null", "string"] + }, + "ad_group_criterion.effective_cpm_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.effective_cpm_bid_source": { + "type": ["null", "string"] + }, + "ad_group_criterion.effective_cpv_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.effective_cpv_bid_source": { + "type": ["null", "string"] + }, + "ad_group_criterion.effective_percent_cpc_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.effective_percent_cpc_bid_source": { + "type": ["null", "string"] + }, + "ad_group_criterion.final_mobile_urls": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "ad_group_criterion.final_url_suffix": { + "type": ["null", "string"] + }, + "ad_group_criterion.final_urls": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "ad_group_criterion.gender.type": { + "type": ["null", "string"] + }, + "ad_group_criterion.income_range.type": { + "type": ["null", "string"] + }, + "ad_group_criterion.keyword.match_type": { + "type": ["null", "string"] + }, + "ad_group_criterion.keyword.text": { + "type": ["null", "string"] + }, + "ad_group_criterion.labels": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "ad_group_criterion.mobile_app_category.mobile_app_category_constant": { + "type": ["null", "string"] + }, + "ad_group_criterion.mobile_application.app_id": { + "type": ["null", "string"] + }, + "ad_group_criterion.mobile_application.name": { + "type": ["null", "string"] + }, + "ad_group_criterion.negative": { + "type": ["null", "boolean"] + }, + "ad_group_criterion.parental_status.type": { + "type": ["null", "string"] + }, + "ad_group_criterion.percent_cpc_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.placement.url": { + "type": ["null", "string"] + }, + "ad_group_criterion.position_estimates.estimated_add_clicks_at_first_position_cpc": { + "type": ["null", "integer"] + }, + "ad_group_criterion.position_estimates.estimated_add_cost_at_first_position_cpc": { + "type": ["null", "integer"] + }, + "ad_group_criterion.position_estimates.first_page_cpc_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.position_estimates.first_position_cpc_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.position_estimates.top_of_page_cpc_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.quality_info.creative_quality_score": { + "type": ["null", "string"] + }, + "ad_group_criterion.quality_info.post_click_quality_score": { + "type": ["null", "string"] + }, + "ad_group_criterion.quality_info.quality_score": { + "type": ["null", "integer"] + }, + "ad_group_criterion.quality_info.search_predicted_ctr": { + "type": ["null", "string"] + }, + "ad_group_criterion.resource_name": { + "type": ["null", "string"] + }, + "ad_group_criterion.status": { + "type": ["null", "string"] + }, + "ad_group_criterion.system_serving_status": { + "type": ["null", "string"] + }, + "ad_group_criterion.topic.path": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "ad_group_criterion.topic.topic_constant": { + "type": ["null", "string"] + }, + "ad_group_criterion.tracking_url_template": { + "type": ["null", "string"] + }, + "ad_group_criterion.type": { + "type": ["null", "string"] + }, + "ad_group_criterion.url_custom_parameters": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "ad_group_criterion.user_interest.user_interest_category": { + "type": ["null", "string"] + }, + "ad_group_criterion.user_list.user_list": { + "type": ["null", "string"] + }, + "ad_group_criterion.webpage.conditions": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "ad_group_criterion.webpage.coverage_percentage": { + "type": ["null", "number"] + }, + "ad_group_criterion.webpage.criterion_name": { + "type": ["null", "string"] + }, + "ad_group_criterion.webpage.sample.sample_urls": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "ad_group_criterion.youtube_channel.channel_id": { + "type": ["null", "string"] + }, + "ad_group_criterion.youtube_video.video_id": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_criterion_label.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_criterion_label.json new file mode 100644 index 0000000000000..c381686ebf589 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_criterion_label.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "ad_group.id": { + "type": ["null", "integer"] + }, + "label.id": { + "type": ["null", "integer"] + }, + "ad_group_criterion_label.ad_group_criterion": { + "type": ["null", "string"] + }, + "ad_group_criterion_label.label": { + "type": ["null", "string"] + }, + "ad_group_criterion_label.resource_name": { + "type": ["null", "string"] + }, + "ad_group_criterion.criterion_id": { + "type": ["null", "integer"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_label.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_label.json new file mode 100644 index 0000000000000..6338bda92b787 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_group_label.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "ad_group.id": { + "type": ["null", "integer"] + }, + "label.id": { + "type": ["null", "integer"] + }, + "ad_group.resource_name": { + "type": ["null", "string"] + }, + "ad_group_label.resource_name": { + "type": ["null", "string"] + }, + "label.name": { + "type": ["null", "string"] + }, + "label.resource_name": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_listing_group_criterion.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_listing_group_criterion.json new file mode 100644 index 0000000000000..fe5efc3715896 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/ad_listing_group_criterion.json @@ -0,0 +1,84 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "deleted_at": { + "type": ["null", "string"] + }, + "change_status.last_change_date_time": { + "type": ["null", "string"] + }, + "ad_group_criterion.resource_name": { + "type": ["null", "string"] + }, + "ad_group.id": { + "type": ["null", "integer"] + }, + "ad_group_criterion.criterion_id": { + "type": ["null", "integer"] + }, + "ad_group_criterion.listing_group.case_value.activity_country.value": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.activity_id.value": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.activity_rating.value": { + "type": ["null", "integer"] + }, + "ad_group_criterion.listing_group.case_value.hotel_city.city_criterion": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.hotel_class.value": { + "type": ["null", "integer"] + }, + "ad_group_criterion.listing_group.case_value.hotel_country_region.country_region_criterion": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.hotel_id.value": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.hotel_state.state_criterion": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.product_category.category_id": { + "type": ["null", "integer"] + }, + "ad_group_criterion.listing_group.case_value.product_category.level": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.product_brand.value": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.product_channel.channel": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.product_channel_exclusivity.channel_exclusivity": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.product_condition.condition": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.product_custom_attribute.index": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.product_custom_attribute.value": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.product_item_id.value": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.product_type.level": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.case_value.product_type.value": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.parent_ad_group_criterion": { + "type": ["null", "string"] + }, + "ad_group_criterion.listing_group.type": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/audience.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/audience.json new file mode 100644 index 0000000000000..314a2c19b771f --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/audience.json @@ -0,0 +1,33 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "customer.id": { + "type": ["null", "integer"] + }, + "audience.description": { + "type": ["null", "string"] + }, + "audience.dimensions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "audience.exclusion_dimension": { + "type": ["null", "string"] + }, + "audience.id": { + "type": ["null", "integer"] + }, + "audience.name": { + "type": ["null", "string"] + }, + "audience.resource_name": { + "type": ["null", "string"] + }, + "audience.status": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign.json new file mode 100644 index 0000000000000..6b7d4f334ca5a --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign.json @@ -0,0 +1,325 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "campaign.accessible_bidding_strategy": { + "type": ["null", "string"] + }, + "campaign.ad_serving_optimization_status": { + "type": ["null", "string"] + }, + "campaign.advertising_channel_sub_type": { + "type": ["null", "string"] + }, + "campaign.advertising_channel_type": { + "type": ["null", "string"] + }, + "campaign.app_campaign_setting.app_id": { + "type": ["null", "string"] + }, + "campaign.app_campaign_setting.app_store": { + "type": ["null", "string"] + }, + "campaign.app_campaign_setting.bidding_strategy_goal_type": { + "type": ["null", "string"] + }, + "campaign.base_campaign": { + "type": ["null", "string"] + }, + "campaign.bidding_strategy": { + "type": ["null", "string"] + }, + "campaign.bidding_strategy_type": { + "type": ["null", "string"] + }, + "campaign.campaign_budget": { + "type": ["null", "string"] + }, + "campaign_budget.amount_micros": { + "type": ["null", "integer"] + }, + "campaign.commission.commission_rate_micros": { + "type": ["null", "integer"] + }, + "campaign.dynamic_search_ads_setting.domain_name": { + "type": ["null", "string"] + }, + "campaign.dynamic_search_ads_setting.feeds": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "campaign.dynamic_search_ads_setting.language_code": { + "type": ["null", "string"] + }, + "campaign.dynamic_search_ads_setting.use_supplied_urls_only": { + "type": ["null", "boolean"] + }, + "campaign.end_date": { + "type": ["null", "string"] + }, + "campaign.excluded_parent_asset_field_types": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "campaign.experiment_type": { + "type": ["null", "string"] + }, + "campaign.final_url_suffix": { + "type": ["null", "string"] + }, + "campaign.frequency_caps": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "campaign.geo_target_type_setting.negative_geo_target_type": { + "type": ["null", "string"] + }, + "campaign.geo_target_type_setting.positive_geo_target_type": { + "type": ["null", "string"] + }, + "campaign.hotel_setting.hotel_center_id": { + "type": ["null", "integer"] + }, + "campaign.id": { + "type": ["null", "integer"] + }, + "campaign.labels": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "campaign.local_campaign_setting.location_source_type": { + "type": ["null", "string"] + }, + "campaign.manual_cpc.enhanced_cpc_enabled": { + "type": ["null", "boolean"] + }, + "campaign.manual_cpm": { + "type": ["null", "string"] + }, + "campaign.manual_cpv": { + "type": ["null", "string"] + }, + "campaign.maximize_conversion_value.target_roas": { + "type": ["null", "number"] + }, + "campaign.maximize_conversions.target_cpa_micros": { + "type": ["null", "integer"] + }, + "campaign.name": { + "type": ["null", "string"] + }, + "campaign.network_settings.target_content_network": { + "type": ["null", "boolean"] + }, + "campaign.network_settings.target_google_search": { + "type": ["null", "boolean"] + }, + "campaign.network_settings.target_partner_search_network": { + "type": ["null", "boolean"] + }, + "campaign.network_settings.target_search_network": { + "type": ["null", "boolean"] + }, + "campaign.optimization_goal_setting.optimization_goal_types": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "campaign.optimization_score": { + "type": ["null", "number"] + }, + "campaign.payment_mode": { + "type": ["null", "string"] + }, + "campaign.percent_cpc.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "campaign.percent_cpc.enhanced_cpc_enabled": { + "type": ["null", "boolean"] + }, + "campaign.real_time_bidding_setting.opt_in": { + "type": ["null", "boolean"] + }, + "campaign.resource_name": { + "type": ["null", "string"] + }, + "campaign.selective_optimization.conversion_actions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "campaign.serving_status": { + "type": ["null", "string"] + }, + "campaign.shopping_setting.campaign_priority": { + "type": ["null", "integer"] + }, + "campaign.shopping_setting.enable_local": { + "type": ["null", "boolean"] + }, + "campaign.shopping_setting.merchant_id": { + "type": ["null", "integer"] + }, + "campaign.start_date": { + "type": ["null", "string"] + }, + "campaign.status": { + "type": ["null", "string"] + }, + "campaign.target_cpa.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "campaign.target_cpa.cpc_bid_floor_micros": { + "type": ["null", "integer"] + }, + "campaign.target_cpa.target_cpa_micros": { + "type": ["null", "integer"] + }, + "campaign.target_cpm.target_frequency_goal.target_count": { + "type": ["null", "integer"] + }, + "campaign.target_cpm.target_frequency_goal.time_unit": { + "type": ["null", "string"] + }, + "campaign.target_impression_share.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "campaign.target_impression_share.location": { + "type": ["null", "string"] + }, + "campaign.target_impression_share.location_fraction_micros": { + "type": ["null", "integer"] + }, + "campaign.target_roas.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "campaign.target_roas.cpc_bid_floor_micros": { + "type": ["null", "integer"] + }, + "campaign.target_roas.target_roas": { + "type": ["null", "number"] + }, + "campaign.target_spend.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "campaign.target_spend.target_spend_micros": { + "type": ["null", "integer"] + }, + "campaign.targeting_setting.target_restrictions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "campaign.tracking_setting.tracking_url": { + "type": ["null", "string"] + }, + "campaign.tracking_url_template": { + "type": ["null", "string"] + }, + "campaign.url_custom_parameters": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "campaign.vanity_pharma.vanity_pharma_display_url_mode": { + "type": ["null", "string"] + }, + "campaign.vanity_pharma.vanity_pharma_text": { + "type": ["null", "string"] + }, + "campaign.video_brand_safety_suitability": { + "type": ["null", "string"] + }, + "metrics.clicks": { + "type": ["null", "integer"] + }, + "metrics.ctr": { + "type": ["null", "number"] + }, + "metrics.conversions": { + "type": ["null", "number"] + }, + "metrics.conversions_value": { + "type": ["null", "number"] + }, + "metrics.cost_micros": { + "type": ["null", "integer"] + }, + "metrics.impressions": { + "type": ["null", "integer"] + }, + "metrics.video_views": { + "type": ["null", "integer"] + }, + "metrics.video_quartile_p100_rate": { + "type": ["null", "number"] + }, + "metrics.active_view_cpm": { + "type": ["null", "number"] + }, + "metrics.active_view_ctr": { + "type": ["null", "number"] + }, + "metrics.active_view_impressions": { + "type": ["null", "integer"] + }, + "metrics.active_view_measurability": { + "type": ["null", "number"] + }, + "metrics.active_view_measurable_cost_micros": { + "type": ["null", "integer"] + }, + "metrics.active_view_measurable_impressions": { + "type": ["null", "integer"] + }, + "metrics.active_view_viewability": { + "type": ["null", "number"] + }, + "metrics.average_cost": { + "type": ["null", "number"] + }, + "metrics.average_cpc": { + "type": ["null", "number"] + }, + "metrics.average_cpm": { + "type": ["null", "number"] + }, + "metrics.interactions": { + "type": ["null", "integer"] + }, + "metrics.interaction_event_types": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "metrics.value_per_conversion": { + "type": ["null", "number"] + }, + "metrics.cost_per_conversion": { + "type": ["null", "number"] + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + }, + "segments.hour": { + "type": ["null", "integer"] + }, + "segments.ad_network_type": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_bidding_strategy.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_bidding_strategy.json new file mode 100644 index 0000000000000..7bd9a868d9d2a --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_bidding_strategy.json @@ -0,0 +1,100 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "customer.id": { + "type": ["null", "integer"] + }, + "campaign.id": { + "type": ["null", "integer"] + }, + "bidding_strategy.aligned_campaign_budget_id": { + "type": ["null", "integer"] + }, + "bidding_strategy.campaign_count": { + "type": ["null", "integer"] + }, + "bidding_strategy.currency_code": { + "type": ["null", "string"] + }, + "bidding_strategy.effective_currency_code": { + "type": ["null", "string"] + }, + "bidding_strategy.enhanced_cpc": { + "type": ["null", "string"] + }, + "bidding_strategy.id": { + "type": ["null", "integer"] + }, + "bidding_strategy.maximize_conversion_value.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.maximize_conversion_value.cpc_bid_floor_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.maximize_conversion_value.target_roas": { + "type": ["null", "number"] + }, + "bidding_strategy.maximize_conversions.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.maximize_conversions.cpc_bid_floor_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.maximize_conversions.target_cpa_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.name": { + "type": ["null", "string"] + }, + "bidding_strategy.non_removed_campaign_count": { + "type": ["null", "integer"] + }, + "bidding_strategy.resource_name": { + "type": ["null", "string"] + }, + "bidding_strategy.status": { + "type": ["null", "string"] + }, + "bidding_strategy.target_cpa.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_cpa.cpc_bid_floor_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_cpa.target_cpa_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_impression_share.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_impression_share.location": { + "type": ["null", "string"] + }, + "bidding_strategy.target_impression_share.location_fraction_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_roas.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_roas.cpc_bid_floor_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_roas.target_roas": { + "type": ["null", "number"] + }, + "bidding_strategy.target_spend.cpc_bid_ceiling_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.target_spend.target_spend_micros": { + "type": ["null", "integer"] + }, + "bidding_strategy.type": { + "type": ["null", "string"] + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_budget.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_budget.json new file mode 100644 index 0000000000000..86b246f863bfd --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_budget.json @@ -0,0 +1,163 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "customer.id": { + "type": ["null", "integer"] + }, + "campaign.id": { + "type": ["null", "integer"] + }, + "campaign_budget.aligned_bidding_strategy_id": { + "type": ["null", "integer"] + }, + "campaign_budget.amount_micros": { + "type": ["null", "integer"] + }, + "campaign_budget.delivery_method": { + "type": ["null", "string"] + }, + "campaign_budget.explicitly_shared": { + "type": ["null", "boolean"] + }, + "campaign_budget.has_recommended_budget": { + "type": ["null", "boolean"] + }, + "campaign_budget.id": { + "type": ["null", "integer"] + }, + "campaign_budget.name": { + "type": ["null", "string"] + }, + "campaign_budget.period": { + "type": ["null", "string"] + }, + "campaign_budget.recommended_budget_amount_micros": { + "type": ["null", "integer"] + }, + "campaign_budget.recommended_budget_estimated_change_weekly_clicks": { + "type": ["null", "integer"] + }, + "campaign_budget.recommended_budget_estimated_change_weekly_cost_micros": { + "type": ["null", "integer"] + }, + "campaign_budget.recommended_budget_estimated_change_weekly_interactions": { + "type": ["null", "integer"] + }, + "campaign_budget.recommended_budget_estimated_change_weekly_views": { + "type": ["null", "integer"] + }, + "campaign_budget.reference_count": { + "type": ["null", "integer"] + }, + "campaign_budget.resource_name": { + "type": ["null", "string"] + }, + "campaign_budget.status": { + "type": ["null", "string"] + }, + "campaign_budget.total_amount_micros": { + "type": ["null", "integer"] + }, + "campaign_budget.type": { + "type": ["null", "string"] + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + }, + "segments.budget_campaign_association_status.campaign": { + "type": ["null", "string"] + }, + "segments.budget_campaign_association_status.status": { + "type": ["null", "string"] + }, + "metrics.all_conversions": { + "type": ["null", "number"] + }, + "metrics.all_conversions_from_interactions_rate": { + "type": ["null", "number"] + }, + "metrics.all_conversions_value": { + "type": ["null", "number"] + }, + "metrics.average_cost": { + "type": ["null", "number"] + }, + "metrics.average_cpc": { + "type": ["null", "number"] + }, + "metrics.average_cpe": { + "type": ["null", "number"] + }, + "metrics.average_cpm": { + "type": ["null", "number"] + }, + "metrics.average_cpv": { + "type": ["null", "number"] + }, + "metrics.clicks": { + "type": ["null", "integer"] + }, + "metrics.conversions": { + "type": ["null", "number"] + }, + "metrics.conversions_from_interactions_rate": { + "type": ["null", "number"] + }, + "metrics.conversions_value": { + "type": ["null", "number"] + }, + "metrics.cost_micros": { + "type": ["null", "integer"] + }, + "metrics.cost_per_all_conversions": { + "type": ["null", "number"] + }, + "metrics.cost_per_conversion": { + "type": ["null", "number"] + }, + "metrics.cross_device_conversions": { + "type": ["null", "number"] + }, + "metrics.ctr": { + "type": ["null", "number"] + }, + "metrics.engagement_rate": { + "type": ["null", "number"] + }, + "metrics.engagements": { + "type": ["null", "integer"] + }, + "metrics.impressions": { + "type": ["null", "integer"] + }, + "metrics.interaction_event_types": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "metrics.interaction_rate": { + "type": ["null", "number"] + }, + "metrics.interactions": { + "type": ["null", "integer"] + }, + "metrics.value_per_all_conversions": { + "type": ["null", "number"] + }, + "metrics.value_per_conversion": { + "type": ["null", "number"] + }, + "metrics.video_view_rate": { + "type": ["null", "number"] + }, + "metrics.video_views": { + "type": ["null", "integer"] + }, + "metrics.view_through_conversions": { + "type": ["null", "integer"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_criterion.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_criterion.json new file mode 100644 index 0000000000000..dc5b2f8109a21 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_criterion.json @@ -0,0 +1,36 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "deleted_at": { + "type": ["null", "string"] + }, + "change_status.last_change_date_time": { + "type": ["null", "string"] + }, + "campaign.id": { + "type": ["null", "integer"] + }, + "campaign_criterion.resource_name": { + "type": ["null", "string"] + }, + "campaign_criterion.campaign": { + "type": ["null", "string"] + }, + "campaign_criterion.age_range.type": { + "type": ["null", "string"] + }, + "campaign_criterion.mobile_application.name": { + "type": ["null", "string"] + }, + "campaign_criterion.negative": { + "type": ["null", "boolean"] + }, + "campaign_criterion.youtube_channel.channel_id": { + "type": ["null", "string"] + }, + "campaign_criterion.youtube_video.video_id": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_label.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_label.json new file mode 100644 index 0000000000000..6f64ee157f6e9 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/campaign_label.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "campaign.id": { + "type": ["null", "integer"] + }, + "label.id": { + "type": ["null", "integer"] + }, + "campaign.resource_name": { + "type": ["null", "string"] + }, + "campaign_label.resource_name": { + "type": ["null", "string"] + }, + "label.name": { + "type": ["null", "string"] + }, + "label.resource_name": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/change_status.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/change_status.json new file mode 100644 index 0000000000000..55c9f2e901387 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/change_status.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "change_status.last_change_date_time": { + "type": ["null", "string"] + }, + "change_status.resource_type": { + "type": ["null", "string"] + }, + "change_status.resource_status": { + "type": ["null", "string"] + }, + "change_status.resource_name": { + "type": ["null", "string"] + }, + "change_status.ad_group_criterion": { + "type": ["null", "string"] + }, + "change_status.campaign_criterion": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/click_view.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/click_view.json index 4a8b6c3d682d0..6f1f783162062 100644 --- a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/click_view.json +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/click_view.json @@ -27,7 +27,8 @@ "type": ["null", "integer"] }, "segments.date": { - "type": ["null", "string"] + "type": ["null", "string"], + "format": "date" }, "customer.id": { "type": ["null", "integer"] diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/customer.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/customer.json new file mode 100644 index 0000000000000..4dadaae50e400 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/customer.json @@ -0,0 +1,73 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "customer.auto_tagging_enabled": { + "type": ["null", "boolean"] + }, + "customer.call_reporting_setting.call_conversion_action": { + "type": ["null", "string"] + }, + "customer.call_reporting_setting.call_conversion_reporting_enabled": { + "type": ["null", "boolean"] + }, + "customer.call_reporting_setting.call_reporting_enabled": { + "type": ["null", "boolean"] + }, + "customer.conversion_tracking_setting.conversion_tracking_id": { + "type": ["null", "integer"] + }, + "customer.conversion_tracking_setting.cross_account_conversion_tracking_id": { + "type": ["null", "integer"] + }, + "customer.currency_code": { + "type": ["null", "string"] + }, + "customer.descriptive_name": { + "type": ["null", "string"] + }, + "customer.final_url_suffix": { + "type": ["null", "string"] + }, + "customer.has_partners_badge": { + "type": ["null", "boolean"] + }, + "customer.id": { + "type": ["null", "integer"] + }, + "customer.manager": { + "type": ["null", "boolean"] + }, + "customer.optimization_score": { + "type": ["null", "number"] + }, + "customer.optimization_score_weight": { + "type": ["null", "number"] + }, + "customer.pay_per_conversion_eligibility_failure_reasons": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "customer.remarketing_setting.google_global_site_tag": { + "type": ["null", "string"] + }, + "customer.resource_name": { + "type": ["null", "string"] + }, + "customer.test_account": { + "type": ["null", "boolean"] + }, + "customer.time_zone": { + "type": ["null", "string"] + }, + "customer.tracking_url_template": { + "type": ["null", "string"] + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/customer_client.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/customer_client.json new file mode 100644 index 0000000000000..efb4bfd93f78c --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/customer_client.json @@ -0,0 +1,24 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "customer_client.client_customer": { + "type": ["null", "boolean"] + }, + "customer_client.level": { + "type": ["null", "string"] + }, + "customer_client.id": { + "type": ["null", "integer"] + }, + "customer_client.manager": { + "type": ["null", "boolean"] + }, + "customer_client.time_zone": { + "type": ["null", "number"] + }, + "customer_client.status": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/customer_label.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/customer_label.json new file mode 100644 index 0000000000000..294e82084a59a --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/customer_label.json @@ -0,0 +1,18 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "customer_label.resource_name": { + "type": ["null", "string"] + }, + "customer_label.customer": { + "type": ["null", "string"] + }, + "customer.id": { + "type": ["null", "integer"] + }, + "customer_label.label": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/display_keyword_view.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/display_keyword_view.json new file mode 100644 index 0000000000000..60b84b43e0511 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/display_keyword_view.json @@ -0,0 +1,262 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "customer.currency_code": { + "type": ["null", "string"] + }, + "customer.descriptive_name": { + "type": ["null", "string"] + }, + "customer.time_zone": { + "type": ["null", "string"] + }, + "metrics.active_view_cpm": { + "type": ["null", "number"] + }, + "metrics.active_view_ctr": { + "type": ["null", "number"] + }, + "metrics.active_view_impressions": { + "type": ["null", "integer"] + }, + "metrics.active_view_measurability": { + "type": ["null", "number"] + }, + "metrics.active_view_measurable_cost_micros": { + "type": ["null", "integer"] + }, + "metrics.active_view_measurable_impressions": { + "type": ["null", "integer"] + }, + "metrics.active_view_viewability": { + "type": ["null", "number"] + }, + "ad_group.id": { + "type": ["null", "integer"] + }, + "ad_group.name": { + "type": ["null", "string"] + }, + "ad_group.status": { + "type": ["null", "string"] + }, + "segments.ad_network_type": { + "type": ["null", "string"] + }, + "metrics.all_conversions_from_interactions_rate": { + "type": ["null", "number"] + }, + "metrics.all_conversions_value": { + "type": ["null", "number"] + }, + "metrics.all_conversions": { + "type": ["null", "number"] + }, + "metrics.average_cost": { + "type": ["null", "number"] + }, + "metrics.average_cpc": { + "type": ["null", "number"] + }, + "metrics.average_cpe": { + "type": ["null", "number"] + }, + "metrics.average_cpm": { + "type": ["null", "number"] + }, + "metrics.average_cpv": { + "type": ["null", "number"] + }, + "ad_group.base_ad_group": { + "type": ["null", "string"] + }, + "campaign.base_campaign": { + "type": ["null", "string"] + }, + "campaign.bidding_strategy": { + "type": ["null", "string"] + }, + "campaign.bidding_strategy_type": { + "type": ["null", "string"] + }, + "campaign.id": { + "type": ["null", "integer"] + }, + "campaign.name": { + "type": ["null", "string"] + }, + "campaign.status": { + "type": ["null", "string"] + }, + "metrics.clicks": { + "type": ["null", "integer"] + }, + "metrics.conversions_from_interactions_rate": { + "type": ["null", "number"] + }, + "metrics.conversions_value": { + "type": ["null", "number"] + }, + "metrics.conversions": { + "type": ["null", "number"] + }, + "metrics.cost_micros": { + "type": ["null", "integer"] + }, + "metrics.cost_per_all_conversions": { + "type": ["null", "number"] + }, + "metrics.cost_per_conversion": { + "type": ["null", "number"] + }, + "ad_group_criterion.effective_cpc_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.effective_cpc_bid_source": { + "type": ["null", "string"] + }, + "ad_group_criterion.effective_cpm_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.effective_cpm_bid_source": { + "type": ["null", "string"] + }, + "ad_group_criterion.effective_cpv_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.effective_cpv_bid_source": { + "type": ["null", "string"] + }, + "ad_group_criterion.keyword.text": { + "type": ["null", "string"] + }, + "metrics.cross_device_conversions": { + "type": ["null", "number"] + }, + "metrics.ctr": { + "type": ["null", "number"] + }, + "segments.day_of_week": { + "type": ["null", "string"] + }, + "segments.device": { + "type": ["null", "string"] + }, + "metrics.engagement_rate": { + "type": ["null", "number"] + }, + "metrics.engagements": { + "type": ["null", "integer"] + }, + "customer.id": { + "type": ["null", "integer"] + }, + "ad_group_criterion.final_mobile_urls": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "ad_group_criterion.final_urls": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "metrics.gmail_forwards": { + "type": ["null", "integer"] + }, + "metrics.gmail_saves": { + "type": ["null", "integer"] + }, + "metrics.gmail_secondary_clicks": { + "type": ["null", "integer"] + }, + "ad_group_criterion.criterion_id": { + "type": ["null", "integer"] + }, + "metrics.impressions": { + "type": ["null", "integer"] + }, + "metrics.interaction_rate": { + "type": ["null", "number"] + }, + "metrics.interaction_event_types": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "metrics.interactions": { + "type": ["null", "integer"] + }, + "ad_group_criterion.negative": { + "type": ["null", "boolean"] + }, + "ad_group.targeting_setting.target_restrictions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "segments.month": { + "type": ["null", "string"] + }, + "segments.quarter": { + "type": ["null", "string"] + }, + "ad_group_criterion.status": { + "type": ["null", "string"] + }, + "ad_group_criterion.tracking_url_template": { + "type": ["null", "string"] + }, + "ad_group_criterion.keyword.match_type": { + "type": ["null", "string"] + }, + "ad_group_criterion.url_custom_parameters": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "metrics.value_per_all_conversions": { + "type": ["null", "number"] + }, + "metrics.value_per_conversion": { + "type": ["null", "number"] + }, + "metrics.video_quartile_p100_rate": { + "type": ["null", "number"] + }, + "metrics.video_quartile_p25_rate": { + "type": ["null", "number"] + }, + "metrics.video_quartile_p50_rate": { + "type": ["null", "number"] + }, + "metrics.video_quartile_p75_rate": { + "type": ["null", "number"] + }, + "metrics.video_view_rate": { + "type": ["null", "number"] + }, + "metrics.video_views": { + "type": ["null", "integer"] + }, + "metrics.view_through_conversions": { + "type": ["null", "integer"] + }, + "segments.week": { + "type": ["null", "string"] + }, + "segments.year": { + "type": ["null", "integer"] + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/geographic_view.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/geographic_view.json new file mode 100644 index 0000000000000..2f67d121006f7 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/geographic_view.json @@ -0,0 +1,25 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "customer.id": { + "type": ["null", "integer"] + }, + "customer.descriptive_name": { + "type": ["null", "string"] + }, + "geographic_view.country_criterion_id": { + "type": ["null", "integer"] + }, + "geographic_view.location_type": { + "type": ["null", "string"] + }, + "ad_group.id": { + "type": ["null", "integer"] + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/keyword_view.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/keyword_view.json new file mode 100644 index 0000000000000..a4ade30ce77a5 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/keyword_view.json @@ -0,0 +1,88 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "customer.id": { + "type": ["null", "integer"] + }, + "customer.descriptive_name": { + "type": ["null", "string"] + }, + "campaign.id": { + "type": ["null", "integer"] + }, + "ad_group.id": { + "type": ["null", "integer"] + }, + "ad_group_criterion.type": { + "type": ["null", "string"] + }, + "ad_group_criterion.keyword.text": { + "type": ["null", "string"] + }, + "ad_group_criterion.negative": { + "type": ["null", "boolean"] + }, + "ad_group_criterion.keyword.match_type": { + "type": ["null", "string"] + }, + "metrics.historical_quality_score": { + "type": ["null", "integer"] + }, + "metrics.ctr": { + "type": ["null", "number"] + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + }, + "campaign.bidding_strategy_type": { + "type": ["null", "string"] + }, + "metrics.clicks": { + "type": ["null", "integer"] + }, + "metrics.cost_micros": { + "type": ["null", "integer"] + }, + "metrics.impressions": { + "type": ["null", "integer"] + }, + "metrics.active_view_impressions": { + "type": ["null", "integer"] + }, + "metrics.active_view_measurability": { + "type": ["null", "number"] + }, + "metrics.active_view_measurable_cost_micros": { + "type": ["null", "integer"] + }, + "metrics.active_view_measurable_impressions": { + "type": ["null", "integer"] + }, + "metrics.active_view_viewability": { + "type": ["null", "number"] + }, + "metrics.conversions": { + "type": ["null", "number"] + }, + "metrics.conversions_value": { + "type": ["null", "number"] + }, + "metrics.interactions": { + "type": ["null", "integer"] + }, + "metrics.interaction_event_types": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "metrics.view_through_conversions": { + "type": ["null", "integer"] + }, + "ad_group_criterion.criterion_id": { + "type": ["null", "integer"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/label.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/label.json new file mode 100644 index 0000000000000..79043478d1f71 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/label.json @@ -0,0 +1,27 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "customer.id": { + "type": ["null", "integer"] + }, + "label.id": { + "type": ["null", "integer"] + }, + "label.name": { + "type": ["null", "string"] + }, + "label.resource_name": { + "type": ["null", "string"] + }, + "label.status": { + "type": ["null", "string"] + }, + "label.text_label.background_color": { + "type": ["null", "string"] + }, + "label.text_label.description": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/shopping_performance_view.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/shopping_performance_view.json new file mode 100644 index 0000000000000..f679be52592c1 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/shopping_performance_view.json @@ -0,0 +1,184 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "customer.descriptive_name": { + "type": ["null", "string"] + }, + "ad_group.id": { + "type": ["null", "integer"] + }, + "ad_group.name": { + "type": ["null", "string"] + }, + "ad_group.status": { + "type": ["null", "string"] + }, + "segments.ad_network_type": { + "type": ["null", "string"] + }, + "segments.product_aggregator_id": { + "type": ["null", "integer"] + }, + "metrics.all_conversions_from_interactions_rate": { + "type": ["null", "number"] + }, + "metrics.all_conversions_value": { + "type": ["null", "number"] + }, + "metrics.all_conversions": { + "type": ["null", "number"] + }, + "metrics.average_cpc": { + "type": ["null", "number"] + }, + "segments.product_brand": { + "type": ["null", "string"] + }, + "campaign.id": { + "type": ["null", "integer"] + }, + "campaign.name": { + "type": ["null", "string"] + }, + "campaign.status": { + "type": ["null", "string"] + }, + "segments.product_category_level1": { + "type": ["null", "string"] + }, + "segments.product_category_level2": { + "type": ["null", "string"] + }, + "segments.product_category_level3": { + "type": ["null", "string"] + }, + "segments.product_category_level4": { + "type": ["null", "string"] + }, + "segments.product_category_level5": { + "type": ["null", "string"] + }, + "segments.product_channel": { + "type": ["null", "string"] + }, + "segments.product_channel_exclusivity": { + "type": ["null", "string"] + }, + "segments.click_type": { + "type": ["null", "string"] + }, + "metrics.clicks": { + "type": ["null", "integer"] + }, + "metrics.conversions_from_interactions_rate": { + "type": ["null", "number"] + }, + "metrics.conversions_value": { + "type": ["null", "number"] + }, + "metrics.conversions": { + "type": ["null", "number"] + }, + "metrics.cost_micros": { + "type": ["null", "integer"] + }, + "metrics.cost_per_all_conversions": { + "type": ["null", "number"] + }, + "metrics.cost_per_conversion": { + "type": ["null", "number"] + }, + "segments.product_country": { + "type": ["null", "string"] + }, + "metrics.cross_device_conversions": { + "type": ["null", "number"] + }, + "metrics.ctr": { + "type": ["null", "number"] + }, + "segments.product_custom_attribute0": { + "type": ["null", "string"] + }, + "segments.product_custom_attribute1": { + "type": ["null", "string"] + }, + "segments.product_custom_attribute2": { + "type": ["null", "string"] + }, + "segments.product_custom_attribute3": { + "type": ["null", "string"] + }, + "segments.product_custom_attribute4": { + "type": ["null", "string"] + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + }, + "segments.day_of_week": { + "type": ["null", "string"] + }, + "segments.device": { + "type": ["null", "string"] + }, + "customer.id": { + "type": ["null", "integer"] + }, + "metrics.impressions": { + "type": ["null", "integer"] + }, + "segments.product_language": { + "type": ["null", "string"] + }, + "segments.product_merchant_id": { + "type": ["null", "integer"] + }, + "segments.month": { + "type": ["null", "string"] + }, + "segments.product_item_id": { + "type": ["null", "string"] + }, + "segments.product_condition": { + "type": ["null", "string"] + }, + "segments.product_title": { + "type": ["null", "string"] + }, + "segments.product_type_l1": { + "type": ["null", "string"] + }, + "segments.product_type_l2": { + "type": ["null", "string"] + }, + "segments.product_type_l3": { + "type": ["null", "string"] + }, + "segments.product_type_l4": { + "type": ["null", "string"] + }, + "segments.product_type_l5": { + "type": ["null", "string"] + }, + "segments.quarter": { + "type": ["null", "string"] + }, + "segments.product_store_id": { + "type": ["null", "string"] + }, + "metrics.value_per_all_conversions": { + "type": ["null", "number"] + }, + "metrics.value_per_conversion": { + "type": ["null", "number"] + }, + "segments.week": { + "type": ["null", "string"] + }, + "segments.year": { + "type": ["null", "integer"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/topic_view.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/topic_view.json new file mode 100644 index 0000000000000..9defd19f56007 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/topic_view.json @@ -0,0 +1,265 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "topic_view.resource_name": { + "type": ["null", "string"] + }, + "customer.currency_code": { + "type": ["null", "string"] + }, + "customer.descriptive_name": { + "type": ["null", "string"] + }, + "customer.time_zone": { + "type": ["null", "string"] + }, + "metrics.active_view_cpm": { + "type": ["null", "number"] + }, + "metrics.active_view_ctr": { + "type": ["null", "number"] + }, + "metrics.active_view_impressions": { + "type": ["null", "integer"] + }, + "metrics.active_view_measurability": { + "type": ["null", "number"] + }, + "metrics.active_view_measurable_cost_micros": { + "type": ["null", "integer"] + }, + "metrics.active_view_measurable_impressions": { + "type": ["null", "integer"] + }, + "metrics.active_view_viewability": { + "type": ["null", "number"] + }, + "ad_group.id": { + "type": ["null", "integer"] + }, + "ad_group.name": { + "type": ["null", "string"] + }, + "ad_group.status": { + "type": ["null", "string"] + }, + "segments.ad_network_type": { + "type": ["null", "string"] + }, + "metrics.all_conversions_from_interactions_rate": { + "type": ["null", "number"] + }, + "metrics.all_conversions_value": { + "type": ["null", "number"] + }, + "metrics.all_conversions": { + "type": ["null", "number"] + }, + "metrics.average_cost": { + "type": ["null", "number"] + }, + "metrics.average_cpc": { + "type": ["null", "number"] + }, + "metrics.average_cpe": { + "type": ["null", "number"] + }, + "metrics.average_cpm": { + "type": ["null", "number"] + }, + "metrics.average_cpv": { + "type": ["null", "number"] + }, + "ad_group.base_ad_group": { + "type": ["null", "string"] + }, + "campaign.base_campaign": { + "type": ["null", "string"] + }, + "ad_group_criterion.bid_modifier": { + "type": ["null", "number"] + }, + "campaign.bidding_strategy": { + "type": ["null", "string"] + }, + "campaign.bidding_strategy_type": { + "type": ["null", "string"] + }, + "campaign.id": { + "type": ["null", "integer"] + }, + "campaign.name": { + "type": ["null", "string"] + }, + "campaign.status": { + "type": ["null", "string"] + }, + "metrics.clicks": { + "type": ["null", "integer"] + }, + "metrics.conversions_from_interactions_rate": { + "type": ["null", "number"] + }, + "metrics.conversions_value": { + "type": ["null", "number"] + }, + "metrics.conversions": { + "type": ["null", "number"] + }, + "metrics.cost_micros": { + "type": ["null", "integer"] + }, + "metrics.cost_per_all_conversions": { + "type": ["null", "number"] + }, + "metrics.cost_per_conversion": { + "type": ["null", "number"] + }, + "ad_group_criterion.effective_cpc_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.effective_cpc_bid_source": { + "type": ["null", "string"] + }, + "ad_group_criterion.effective_cpm_bid_micros": { + "type": ["null", "integer"] + }, + "ad_group_criterion.effective_cpm_bid_source": { + "type": ["null", "string"] + }, + "ad_group_criterion.topic.path": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "metrics.cross_device_conversions": { + "type": ["null", "number"] + }, + "metrics.ctr": { + "type": ["null", "number"] + }, + "segments.date": { + "type": ["null", "string"], + "format": "date" + }, + "segments.day_of_week": { + "type": ["null", "string"] + }, + "segments.device": { + "type": ["null", "string"] + }, + "metrics.engagement_rate": { + "type": ["null", "number"] + }, + "metrics.engagements": { + "type": ["null", "integer"] + }, + "customer.id": { + "type": ["null", "integer"] + }, + "ad_group_criterion.final_mobile_urls": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "ad_group_criterion.final_urls": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "metrics.gmail_forwards": { + "type": ["null", "integer"] + }, + "metrics.gmail_saves": { + "type": ["null", "integer"] + }, + "metrics.gmail_secondary_clicks": { + "type": ["null", "integer"] + }, + "ad_group_criterion.criterion_id": { + "type": ["null", "integer"] + }, + "metrics.impressions": { + "type": ["null", "integer"] + }, + "metrics.interaction_rate": { + "type": ["null", "number"] + }, + "metrics.interaction_event_types": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "metrics.interactions": { + "type": ["null", "integer"] + }, + "ad_group_criterion.negative": { + "type": ["null", "boolean"] + }, + "ad_group.targeting_setting.target_restrictions": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "segments.month": { + "type": ["null", "string"] + }, + "segments.quarter": { + "type": ["null", "string"] + }, + "ad_group_criterion.status": { + "type": ["null", "string"] + }, + "ad_group_criterion.tracking_url_template": { + "type": ["null", "string"] + }, + "ad_group_criterion.url_custom_parameters": { + "type": ["null", "array"], + "items": { + "type": "string" + } + }, + "metrics.value_per_all_conversions": { + "type": ["null", "number"] + }, + "metrics.value_per_conversion": { + "type": ["null", "number"] + }, + "ad_group_criterion.topic.topic_constant": { + "type": ["null", "string"] + }, + "metrics.video_quartile_p100_rate": { + "type": ["null", "number"] + }, + "metrics.video_quartile_p25_rate": { + "type": ["null", "number"] + }, + "metrics.video_quartile_p50_rate": { + "type": ["null", "number"] + }, + "metrics.video_quartile_p75_rate": { + "type": ["null", "number"] + }, + "metrics.video_view_rate": { + "type": ["null", "number"] + }, + "metrics.video_views": { + "type": ["null", "integer"] + }, + "metrics.view_through_conversions": { + "type": ["null", "integer"] + }, + "segments.week": { + "type": ["null", "string"] + }, + "segments.year": { + "type": ["null", "integer"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/user_interest.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/user_interest.json new file mode 100644 index 0000000000000..1de930af34e46 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/user_interest.json @@ -0,0 +1,30 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "user_interest.availabilities": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "user_interest.launched_to_all": { + "type": ["null", "boolean"] + }, + "user_interest.name": { + "type": ["null", "string"] + }, + "user_interest.resource_name": { + "type": ["null", "string"] + }, + "user_interest.taxonomy_type": { + "type": ["null", "string"] + }, + "user_interest.user_interest_id": { + "type": ["null", "integer"] + }, + "user_interest.user_interest_parent": { + "type": ["null", "string"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/user_location_view.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/user_location_view.json new file mode 100644 index 0000000000000..d78f0d8f2e7b9 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/schemas/user_location_view.json @@ -0,0 +1,148 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "segments.date": { + "type": ["null", "string"], + "format": "date" + }, + "segments.day_of_week": { + "type": ["null", "string"] + }, + "segments.month": { + "type": ["null", "string"] + }, + "segments.week": { + "type": ["null", "string"] + }, + "segments.quarter": { + "type": ["null", "string"] + }, + "segments.year": { + "type": ["null", "integer"] + }, + "segments.ad_network_type": { + "type": ["null", "string"] + }, + "customer.currency_code": { + "type": ["null", "string"] + }, + "customer.id": { + "type": ["null", "integer"] + }, + "customer.descriptive_name": { + "type": ["null", "string"] + }, + "customer.time_zone": { + "type": ["null", "string"] + }, + "user_location_view.country_criterion_id": { + "type": ["null", "integer"] + }, + "user_location_view.targeting_location": { + "type": ["null", "boolean"] + }, + "user_location_view.resource_name": { + "type": ["null", "string"] + }, + "campaign.base_campaign": { + "type": ["null", "string"] + }, + "campaign.id": { + "type": ["null", "integer"] + }, + "campaign.name": { + "type": ["null", "string"] + }, + "campaign.status": { + "type": ["null", "string"] + }, + "ad_group.name": { + "type": ["null", "string"] + }, + "ad_group.status": { + "type": ["null", "string"] + }, + "ad_group.base_ad_group": { + "type": ["null", "string"] + }, + "metrics.all_conversions": { + "type": ["null", "number"] + }, + "metrics.all_conversions_from_interactions_rate": { + "type": ["null", "number"] + }, + "metrics.all_conversions_value": { + "type": ["null", "number"] + }, + "metrics.average_cost": { + "type": ["null", "number"] + }, + "metrics.average_cpc": { + "type": ["null", "number"] + }, + "metrics.average_cpm": { + "type": ["null", "number"] + }, + "metrics.average_cpv": { + "type": ["null", "number"] + }, + "metrics.clicks": { + "type": ["null", "integer"] + }, + "metrics.conversions": { + "type": ["null", "number"] + }, + "metrics.conversions_from_interactions_rate": { + "type": ["null", "number"] + }, + "metrics.conversions_value": { + "type": ["null", "number"] + }, + "metrics.cost_micros": { + "type": ["null", "integer"] + }, + "metrics.cost_per_all_conversions": { + "type": ["null", "number"] + }, + "metrics.cost_per_conversion": { + "type": ["null", "number"] + }, + "metrics.cross_device_conversions": { + "type": ["null", "number"] + }, + "metrics.ctr": { + "type": ["null", "number"] + }, + "metrics.impressions": { + "type": ["null", "integer"] + }, + "metrics.interaction_event_types": { + "type": ["null", "array"], + "items": { + "type": ["null", "string"] + } + }, + "metrics.interaction_rate": { + "type": ["null", "number"] + }, + "metrics.interactions": { + "type": ["null", "integer"] + }, + "metrics.value_per_all_conversions": { + "type": ["null", "number"] + }, + "metrics.value_per_conversion": { + "type": ["null", "number"] + }, + "metrics.video_view_rate": { + "type": ["null", "number"] + }, + "metrics.video_views": { + "type": ["null", "integer"] + }, + "metrics.view_through_conversions": { + "type": ["null", "integer"] + } + } +} diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/source.py b/airbyte-integrations/connectors/source-google-ads/source_google_ads/source.py index 990f5a0e0876f..2402cd18adbed 100644 --- a/airbyte-integrations/connectors/source-google-ads/source_google_ads/source.py +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/source.py @@ -4,82 +4,143 @@ import logging -import traceback from typing import Any, Iterable, List, Mapping, MutableMapping, Tuple -from airbyte_cdk.models import SyncMode +from airbyte_cdk.models import FailureType, SyncMode from airbyte_cdk.sources import AbstractSource from airbyte_cdk.sources.streams import Stream -from google.ads.googleads.errors import GoogleAdsException +from airbyte_cdk.utils import AirbyteTracedException from pendulum import parse, today from .custom_query_stream import CustomQuery, IncrementalCustomQuery from .google_ads import GoogleAds -from .models import Customer +from .models import CustomerModel from .streams import ( AccountPerformanceReport, - Accounts, - AdGroupAdLabels, - AdGroupAdReport, - AdGroupAds, - AdGroupLabels, - AdGroups, - CampaignLabels, - Campaigns, + AdGroup, + AdGroupAd, + AdGroupAdLabel, + AdGroupAdLegacy, + AdGroupBiddingStrategy, + AdGroupCriterion, + AdGroupCriterionLabel, + AdGroupLabel, + AdListingGroupCriterion, + Audience, + Campaign, + CampaignBiddingStrategy, + CampaignBudget, + CampaignCriterion, + CampaignLabel, ClickView, - DisplayKeywordPerformanceReport, - DisplayTopicsPerformanceReport, - GeographicReport, - KeywordReport, + Customer, + CustomerClient, + CustomerLabel, + DisplayKeywordView, + GeographicView, + KeywordView, + Label, ServiceAccounts, - ShoppingPerformanceReport, - UserLocationReport, + ShoppingPerformanceView, + TopicView, + UserInterest, + UserLocationView, ) from .utils import GAQL -FULL_REFRESH_CUSTOM_TABLE = ["geo_target_constant", "custom_audience"] +logger = logging.getLogger("airbyte") class SourceGoogleAds(AbstractSource): + # Skip exceptions on missing streams + raise_exception_on_missing_stream = False + @staticmethod def _validate_and_transform(config: Mapping[str, Any]): if config.get("end_date") == "": config.pop("end_date") - for query in config.get("custom_queries", []): - query["query"] = GAQL.parse(query["query"]) + for query in config.get("custom_queries_array", []): + try: + query["query"] = GAQL.parse(query["query"]) + except ValueError: + message = ( + f"The custom GAQL query {query['table_name']} failed. Validate your GAQL query with the Google Ads query validator. " + "https://developers.google.com/google-ads/api/fields/v15/query_validator" + ) + raise AirbyteTracedException(message=message, failure_type=FailureType.config_error) + + if "customer_id" in config: + config["customer_ids"] = config["customer_id"].split(",") + config.pop("customer_id") + return config @staticmethod def get_credentials(config: Mapping[str, Any]) -> MutableMapping[str, Any]: credentials = config["credentials"] - # use_proto_plus is set to True, because setting to False returned wrong value types, which breakes the backward compatibility. + # use_proto_plus is set to True, because setting to False returned wrong value types, which breaks the backward compatibility. # For more info read the related PR's description: https://github.com/airbytehq/airbyte/pull/9996 credentials.update(use_proto_plus=True) - - # https://developers.google.com/google-ads/api/docs/concepts/call-structure#cid - if "login_customer_id" in config and config["login_customer_id"].strip(): - credentials["login_customer_id"] = config["login_customer_id"] return credentials @staticmethod - def get_incremental_stream_config(google_api: GoogleAds, config: Mapping[str, Any], customers: List[Customer]): + def get_incremental_stream_config(google_api: GoogleAds, config: Mapping[str, Any], customers: List[CustomerModel]): + # date range is mandatory parameter for incremental streams, so default start day is used + start_date = config.get("start_date", today().subtract(years=2).to_date_string()) + end_date = config.get("end_date") - if end_date: - end_date = min(today(), parse(end_date)).to_date_string() + # check if end_date is not in the future, set to today if it is + end_date = min(today(), parse(end_date)) if end_date else today() + end_date = end_date.to_date_string() + incremental_stream_config = dict( api=google_api, customers=customers, - conversion_window_days=config["conversion_window_days"], - start_date=config["start_date"], + conversion_window_days=config.get("conversion_window_days", 0), + start_date=start_date, end_date=end_date, ) return incremental_stream_config - def get_account_info(self, google_api: GoogleAds, config: Mapping[str, Any]) -> Iterable[Iterable[Mapping[str, Any]]]: - dummy_customers = [Customer(id=_id) for _id in config["customer_id"].split(",")] - accounts_stream = ServiceAccounts(google_api, customers=dummy_customers) - for slice_ in accounts_stream.stream_slices(): - yield accounts_stream.read_records(sync_mode=SyncMode.full_refresh, stream_slice=slice_) + def get_all_accounts(self, google_api: GoogleAds, customers: List[CustomerModel], customer_status_filter: List[str]) -> List[str]: + customer_clients_stream = CustomerClient(api=google_api, customers=customers, customer_status_filter=customer_status_filter) + for slice in customer_clients_stream.stream_slices(): + for record in customer_clients_stream.read_records(sync_mode=SyncMode.full_refresh, stream_slice=slice): + yield record + + def _get_all_connected_accounts( + self, google_api: GoogleAds, customer_status_filter: List[str] + ) -> Iterable[Iterable[Mapping[str, Any]]]: + customer_ids = [customer_id for customer_id in google_api.get_accessible_accounts()] + dummy_customers = [CustomerModel(id=_id, login_customer_id=_id) for _id in customer_ids] + + yield from self.get_all_accounts(google_api, dummy_customers, customer_status_filter) + + def get_customers(self, google_api: GoogleAds, config: Mapping[str, Any]) -> List[CustomerModel]: + customer_status_filter = config.get("customer_status_filter", []) + accounts = self._get_all_connected_accounts(google_api, customer_status_filter) + customers = CustomerModel.from_accounts(accounts) + + # filter duplicates as one customer can be accessible from mutiple connected accounts + unique_customers = [] + seen_ids = set() + for customer in customers: + if customer.id in seen_ids: + continue + seen_ids.add(customer.id) + unique_customers.append(customer) + customers = unique_customers + customers_dict = {customer.id: customer for customer in customers} + + # filter only selected accounts + if config.get("customer_ids"): + customers = [] + for customer_id in config["customer_ids"]: + if customer_id not in customers_dict: + logging.warning(f"Customer with id {customer_id} is not accessible. Skipping it.") + else: + customers.append(customers_dict[customer_id]) + return customers @staticmethod def is_metrics_in_custom_query(query: GAQL) -> bool: @@ -88,81 +149,120 @@ def is_metrics_in_custom_query(query: GAQL) -> bool: return True return False + @staticmethod + def is_custom_query_incremental(query: GAQL) -> bool: + time_segment_in_select, time_segment_in_where = ["segments.date" in clause for clause in [query.fields, query.where]] + return time_segment_in_select and not time_segment_in_where + + def create_custom_query_stream( + self, + google_api: GoogleAds, + single_query_config: Mapping[str, Any], + customers: List[CustomerModel], + non_manager_accounts: List[CustomerModel], + incremental_config: Mapping[str, Any], + non_manager_incremental_config: Mapping[str, Any], + ): + query = single_query_config["query"] + is_incremental = self.is_custom_query_incremental(query) + is_non_manager = self.is_metrics_in_custom_query(query) + + if is_non_manager: + # Skip query with metrics if there are no non-manager accounts + if not non_manager_accounts: + return + + customers = non_manager_accounts + incremental_config = non_manager_incremental_config + + if is_incremental: + return IncrementalCustomQuery(config=single_query_config, **incremental_config) + else: + return CustomQuery(config=single_query_config, api=google_api, customers=customers) + def check_connection(self, logger: logging.Logger, config: Mapping[str, Any]) -> Tuple[bool, any]: config = self._validate_and_transform(config) - try: - logger.info("Checking the config") - google_api = GoogleAds(credentials=self.get_credentials(config)) - - accounts = self.get_account_info(google_api, config) - customers = Customer.from_accounts(accounts) - # Check custom query request validity by sending metric request with non-existant time window - for customer in customers: - for query in config.get("custom_queries", []): - query = query["query"] - if customer.is_manager_account and self.is_metrics_in_custom_query(query): - logger.warning( - f"Metrics are not available for manager account {customer.id}. " - f"Please remove metrics fields in your custom query: {query}." - ) - if query.resource_name not in FULL_REFRESH_CUSTOM_TABLE: - if IncrementalCustomQuery.cursor_field in query.fields: - return False, f"Custom query should not contain {IncrementalCustomQuery.cursor_field}" - query = IncrementalCustomQuery.insert_segments_date_expr(query, "1980-01-01", "1980-01-01") - query = query.set_limit(1) - response = google_api.send_request(str(query), customer_id=customer.id) - # iterate over the response otherwise exceptions will not be raised! - for _ in response: - pass - return True, None - except GoogleAdsException as exception: - error_messages = ", ".join([error.message for error in exception.failure.errors]) - logger.error(traceback.format_exc()) - return False, f"Unable to connect to Google Ads API with the provided configuration - {error_messages}" + + logger.info("Checking the config") + google_api = GoogleAds(credentials=self.get_credentials(config)) + + customers = self.get_customers(google_api, config) + logger.info(f"Found {len(customers)} customers: {[customer.id for customer in customers]}") + + # Check custom query request validity by sending metric request with non-existent time window + for customer in customers: + for query in config.get("custom_queries_array", []): + query = query["query"] + if customer.is_manager_account and self.is_metrics_in_custom_query(query): + logger.warning( + f"Metrics are not available for manager account {customer.id}. " + f'Skipping the custom query: "{query}" for manager account.' + ) + continue + + # Add segments.date to where clause of incremental custom queries if they are not present. + # The same will be done during read, but with start and end date from config + if self.is_custom_query_incremental(query): + query = IncrementalCustomQuery.insert_segments_date_expr(query, "1980-01-01", "1980-01-01") + + query = query.set_limit(1) + response = google_api.send_request(str(query), customer_id=customer.id, login_customer_id=customer.login_customer_id) + # iterate over the response otherwise exceptions will not be raised! + for _ in response: + pass + return True, None def streams(self, config: Mapping[str, Any]) -> List[Stream]: config = self._validate_and_transform(config) google_api = GoogleAds(credentials=self.get_credentials(config)) - accounts = self.get_account_info(google_api, config) - customers = Customer.from_accounts(accounts) + + customers = self.get_customers(google_api, config) + logger.info(f"Found {len(customers)} customers: {[customer.id for customer in customers]}") + non_manager_accounts = [customer for customer in customers if not customer.is_manager_account] + default_config = dict(api=google_api, customers=customers) incremental_config = self.get_incremental_stream_config(google_api, config, customers) non_manager_incremental_config = self.get_incremental_stream_config(google_api, config, non_manager_accounts) streams = [ - AdGroupAds(**incremental_config), - AdGroupAdLabels(google_api, customers=customers), - AdGroups(**incremental_config), - AdGroupLabels(google_api, customers=customers), - Accounts(**incremental_config), - CampaignLabels(google_api, customers=customers), + AdGroup(**incremental_config), + AdGroupAd(**incremental_config), + AdGroupAdLabel(**default_config), + AdGroupBiddingStrategy(**incremental_config), + AdGroupCriterion(**default_config), + AdGroupCriterionLabel(**default_config), + AdGroupLabel(**default_config), + AdListingGroupCriterion(**default_config), + Audience(**default_config), + CampaignBiddingStrategy(**incremental_config), + CampaignCriterion(**default_config), + CampaignLabel(google_api, customers=customers), ClickView(**incremental_config), + Customer(**incremental_config), + CustomerLabel(**default_config), + Label(**default_config), + UserInterest(**default_config), ] # Metrics streams cannot be requested for a manager account. if non_manager_accounts: streams.extend( [ - Campaigns(**non_manager_incremental_config), - UserLocationReport(**non_manager_incremental_config), + Campaign(**non_manager_incremental_config), + CampaignBudget(**non_manager_incremental_config), + UserLocationView(**non_manager_incremental_config), AccountPerformanceReport(**non_manager_incremental_config), - DisplayTopicsPerformanceReport(**non_manager_incremental_config), - DisplayKeywordPerformanceReport(**non_manager_incremental_config), - ShoppingPerformanceReport(**non_manager_incremental_config), - AdGroupAdReport(**non_manager_incremental_config), - GeographicReport(**non_manager_incremental_config), - KeywordReport(**non_manager_incremental_config), + TopicView(**non_manager_incremental_config), + DisplayKeywordView(**non_manager_incremental_config), + ShoppingPerformanceView(**non_manager_incremental_config), + AdGroupAdLegacy(**non_manager_incremental_config), + GeographicView(**non_manager_incremental_config), + KeywordView(**non_manager_incremental_config), ] ) - for single_query_config in config.get("custom_queries", []): - query = single_query_config["query"] - if self.is_metrics_in_custom_query(query): - if non_manager_accounts: - if query.resource_name in FULL_REFRESH_CUSTOM_TABLE: - streams.append(CustomQuery(config=single_query_config, api=google_api, customers=non_manager_accounts)) - else: - streams.append(IncrementalCustomQuery(config=single_query_config, **non_manager_incremental_config)) - continue - if query.resource_name in FULL_REFRESH_CUSTOM_TABLE: - streams.append(CustomQuery(config=single_query_config, api=google_api, customers=customers)) - else: - streams.append(IncrementalCustomQuery(config=single_query_config, **incremental_config)) + + for single_query_config in config.get("custom_queries_array", []): + query_stream = self.create_custom_query_stream( + google_api, single_query_config, customers, non_manager_accounts, incremental_config, non_manager_incremental_config + ) + if query_stream: + streams.append(query_stream) return streams diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/spec.json b/airbyte-integrations/connectors/source-google-ads/source_google_ads/spec.json index 19db526fa268f..2b84f6bc1beb3 100644 --- a/airbyte-integrations/connectors/source-google-ads/source_google_ads/spec.json +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/spec.json @@ -4,7 +4,7 @@ "$schema": "http://json-schema.org/draft-07/schema#", "title": "Google Ads Spec", "type": "object", - "required": ["credentials", "start_date", "customer_id"], + "required": ["credentials"], "additionalProperties": true, "properties": { "credentials": { @@ -23,34 +23,34 @@ "type": "string", "title": "Developer Token", "order": 0, - "description": "Developer token granted by Google to use their APIs. More instruction on how to find this value in our docs", + "description": "The Developer Token granted by Google to use their APIs. For detailed instructions on finding this value, refer to our documentation.", "airbyte_secret": true }, "client_id": { "type": "string", "title": "Client ID", "order": 1, - "description": "The Client ID of your Google Ads developer application. More instruction on how to find this value in our docs" + "description": "The Client ID of your Google Ads developer application. For detailed instructions on finding this value, refer to our documentation." }, "client_secret": { "type": "string", "title": "Client Secret", "order": 2, - "description": "The Client Secret of your Google Ads developer application. More instruction on how to find this value in our docs", + "description": "The Client Secret of your Google Ads developer application. For detailed instructions on finding this value, refer to our documentation.", "airbyte_secret": true }, "refresh_token": { "type": "string", "title": "Refresh Token", "order": 3, - "description": "The token for obtaining a new access token. More instruction on how to find this value in our docs", + "description": "The token used to obtain a new Access Token. For detailed instructions on finding this value, refer to our documentation.", "airbyte_secret": true }, "access_token": { "type": "string", "title": "Access Token", "order": 4, - "description": "Access Token for making authenticated requests. More instruction on how to find this value in our docs", + "description": "The Access Token for making authenticated requests. For detailed instructions on finding this value, refer to our documentation.", "airbyte_secret": true } } @@ -58,42 +58,58 @@ "customer_id": { "title": "Customer ID(s)", "type": "string", - "description": "Comma separated list of (client) customer IDs. Each customer ID must be specified as a 10-digit number without dashes. More instruction on how to find this value in our docs. Metrics streams like AdGroupAdReport cannot be requested for a manager account.", + "description": "Comma-separated list of (client) customer IDs. Each customer ID must be specified as a 10-digit number without dashes. For detailed instructions on finding this value, refer to our documentation.", "pattern": "^[0-9]{10}(,[0-9]{10})*$", + "pattern_descriptor": "The customer ID must be 10 digits. Separate multiple customer IDs using commas.", "examples": ["6783948572,5839201945"], "order": 1 }, + "customer_status_filter": { + "title": "Customer Statuses Filter", + "description": "A list of customer statuses to filter on. For detailed info about what each status mean refer to Google Ads documentation.", + "default": [], + "order": 2, + "type": "array", + "items": { + "title": "CustomerStatus", + "description": "An enumeration.", + "enum": ["UNKNOWN", "ENABLED", "CANCELED", "SUSPENDED", "CLOSED"] + } + }, "start_date": { "type": "string", "title": "Start Date", - "description": "UTC date and time in the format 2017-01-25. Any data before this date will not be replicated.", + "description": "UTC date in the format YYYY-MM-DD. Any data before this date will not be replicated. (Default value of two years ago is used if not set)", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$", + "pattern_descriptor": "YYYY-MM-DD", "examples": ["2017-01-25"], - "order": 2, + "order": 3, "format": "date" }, "end_date": { "type": "string", "title": "End Date", - "description": "UTC date and time in the format 2017-01-25. Any data after this date will not be replicated.", + "description": "UTC date in the format YYYY-MM-DD. Any data after this date will not be replicated. (Default value of today is used if not set)", "pattern": "^$|^[0-9]{4}-[0-9]{2}-[0-9]{2}$", + "pattern_descriptor": "YYYY-MM-DD", "examples": ["2017-01-30"], - "order": 6, + "order": 4, "format": "date" }, - "custom_queries": { + "custom_queries_array": { "type": "array", "title": "Custom GAQL Queries", "description": "", - "order": 3, + "order": 5, "items": { "type": "object", "required": ["query", "table_name"], "properties": { "query": { "type": "string", + "multiline": true, "title": "Custom Query", - "description": "A custom defined GAQL query for building the report. Should not contain segments.date expression because it is used by incremental streams. See Google's query builder for more information.", + "description": "A custom defined GAQL query for building the report. Avoid including the segments.date field; wherever possible, Airbyte will automatically include it for incremental syncs. For more information, refer to Google's documentation.", "examples": [ "SELECT segments.ad_destination_type, campaign.advertising_channel_sub_type FROM campaign WHERE campaign.status = 'PAUSED'" ] @@ -101,41 +117,67 @@ "table_name": { "type": "string", "title": "Destination Table Name", - "description": "The table name in your destination database for choosen query." + "description": "The table name in your destination database for the chosen query." } } } }, - "login_customer_id": { - "type": "string", - "title": "Login Customer ID for Managed Accounts", - "description": "If your access to the customer account is through a manager account, this field is required and must be set to the customer ID of the manager account (10-digit number without dashes). More information about this field you can see here", - "pattern": "^([0-9]{10})?$", - "examples": ["7349206847"], - "order": 4 - }, "conversion_window_days": { "title": "Conversion Window", "type": "integer", - "description": "A conversion window is the period of time after an ad interaction (such as an ad click or video view) during which a conversion, such as a purchase, is recorded in Google Ads. For more information, see Google's documentation.", + "description": "A conversion window is the number of days after an ad interaction (such as an ad click or video view) during which a conversion, such as a purchase, is recorded in Google Ads. For more information, see Google's documentation.", "minimum": 0, "maximum": 1095, "default": 14, "examples": [14], - "order": 5 + "order": 6 } } }, - "authSpecification": { - "auth_type": "oauth2.0", - "oauth2Specification": { - "rootObject": ["credentials"], - "oauthFlowInitParameters": [ - ["client_id"], - ["client_secret"], - ["developer_token"] - ], - "oauthFlowOutputParameters": [["access_token"], ["refresh_token"]] + "advanced_auth": { + "auth_flow_type": "oauth2.0", + "oauth_config_specification": { + "complete_oauth_output_specification": { + "type": "object", + "properties": { + "access_token": { + "type": "string", + "path_in_connector_config": ["credentials", "access_token"] + }, + "refresh_token": { + "type": "string", + "path_in_connector_config": ["credentials", "refresh_token"] + } + } + }, + "complete_oauth_server_input_specification": { + "type": "object", + "properties": { + "client_id": { + "type": "string" + }, + "client_secret": { + "type": "string" + } + } + }, + "complete_oauth_server_output_specification": { + "type": "object", + "properties": { + "client_id": { + "type": "string", + "path_in_connector_config": ["credentials", "client_id"] + }, + "client_secret": { + "type": "string", + "path_in_connector_config": ["credentials", "client_secret"] + }, + "developer_token": { + "type": "string", + "path_in_connector_config": ["credentials", "developer_token"] + } + } + } } } } diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/streams.py b/airbyte-integrations/connectors/source-google-ads/source_google_ads/streams.py index 039073971cd47..499bceca367e8 100644 --- a/airbyte-integrations/connectors/source-google-ads/source_google_ads/streams.py +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/streams.py @@ -2,157 +2,104 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # -import logging -from abc import ABC -from typing import Any, Iterable, List, Mapping, MutableMapping, Optional, Tuple +from abc import ABC, abstractmethod +from typing import Any, Iterable, Iterator, List, Mapping, MutableMapping, Optional + +import backoff import pendulum from airbyte_cdk.models import SyncMode from airbyte_cdk.sources.streams import IncrementalMixin, Stream from airbyte_cdk.sources.utils.transform import TransformConfig, TypeTransformer +from airbyte_cdk.utils import AirbyteTracedException +from airbyte_protocol.models import FailureType from google.ads.googleads.errors import GoogleAdsException -from google.ads.googleads.v11.errors.types.authorization_error import AuthorizationErrorEnum -from google.ads.googleads.v11.errors.types.request_error import RequestErrorEnum -from google.ads.googleads.v11.services.services.google_ads_service.pagers import SearchPager - -from .google_ads import GoogleAds -from .models import Customer - - -class cyclic_sieve: - def __init__(self, logger: logging.Logger, fraction: int = 10): - self._logger = logger - self._cycle_counter = 0 - self._fraction = fraction - - def __getattr__(self, item): - if self._cycle_counter % self._fraction == 0: - return getattr(self._logger, item) - return self.stub - - def stub(self, *args, **kwargs): - pass - - def bump(self): - self._cycle_counter += 1 - - -def parse_dates(stream_slice): - start_date = pendulum.parse(stream_slice["start_date"]) - end_date = pendulum.parse(stream_slice["end_date"]) - return start_date, end_date - - -def get_date_params(start_date: str, time_zone=None, range_days: int = None, end_date: pendulum.datetime = None) -> Tuple[str, str]: - """ - Returns `start_date` and `end_date` for the given stream_slice. - If (end_date - start_date) is a big date range (>= 1 month), it can take more than 2 hours to process all the records from the given slice. - After 2 hours next page tokens will be expired, finally resulting in page token expired error - Currently this method returns `start_date` and `end_date` with 15 days difference. - """ - - end_date = end_date or pendulum.yesterday(tz=time_zone) - start_date = pendulum.parse(start_date) - if start_date > pendulum.now(): - return start_date.to_date_string(), start_date.add(days=1).to_date_string() - end_date = min(end_date, start_date.add(days=range_days)) +from google.ads.googleads.v15.services.services.google_ads_service.pagers import SearchPager +from google.ads.googleads.v15.services.types.google_ads_service import SearchGoogleAdsResponse +from google.api_core.exceptions import InternalServerError, ServerError, ServiceUnavailable, TooManyRequests, Unauthenticated - # Fix issue #4806, start date should always be lower than end date. - if start_date.add(days=1).date() >= end_date.date(): - return start_date.add(days=1).to_date_string(), start_date.add(days=2).to_date_string() - return start_date.add(days=1).to_date_string(), end_date.to_date_string() - - -def chunk_date_range( - start_date: str, - conversion_window: int, - field: str, - end_date: str = None, - days_of_data_storage: int = None, - range_days: int = None, - time_zone=None, -) -> Iterable[Optional[MutableMapping[str, any]]]: - """ - Passing optional parameter end_date for testing - Returns a list of the beginning and ending timestamps of each `range_days` between the start date and now. - The return value is a list of dicts {'date': str} which can be used directly with the Slack API - """ - intervals = [] - end_date = pendulum.parse(end_date) if end_date else pendulum.now() - start_date = pendulum.parse(start_date) - - # For some metrics we can only get data not older than N days, it is Google Ads policy - if days_of_data_storage: - start_date = max(start_date, pendulum.now().subtract(days=days_of_data_storage - conversion_window)) - - # As in to return some state when state in abnormal - if start_date > end_date: - return [None] - - # applying conversion window - start_date = start_date.subtract(days=conversion_window) - - while start_date < end_date: - start, end = get_date_params(start_date.to_date_string(), time_zone=time_zone, range_days=range_days, end_date=end_date) - intervals.append( - { - "start_date": start, - "end_date": end, - } - ) - start_date = start_date.add(days=range_days) - return intervals +from .google_ads import GoogleAds, logger +from .models import CustomerModel +from .utils import ExpiredPageTokenError, chunk_date_range, detached, generator_backoff, get_resource_name, parse_dates, traced_exception class GoogleAdsStream(Stream, ABC): - CATCH_API_ERRORS = True + CATCH_CUSTOMER_NOT_ENABLED_ERROR = True - def __init__(self, api: GoogleAds, customers: List[Customer]): + def __init__(self, api: GoogleAds, customers: List[CustomerModel]): self.google_ads_client = api self.customers = customers - self.base_sieve_logger = cyclic_sieve(self.logger, 10) def get_query(self, stream_slice: Mapping[str, Any]) -> str: - query = GoogleAds.convert_schema_into_query(schema=self.get_json_schema(), report_name=self.name) + fields = GoogleAds.get_fields_from_schema(self.get_json_schema()) + table_name = get_resource_name(self.name) + query = GoogleAds.convert_schema_into_query(fields=fields, table_name=table_name) return query - def parse_response(self, response: SearchPager) -> Iterable[Mapping]: + def parse_response(self, response: SearchPager, stream_slice: Optional[Mapping[str, Any]] = None) -> Iterable[Mapping]: for result in response: yield self.google_ads_client.parse_single_result(self.get_json_schema(), result) def stream_slices(self, stream_state: Mapping[str, Any] = None, **kwargs) -> Iterable[Optional[Mapping[str, any]]]: for customer in self.customers: - yield {"customer_id": customer.id} + yield {"customer_id": customer.id, "login_customer_id": customer.login_customer_id} + + @generator_backoff( + wait_gen=backoff.constant, + exception=(TimeoutError), + max_tries=5, + on_backoff=lambda details: logger.info( + f"Caught retryable error {details['exception']} after {details['tries']} tries. Waiting {details['wait']} seconds then retrying..." + ), + interval=1, + ) + @detached(timeout_minutes=5) + def request_records_job(self, customer_id, login_customer_id, query, stream_slice): + response_records = self.google_ads_client.send_request(query=query, customer_id=customer_id, login_customer_id=login_customer_id) + yield from self.parse_records_with_backoff(response_records, stream_slice) def read_records(self, sync_mode, stream_slice: Optional[Mapping[str, Any]] = None, **kwargs) -> Iterable[Mapping[str, Any]]: - self.base_sieve_logger.bump() - self.base_sieve_logger.info(f"Read records using g-ads client. Stream slice is {stream_slice}") if stream_slice is None: return [] customer_id = stream_slice["customer_id"] - response_records = self.google_ads_client.send_request(self.get_query(stream_slice), customer_id=customer_id) + login_customer_id = stream_slice["login_customer_id"] + try: - for response in response_records: - yield from self.parse_response(response) - except GoogleAdsException as exc: - if not self.CATCH_API_ERRORS: - raise - for error in exc.failure.errors: - if error.error_code.authorization_error == AuthorizationErrorEnum.AuthorizationError.CUSTOMER_NOT_ENABLED: - self.base_sieve_logger.error(error.message) - continue - # log and ignore only CUSTOMER_NOT_ENABLED error, otherwise - raise further - raise + yield from self.request_records_job(customer_id, login_customer_id, self.get_query(stream_slice), stream_slice) + except (GoogleAdsException, Unauthenticated) as exception: + traced_exception(exception, customer_id, self.CATCH_CUSTOMER_NOT_ENABLED_ERROR) + except TimeoutError as exception: + # Prevent sync failure + logger.warning(f"Timeout: Failed to access {self.name} stream data. {str(exception)}") + + @generator_backoff( + wait_gen=backoff.expo, + exception=(InternalServerError, ServerError, ServiceUnavailable, TooManyRequests), + max_tries=5, + max_time=600, + on_backoff=lambda details: logger.info( + f"Caught retryable error {details['exception']} after {details['tries']} tries. Waiting {details['wait']} seconds then retrying..." + ), + factor=5, + ) + def parse_records_with_backoff( + self, response_records: Iterator[SearchGoogleAdsResponse], stream_slice: Optional[Mapping[str, Any]] = None + ) -> Iterable[Mapping[str, Any]]: + for response in response_records: + yield from self.parse_response(response, stream_slice) class IncrementalGoogleAdsStream(GoogleAdsStream, IncrementalMixin, ABC): + primary_key = None days_of_data_storage = None cursor_field = "segments.date" - primary_key = None - # Date range is set to 15 days, because for conversion_window_days default value is 14. - # Range less than 15 days will break the integration tests. - range_days = 15 + cursor_time_format = "YYYY-MM-DD" + # Slice duration is set to 14 days, because for conversion_window_days default value is 14. + # Range less than 14 days will break the integration tests. + slice_duration = pendulum.duration(days=14) + # slice step is difference from one slice end_date and next slice start_date + slice_step = pendulum.duration(days=1) def __init__(self, start_date: str, conversion_window_days: int, end_date: str = None, **kwargs): self.conversion_window_days = conversion_window_days @@ -160,7 +107,11 @@ def __init__(self, start_date: str, conversion_window_days: int, end_date: str = self._end_date = end_date self._state = {} super().__init__(**kwargs) - self.incremental_sieve_logger = cyclic_sieve(self.logger, 10) + + @property + def state_checkpoint_interval(self) -> int: + # default page size is 10000, so set to 10% of it + return 1000 @property def state(self) -> MutableMapping[str, Any]: @@ -170,13 +121,12 @@ def state(self) -> MutableMapping[str, Any]: def state(self, value: MutableMapping[str, Any]): self._state.update(value) - def current_state(self, customer_id, default=None): + def get_current_state(self, customer_id, default=None): default = default or self.state.get(self.cursor_field) return self.state.get(customer_id, {}).get(self.cursor_field) or default def stream_slices(self, stream_state: Mapping[str, Any] = None, **kwargs) -> Iterable[Optional[MutableMapping[str, any]]]: for customer in self.customers: - logger = cyclic_sieve(self.logger, 10) stream_state = stream_state or {} if stream_state.get(customer.id): start_date = stream_state[customer.id].get(self.cursor_field) or self._start_date @@ -188,23 +138,50 @@ def stream_slices(self, stream_state: Mapping[str, Any] = None, **kwargs) -> Ite start_date = self._start_date end_date = self._end_date - logger.info(f"Generating slices for customer {customer.id}. Start date is {start_date}, end date is {end_date}") for chunk in chunk_date_range( start_date=start_date, end_date=end_date, conversion_window=self.conversion_window_days, - field=self.cursor_field, days_of_data_storage=self.days_of_data_storage, - range_days=self.range_days, time_zone=customer.time_zone, + time_format=self.cursor_time_format, + slice_duration=self.slice_duration, + slice_step=self.slice_step, ): if chunk: chunk["customer_id"] = customer.id - logger.info(f"Next slice is {chunk}") - logger.bump() + chunk["login_customer_id"] = customer.login_customer_id yield chunk + def _update_state(self, customer_id: str, record: MutableMapping[str, Any]): + """Update the state based on the latest record's cursor value.""" + current_state = self.get_current_state(customer_id) + if current_state: + date_in_current_stream = pendulum.parse(current_state) + date_in_latest_record = pendulum.parse(record[self.cursor_field]) + cursor_value = (max(date_in_current_stream, date_in_latest_record)).format(self.cursor_time_format) + self.state = {customer_id: {self.cursor_field: cursor_value}} + else: + self.state = {customer_id: {self.cursor_field: record[self.cursor_field]}} + + def _handle_expired_page_exception(self, exception: ExpiredPageTokenError, stream_slice: MutableMapping[str, Any], customer_id: str): + """ + Handle Google Ads EXPIRED_PAGE_TOKEN error by updating the stream slice. + """ + start_date, end_date = parse_dates(stream_slice) + current_state = self.get_current_state(customer_id) + + if end_date - start_date <= self.slice_step: + # If range days less than slice_step, no need in retry, because it's the minimum date range + raise exception + elif current_state == stream_slice["start_date"]: + # It couldn't read all the records within one day, it will enter an infinite loop, + # so raise the error + raise exception + # Retry reading records from where it crushed + stream_slice["start_date"] = self.get_current_state(customer_id, default=stream_slice["start_date"]) + def read_records( self, sync_mode: SyncMode, cursor_field: List[str] = None, stream_slice: MutableMapping[str, Any] = None, **kwargs ) -> Iterable[Mapping[str, Any]]: @@ -212,194 +189,654 @@ def read_records( This method is overridden to handle GoogleAdsException with EXPIRED_PAGE_TOKEN error code, and update `start_date` key in the `stream_slice` with the latest read record's cursor value, then retry the sync. """ - self.incremental_sieve_logger.bump() while True: - self.incremental_sieve_logger.info("Starting a while loop iteration") customer_id = stream_slice and stream_slice["customer_id"] + try: + # count records to update slice date range with latest record time when limit is hit records = super().read_records(sync_mode, stream_slice=stream_slice) for record in records: - current_state = self.current_state(customer_id) - if current_state: - date_in_current_stream = pendulum.parse(current_state) - date_in_latest_record = pendulum.parse(record[self.cursor_field]) - cursor_value = (max(date_in_current_stream, date_in_latest_record)).to_date_string() - self.state = {customer_id: {self.cursor_field: cursor_value}} - self.incremental_sieve_logger.info(f"Updated state for customer {customer_id}. Full state is {self.state}.") - yield record - continue - self.state = {customer_id: {self.cursor_field: record[self.cursor_field]}} - self.incremental_sieve_logger.info(f"Initialized state for customer {customer_id}. Full state is {self.state}.") + self._update_state(customer_id, record) yield record - continue - except GoogleAdsException as exception: - self.incremental_sieve_logger.info(f"Caught a GoogleAdsException: {str(exception)}") - error = next(iter(exception.failure.errors)) - if error.error_code.request_error == RequestErrorEnum.RequestError.EXPIRED_PAGE_TOKEN: - start_date, end_date = parse_dates(stream_slice) - current_state = self.current_state(customer_id) - self.incremental_sieve_logger.info( - f"Start date is {start_date}. End date is {end_date}. Current state is {current_state}" - ) - if (end_date - start_date).days == 1: - # If range days is 1, no need in retry, because it's the minimum date range - self.incremental_sieve_logger.error("Page token has expired.") - raise exception - elif current_state == stream_slice["start_date"]: - # It couldn't read all the records within one day, it will enter an infinite loop, - # so raise the error - self.incremental_sieve_logger.error("Page token has expired.") - raise exception - # Retry reading records from where it crushed - stream_slice["start_date"] = self.current_state(customer_id, default=stream_slice["start_date"]) - self.incremental_sieve_logger.info(f"Retry reading records from where it crushed with a modified slice: {stream_slice}") - else: - # raise caught error for other error statuses - raise exception + except ExpiredPageTokenError as exception: + # handle expired page error that was caught in parent class by updating stream_slice + self._handle_expired_page_exception(exception, stream_slice, customer_id) else: - # return the control if no exception is raised - self.incremental_sieve_logger.info("Current slice has been read. Exiting read_records()") return def get_query(self, stream_slice: Mapping[str, Any] = None) -> str: + fields = GoogleAds.get_fields_from_schema(self.get_json_schema()) + table_name = get_resource_name(self.name) + + start_date, end_date = stream_slice.get("start_date"), stream_slice.get("end_date") + cursor_condition = [f"{self.cursor_field} >= '{start_date}' AND {self.cursor_field} <= '{end_date}'"] + query = GoogleAds.convert_schema_into_query( - schema=self.get_json_schema(), - report_name=self.name, - from_date=stream_slice.get("start_date"), - to_date=stream_slice.get("end_date"), - cursor_field=self.cursor_field, + fields=fields, table_name=table_name, conditions=cursor_condition, order_field=self.cursor_field ) return query -class Accounts(IncrementalGoogleAdsStream): +class Customer(IncrementalGoogleAdsStream): """ - Accounts stream: https://developers.google.com/google-ads/api/fields/v11/customer + Customer stream: https://developers.google.com/google-ads/api/fields/v15/customer """ primary_key = ["customer.id", "segments.date"] + def parse_response(self, response: SearchPager, stream_slice: Optional[Mapping[str, Any]] = None) -> Iterable[Mapping]: + for record in super().parse_response(response): + if isinstance(record.get("customer.optimization_score_weight"), int): + record["customer.optimization_score_weight"] = float(record["customer.optimization_score_weight"]) + yield record + + +class CustomerClient(GoogleAdsStream): + """ + Customer Client stream: https://developers.google.com/google-ads/api/fields/v15/customer_client + """ + + primary_key = ["customer_client.id"] + + def __init__(self, customer_status_filter: List[str], **kwargs): + self.customer_status_filter = customer_status_filter + super().__init__(**kwargs) + + def get_query(self, stream_slice: Mapping[str, Any] = None) -> str: + fields = GoogleAds.get_fields_from_schema(self.get_json_schema()) + table_name = get_resource_name(self.name) + + active_customers_condition = [] + if self.customer_status_filter: + customer_status_filter = ", ".join([f"'{status}'" for status in self.customer_status_filter]) + active_customers_condition = [f"customer_client.status in ({customer_status_filter})"] + + query = GoogleAds.convert_schema_into_query(fields=fields, table_name=table_name, conditions=active_customers_condition) + return query + + def read_records(self, sync_mode, stream_slice: Optional[Mapping[str, Any]] = None, **kwargs) -> Iterable[Mapping[str, Any]]: + """ + This method is overridden to avoid using login_customer_id from dummy_customers. + + login_customer_id is used in the stream_slices to pass it to child customers, + but we don't need it here as this class iterate over customers accessible from user creds. + """ + if stream_slice is None: + return [] + + customer_id = stream_slice["customer_id"] + + try: + response_records = self.google_ads_client.send_request(self.get_query(stream_slice), customer_id=customer_id) + + yield from self.parse_records_with_backoff(response_records, stream_slice) + except GoogleAdsException as exception: + traced_exception(exception, customer_id, self.CATCH_CUSTOMER_NOT_ENABLED_ERROR) + + def parse_response(self, response: SearchPager, stream_slice: Optional[Mapping[str, Any]] = None) -> Iterable[Mapping]: + """ + login_cusotmer_id is populated to child customers if they are under managers account + """ + records = [record for record in super().parse_response(response)] + + # read_records get all customers connected to customer_id from stream_slice + # if the result is more than one customer, it's a manager, otherwise it is client account for which we don't need login_customer_id + root_is_manager = len(records) > 1 + for record in records: + record["login_customer_id"] = stream_slice["login_customer_id"] if root_is_manager else "default" + yield record + + +class CustomerLabel(GoogleAdsStream): + """ + Customer Label stream: https://developers.google.com/google-ads/api/fields/v15/customer_label + """ + + primary_key = ["customer_label.resource_name"] + class ServiceAccounts(GoogleAdsStream): """ This stream is intended to be used as a service class, not exposed to a user """ - CATCH_API_ERRORS = False + CATCH_CUSTOMER_NOT_ENABLED_ERROR = False primary_key = ["customer.id"] -class Campaigns(IncrementalGoogleAdsStream): +class Campaign(IncrementalGoogleAdsStream): + """ + Campaign stream: https://developers.google.com/google-ads/api/fields/v15/campaign + """ + + transformer = TypeTransformer(TransformConfig.DefaultSchemaNormalization) + primary_key = ["campaign.id", "segments.date", "segments.hour", "segments.ad_network_type"] + + +class CampaignBudget(IncrementalGoogleAdsStream): """ - Campaigns stream: https://developers.google.com/google-ads/api/fields/v11/campaign + Campaigns stream: https://developers.google.com/google-ads/api/fields/v15/campaign_budget """ transformer = TypeTransformer(TransformConfig.DefaultSchemaNormalization) - primary_key = ["campaign.id", "segments.date", "segments.hour"] + primary_key = [ + "customer.id", + "campaign_budget.id", + "segments.date", + "segments.budget_campaign_association_status.campaign", + "segments.budget_campaign_association_status.status", + ] -class CampaignLabels(GoogleAdsStream): +class CampaignBiddingStrategy(IncrementalGoogleAdsStream): """ - Campaign labels stream: https://developers.google.com/google-ads/api/fields/v11/campaign_label + Campaign Bidding Strategy stream: https://developers.google.com/google-ads/api/fields/v15/campaign + """ + + transformer = TypeTransformer(TransformConfig.DefaultSchemaNormalization) + primary_key = ["campaign.id", "bidding_strategy.id", "segments.date"] + + +class CampaignLabel(GoogleAdsStream): + """ + Campaign labels stream: https://developers.google.com/google-ads/api/fields/v15/campaign_label """ # Note that this is a string type. Google doesn't return a more convenient identifier. - primary_key = ["campaign_label.resource_name"] + primary_key = ["campaign.id", "label.id"] -class AdGroups(IncrementalGoogleAdsStream): +class AdGroup(IncrementalGoogleAdsStream): """ - AdGroups stream: https://developers.google.com/google-ads/api/fields/v11/ad_group + AdGroup stream: https://developers.google.com/google-ads/api/fields/v15/ad_group """ primary_key = ["ad_group.id", "segments.date"] + def get_query(self, stream_slice: Mapping[str, Any] = None) -> str: + fields = GoogleAds.get_fields_from_schema(self.get_json_schema()) + # validation that the customer is not a manager + # due to unsupported metrics.cost_micros field and removing it in case custom is a manager + if [customer for customer in self.customers if customer.id == stream_slice["customer_id"]][0].is_manager_account: + fields = [field for field in fields if field != "metrics.cost_micros"] + table_name = get_resource_name(self.name) + start_date, end_date = stream_slice.get("start_date"), stream_slice.get("end_date") + cursor_condition = [f"{self.cursor_field} >= '{start_date}' AND {self.cursor_field} <= '{end_date}'"] + + query = GoogleAds.convert_schema_into_query( + fields=fields, table_name=table_name, conditions=cursor_condition, order_field=self.cursor_field + ) + return query -class AdGroupLabels(GoogleAdsStream): + +class AdGroupLabel(GoogleAdsStream): """ - Ad Group Labels stream: https://developers.google.com/google-ads/api/fields/v11/ad_group_label + Ad Group Labels stream: https://developers.google.com/google-ads/api/fields/v15/ad_group_label """ # Note that this is a string type. Google doesn't return a more convenient identifier. - primary_key = ["ad_group_label.resource_name"] + primary_key = ["ad_group.id", "label.id"] -class AdGroupAds(IncrementalGoogleAdsStream): +class AdGroupBiddingStrategy(IncrementalGoogleAdsStream): """ - AdGroups stream: https://developers.google.com/google-ads/api/fields/v11/ad_group_ad + Ad Group Bidding Strategies stream: https://developers.google.com/google-ads/api/fields/v15/ad_group """ - primary_key = ["ad_group_ad.ad.id", "segments.date"] + transformer = TypeTransformer(TransformConfig.DefaultSchemaNormalization) + primary_key = ["ad_group.id", "bidding_strategy.id", "segments.date"] -class AdGroupAdLabels(GoogleAdsStream): +class AdGroupCriterionLabel(GoogleAdsStream): """ - Ad Group Ad Labels stream: https://developers.google.com/google-ads/api/fields/v11/ad_group_ad_label + Ad Group Criterion Label stream: https://developers.google.com/google-ads/api/fields/v15/ad_group_criterion_label """ - # Note that this is a string type. Google doesn't return a more convenient identifier. - primary_key = ["ad_group_ad_label.resource_name"] + transformer = TypeTransformer(TransformConfig.DefaultSchemaNormalization) + primary_key = ["ad_group_criterion_label.resource_name"] + + +class AdGroupAd(IncrementalGoogleAdsStream): + """ + Ad Group Ad stream: https://developers.google.com/google-ads/api/fields/v15/ad_group_ad + """ + + primary_key = ["ad_group.id", "ad_group_ad.ad.id", "segments.date"] + + +class AdGroupAdLabel(GoogleAdsStream): + """ + Ad Group Ad Labels stream: https://developers.google.com/google-ads/api/fields/v15/ad_group_ad_label + """ + + primary_key = ["ad_group.id", "ad_group_ad.ad.id", "label.id"] class AccountPerformanceReport(IncrementalGoogleAdsStream): """ - AccountPerformanceReport stream: https://developers.google.com/google-ads/api/fields/v11/customer + AccountPerformanceReport stream: https://developers.google.com/google-ads/api/fields/v15/customer Google Ads API field mapping: https://developers.google.com/google-ads/api/docs/migration/mapping#account_performance """ + primary_key = ["customer.id", "segments.date", "segments.ad_network_type", "segments.device"] -class AdGroupAdReport(IncrementalGoogleAdsStream): + +class AdGroupAdLegacy(IncrementalGoogleAdsStream): """ - AdGroupAdReport stream: https://developers.google.com/google-ads/api/fields/v11/ad_group_ad + AdGroupAdReport stream: https://developers.google.com/google-ads/api/fields/v15/ad_group_ad Google Ads API field mapping: https://developers.google.com/google-ads/api/docs/migration/mapping#ad_performance """ + primary_key = ["ad_group.id", "ad_group_ad.ad.id", "segments.date", "segments.ad_network_type"] + -class DisplayKeywordPerformanceReport(IncrementalGoogleAdsStream): +class DisplayKeywordView(IncrementalGoogleAdsStream): """ - DisplayKeywordPerformanceReport stream: https://developers.google.com/google-ads/api/fields/v11/display_keyword_view + DisplayKeywordView stream: https://developers.google.com/google-ads/api/fields/v15/display_keyword_view Google Ads API field mapping: https://developers.google.com/google-ads/api/docs/migration/mapping#display_keyword_performance """ + primary_key = [ + "ad_group.id", + "ad_group_criterion.criterion_id", + "segments.date", + "segments.ad_network_type", + "segments.device", + ] + -class DisplayTopicsPerformanceReport(IncrementalGoogleAdsStream): +class TopicView(IncrementalGoogleAdsStream): """ - DisplayTopicsPerformanceReport stream: https://developers.google.com/google-ads/api/fields/v11/topic_view + DisplayTopicsPerformanceReport stream: https://developers.google.com/google-ads/api/fields/v15/topic_view Google Ads API field mapping: https://developers.google.com/google-ads/api/docs/migration/mapping#display_topics_performance """ + primary_key = [ + "ad_group.id", + "ad_group_criterion.criterion_id", + "segments.date", + "segments.ad_network_type", + "segments.device", + ] -class ShoppingPerformanceReport(IncrementalGoogleAdsStream): + +class ShoppingPerformanceView(IncrementalGoogleAdsStream): """ - ShoppingPerformanceReport stream: https://developers.google.com/google-ads/api/fields/v11/shopping_performance_view + ShoppingPerformanceView stream: https://developers.google.com/google-ads/api/fields/v15/shopping_performance_view Google Ads API field mapping: https://developers.google.com/google-ads/api/docs/migration/mapping#shopping_performance """ -class UserLocationReport(IncrementalGoogleAdsStream): +class UserLocationView(IncrementalGoogleAdsStream): """ - UserLocationReport stream: https://developers.google.com/google-ads/api/fields/v11/user_location_view + UserLocationView stream: https://developers.google.com/google-ads/api/fields/v15/user_location_view Google Ads API field mapping: https://developers.google.com/google-ads/api/docs/migration/mapping#geo_performance """ + primary_key = [ + "customer.id", + "user_location_view.country_criterion_id", + "user_location_view.targeting_location", + "segments.date", + "segments.ad_network_type", + ] + -class GeographicReport(IncrementalGoogleAdsStream): +class GeographicView(IncrementalGoogleAdsStream): """ - UserLocationReport stream: https://developers.google.com/google-ads/api/fields/v11/geographic_view + UserLocationReport stream: https://developers.google.com/google-ads/api/fields/v15/geographic_view """ + primary_key = ["customer.id", "geographic_view.country_criterion_id", "geographic_view.location_type", "segments.date"] -class KeywordReport(IncrementalGoogleAdsStream): + +class KeywordView(IncrementalGoogleAdsStream): """ - UserLocationReport stream: https://developers.google.com/google-ads/api/fields/v11/keyword_view + UserLocationReport stream: https://developers.google.com/google-ads/api/fields/v15/keyword_view """ + primary_key = ["ad_group.id", "ad_group_criterion.criterion_id", "segments.date"] + class ClickView(IncrementalGoogleAdsStream): """ - ClickView stream: https://developers.google.com/google-ads/api/reference/rpc/v11/ClickView + ClickView stream: https://developers.google.com/google-ads/api/reference/rpc/v15/ClickView """ primary_key = ["click_view.gclid", "segments.date", "segments.ad_network_type"] days_of_data_storage = 90 - range_days = 1 + # where clause for cursor is inclusive from both sides, duration 0 will result in - '"2022-01-01" <= cursor AND "2022-01-01" >= cursor' + # Queries including ClickView must have a filter limiting the results to one day + slice_duration = pendulum.duration(days=0) + + +class UserInterest(GoogleAdsStream): + """ + Ad Group Ad Labels stream: https://developers.google.com/google-ads/api/fields/v15/ad_group_ad_label + """ + + primary_key = ["user_interest.user_interest_id"] + + +class Audience(GoogleAdsStream): + """ + Ad Group Ad Labels stream: https://developers.google.com/google-ads/api/fields/v15/ad_group_ad_label + """ + + primary_key = ["customer.id", "audience.id"] + + +class Label(GoogleAdsStream): + """ + Label stream: https://developers.google.com/google-ads/api/fields/v15/label + """ + + primary_key = ["label.id"] + + +class ChangeStatus(IncrementalGoogleAdsStream): + """ + Change status stream: https://developers.google.com/google-ads/api/fields/v15/change_status + Stream is only used internally to implement incremental updates for child streams of IncrementalEventsStream + """ + + cursor_field = "change_status.last_change_date_time" + slice_step = pendulum.duration(microseconds=1) + days_of_data_storage = 90 + cursor_time_format = "YYYY-MM-DD HH:mm:ss.SSSSSS" + + def __init__(self, **kwargs): + # date range is not used for these streams, only state is used to sync recent records, otherwise full refresh + for key in ["start_date", "conversion_window_days", "end_date"]: + kwargs.pop(key, None) + super().__init__(start_date=None, conversion_window_days=0, end_date=None, **kwargs) + + @property + def query_limit(self) -> Optional[int]: + """Queries for ChangeStatus resource have to include limit in it""" + return 10000 + + def read_records( + self, sync_mode: SyncMode, cursor_field: List[str] = None, stream_slice: MutableMapping[str, Any] = None, **kwargs + ) -> Iterable[Mapping[str, Any]]: + """ + This method is overridden to handle GoogleAdsException with EXPIRED_PAGE_TOKEN error code, + and update `start_date` key in the `stream_slice` with the latest read record's cursor value, then retry the sync. + """ + while True: + records_count = 0 + customer_id = stream_slice and stream_slice["customer_id"] + + try: + # count records to update slice date range with latest record time when limit is hit + records = super().read_records(sync_mode, stream_slice=stream_slice) + for records_count, record in enumerate(records, start=1): + self._update_state(customer_id, record) + yield record + except ExpiredPageTokenError as exception: + # handle expired page error that was caught in parent class by updating stream_slice + self._handle_expired_page_exception(exception, stream_slice, customer_id) + else: + # if records limit is hit - update slice with new start_date to continue reading + if self.query_limit and records_count == self.query_limit: + # if state was not updated before hitting limit - raise error to avoid infinite loop + if stream_slice["start_date"] == self.get_current_state(customer_id): + raise AirbyteTracedException( + message=f"More than limit {self.query_limit} records with same cursor field. Incremental sync is not possible for this stream.", + failure_type=FailureType.system_error, + ) + + current_state = self.get_current_state(customer_id, default=stream_slice["start_date"]) + stream_slice["start_date"] = current_state + else: + return + + def get_query(self, stream_slice: Mapping[str, Any] = None) -> str: + fields = GoogleAds.get_fields_from_schema(self.get_json_schema()) + table_name = get_resource_name(self.name) + + start_date, end_date = stream_slice.get("start_date"), stream_slice.get("end_date") + conditions = [f"{self.cursor_field} >= '{start_date}' AND {self.cursor_field} <= '{end_date}'"] + + resource_type = stream_slice.get("resource_type") + conditions.append(f"change_status.resource_type = '{resource_type}'") + + query = GoogleAds.convert_schema_into_query( + fields=fields, table_name=table_name, conditions=conditions, order_field=self.cursor_field, limit=self.query_limit + ) + return query + + +class IncrementalEventsStream(GoogleAdsStream, IncrementalMixin, ABC): + """ + Abstract class used for getting incremental updates based on events returned from ChangeStatus stream. + Only Ad Group Criterion and Campaign Criterion streams are fetched using this class, for other resources + like Campaigns, Ad Groups, Ad Group Ads, and Campaign Budget we already fetch incremental updates based on date. + Also, these resources, unlike criterions, can't be deleted, only marked as "Removed". + """ + + def __init__(self, **kwargs): + self.parent_stream = ChangeStatus(api=kwargs.get("api"), customers=kwargs.get("customers")) + self.parent_stream_name: str = self.parent_stream.name + self.parent_cursor_field: str = self.parent_stream.cursor_field + + super().__init__(**kwargs) + + self._state = {self.parent_stream_name: {customer.id: None for customer in self.customers}} + + @property + @abstractmethod + def id_field(self) -> str: + """Name of field used for getting records by id""" + pass + + @property + @abstractmethod + def parent_id_field(self) -> str: + """Field name of id from parent record""" + pass + + @property + @abstractmethod + def resource_type(self) -> str: + """Resource type used for filtering parent records""" + pass + + @property + def state(self) -> MutableMapping[str, Any]: + return self._state + + @state.setter + def state(self, value: MutableMapping[str, Any]): + self._state.update(value) + self.parent_stream.state = self._state.get(self.parent_stream_name, {}) + + def get_current_state(self, customer_id, default=None): + return self.parent_stream.get_current_state(customer_id, default) + + def stream_slices(self, stream_state: Mapping[str, Any] = None, **kwargs) -> Iterable[Optional[MutableMapping[str, any]]]: + """ + If state exists read updates from parent stream otherwise return slices with only customer id to sync all records for stream + """ + if stream_state: + slices_generator = self.read_parent_stream(SyncMode.incremental, self.parent_cursor_field, stream_state) + yield from slices_generator + else: + for customer in self.customers: + yield { + "customer_id": customer.id, + "login_customer_id": customer.login_customer_id, + "updated_ids": set(), + "deleted_ids": set(), + "record_changed_time_map": dict(), + } + + def _process_parent_record(self, parent_record: MutableMapping[str, Any], child_slice: MutableMapping[str, Any]) -> bool: + """Process a single parent_record and update the child_slice.""" + substream_id = parent_record.get(self.parent_id_field) + if not substream_id: + return False + + # Save time of change + child_slice["record_changed_time_map"][substream_id] = parent_record[self.parent_cursor_field] + + # Add record id to list of changed or deleted items depending on status + slice_id_list = "deleted_ids" if parent_record.get("change_status.resource_status") == "REMOVED" else "updated_ids" + child_slice[slice_id_list].add(substream_id) + + return True + + def read_parent_stream( + self, sync_mode: SyncMode, cursor_field: Optional[str], stream_state: Mapping[str, Any] + ) -> Iterable[Mapping[str, Any]]: + for parent_slice in self.parent_stream.stream_slices( + sync_mode=sync_mode, cursor_field=cursor_field, stream_state=stream_state.get(self.parent_stream_name) + ): + customer_id = parent_slice.get("customer_id") + child_slice = { + "customer_id": customer_id, + "updated_ids": set(), + "deleted_ids": set(), + "record_changed_time_map": dict(), + "login_customer_id": parent_slice.get("login_customer_id"), + } + if not self.get_current_state(customer_id): + yield child_slice + continue + + parent_slice["resource_type"] = self.resource_type + for parent_record in self.parent_stream.read_records(sync_mode=sync_mode, cursor_field=cursor_field, stream_slice=parent_slice): + self._process_parent_record(parent_record, child_slice) + + # yield child slice if any records where read + if child_slice["record_changed_time_map"]: + yield child_slice + + def parse_response(self, response: SearchPager, stream_slice: MutableMapping[str, Any] = None) -> Iterable[Mapping]: + # update records with time obtained from parent stream + for record in super().parse_response(response): + primary_key_value = record[self.primary_key[0]] + + # cursor value obtained from parent stream + cursor_value = stream_slice.get("record_changed_time_map", dict()).get(primary_key_value) + + record[self.cursor_field] = cursor_value + yield record + + def _update_state(self, stream_slice: MutableMapping[str, Any]): + customer_id = stream_slice.get("customer_id") + + # if parent stream was used - copy state from it, otherwise set default state + if isinstance(self.parent_stream.state, dict) and self.parent_stream.state.get(customer_id): + self._state[self.parent_stream_name][customer_id] = self.parent_stream.state[customer_id] + else: + parent_state = {self.parent_cursor_field: pendulum.today().start_of("day").format(self.parent_stream.cursor_time_format)} + # full refresh sync without parent stream + self._state[self.parent_stream_name].update({customer_id: parent_state}) + + def _read_deleted_records(self, stream_slice: MutableMapping[str, Any] = None): + # yield deleted records with id and time when record was deleted + for deleted_record_id in stream_slice.get("deleted_ids", []): + yield {self.id_field: deleted_record_id, "deleted_at": stream_slice["record_changed_time_map"].get(deleted_record_id)} + + @staticmethod + def _split_slice(child_slice: MutableMapping[str, Any], chunk_size: int = 10000) -> Iterable[Mapping[str, Any]]: + """ + Splits a child slice into smaller chunks based on the chunk_size. + + Parameters: + - child_slice (MutableMapping[str, Any]): The input dictionary to split. + - chunk_size (int, optional): The maximum number of ids per chunk. Defaults to 10000, + because it is the maximum number of ids that can be present in a query filter. + + Yields: + - Mapping[str, Any]: A dictionary with a similar structure to child_slice. + """ + updated_ids = list(child_slice["updated_ids"]) + if not updated_ids: + yield child_slice + return + + record_changed_time_map = child_slice["record_changed_time_map"] + customer_id = child_slice["customer_id"] + login_customer_id = child_slice["login_customer_id"] + + # Split the updated_ids into chunks and yield them + for i in range(0, len(updated_ids), chunk_size): + chunk_ids = set(updated_ids[i : i + chunk_size]) + chunk_time_map = {k: record_changed_time_map[k] for k in chunk_ids} + + yield { + "updated_ids": chunk_ids, + "record_changed_time_map": chunk_time_map, + "customer_id": customer_id, + "deleted_ids": set(), + "login_customer_id": login_customer_id, + } + + def read_records( + self, sync_mode: SyncMode, cursor_field: List[str] = None, stream_slice: MutableMapping[str, Any] = None, **kwargs + ) -> Iterable[Mapping[str, Any]]: + """ + This method is overridden to read records using parent stream + """ + # if state is present read records by ids from slice otherwise full refresh sync + for stream_slice_part in self._split_slice(stream_slice): + yield from super().read_records(sync_mode, stream_slice=stream_slice_part) + + # yield deleted items + yield from self._read_deleted_records(stream_slice) + + self._update_state(stream_slice) + + def get_query(self, stream_slice: Mapping[str, Any] = None) -> str: + table_name = get_resource_name(self.name) + + fields = GoogleAds.get_fields_from_schema(self.get_json_schema()) + # delete fields that are obtained from parent stream and should not be requested from API + delete_fields = ["change_status.last_change_date_time", "deleted_at"] + fields = [field_name for field_name in fields if field_name not in delete_fields] + + conditions = [] + # filter by ids obtained from parent stream + updated_ids = stream_slice.get("updated_ids") + if updated_ids: + id_list_str = ", ".join(f"'{str(id_)}'" for id_ in updated_ids) + conditions.append(f"{self.id_field} IN ({id_list_str})") + + query = GoogleAds.convert_schema_into_query(fields=fields, table_name=table_name, conditions=conditions) + return query + + +class AdGroupCriterion(IncrementalEventsStream): + """ + Ad Group Criterion stream: https://developers.google.com/google-ads/api/fields/v15/ad_group_criterion + """ + + transformer = TypeTransformer(TransformConfig.DefaultSchemaNormalization) + primary_key = ["ad_group_criterion.resource_name"] + parent_id_field = "change_status.ad_group_criterion" + id_field = "ad_group_criterion.resource_name" + resource_type = "AD_GROUP_CRITERION" + cursor_field = "change_status.last_change_date_time" + + +class AdListingGroupCriterion(AdGroupCriterion): + """ + Ad Listing Group Criterion stream: https://developers.google.com/google-ads/api/fields/v15/ad_group_criterion + While this stream utilizes the same resource as the AdGroupCriterions, + it specifically targets the listing group and has distinct schemas. + """ + + +class CampaignCriterion(IncrementalEventsStream): + """ + Campaign Criterion stream: https://developers.google.com/google-ads/api/fields/v15/campaign_criterion + """ + + transformer = TypeTransformer(TransformConfig.DefaultSchemaNormalization) + primary_key = ["campaign_criterion.resource_name"] + parent_id_field = "change_status.campaign_criterion" + id_field = "campaign_criterion.resource_name" + resource_type = "CAMPAIGN_CRITERION" + cursor_field = "change_status.last_change_date_time" diff --git a/airbyte-integrations/connectors/source-google-ads/source_google_ads/utils.py b/airbyte-integrations/connectors/source-google-ads/source_google_ads/utils.py index 53c03616dd10b..3085343c92789 100644 --- a/airbyte-integrations/connectors/source-google-ads/source_google_ads/utils.py +++ b/airbyte-integrations/connectors/source-google-ads/source_google_ads/utils.py @@ -2,9 +2,373 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # +import functools +import queue import re +import threading +import time from dataclasses import dataclass -from typing import Optional, Tuple +from datetime import datetime +from typing import Any, Callable, Generator, Iterable, MutableMapping, Optional, Tuple, Type, Union + +import pendulum +from airbyte_cdk.models import FailureType +from airbyte_cdk.utils import AirbyteTracedException +from google.ads.googleads.errors import GoogleAdsException +from google.ads.googleads.v15.errors.types.authentication_error import AuthenticationErrorEnum +from google.ads.googleads.v15.errors.types.authorization_error import AuthorizationErrorEnum +from google.ads.googleads.v15.errors.types.quota_error import QuotaErrorEnum +from google.ads.googleads.v15.errors.types.request_error import RequestErrorEnum +from google.api_core.exceptions import Unauthenticated +from source_google_ads.google_ads import logger + + +def get_resource_name(stream_name: str) -> str: + """Returns resource name for stream name""" + return REPORT_MAPPING[stream_name] if stream_name in REPORT_MAPPING else stream_name + + +# maps stream name to name of resource in Google Ads +REPORT_MAPPING = { + "account_performance_report": "customer", + "ad_group_ad_legacy": "ad_group_ad", + "ad_group_bidding_strategy": "ad_group", + "ad_listing_group_criterion": "ad_group_criterion", + "campaign_real_time_bidding_settings": "campaign", + "campaign_bidding_strategy": "campaign", + "service_accounts": "customer", +} + + +class ExpiredPageTokenError(AirbyteTracedException): + """ + Custom AirbyteTracedException exception to handle the scenario when the page token has expired + while processing a response from Google Ads. + """ + + pass + + +def is_error_type(error_value, target_enum_value): + """Compares error value with target enum value after converting both to integers.""" + return int(error_value) == int(target_enum_value) + + +def traced_exception(ga_exception: Union[GoogleAdsException, Unauthenticated], customer_id: str, catch_disabled_customer_error: bool): + """Add user-friendly message for GoogleAdsException""" + messages = [] + raise_exception = AirbyteTracedException + failure_type = FailureType.config_error + + if isinstance(ga_exception, Unauthenticated): + message = ( + f"Authentication failed for the customer '{customer_id}'. " + f"Please try to Re-authenticate your credentials on set up Google Ads page." + ) + raise raise_exception.from_exception(failure_type=failure_type, exc=ga_exception, message=message) from ga_exception + + for error in ga_exception.failure.errors: + # Get error codes + authorization_error = error.error_code.authorization_error + authentication_error = error.error_code.authentication_error + query_error = error.error_code.query_error + quota_error = error.error_code.quota_error + request_error = error.error_code.request_error + + if is_error_type(authorization_error, AuthorizationErrorEnum.AuthorizationError.USER_PERMISSION_DENIED) or is_error_type( + authentication_error, AuthenticationErrorEnum.AuthenticationError.CUSTOMER_NOT_FOUND + ): + message = ( + f"Failed to access the customer '{customer_id}'. " + f"Ensure the customer is linked to your manager account or check your permissions to access this customer account." + ) + + # If the error is encountered in the internally used class `ServiceAccounts`, an exception is raised. + # For other classes, the error is logged and skipped to prevent sync failure. See: https://github.com/airbytehq/airbyte/issues/12486 + elif is_error_type(authorization_error, AuthorizationErrorEnum.AuthorizationError.CUSTOMER_NOT_ENABLED): + if catch_disabled_customer_error: + logger.error(error.message) + continue + else: + message = ( + f"The customer account '{customer_id}' hasn't finished signup or has been deactivated. " + "Sign in to the Google Ads UI to verify its status. " + "For reactivating deactivated accounts, refer to: " + "https://support.google.com/google-ads/answer/2375392." + ) + + elif query_error: + message = f"Incorrect custom query. {error.message}" + + elif is_error_type(quota_error, QuotaErrorEnum.QuotaError.RESOURCE_EXHAUSTED): + message = ( + f"The operation limits for your Google Ads account '{customer_id}' have been exceeded for the last 24 hours. " + f"To avoid these limitations, consider applying for Standard access which offers unlimited operations per day. " + f"Learn more about access levels and how to apply for Standard access here: " + f"https://developers.google.com/google-ads/api/docs/access-levels#access_levels_2" + ) + + # This error occurs when the page token expires while processing results, it is partially handled in IncrementalGoogleAdsStream + elif is_error_type(request_error, RequestErrorEnum.RequestError.EXPIRED_PAGE_TOKEN): + message = ( + "Page token has expired during processing response. " + "Please contact the Airbyte team with the link of your connection for assistance." + ) + + # Raise new error for easier catch in child class - this error will be handled in IncrementalGoogleAdsStream + raise_exception = ExpiredPageTokenError + failure_type = FailureType.system_error + + else: + message = str(error.message) + failure_type = FailureType.system_error + + if message: + messages.append(message) + + if messages: + message = "\n".join(messages) + raise raise_exception.from_exception(failure_type=failure_type, exc=ga_exception, message=message) from ga_exception + + +def generator_backoff( + wait_gen: Callable, + exception: Union[Type[Exception], tuple], + max_tries: Optional[int] = None, + max_time: Optional[float] = None, + on_backoff: Optional[Callable] = None, + **wait_gen_kwargs: Any, +): + def decorator(func: Callable) -> Callable: + def wrapper(*args, **kwargs) -> Generator: + tries = 0 + start_time = datetime.now() + wait_times = wait_gen(**wait_gen_kwargs) + next(wait_times) # Skip the first yield which is None + + while True: + try: + yield from func(*args, **kwargs) + return # If the generator completes without error, return + except exception as e: + tries += 1 + elapsed_time = (datetime.now() - start_time).total_seconds() + + if max_time is not None and elapsed_time >= max_time: + print(f"Maximum time of {max_time} seconds exceeded.") + raise + + if max_tries is not None and tries >= max_tries: + print(f"Maximum tries of {max_tries} exceeded.") + raise + + # Get the next wait time from the exponential decay generator + sleep_time = next(wait_times) + + # Adjust sleep time if it exceeds the remaining max_time + if max_time is not None: + time_remaining = max_time - elapsed_time + sleep_time = min(sleep_time, time_remaining) + + if on_backoff: + on_backoff( + { + "target": func, + "args": args, + "kwargs": kwargs, + "tries": tries, + "elapsed": elapsed_time, + "wait": sleep_time, + "exception": e, + } + ) + + time.sleep(sleep_time) + + return wrapper + + return decorator + + +class RunAsThread: + """ + The `RunAsThread` decorator is designed to run a generator function in a separate thread with a specified timeout. + This is particularly useful when dealing with functions that involve potentially time-consuming operations, + and you want to enforce a time limit for their execution. + """ + + def __init__(self, timeout_minutes): + """ + :param timeout_minutes: The maximum allowed time (in minutes) for the generator function to idle. + If the timeout is reached, a TimeoutError is raised. + """ + self._timeout_seconds = timeout_minutes * 60 + + def __call__(self, generator_func): + @functools.wraps(generator_func) + def wrapper(*args, **kwargs): + """ + The wrapper function sets up threading components, starts a separate thread to run the generator function. + It uses events and a queue for communication and synchronization between the main thread and the thread running the generator function. + """ + # Event and Queue initialization + write_event = threading.Event() + exit_event = threading.Event() + the_queue = queue.Queue() + + # Thread initialization and start + thread = threading.Thread( + target=self.target, args=(the_queue, write_event, exit_event, generator_func, args, kwargs), daemon=True + ) + thread.start() + + # Records the starting time for the timeout calculation. + start_time = time.time() + while thread.is_alive() or not the_queue.empty(): + # The main thread waits for the `write_event` to be set or until the specified timeout. + if the_queue.empty(): + write_event.wait(self._timeout_seconds) + try: + # The main thread yields the result obtained from reading the queue. + yield self.read(the_queue) + # The timer is reset since a new result has been received, preventing the timeout from occurring. + start_time = time.time() + except queue.Empty: + # If exit_event is set it means that the generator function in the thread has completed its execution. + if exit_event.is_set(): + break + # Check if the timeout has been reached without new results. + if time.time() - start_time > self._timeout_seconds: + # The thread may continue to run for some time after reaching a timeout and even come to life and continue working. + # That is why the exit event is set to signal the generator function to stop producing data. + exit_event.set() + raise TimeoutError(f"Method '{generator_func.__name__}' timed out after {self._timeout_seconds / 60.0} minutes") + # The write event is cleared to reset it for the next iteration. + write_event.clear() + + return wrapper + + def target(self, the_queue, write_event, exit_event, func, args, kwargs): + """ + This is a target function for the thread. + It runs the actual generator function, writing its results to a queue. + Exceptions raised during execution are also written to the queue. + :param the_queue: A queue used for communication between the main thread and the thread running the generator function. + :param write_event: An event signaling the availability of new data in the queue. + :param exit_event: An event indicating whether the generator function should stop producing data due to a timeout. + :param func: The generator function to be executed. + :param args: Positional arguments for the generator function. + :param kwargs: Keyword arguments for the generator function. + :return: None + """ + try: + for value in func(*args, **kwargs): + # If the timeout has been reached we must stop producing any data + if exit_event.is_set(): + break + self.write(the_queue, value, write_event) + else: + # Notify the main thread that the generator function has completed its execution. + exit_event.set() + # Notify the main thread (even if the generator didn't produce any data) to prevent waiting for no reason. + if not write_event.is_set(): + write_event.set() + except Exception as e: + self.write(the_queue, e, write_event) + + @staticmethod + def write(the_queue, value, write_event): + """ + Puts a value into the queue and sets a write event to notify the main thread that new data is available. + :param the_queue: A queue used for communication between the main thread and the thread running the generator function. + :param value: The value to be put into the communication queue. + This can be any type of data produced by the generator function, including results or exceptions. + :param write_event: An event signaling the availability of new data in the queue. + :return: None + """ + the_queue.put(value) + write_event.set() + + @staticmethod + def read(the_queue, timeout=0.001): + """ + Retrieves a value from the queue, handling the case where the value is an exception, and raising it. + :param the_queue: A queue used for communication between the main thread and the thread running the generator function. + :param timeout: A time in seconds to wait for a value to be available in the queue. + If the timeout is reached and no new data is available, a `queue.Empty` exception is raised. + :return: a value retrieved from the queue + """ + value = the_queue.get(block=True, timeout=timeout) + if isinstance(value, Exception): + raise value + return value + + +detached = RunAsThread + + +def parse_dates(stream_slice): + start_date = pendulum.parse(stream_slice["start_date"]) + end_date = pendulum.parse(stream_slice["end_date"]) + return start_date, end_date + + +def chunk_date_range( + start_date: str, + end_date: str = None, + conversion_window: int = 0, + days_of_data_storage: int = None, + time_zone=None, + time_format="YYYY-MM-DD", + slice_duration: pendulum.Duration = pendulum.duration(days=14), + slice_step: pendulum.Duration = pendulum.duration(days=1), +) -> Iterable[Optional[MutableMapping[str, any]]]: + """ + Splits a date range into smaller chunks based on the provided parameters. + + Args: + start_date (str): The beginning date of the range. + end_date (str, optional): The ending date of the range. Defaults to today's date. + conversion_window (int): Number of days to subtract from the start date. Defaults to 0. + days_of_data_storage (int, optional): Maximum age of data that can be retrieved. Used to adjust the start date. + time_zone: Time zone to be used for date parsing and today's date calculation. If not provided, the default time zone is used. + time_format (str): Format to be used when returning dates. Defaults to 'YYYY-MM-DD'. + slice_duration (pendulum.Duration): Duration of each chunk. Defaults to 14 days. + slice_step (pendulum.Duration): Step size to move to the next chunk. Defaults to 1 day. + + Returns: + Iterable[Optional[MutableMapping[str, any]]]: An iterable of dictionaries containing start and end dates for each chunk. + If the adjusted start date is greater than the end date, returns a list with a None value. + + Notes: + - If the difference between `end_date` and `start_date` is large (e.g., >= 1 month), processing all records might take a long time. + - Tokens for fetching subsequent pages of data might expire after 2 hours, leading to potential errors. + - The function adjusts the start date based on `days_of_data_storage` and `conversion_window` to adhere to certain data retrieval policies, such as Google Ads' policy of only retrieving data not older than a certain number of days. + - The method returns `start_date` and `end_date` with a difference typically spanning 15 days to avoid token expiration issues. + """ + start_date = pendulum.parse(start_date, tz=time_zone) + today = pendulum.today(tz=time_zone) + end_date = pendulum.parse(end_date, tz=time_zone) if end_date else today + + # For some metrics we can only get data not older than N days, it is Google Ads policy + if days_of_data_storage: + start_date = max(start_date, pendulum.now(tz=time_zone).subtract(days=days_of_data_storage - conversion_window)) + + # As in to return some state when state in abnormal + if start_date > end_date: + return [None] + + # applying conversion window + start_date = start_date.subtract(days=conversion_window) + slice_start = start_date + + while slice_start <= end_date: + slice_end = min(end_date, slice_start + slice_duration) + yield { + "start_date": slice_start.format(time_format), + "end_date": slice_end.format(time_format), + } + slice_start = slice_end + slice_step @dataclass(repr=False, eq=False, frozen=True) @@ -25,7 +389,7 @@ class GAQL: r"""\s* SELECT\s+(?P\S.*) \s+ - FROM\s+(?P[a-z]([a-zA-Z_])*) + FROM\s+(?P[a-z][a-zA-Z_]*(\s*,\s*[a-z][a-zA-Z_]*)*) \s* (\s+WHERE\s+(?P\S.*?))? (\s+ORDER\s+BY\s+(?P\S.*?))? @@ -42,14 +406,18 @@ class GAQL: def parse(cls, query): m = cls.REGEX.match(query) if not m: - raise Exception(f"incorrect GAQL query statement: {repr(query)}") + raise ValueError fields = [f.strip() for f in m.group("FieldNames").split(",")] for field in fields: if not cls.REGEX_FIELD_NAME.match(field): - raise Exception(f"incorrect GAQL query statement: {repr(query)}") + raise ValueError + + resource_names = re.split(r"\s*,\s*", m.group("ResourceNames")) + if len(resource_names) > 1: + raise ValueError + resource_name = resource_names[0] - resource_name = m.group("ResourceName") where = cls._normalize(m.group("WhereClause") or "") order_by = cls._normalize(m.group("OrderByClause") or "") limit = m.group("LimitClause") diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/__init__.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/__init__.py index e69de29bb2d1d..c941b30457953 100644 --- a/airbyte-integrations/connectors/source-google-ads/unit_tests/__init__.py +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/__init__.py @@ -0,0 +1,3 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/common.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/common.py index 426f3995dc85c..b2bff404d6e27 100644 --- a/airbyte-integrations/connectors/source-google-ads/unit_tests/common.py +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/common.py @@ -2,10 +2,15 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # + import json from google.ads.googleads.errors import GoogleAdsException -from google.ads.googleads.v11 import GoogleAdsFailure +from google.ads.googleads.v15 import GoogleAdsFailure +from google.ads.googleads.v15.errors.types.authentication_error import AuthenticationErrorEnum +from google.ads.googleads.v15.errors.types.authorization_error import AuthorizationErrorEnum +from google.ads.googleads.v15.errors.types.query_error import QueryErrorEnum +from google.ads.googleads.v15.errors.types.quota_error import QuotaErrorEnum class MockSearchRequest: @@ -13,6 +18,7 @@ class MockSearchRequest: query = None page_size = 100 page_token = None + next_page_token = None # Mocking Classes @@ -30,44 +36,85 @@ def get_type(self, type): return MockSearchRequest() def get_service(self, service): + if service == "GoogleAdsFieldService": + return MockGoogleAdsFieldService() return MockGoogleAdsService() @staticmethod - def load_from_dict(config): + def load_from_dict(config, version=None): return MockGoogleAdsClient(config) - def send_request(self, query, customer_id): + def send_request(self, query, customer_id, login_customer_id="none"): yield from () - -class MockErroringGoogleAdsService: - def search(self, search_request): - raise make_google_ads_exception(1) - - -def make_google_ads_exception(failure_code: int = 1, failure_msg: str = "it failed", error_type: str = "request_error"): - # There is no easy way I could find to mock a GoogleAdsException without doing something heinous like this - # Following the definition of the object here - # https://developers.google.com/google-ads/api/reference/rpc/v10/GoogleAdsFailure - protobuf_as_json = json.dumps({"errors": [{"error_code": {error_type: failure_code}, "message": failure_msg}], "request_id": "1"}) - failure = type(GoogleAdsFailure).from_json(GoogleAdsFailure, protobuf_as_json) - return GoogleAdsException(None, None, failure, 1) - - -class MockErroringGoogleAdsClient: - def __init__(self, credentials, **kwargs): - self.config = credentials - self.customer_ids = ["1"] - - def send_request(self, query, customer_id): - raise make_google_ads_exception(1) - - def get_type(self, type): - return MockSearchRequest() - - def get_service(self, service): - return MockErroringGoogleAdsService() - - @staticmethod - def load_from_dict(config): - return MockErroringGoogleAdsClient(config) + def get_accessible_accounts(self): + yield from ["fake_customer_id", "fake_customer_id_2"] + + +class MockGoogleAdsFieldService: + _instance = None + + def __new__(cls): + if cls._instance is None: + cls._instance = super(MockGoogleAdsFieldService, cls).__new__(cls) + cls._instance.request_query = None + return cls._instance + + def search_google_ads_fields(self, request): + self.request_query = request.query + + class MockResponse: + def __init__(self, name): + self.name = name + + fields = [name.strip("'") for name in request.query.split("WHERE name in (")[1].split(")")[0].split(",")] + return [MockResponse(name) for name in fields] + + +ERROR_MAP = { + "CUSTOMER_NOT_FOUND": { + "failure_code": AuthenticationErrorEnum.AuthenticationError.CUSTOMER_NOT_FOUND, + "failure_msg": "msg2", + "error_type": "authenticationError", + }, + "USER_PERMISSION_DENIED": { + "failure_code": AuthorizationErrorEnum.AuthorizationError.USER_PERMISSION_DENIED, + "failure_msg": "msg1", + "error_type": "authorizationError", + }, + "CUSTOMER_NOT_ENABLED": { + "failure_code": AuthorizationErrorEnum.AuthorizationError.CUSTOMER_NOT_ENABLED, + "failure_msg": "msg2", + "error_type": "authorizationError", + }, + "QUERY_ERROR": { + "failure_code": QueryErrorEnum.QueryError.UNEXPECTED_END_OF_QUERY, + "failure_msg": "Error in query: unexpected end of query.", + "error_type": "queryError", + }, + "RESOURCE_EXHAUSTED": {"failure_code": QuotaErrorEnum.QuotaError.RESOURCE_EXHAUSTED, "failure_msg": "msg4", "error_type": "quotaError"}, + "UNEXPECTED_ERROR": { + "failure_code": AuthorizationErrorEnum.AuthorizationError.UNKNOWN, + "failure_msg": "Unexpected error message", + "error_type": "authorizationError", + }, +} + + +def mock_google_ads_request_failure(mocker, error_names): + errors = [] + for error_name in error_names: + param = ERROR_MAP[error_name] + # Extract the parameter values from the request object + failure_code = param.get("failure_code", 1) + failure_msg = param.get("failure_msg", "it failed") + error_type = param.get("error_type", "requestError") + + errors.append({"error_code": {error_type: failure_code}, "message": failure_msg}) + + protobuf_as_json = json.dumps({"errors": errors, "request_id": "1"}) + failure = GoogleAdsFailure.from_json(protobuf_as_json) + + exception = GoogleAdsException(None, None, failure, 1) + + mocker.patch("source_google_ads.google_ads.GoogleAds.send_request", side_effect=exception) diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/conftest.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/conftest.py index bb4bece88abad..0ed82b8024ec3 100644 --- a/airbyte-integrations/connectors/source-google-ads/unit_tests/conftest.py +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/conftest.py @@ -2,8 +2,11 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # + +from unittest.mock import Mock + import pytest -from source_google_ads.models import Customer +from source_google_ads.models import CustomerModel @pytest.fixture(name="config") @@ -18,7 +21,7 @@ def test_config(): "customer_id": "123", "start_date": "2021-01-01", "conversion_window_days": 14, - "custom_queries": [ + "custom_queries_array": [ { "query": "SELECT campaign.accessible_bidding_strategy, segments.ad_destination_type, campaign.start_date, campaign.end_date FROM campaign", "primary_key": None, @@ -52,4 +55,9 @@ def mock_oauth_call(requests_mock): @pytest.fixture def customers(config): - return [Customer(id=_id, time_zone="local", is_manager_account=False) for _id in config["customer_id"].split(",")] + return [CustomerModel(id=_id, time_zone="local", is_manager_account=False) for _id in config["customer_id"].split(",")] + + +@pytest.fixture +def customers_manager(config): + return [CustomerModel(id=_id, time_zone="local", is_manager_account=True) for _id in config["customer_id"].split(",")] diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_config_migrations.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_config_migrations.py new file mode 100644 index 0000000000000..4ca91bc77892c --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_config_migrations.py @@ -0,0 +1,79 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +import json +from typing import Any, Mapping + +from airbyte_cdk.models import OrchestratorType, Type +from airbyte_cdk.sources import Source +from source_google_ads.config_migrations import MigrateCustomQuery +from source_google_ads.source import SourceGoogleAds + +# BASE ARGS +CMD = "check" +TEST_CONFIG_PATH = "unit_tests/test_migrations/custom_query/test_config.json" +NEW_TEST_CONFIG_PATH = "unit_tests/test_migrations/custom_query/test_new_config.json" +SOURCE_INPUT_ARGS = [CMD, "--config", TEST_CONFIG_PATH] +SOURCE: Source = SourceGoogleAds() + + +# HELPERS +def load_config(config_path: str = TEST_CONFIG_PATH) -> Mapping[str, Any]: + with open(config_path, "r") as config: + return json.load(config) + + +def revert_migration(config_path: str = TEST_CONFIG_PATH) -> None: + with open(config_path, "r") as test_config: + config = json.load(test_config) + config.pop("custom_queries_array") + with open(config_path, "w") as updated_config: + config = json.dumps(config) + updated_config.write(config) + + +def test_migrate_config(): + migration_instance = MigrateCustomQuery() + original_config = load_config() + original_config_queries = original_config["custom_queries"].copy() + # migrate the test_config + migration_instance.migrate(SOURCE_INPUT_ARGS, SOURCE) + # load the updated config + test_migrated_config = load_config() + # check migrated property + assert "custom_queries_array" in test_migrated_config + assert "segments.date" in test_migrated_config["custom_queries_array"][0]["query"] + # check the old property is in place + assert "custom_queries" in test_migrated_config + assert test_migrated_config["custom_queries"] == original_config_queries + assert "segments.date" not in test_migrated_config["custom_queries"][0]["query"] + # check the migration should be skipped, once already done + assert not migration_instance.should_migrate(test_migrated_config) + # load the old custom reports VS migrated + new_config_queries = test_migrated_config["custom_queries_array"].copy() + new_config_queries[0]["query"] = new_config_queries[0]["query"].replace(", segments.date", "") + print(f"{original_config=} \n {test_migrated_config=}") + assert original_config["custom_queries"] == new_config_queries + # test CONTROL MESSAGE was emitted + control_msg = migration_instance.message_repository._message_queue[0] + assert control_msg.type == Type.CONTROL + assert control_msg.control.type == OrchestratorType.CONNECTOR_CONFIG + # revert the test_config to the starting point + revert_migration() + + +def test_config_is_reverted(): + # check the test_config state, it has to be the same as before tests + test_config = load_config() + # check the config no longer has the migarted property + assert "custom_queries_array" not in test_config + # check the old property is still there + assert "custom_queries" in test_config + + +def test_should_not_migrate_new_config(): + new_config = load_config(NEW_TEST_CONFIG_PATH) + migration_instance = MigrateCustomQuery() + assert not migration_instance.should_migrate(new_config) diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_custom_query.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_custom_query.py index ed3e6f26b6601..862324d3c2375 100644 --- a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_custom_query.py +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_custom_query.py @@ -2,7 +2,10 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # -from source_google_ads.custom_query_stream import IncrementalCustomQuery + +from unittest.mock import MagicMock + +from source_google_ads.custom_query_stream import CustomQueryMixin, IncrementalCustomQuery from source_google_ads.utils import GAQL @@ -17,3 +20,41 @@ def test_custom_query(): str(output_q) == """SELECT ad_group.resource_name, ad_group.status, ad_group.target_cpa_micros, ad_group.target_cpm_micros, ad_group.target_roas, ad_group.targeting_setting.target_restrictions, ad_group.tracking_url_template, ad_group.type, ad_group.url_custom_parameters, campaign.accessible_bidding_strategy, campaign.ad_serving_optimization_status, campaign.advertising_channel_type, campaign.advertising_channel_sub_type, campaign.app_campaign_setting.app_id, campaign.app_campaign_setting.app_store, segments.date FROM search_term_view WHERE segments.date BETWEEN '1980-01-01' AND '1980-01-01'""" ) + + +class Obj: + def __init__(self, **entries): + self.__dict__.update(entries) + + +def test_get_json_schema(): + query_object = MagicMock( + return_value={ + "a": Obj(data_type=Obj(name="ENUM"), is_repeated=False, enum_values=["a", "aa"]), + "b": Obj(data_type=Obj(name="ENUM"), is_repeated=True, enum_values=["b", "bb"]), + "c": Obj(data_type=Obj(name="MESSAGE"), is_repeated=False), + "d": Obj(data_type=Obj(name="MESSAGE"), is_repeated=True), + "e": Obj(data_type=Obj(name="STRING"), is_repeated=False), + "f": Obj(data_type=Obj(name="DATE"), is_repeated=False), + "segments.month": Obj(data_type=Obj(name="DATE"), is_repeated=False), + } + ) + instance = CustomQueryMixin(config={"query": Obj(fields=["a", "b", "c", "d", "e", "f", "segments.month"])}) + instance.cursor_field = None + instance.google_ads_client = Obj(get_fields_metadata=query_object) + schema = instance.get_json_schema() + + assert schema == { + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": True, + "type": "object", + "properties": { + "a": {"type": "string", "enum": ["a", "aa"]}, + "b": {"type": ["null", "array"], "items": {"type": "string", "enum": ["b", "bb"]}}, + "c": {"type": ["string", "null"]}, + "d": {"type": ["null", "array"], "items": {"type": ["string", "null"]}}, + "e": {"type": ["string", "null"]}, + "f": {"type": ["string", "null"]}, + "segments.month": {"type": ["string", "null"], "format": "date"}, + }, + } diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_errors.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_errors.py new file mode 100644 index 0000000000000..e71263296007d --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_errors.py @@ -0,0 +1,156 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +from contextlib import nullcontext as does_not_raise +from unittest.mock import Mock + +import pytest +from airbyte_cdk import AirbyteLogger +from airbyte_cdk.utils import AirbyteTracedException +from source_google_ads.google_ads import GoogleAds +from source_google_ads.models import CustomerModel +from source_google_ads.source import SourceGoogleAds +from source_google_ads.streams import AdGroupLabel, Label, ServiceAccounts + +from .common import MockGoogleAdsClient, mock_google_ads_request_failure + + +@pytest.fixture +def mock_get_customers(mocker): + mocker.patch( + "source_google_ads.source.SourceGoogleAds.get_customers", + Mock(return_value=[CustomerModel(is_manager_account=False, time_zone="Europe/Berlin", id="123")]), + ) + + +params = [ + ( + ["USER_PERMISSION_DENIED"], + "Failed to access the customer '123'. Ensure the customer is linked to your manager account or check your permissions to access this customer account.", + ), + ( + ["CUSTOMER_NOT_FOUND"], + "Failed to access the customer '123'. Ensure the customer is linked to your manager account or check your permissions to access this customer account.", + ), + (["QUERY_ERROR"], "Incorrect custom query. Error in query: unexpected end of query."), + ( + ["RESOURCE_EXHAUSTED"], + ( + "The operation limits for your Google Ads account '123' have been exceeded for the last 24 hours. " + "To avoid these limitations, consider applying for Standard access which offers unlimited operations per day. " + "Learn more about access levels and how to apply for Standard access here: " + "https://developers.google.com/google-ads/api/docs/access-levels#access_levels_2" + ), + ), + (["UNEXPECTED_ERROR"], "Unexpected error message"), + (["QUERY_ERROR", "UNEXPECTED_ERROR"], "Incorrect custom query. Error in query: unexpected end of query.\nUnexpected error message"), +] + + +@pytest.mark.parametrize(("exception", "error_message"), params) +def test_expected_errors(mocker, config, exception, error_message): + mock_google_ads_request_failure(mocker, exception) + mocker.patch( + "source_google_ads.google_ads.GoogleAds.get_accessible_accounts", + Mock(return_value=["123", "12345"]), + ) + source = SourceGoogleAds() + with pytest.raises(AirbyteTracedException) as exception: + status_ok, error = source.check_connection(AirbyteLogger(), config) + assert exception.value.message == error_message + + +@pytest.mark.parametrize( + ("cls", "raise_expected"), + ( + (AdGroupLabel, False), + (Label, False), + (ServiceAccounts, True), + ), +) +def test_read_record_error_handling(mocker, config, customers, cls, raise_expected): + mock_google_ads_request_failure(mocker, ["CUSTOMER_NOT_ENABLED"]) + google_api = GoogleAds(credentials=config["credentials"]) + stream = cls(api=google_api, customers=customers) + + # Use nullcontext or pytest.raises based on raise_expected + context = pytest.raises(AirbyteTracedException) if raise_expected else does_not_raise() + + with context as exception: + for _ in stream.read_records(sync_mode=Mock(), stream_slice={"customer_id": "1234567890", "login_customer_id": "default"}): + pass + + if raise_expected: + assert exception.value.message == ( + "The customer account '1234567890' hasn't finished signup or has been deactivated. " + "Sign in to the Google Ads UI to verify its status. " + "For reactivating deactivated accounts, refer to: " + "https://support.google.com/google-ads/answer/2375392." + ) + + +@pytest.mark.parametrize( + "custom_query, is_manager_account, error_message, warning", + [ + ( + { + "query": "SELECT campaign.accessible_bidding_strategy, metrics.clicks from campaigns", + "primary_key": None, + "cursor_field": "None", + "table_name": "happytable", + }, + True, + None, + ( + "Metrics are not available for manager account 8765. " + 'Skipping the custom query: "SELECT campaign.accessible_bidding_strategy, ' + 'metrics.clicks FROM campaigns" for manager account.' + ), + ), + ( + { + "query": "SELECT campaign.accessible_bidding_strategy, metrics.clicks from campaigns", + "primary_key": None, + "cursor_field": None, + "table_name": "happytable", + }, + False, + None, + None, + ), + ( + { + "query": "SELECT segments.ad_destination_type, segments.date from campaigns", + "primary_key": "customer.id", + "cursor_field": None, + "table_name": "unhappytable", + }, + False, + None, + None, + ), + ], +) +def test_check_custom_queries(mocker, config, custom_query, is_manager_account, error_message, warning): + config["custom_queries_array"] = [custom_query] + mocker.patch( + "source_google_ads.source.SourceGoogleAds.get_customers", + Mock(return_value=[CustomerModel(is_manager_account=is_manager_account, time_zone="Europe/Berlin", id="8765")]), + ) + mocker.patch("source_google_ads.google_ads.GoogleAdsClient", return_value=MockGoogleAdsClient) + source = SourceGoogleAds() + logger_mock = Mock() + + # Use nullcontext or pytest.raises based on error_message + context = pytest.raises(AirbyteTracedException) if error_message else does_not_raise() + + with context as exception: + status_ok, error = source.check_connection(logger_mock, config) + + if error_message: + assert exception.value.message == error_message + + if warning: + logger_mock.warning.assert_called_with(warning) diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_google_ads.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_google_ads.py index 48b3b0720c1bd..3f66564846f44 100644 --- a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_google_ads.py +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_google_ads.py @@ -2,14 +2,15 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # + from datetime import date import pendulum -from freezegun import freeze_time -from pendulum.tz.timezone import Timezone +import pytest +from airbyte_cdk.utils import AirbyteTracedException +from google.auth import exceptions from source_google_ads.google_ads import GoogleAds -from source_google_ads.models import Customer -from source_google_ads.streams import IncrementalGoogleAdsStream, chunk_date_range, get_date_params +from source_google_ads.streams import chunk_date_range from .common import MockGoogleAdsClient, MockGoogleAdsService @@ -57,6 +58,14 @@ def test_google_ads_init(mocker): assert google_client_mocker.load_from_dict.call_args[0][0] == EXPECTED_CRED +def test_google_ads_wrong_permissions(mocker): + mocker.patch("source_google_ads.google_ads.GoogleAdsClient.load_from_dict", side_effect=exceptions.RefreshError("invalid_grant")) + with pytest.raises(AirbyteTracedException) as e: + GoogleAds(**SAMPLE_CONFIG) + expected_message = "The authentication to Google Ads has expired. Re-authenticate to restore access to Google Ads." + assert e.value.message == expected_message + + def test_send_request(mocker, customers): mocker.patch("source_google_ads.google_ads.GoogleAdsClient.load_from_dict", return_value=MockGoogleAdsClient(SAMPLE_CONFIG)) mocker.patch("source_google_ads.google_ads.GoogleAdsClient.get_service", return_value=MockGoogleAdsService()) @@ -78,78 +87,59 @@ def test_get_fields_from_schema(): def test_interval_chunking(): mock_intervals = [ - {"start_date": "2021-06-18", "end_date": "2021-06-27"}, - {"start_date": "2021-06-28", "end_date": "2021-07-07"}, - {"start_date": "2021-07-08", "end_date": "2021-07-17"}, - {"start_date": "2021-07-18", "end_date": "2021-07-27"}, - {"start_date": "2021-07-28", "end_date": "2021-08-06"}, - {"start_date": "2021-08-07", "end_date": "2021-08-15"}, + {"start_date": "2021-06-17", "end_date": "2021-06-26"}, + {"start_date": "2021-06-27", "end_date": "2021-07-06"}, + {"start_date": "2021-07-07", "end_date": "2021-07-16"}, + {"start_date": "2021-07-17", "end_date": "2021-07-26"}, + {"start_date": "2021-07-27", "end_date": "2021-08-05"}, + {"start_date": "2021-08-06", "end_date": "2021-08-10"}, ] - intervals = chunk_date_range("2021-07-01", 14, "segments.date", "2021-08-15", range_days=10) - - assert mock_intervals == intervals - - -def test_get_date_params(customers): - # Please note that this is equal to inputted stream_slice start date + 1 day - mock_start_date = "2021-05-19" - mock_end_date = "2021-06-02" - mock_conversion_window_days = 14 - - incremental_stream_config = dict( - conversion_window_days=mock_conversion_window_days, - start_date=mock_start_date, - api=MockGoogleAdsClient(SAMPLE_CONFIG), - customers=customers, - ) - - stream = IncrementalGoogleAdsStream(**incremental_stream_config) - - for customer in stream.customers: - start_date, end_date = get_date_params( - start_date="2021-05-18", range_days=stream.range_days, time_zone=customer.time_zone, end_date=pendulum.parse("2021-08-15") + intervals = list( + chunk_date_range( + start_date="2021-07-01", end_date="2021-08-10", conversion_window=14, slice_duration=pendulum.Duration(days=9), time_zone="UTC" ) - - assert mock_start_date == start_date and mock_end_date == end_date - - -@freeze_time("2022-01-30 03:21:34", tz_offset=0) -def test_get_date_params_with_time_zone(): - time_zone_chatham = Timezone("Pacific/Chatham") # UTC+12:45 - customer = Customer(id="id", time_zone=time_zone_chatham, is_manager_account=False) - mock_start_date_chatham = pendulum.today(tz=time_zone_chatham).subtract(days=1).to_date_string() - time_zone_honolulu = Timezone("Pacific/Honolulu") # UTC-10:00 - customer_2 = Customer(id="id_2", time_zone=time_zone_honolulu, is_manager_account=False) - mock_start_date_honolulu = pendulum.today(tz=time_zone_honolulu).subtract(days=1).to_date_string() - - mock_conversion_window_days = 14 - - incremental_stream_config = dict( - conversion_window_days=mock_conversion_window_days, - start_date=mock_start_date_chatham, - api=MockGoogleAdsClient(SAMPLE_CONFIG), - customers=[customer], ) - stream = IncrementalGoogleAdsStream(**incremental_stream_config) - start_date_chatham, end_date_chatham = get_date_params( - start_date=mock_start_date_chatham, time_zone=customer.time_zone, range_days=stream.range_days - ) - - incremental_stream_config.update({"start_date": mock_start_date_honolulu, "customers": [customer_2]}) - stream_2 = IncrementalGoogleAdsStream(**incremental_stream_config) - - start_date_honolulu, end_date_honolulu = get_date_params( - start_date=mock_start_date_honolulu, time_zone=customer_2.time_zone, range_days=stream_2.range_days - ) - - assert start_date_honolulu != start_date_chatham and end_date_honolulu != end_date_chatham + assert mock_intervals == intervals -def test_convert_schema_into_query(): - report_name = "ad_group_ad_report" - query = "SELECT segment.date FROM ad_group_ad WHERE segments.date >= '2020-01-01' AND segments.date <= '2020-03-01' ORDER BY segments.date ASC" - response = GoogleAds.convert_schema_into_query(SAMPLE_SCHEMA, report_name, "2020-01-01", "2020-03-01", "segments.date") - assert response == query +generic_schema = {"properties": {"ad_group_id": {}, "segments.date": {}, "campaign_id": {}, "account_id": {}}} + + +@pytest.mark.parametrize( + "fields, table_name, conditions, order_field, limit, expected_sql", + ( + # Basic test case + ( + ["ad_group_id", "segments.date", "campaign_id", "account_id"], + "ad_group_ad", + ["segments.date >= '2020-01-01'", "segments.date <= '2020-01-10'"], + "segments.date", + None, + "SELECT ad_group_id, segments.date, campaign_id, account_id FROM ad_group_ad WHERE segments.date >= '2020-01-01' AND segments.date <= '2020-01-10' ORDER BY segments.date ASC", + ), + # Test with no conditions + ( + ["ad_group_id", "segments.date", "campaign_id", "account_id"], + "ad_group_ad", + None, + None, + None, + "SELECT ad_group_id, segments.date, campaign_id, account_id FROM ad_group_ad", + ), + # Test order with limit + ( + ["ad_group_id", "segments.date", "campaign_id", "account_id"], + "click_view", + None, + "ad_group_id", + 5, + "SELECT ad_group_id, segments.date, campaign_id, account_id FROM click_view ORDER BY ad_group_id ASC LIMIT 5", + ), + ), +) +def test_convert_schema_into_query(fields, table_name, conditions, order_field, limit, expected_sql): + query = GoogleAds.convert_schema_into_query(fields, table_name, conditions, order_field, limit) + assert query == expected_sql def test_get_field_value(): @@ -165,65 +155,34 @@ def test_parse_single_result(): assert response == response -# Add a sample config with date parameters -SAMPLE_CONFIG_WITH_DATE = { - "credentials": { - "developer_token": "developer_token", - "client_id": "client_id", - "client_secret": "client_secret", - "refresh_token": "refresh_token", - }, - "customer_id": "customer_id", - "start_date": "2021-11-01", - "end_date": "2021-11-15", -} - - -def test_get_date_params_with_date(customers): - # Please note that this is equal to inputted stream_slice start date + 1 day - mock_start_date = SAMPLE_CONFIG_WITH_DATE["start_date"] - mock_end_date = SAMPLE_CONFIG_WITH_DATE["end_date"] - incremental_stream_config = dict( - start_date=mock_start_date, - end_date=mock_end_date, - conversion_window_days=0, - customers=customers, - api=MockGoogleAdsClient(SAMPLE_CONFIG_WITH_DATE), - ) - stream = IncrementalGoogleAdsStream(**incremental_stream_config) - for customer in stream.customers: - start_date, end_date = get_date_params( - start_date="2021-10-31", time_zone=customer.time_zone, range_days=stream.range_days, end_date=pendulum.parse("2021-11-15") - ) - assert mock_start_date == start_date and mock_end_date == end_date - - -SAMPLE_CONFIG_WITHOUT_END_DATE = { - "credentials": { - "developer_token": "developer_token", - "client_id": "client_id", - "client_secret": "client_secret", - "refresh_token": "refresh_token", - }, - "customer_id": "customer_id", - "start_date": "2021-11-01", -} +def test_get_fields_metadata(mocker): + # Mock the GoogleAdsClient to return our mock client + mocker.patch("source_google_ads.google_ads.GoogleAdsClient", MockGoogleAdsClient) + # Instantiate the GoogleAds client + google_ads_client = GoogleAds(**SAMPLE_CONFIG) -def test_get_date_params_without_end_date(customers): - # Please note that this is equal to inputted stream_slice start date + 1 day - mock_start_date = SAMPLE_CONFIG_WITHOUT_END_DATE["start_date"] - mock_end_date = "2021-11-30" - incremental_stream_config = dict( - start_date=mock_start_date, - end_date=mock_end_date, - conversion_window_days=0, - customers=customers, - api=MockGoogleAdsClient(SAMPLE_CONFIG_WITHOUT_END_DATE), - ) - stream = IncrementalGoogleAdsStream(**incremental_stream_config) - for customer in stream.customers: - start_date, end_date = get_date_params(start_date="2021-10-31", range_days=stream.range_days, time_zone=customer.time_zone) - assert mock_start_date == start_date - # There is a Google limitation where we capture only a 15-day date range - assert end_date == "2021-11-15" + # Define the fields we want metadata for + fields = ["field1", "field2", "field3"] + + # Call the method to get fields metadata + response = google_ads_client.get_fields_metadata(fields) + + # Get the mock service to check the request query + mock_service = google_ads_client.get_client().get_service("GoogleAdsFieldService") + + # Assert the constructed request query + expected_query = """ + SELECT + name, + data_type, + enum_values, + is_repeated + WHERE name in ('field1','field2','field3') + """ + assert mock_service.request_query.strip() == expected_query.strip() + + # Assert the response + assert set(response.keys()) == set(fields) + for field in fields: + assert response[field].name == field diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_incremental_events_streams.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_incremental_events_streams.py new file mode 100644 index 0000000000000..8ddf8bd80fbac --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_incremental_events_streams.py @@ -0,0 +1,608 @@ +# +# Copyright (c) 2023 Airbyte, Inc., all rights reserved. +# + + +from copy import deepcopy +from unittest.mock import DEFAULT, MagicMock, Mock, call + +import pendulum +import pytest +from airbyte_cdk.models import SyncMode +from airbyte_cdk.utils import AirbyteTracedException +from source_google_ads.google_ads import GoogleAds +from source_google_ads.streams import CampaignCriterion, ChangeStatus + + +def mock_response_parent(): + yield [ + { + "change_status.last_change_date_time": "2023-06-13 12:36:01.772447", + "change_status.resource_type": "CAMPAIGN_CRITERION", + "change_status.resource_status": "ADDED", + "change_status.campaign_criterion": "1", + }, + { + "change_status.last_change_date_time": "2023-06-13 12:36:02.772447", + "change_status.resource_type": "CAMPAIGN_CRITERION", + "change_status.resource_status": "ADDED", + "change_status.campaign_criterion": "2", + }, + { + "change_status.last_change_date_time": "2023-06-13 12:36:03.772447", + "change_status.resource_type": "CAMPAIGN_CRITERION", + "change_status.resource_status": "REMOVED", + "change_status.campaign_criterion": "3", + }, + { + "change_status.last_change_date_time": "2023-06-13 12:36:04.772447", + "change_status.resource_type": "CAMPAIGN_CRITERION", + "change_status.resource_status": "REMOVED", + "change_status.campaign_criterion": "4", + }, + ] + + +def mock_response_child(): + yield [ + {"customer.id": 123, "campaign.id": 1, "campaign_criterion.resource_name": "1"}, + {"customer.id": 123, "campaign.id": 1, "campaign_criterion.resource_name": "2"}, + ] + + +class MockGoogleAds(GoogleAds): + def parse_single_result(self, schema, result): + return result + + def send_request(self, query: str, customer_id: str, login_customer_id: str = "default"): + if query == "query_parent": + return mock_response_parent() + else: + return mock_response_child() + + +def test_change_status_stream(config, customers): + """ """ + customer_id = next(iter(customers)).id + stream_slice = {"customer_id": customer_id, "login_customer_id": "default"} + + google_api = MockGoogleAds(credentials=config["credentials"]) + + stream = ChangeStatus(api=google_api, customers=customers) + + stream.get_query = Mock() + stream.get_query.return_value = "query_parent" + + result = list( + stream.read_records(sync_mode=SyncMode.incremental, cursor_field=["change_status.last_change_date_time"], stream_slice=stream_slice) + ) + assert len(result) == 4 + assert stream.get_query.call_count == 1 + stream.get_query.assert_called_with({"customer_id": customer_id, "login_customer_id": "default"}) + + +def test_child_incremental_events_read(config, customers): + """ + Page token expired while reading records on date 2021-01-03 + The latest read record is {"segments.date": "2021-01-03", "click_view.gclid": "4"} + It should retry reading starting from 2021-01-03, already read records will be reread again from that date. + It shouldn't read records on 2021-01-01, 2021-01-02 + """ + customer_id = next(iter(customers)).id + parent_stream_slice = {"customer_id": customer_id, "resource_type": "CAMPAIGN_CRITERION", "login_customer_id": "default"} + stream_state = {"change_status": {customer_id: {"change_status.last_change_date_time": "2023-08-16 13:20:01.003295"}}} + + google_api = MockGoogleAds(credentials=config["credentials"]) + + stream = CampaignCriterion(api=google_api, customers=customers) + parent_stream = stream.parent_stream + + parent_stream.get_query = Mock() + parent_stream.get_query.return_value = "query_parent" + + parent_stream.stream_slices = Mock() + parent_stream.stream_slices.return_value = [parent_stream_slice] + + parent_stream.state = {customer_id: {"change_status.last_change_date_time": "2023-05-16 13:20:01.003295"}} + + stream.get_query = Mock() + stream.get_query.return_value = "query_child" + + stream_slices = list(stream.stream_slices(stream_state=stream_state)) + + assert stream_slices == [ + { + "customer_id": "123", + "updated_ids": {"2", "1"}, + "deleted_ids": {"3", "4"}, + "record_changed_time_map": { + "1": "2023-06-13 12:36:01.772447", + "2": "2023-06-13 12:36:02.772447", + "3": "2023-06-13 12:36:03.772447", + "4": "2023-06-13 12:36:04.772447", + }, + "login_customer_id": "default", + } + ] + + result = list( + stream.read_records( + sync_mode=SyncMode.incremental, cursor_field=["change_status.last_change_date_time"], stream_slice=stream_slices[0] + ) + ) + expected_result = [ + { + "campaign.id": 1, + "campaign_criterion.resource_name": "1", + "change_status.last_change_date_time": "2023-06-13 12:36:01.772447", + "customer.id": 123, + }, + { + "campaign.id": 1, + "campaign_criterion.resource_name": "2", + "change_status.last_change_date_time": "2023-06-13 12:36:02.772447", + "customer.id": 123, + }, + {"campaign_criterion.resource_name": "3", "deleted_at": "2023-06-13 12:36:03.772447"}, + {"campaign_criterion.resource_name": "4", "deleted_at": "2023-06-13 12:36:04.772447"}, + ] + + assert all([expected_row in result for expected_row in expected_result]) + + assert stream.state == {"change_status": {"123": {"change_status.last_change_date_time": "2023-06-13 12:36:04.772447"}}} + + assert stream.get_query.call_count == 1 + + +def mock_response_1(): + yield [ + { + "change_status.last_change_date_time": "2023-06-13 12:36:01.772447", + "change_status.resource_type": "CAMPAIGN_CRITERION", + "change_status.resource_status": "ADDED", + "change_status.campaign_criterion": "1", + }, + { + "change_status.last_change_date_time": "2023-06-13 12:36:02.772447", + "change_status.resource_type": "CAMPAIGN_CRITERION", + "change_status.resource_status": "ADDED", + "change_status.campaign_criterion": "2", + }, + ] + + +def mock_response_2(): + yield [ + { + "change_status.last_change_date_time": "2023-06-13 12:36:03.772447", + "change_status.resource_type": "CAMPAIGN_CRITERION", + "change_status.resource_status": "REMOVED", + "change_status.campaign_criterion": "3", + }, + { + "change_status.last_change_date_time": "2023-06-13 12:36:04.772447", + "change_status.resource_type": "CAMPAIGN_CRITERION", + "change_status.resource_status": "REMOVED", + "change_status.campaign_criterion": "4", + }, + ] + + +def mock_response_3(): + yield [ + { + "change_status.last_change_date_time": "2023-06-13 12:36:04.772447", + "change_status.resource_type": "CAMPAIGN_CRITERION", + "change_status.resource_status": "REMOVED", + "change_status.campaign_criterion": "6", + }, + ] + + +def mock_response_4(): + yield [ + { + "change_status.last_change_date_time": "2023-06-13 12:36:04.772447", + "change_status.resource_type": "CAMPAIGN_CRITERION", + "change_status.resource_status": "REMOVED", + "change_status.campaign_criterion": "6", + }, + { + "change_status.last_change_date_time": "2023-06-13 12:36:04.772447", + "change_status.resource_type": "CAMPAIGN_CRITERION", + "change_status.resource_status": "REMOVED", + "change_status.campaign_criterion": "7", + }, + ] + + +class MockGoogleAdsLimit(GoogleAds): + count = 0 + + def parse_single_result(self, schema, result): + return result + + def send_request(self, query: str, customer_id: str, login_customer_id: str = "default"): + self.count += 1 + if self.count == 1: + return mock_response_1() + elif self.count == 2: + return mock_response_2() + else: + return mock_response_3() + + +def mock_query_limit(self) -> int: + return 2 # or whatever value you want for testing + + +def copy_call_args(mock): + new_mock = Mock() + + def side_effect(*args, **kwargs): + args = deepcopy(args) + kwargs = deepcopy(kwargs) + new_mock(*args, **kwargs) + return DEFAULT + + mock.side_effect = side_effect + return new_mock + + +def test_query_limit_hit(config, customers): + """ + Test the behavior of the `read_records` method in the `ChangeStatus` stream when the query limit is hit. + + This test simulates a scenario where the limit is hit and slice start_date is updated with latest record cursor + """ + customer_id = next(iter(customers)).id + stream_slice = { + "customer_id": customer_id, + "start_date": "2023-06-13 11:35:04.772447", + "end_date": "2023-06-13 13:36:04.772447", + "login_customer_id": "default", + } + + google_api = MockGoogleAdsLimit(credentials=config["credentials"]) + stream_config = dict( + api=google_api, + customers=customers, + ) + stream = ChangeStatus(**stream_config) + ChangeStatus.query_limit = property(mock_query_limit) + stream.get_query = Mock(return_value="query") + get_query_mock = copy_call_args(stream.get_query) + + result = list( + stream.read_records(sync_mode=SyncMode.incremental, cursor_field=["change_status.last_change_date_time"], stream_slice=stream_slice) + ) + + assert len(result) == 5 + assert stream.get_query.call_count == 3 + + get_query_calls = [ + call( + { + "customer_id": "123", + "start_date": "2023-06-13 11:35:04.772447", + "end_date": "2023-06-13 13:36:04.772447", + "login_customer_id": "default", + } + ), + call( + { + "customer_id": "123", + "start_date": "2023-06-13 12:36:02.772447", + "end_date": "2023-06-13 13:36:04.772447", + "login_customer_id": "default", + } + ), + call( + { + "customer_id": "123", + "start_date": "2023-06-13 12:36:04.772447", + "end_date": "2023-06-13 13:36:04.772447", + "login_customer_id": "default", + } + ), + ] + + get_query_mock.assert_has_calls(get_query_calls) + + +class MockGoogleAdsLimitException(MockGoogleAdsLimit): + def send_request(self, query: str, customer_id: str, login_customer_id: str = "default"): + self.count += 1 + if self.count == 1: + return mock_response_1() + elif self.count == 2: + return mock_response_2() + elif self.count == 3: + return mock_response_4() + + +def test_query_limit_hit_exception(config, customers): + """ + Test the behavior of the `read_records` method in the `ChangeStatus` stream when the query limit is hit. + + This test simulates a scenario where the limit is hit and there are more than query_limit number of records with same cursor, + then error will be raised + """ + customer_id = next(iter(customers)).id + stream_slice = { + "customer_id": customer_id, + "start_date": "2023-06-13 11:35:04.772447", + "end_date": "2023-06-13 13:36:04.772447", + "login_customer_id": "default", + } + + google_api = MockGoogleAdsLimitException(credentials=config["credentials"]) + stream_config = dict( + api=google_api, + customers=customers, + ) + stream = ChangeStatus(**stream_config) + ChangeStatus.query_limit = property(mock_query_limit) + stream.get_query = Mock(return_value="query") + + with pytest.raises(AirbyteTracedException) as e: + list( + stream.read_records( + sync_mode=SyncMode.incremental, cursor_field=["change_status.last_change_date_time"], stream_slice=stream_slice + ) + ) + + expected_message = "More than limit 2 records with same cursor field. Incremental sync is not possible for this stream." + assert e.value.message == expected_message + + +def test_change_status_get_query(mocker, config, customers): + """ + Test the get_query method of ChangeStatus stream. + + Given a sample stream_slice, it verifies that the returned query is as expected. + """ + # Setup an instance of the ChangeStatus stream + google_api = MockGoogleAds(credentials=config["credentials"]) + stream = ChangeStatus(api=google_api, customers=customers) + + # Mock get_json_schema method of the stream to return a predefined schema + mocker.patch.object(stream, "get_json_schema", return_value={"properties": {"change_status.resource_type": {"type": "str"}}}) + + # Define a sample stream_slice for the test + stream_slice = { + "start_date": "2023-01-01 00:00:00.000000", + "end_date": "2023-09-19 00:00:00.000000", + "resource_type": "SOME_RESOURCE_TYPE", + "login_customer_id": "default", + } + + # Call the get_query method with the stream_slice + query = stream.get_query(stream_slice=stream_slice) + + # Expected result based on the provided sample + expected_query = """SELECT change_status.resource_type FROM change_status WHERE change_status.last_change_date_time >= '2023-01-01 00:00:00.000000' AND change_status.last_change_date_time <= '2023-09-19 00:00:00.000000' AND change_status.resource_type = 'SOME_RESOURCE_TYPE' ORDER BY change_status.last_change_date_time ASC LIMIT 2""" + + # Check that the result from the get_query method matches the expected query + assert query == expected_query + + +def are_queries_equivalent(query1, query2): + # Split the queries to extract the list of criteria + criteria1 = query1.split("IN (")[1].rstrip(")").split(", ") + criteria2 = query2.split("IN (")[1].rstrip(")").split(", ") + + # Sort the criteria for comparison + criteria1_sorted = sorted(criteria1) + criteria2_sorted = sorted(criteria2) + + # Replace the original criteria with the sorted version in the queries + query1_sorted = query1.replace(", ".join(criteria1), ", ".join(criteria1_sorted)) + query2_sorted = query2.replace(", ".join(criteria2), ", ".join(criteria2_sorted)) + + return query1_sorted == query2_sorted + + +def test_incremental_events_stream_get_query(mocker, config, customers): + """ + Test the get_query method of the IncrementalEventsStream class. + + Given a sample stream_slice, this test will verify that the returned query string is as expected. + """ + # Setup an instance of the CampaignCriterion stream + google_api = MockGoogleAds(credentials=config["credentials"]) + stream = CampaignCriterion(api=google_api, customers=customers) + + # Mock get_json_schema method of the stream to return a predefined schema + mocker.patch.object(stream, "get_json_schema", return_value={"properties": {"campaign_criterion.resource_name": {"type": "str"}}}) + + # Define a sample stream_slice for the test + stream_slice = { + "customer_id": "1234567890", + "updated_ids": { + "customers/1234567890/adGroupCriteria/111111111111~1", + "customers/1234567890/adGroupCriteria/111111111111~2", + "customers/1234567890/adGroupCriteria/111111111111~3", + }, + "deleted_ids": { + "customers/1234567890/adGroupCriteria/111111111111~4", + "customers/1234567890/adGroupCriteria/111111111111~5", + }, + "record_changed_time_map": { + "customers/1234567890/adGroupCriteria/111111111111~1": "2023-09-18 08:56:53.413023", + "customers/1234567890/adGroupCriteria/111111111111~2": "2023-09-18 08:56:59.165599", + "customers/1234567890/adGroupCriteria/111111111111~3": "2023-09-18 08:56:59.165599", + "customers/1234567890/adGroupCriteria/111111111111~4": "2023-09-18 08:56:59.165599", + "customers/1234567890/adGroupCriteria/111111111111~5": "2023-09-18 08:56:59.165599", + }, + "login_customer_id": "default", + } + + # Call the get_query method with the stream_slice + query = stream.get_query(stream_slice=stream_slice) + + # Assuming the generated query should look like: + expected_query = ( + "SELECT campaign_criterion.resource_name " + "FROM campaign_criterion " + "WHERE campaign_criterion.resource_name IN (" + "'customers/1234567890/adGroupCriteria/111111111111~1', " + "'customers/1234567890/adGroupCriteria/111111111111~2', " + "'customers/1234567890/adGroupCriteria/111111111111~3')" + ) + + # Check if the query generated by the get_query method matches the expected query + assert are_queries_equivalent(query, expected_query) + + +def test_read_records_with_slice_splitting(mocker, config): + """ + Test the read_records method to ensure it correctly splits the stream_slice and calls the parent's read_records. + """ + # Define a stream_slice with 15,000 ids to ensure it gets split during processing + stream_slice = { + "updated_ids": set(range(15000)), + "record_changed_time_map": {i: f"time_{i}" for i in range(15000)}, + "customer_id": "sample_customer_id", + "deleted_ids": set(), + "login_customer_id": "default", + } + + # Create a mock instance of the CampaignCriterion stream + google_api = MockGoogleAds(credentials=config["credentials"]) + stream = CampaignCriterion(api=google_api, customers=[]) + + # Mock methods that are expected to be called during the test + super_read_records_mock = MagicMock() + mocker.patch("source_google_ads.streams.GoogleAdsStream.read_records", super_read_records_mock) + read_deleted_records_mock = mocker.patch.object(stream, "_read_deleted_records", return_value=[]) + update_state_mock = mocker.patch.object(stream, "_update_state") + + # Execute the method under test + list(stream.read_records(SyncMode.incremental, stream_slice=stream_slice)) + + # Verify that the parent's read_records method was called twice due to splitting + assert super_read_records_mock.call_count == 2 + + # Define the expected slices after the stream_slice is split + expected_first_slice = { + "updated_ids": set(range(10000)), + "record_changed_time_map": {i: f"time_{i}" for i in range(10000)}, + "customer_id": "sample_customer_id", + "deleted_ids": set(), + "login_customer_id": "default", + } + expected_second_slice = { + "updated_ids": set(range(10000, 15000)), + "record_changed_time_map": {i: f"time_{i}" for i in range(10000, 15000)}, + "customer_id": "sample_customer_id", + "deleted_ids": set(), + "login_customer_id": "default", + } + + # Verify the arguments passed to the parent's read_records method for both calls + first_call_args, first_call_kwargs = super_read_records_mock.call_args_list[0] + assert first_call_args[0] == SyncMode.incremental + assert first_call_kwargs["stream_slice"] == expected_first_slice + second_call_args, second_call_kwargs = super_read_records_mock.call_args_list[1] + assert second_call_args[0] == SyncMode.incremental + assert second_call_kwargs["stream_slice"] == expected_second_slice + + # Ensure that the mocked methods were called as expected + read_deleted_records_mock.assert_called_once_with(stream_slice) + update_state_mock.assert_called_once_with(stream_slice) + + +def test_update_state_with_parent_state(mocker): + """ + Test the _update_state method when the parent_stream has a state. + """ + # Mock instance setup + stream = CampaignCriterion(api=MagicMock(), customers=[]) + + # Mock parent_stream with initial state + stream.parent_stream.state = {"customer_id_1": {"change_status.last_change_date_time": "2023-10-20 00:00:00.000000"}} + + # Call the _update_state method with the first stream_slice + stream_slice_first = {"customer_id": "customer_id_1"} + stream._update_state(stream_slice_first) + + # Assert the state after the first call + expected_state_first_call = {"change_status": {"customer_id_1": {"change_status.last_change_date_time": "2023-10-20 00:00:00.000000"}}} + assert stream._state == expected_state_first_call + + # Update the parent_stream state for the second call + stream.parent_stream.state = {"customer_id_2": {"change_status.last_change_date_time": "2023-10-21 00:00:00.000000"}} + + # Call the _update_state method with the second stream_slice + stream_slice_second = {"customer_id": "customer_id_2"} + stream._update_state(stream_slice_second) + + # Assert the state after the second call + expected_state_second_call = { + "change_status": { + "customer_id_1": {"change_status.last_change_date_time": "2023-10-20 00:00:00.000000"}, + "customer_id_2": {"change_status.last_change_date_time": "2023-10-21 00:00:00.000000"}, + } + } + assert stream._state == expected_state_second_call + + # Set pendulum to return a consistent value + now = pendulum.datetime(2023, 11, 2, 12, 53, 7) + pendulum.set_test_now(now) + + # Call the _update_state method with the third stream_slice + stream_slice_third = {"customer_id": "customer_id_3"} + stream._update_state(stream_slice_third) + + # Assert the state after the third call + expected_state_third_call = { + "change_status": { + "customer_id_1": {"change_status.last_change_date_time": "2023-10-20 00:00:00.000000"}, + "customer_id_2": {"change_status.last_change_date_time": "2023-10-21 00:00:00.000000"}, + "customer_id_3": {"change_status.last_change_date_time": "2023-11-02 00:00:00.000000"}, + } + } + assert stream._state == expected_state_third_call + + # Reset the pendulum mock to its original state + pendulum.set_test_now() + + +def test_update_state_without_parent_state(mocker): + """ + Test the _update_state method when the parent_stream does not have a state. + """ + # Reset any previous mock state for pendulum + pendulum.set_test_now() + + # Mock instance setup + stream = CampaignCriterion(api=MagicMock(), customers=[]) + + # Mock pendulum call to return a consistent value + now = pendulum.datetime(2023, 11, 2, 12, 53, 7) + pendulum.set_test_now(now) + + # Call the _update_state method with the first stream_slice + stream_slice_first = {"customer_id": "customer_id_1"} + stream._update_state(stream_slice_first) + + # Assert the state after the first call + expected_state_first_call = {"change_status": {"customer_id_1": {"change_status.last_change_date_time": "2023-11-02 00:00:00.000000"}}} + assert stream._state == expected_state_first_call + + # Call the _update_state method with the second stream_slice + stream_slice_second = {"customer_id": "customer_id_2"} + stream._update_state(stream_slice_second) + + # Assert the state after the second call + expected_state_second_call = { + "change_status": { + "customer_id_1": {"change_status.last_change_date_time": "2023-11-02 00:00:00.000000"}, + "customer_id_2": {"change_status.last_change_date_time": "2023-11-02 00:00:00.000000"}, + } + } + assert stream._state == expected_state_second_call + + # Reset the pendulum mock to its original state + pendulum.set_test_now() diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_migrations/custom_query/test_config.json b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_migrations/custom_query/test_config.json new file mode 100644 index 0000000000000..2ce005d03ec09 --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_migrations/custom_query/test_config.json @@ -0,0 +1,18 @@ +{ + "credentials": { + "developer_token": "developer_token", + "client_id": "client_id", + "client_secret": "client_secret", + "refresh_token": "refresh_token" + }, + "customer_id": "1234567890", + "start_date": "2023-09-04", + "conversion_window_days": 14, + "custom_queries": [ + { + "query": "SELECT campaign.name, metrics.clicks FROM campaign", + "primary_key": null, + "table_name": "test_query" + } + ] +} diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_migrations/custom_query/test_new_config.json b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_migrations/custom_query/test_new_config.json new file mode 100644 index 0000000000000..7d8097055f09c --- /dev/null +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_migrations/custom_query/test_new_config.json @@ -0,0 +1,12 @@ +{ + "credentials": { + "developer_token": "developer_token", + "client_id": "client_id", + "client_secret": "client_secret", + "refresh_token": "refresh_token" + }, + "customer_id": "1234567890", + "start_date": "2023-09-04", + "conversion_window_days": 14, + "custom_queries_array": [] +} diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_models.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_models.py index 649fe36abad4d..7606a76bc7bf8 100644 --- a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_models.py +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_models.py @@ -2,20 +2,26 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # + +from unittest.mock import Mock + import pytest -from source_google_ads.models import Customer +from pendulum.tz.timezone import Timezone +from source_google_ads.models import CustomerModel + +def test_time_zone(mocker): + mocker.patch("source_google_ads.models.local_timezone", Mock(return_value=Timezone("Europe/Riga"))) -def test_time_zone(): - mock_account_info = [[{"customer.id": "8765"}]] - customers = Customer.from_accounts(mock_account_info) + mock_account_info = [{"customer_client.id": "8765"}] + customers = CustomerModel.from_accounts(mock_account_info) for customer in customers: - assert customer.time_zone == "local" + assert customer.time_zone.name == Timezone("Europe/Riga").name @pytest.mark.parametrize("is_manager_account", (True, False)) def test_manager_account(is_manager_account): - mock_account_info = [[{"customer.manager": is_manager_account, "customer.id": "8765"}]] - customers = Customer.from_accounts(mock_account_info) + mock_account_info = [{"customer_client.manager": is_manager_account, "customer_client.id": "8765"}] + customers = CustomerModel.from_accounts(mock_account_info) for customer in customers: assert customer.is_manager_account is is_manager_account diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_source.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_source.py index 9ebbd47702c24..6394817edd99b 100644 --- a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_source.py +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_source.py @@ -2,30 +2,31 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # + import re from collections import namedtuple -from unittest.mock import Mock +from unittest.mock import Mock, call +import pendulum import pytest from airbyte_cdk import AirbyteLogger -from freezegun import freeze_time -from google.ads.googleads.errors import GoogleAdsException -from google.ads.googleads.v11.errors.types.authorization_error import AuthorizationErrorEnum +from airbyte_cdk.models import AirbyteStream, ConfiguredAirbyteCatalog, ConfiguredAirbyteStream, DestinationSyncMode, SyncMode from pendulum import today from source_google_ads.custom_query_stream import IncrementalCustomQuery from source_google_ads.google_ads import GoogleAds +from source_google_ads.models import CustomerModel from source_google_ads.source import SourceGoogleAds -from source_google_ads.streams import AdGroupAdReport, AdGroupLabels, ServiceAccounts, chunk_date_range +from source_google_ads.streams import AdGroupAdLegacy, chunk_date_range from source_google_ads.utils import GAQL -from .common import MockErroringGoogleAdsClient, MockGoogleAdsClient, make_google_ads_exception +from .common import MockGoogleAdsClient @pytest.fixture -def mock_account_info(mocker): +def mock_get_customers(mocker): mocker.patch( - "source_google_ads.source.SourceGoogleAds.get_account_info", - Mock(return_value=[[{"customer.manager": False, "customer.time_zone": "Europe/Berlin", "customer.id": "8765"}]]), + "source_google_ads.source.SourceGoogleAds.get_customers", + Mock(return_value=[CustomerModel(is_manager_account=False, time_zone="Europe/Berlin", id="8765")]), ) @@ -34,7 +35,7 @@ def stream_mock(mocker, config, customers): def mock(latest_record): mocker.patch("source_google_ads.streams.GoogleAdsStream.read_records", Mock(return_value=[latest_record])) google_api = GoogleAds(credentials=config["credentials"]) - client = AdGroupAdReport( + client = AdGroupAdLegacy( start_date=config["start_date"], api=google_api, conversion_window_days=config["conversion_window_days"], customers=customers ) return client @@ -42,23 +43,6 @@ def mock(latest_record): return mock -@pytest.fixture -def mocked_gads_api(mocker): - def mock(response=None, failure_code=1, failure_msg="", error_type=""): - def side_effect_func(): - raise make_google_ads_exception(failure_code=failure_code, failure_msg=failure_msg, error_type=error_type) - yield - - side_effect = [] - if response: - side_effect.append(response) - if failure_msg or failure_code or error_type: - side_effect.append(side_effect_func()) - mocker.patch("source_google_ads.google_ads.GoogleAds.send_request", side_effect=side_effect) - - return mock - - @pytest.fixture() def mock_fields_meta_data(): DataType = namedtuple("DataType", ["name"]) @@ -105,51 +89,62 @@ def mock_fields_meta_data(): return Mock(get_fields_metadata=Mock(return_value={node.name: node for node in nodes})) -# Test chunk date range without end date -@freeze_time("2022-01-30") -def test_chunk_date_range_without_end_date(): - start_date_str = "2022-01-24" - conversion_window = 0 - field = "date" - response = chunk_date_range( - start_date=start_date_str, conversion_window=conversion_window, field=field, end_date=None, days_of_data_storage=None, range_days=1 - ) - expected_response = [ - {"start_date": "2022-01-25", "end_date": "2022-01-26"}, - {"start_date": "2022-01-26", "end_date": "2022-01-27"}, - {"start_date": "2022-01-27", "end_date": "2022-01-28"}, - {"start_date": "2022-01-28", "end_date": "2022-01-29"}, - {"start_date": "2022-01-29", "end_date": "2022-01-30"}, - {"start_date": "2022-01-30", "end_date": "2022-01-31"}, - ] - assert expected_response == response - - def test_chunk_date_range(): start_date = "2021-03-04" end_date = "2021-05-04" conversion_window = 14 - field = "date" - response = chunk_date_range(start_date, conversion_window, field, end_date, range_days=10) + slices = list( + chunk_date_range( + start_date=start_date, + end_date=end_date, + conversion_window=conversion_window, + slice_duration=pendulum.Duration(days=9), + time_zone="UTC", + ) + ) assert [ - {"start_date": "2021-02-19", "end_date": "2021-02-28"}, - {"start_date": "2021-03-01", "end_date": "2021-03-10"}, - {"start_date": "2021-03-11", "end_date": "2021-03-20"}, - {"start_date": "2021-03-21", "end_date": "2021-03-30"}, - {"start_date": "2021-03-31", "end_date": "2021-04-09"}, - {"start_date": "2021-04-10", "end_date": "2021-04-19"}, - {"start_date": "2021-04-20", "end_date": "2021-04-29"}, - {"start_date": "2021-04-30", "end_date": "2021-05-04"}, - ] == response - - -def test_streams_count(config, mock_account_info): + {"start_date": "2021-02-18", "end_date": "2021-02-27"}, + {"start_date": "2021-02-28", "end_date": "2021-03-09"}, + {"start_date": "2021-03-10", "end_date": "2021-03-19"}, + {"start_date": "2021-03-20", "end_date": "2021-03-29"}, + {"start_date": "2021-03-30", "end_date": "2021-04-08"}, + {"start_date": "2021-04-09", "end_date": "2021-04-18"}, + {"start_date": "2021-04-19", "end_date": "2021-04-28"}, + {"start_date": "2021-04-29", "end_date": "2021-05-04"}, + ] == slices + + +def test_streams_count(config, mock_get_customers): source = SourceGoogleAds() streams = source.streams(config) - expected_streams_number = 19 + expected_streams_number = 30 + print(f"{config=} \n{streams=}") assert len(streams) == expected_streams_number +def test_read_missing_stream(config, mock_get_customers): + source = SourceGoogleAds() + + catalog = ConfiguredAirbyteCatalog( + streams=[ + ConfiguredAirbyteStream( + stream=AirbyteStream( + name="fake_stream", + json_schema={}, + supported_sync_modes=[SyncMode.full_refresh], + ), + sync_mode=SyncMode.full_refresh, + destination_sync_mode=DestinationSyncMode.overwrite, + ) + ] + ) + + try: + list(source.read(AirbyteLogger(), config=config, catalog=catalog)) + except KeyError as error: + pytest.fail(str(error)) + + @pytest.mark.parametrize( ( "query", @@ -199,97 +194,95 @@ def stream_instance(query, api_mock, **kwargs): [ ( """ -SELECT - campaign.id, - campaign.name, - campaign.status, - metrics.impressions -FROM campaign -WHERE campaign.status = 'PAUSED' -AND metrics.impressions > 100 -ORDER BY campaign.status -""", + SELECT + campaign.id, + campaign.name, + campaign.status, + metrics.impressions + FROM campaign + WHERE campaign.status = 'PAUSED' + AND metrics.impressions > 100 + ORDER BY campaign.status + """, """ -SELECT - campaign.id, - campaign.name, - campaign.status, - metrics.impressions, - segments.date -FROM campaign -WHERE campaign.status = 'PAUSED' -AND metrics.impressions > 100 - AND segments.date BETWEEN '1980-01-01' AND '2000-01-01' -ORDER BY campaign.status -""", + SELECT + campaign.id, + campaign.name, + campaign.status, + metrics.impressions, + segments.date + FROM campaign + WHERE campaign.status = 'PAUSED' + AND metrics.impressions > 100 + AND segments.date BETWEEN '1980-01-01' AND '2000-01-01' + ORDER BY campaign.status + """, ), ( """ -SELECT - campaign.id, - campaign.name, - campaign.status, - metrics.impressions -FROM campaign -ORDER BY campaign.status -""", + SELECT + campaign.id, + campaign.name, + campaign.status, + metrics.impressions + FROM campaign + ORDER BY campaign.status + """, """ -SELECT - campaign.id, - campaign.name, - campaign.status, - metrics.impressions, - segments.date -FROM campaign - -WHERE segments.date BETWEEN '1980-01-01' AND '2000-01-01' -ORDER BY campaign.status -""", + SELECT + campaign.id, + campaign.name, + campaign.status, + metrics.impressions, + segments.date + FROM campaign + WHERE segments.date BETWEEN '1980-01-01' AND '2000-01-01' + ORDER BY campaign.status + """, ), ( """ -SELECT - campaign.id, - campaign.name, - campaign.status, - metrics.impressions -FROM campaign -WHERE campaign.status = 'PAUSED' -AND metrics.impressions > 100 -""", + SELECT + campaign.id, + campaign.name, + campaign.status, + metrics.impressions + FROM campaign + WHERE campaign.status = 'PAUSED' + AND metrics.impressions > 100 + """, """ -SELECT - campaign.id, - campaign.name, - campaign.status, - metrics.impressions, - segments.date -FROM campaign -WHERE campaign.status = 'PAUSED' -AND metrics.impressions > 100 - AND segments.date BETWEEN '1980-01-01' AND '2000-01-01' -""", + SELECT + campaign.id, + campaign.name, + campaign.status, + metrics.impressions, + segments.date + FROM campaign + WHERE campaign.status = 'PAUSED' + AND metrics.impressions > 100 + AND segments.date BETWEEN '1980-01-01' AND '2000-01-01' + """, ), ( """ -SELECT - campaign.accessible_bidding_strategy, - segments.ad_destination_type, - campaign.start_date, - campaign.end_date -FROM campaign -""", + SELECT + campaign.accessible_bidding_strategy, + segments.ad_destination_type, + campaign.start_date, + campaign.end_date + FROM campaign + """, """ -SELECT - campaign.accessible_bidding_strategy, - segments.ad_destination_type, - campaign.start_date, - campaign.end_date, - segments.date -FROM campaign - -WHERE segments.date BETWEEN '1980-01-01' AND '2000-01-01' -""", + SELECT + campaign.accessible_bidding_strategy, + segments.ad_destination_type, + campaign.start_date, + campaign.end_date, + segments.date + FROM campaign + WHERE segments.date BETWEEN '1980-01-01' AND '2000-01-01' + """, ), ], ) @@ -400,7 +393,7 @@ def test_check_connection_should_pass_when_config_valid(mocker): "customer_id": "fake_customer_id", "start_date": "2022-01-01", "conversion_window_days": 14, - "custom_queries": [ + "custom_queries_array": [ { "query": "SELECT campaign.accessible_bidding_strategy, segments.ad_destination_type, campaign.start_date, campaign.end_date FROM campaign", "primary_key": None, @@ -426,49 +419,6 @@ def test_check_connection_should_pass_when_config_valid(mocker): assert message is None -def test_check_connection_should_fail_when_api_call_fails(mocker): - # We patch the object inside source.py because that's the calling context - # https://docs.python.org/3/library/unittest.mock.html#where-to-patch - mocker.patch("source_google_ads.source.GoogleAds", MockErroringGoogleAdsClient) - source = SourceGoogleAds() - check_successful, message = source.check_connection( - AirbyteLogger(), - { - "credentials": { - "developer_token": "fake_developer_token", - "client_id": "fake_client_id", - "client_secret": "fake_client_secret", - "refresh_token": "fake_refresh_token", - }, - "customer_id": "fake_customer_id", - "start_date": "2022-01-01", - "conversion_window_days": 14, - "custom_queries": [ - { - "query": "SELECT campaign.accessible_bidding_strategy, segments.ad_destination_type, campaign.start_date, campaign.end_date FROM campaign", - "primary_key": None, - "cursor_field": "campaign.start_date", - "table_name": "happytable", - }, - { - "query": "SELECT segments.ad_destination_type, segments.ad_network_type, segments.day_of_week, customer.auto_tagging_enabled, customer.id, metrics.conversions, campaign.start_date FROM campaign", - "primary_key": "customer.id", - "cursor_field": None, - "table_name": "unhappytable", - }, - { - "query": "SELECT ad_group.targeting_setting.target_restrictions FROM ad_group", - "primary_key": "customer.id", - "cursor_field": None, - "table_name": "ad_group_custom", - }, - ], - }, - ) - assert not check_successful - assert message.startswith("Unable to connect to Google Ads API with the provided configuration") - - def test_end_date_is_not_in_the_future(customers): source = SourceGoogleAds() config = source.get_incremental_stream_config( @@ -477,49 +427,9 @@ def test_end_date_is_not_in_the_future(customers): assert config.get("end_date") == today().to_date_string() -def test_invalid_custom_query_handled(mocked_gads_api, config): - # limit to one custom query, otherwise need to mock more side effects - config["custom_queries"] = [next(iter(config["custom_queries"]))] - mocked_gads_api( - response=[{"customer.id": "8765"}], - failure_msg="Unrecognized field in the query: 'ad_group_ad.ad.video_ad.media_file'", - error_type="request_error", - ) - source = SourceGoogleAds() - status_ok, error = source.check_connection(AirbyteLogger(), config) - assert not status_ok - assert error == ( - "Unable to connect to Google Ads API with the provided configuration - Unrecognized field in the query: " - "'ad_group_ad.ad.video_ad.media_file'" - ) - - -@pytest.mark.parametrize( - ("cls", "error", "failure_code", "raise_expected"), - ( - (AdGroupLabels, "authorization_error", AuthorizationErrorEnum.AuthorizationError.CUSTOMER_NOT_ENABLED, False), - (AdGroupLabels, "internal_error", 1, True), - (ServiceAccounts, "authentication_error", 1, True), - (ServiceAccounts, "internal_error", 1, True), - ), -) -def test_read_record_error_handling(config, customers, caplog, mocked_gads_api, cls, error, failure_code, raise_expected): - error_msg = "Some unexpected error" - mocked_gads_api(failure_code=failure_code, failure_msg=error_msg, error_type=error) - google_api = GoogleAds(credentials=config["credentials"]) - stream = cls(api=google_api, customers=customers) - if raise_expected: - with pytest.raises(GoogleAdsException): - for _ in stream.read_records(sync_mode=Mock(), stream_slice={"customer_id": "1234567890"}): - pass - else: - for _ in stream.read_records(sync_mode=Mock(), stream_slice={"customer_id": "1234567890"}): - pass - - def test_stream_slices(config, customers): google_api = GoogleAds(credentials=config["credentials"]) - stream = AdGroupAdReport( + stream = AdGroupAdLegacy( start_date=config["start_date"], api=google_api, conversion_window_days=config["conversion_window_days"], @@ -528,8 +438,84 @@ def test_stream_slices(config, customers): ) slices = list(stream.stream_slices()) assert slices == [ - {"start_date": "2020-12-19", "end_date": "2021-01-02", "customer_id": "123"}, - {"start_date": "2021-01-03", "end_date": "2021-01-17", "customer_id": "123"}, - {"start_date": "2021-01-18", "end_date": "2021-02-01", "customer_id": "123"}, - {"start_date": "2021-02-02", "end_date": "2021-02-10", "customer_id": "123"}, + {"start_date": "2020-12-18", "end_date": "2021-01-01", "customer_id": "123", "login_customer_id": None}, + {"start_date": "2021-01-02", "end_date": "2021-01-16", "customer_id": "123", "login_customer_id": None}, + {"start_date": "2021-01-17", "end_date": "2021-01-31", "customer_id": "123", "login_customer_id": None}, + {"start_date": "2021-02-01", "end_date": "2021-02-10", "customer_id": "123", "login_customer_id": None}, ] + + +def mock_send_request(query: str, customer_id: str, login_customer_id: str = "default"): + print(query, customer_id, login_customer_id) + if customer_id == "123": + if "WHERE customer_client.status in ('active')" in query: + return [ + [ + {"customer_client.id": "123", "customer_client.status": "active"}, + ] + ] + else: + return [ + [ + {"customer_client.id": "123", "customer_client.status": "active"}, + {"customer_client.id": "456", "customer_client.status": "disabled"}, + ] + ] + else: + return [ + [ + {"customer_client.id": "789", "customer_client.status": "active"}, + ] + ] + + +@pytest.mark.parametrize( + "customer_status_filter, expected_ids, send_request_calls", + [ + ( + [], + ["123", "456", "789"], + [ + call( + "SELECT customer_client.client_customer, customer_client.level, customer_client.id, customer_client.manager, customer_client.time_zone, customer_client.status FROM customer_client", + customer_id="123", + ), + call( + "SELECT customer_client.client_customer, customer_client.level, customer_client.id, customer_client.manager, customer_client.time_zone, customer_client.status FROM customer_client", + customer_id="789", + ), + ], + ), # Empty filter, expect all customers + ( + ["active"], + ["123", "789"], + [ + call( + "SELECT customer_client.client_customer, customer_client.level, customer_client.id, customer_client.manager, customer_client.time_zone, customer_client.status FROM customer_client WHERE customer_client.status in ('active')", + customer_id="123", + ), + call( + "SELECT customer_client.client_customer, customer_client.level, customer_client.id, customer_client.manager, customer_client.time_zone, customer_client.status FROM customer_client WHERE customer_client.status in ('active')", + customer_id="789", + ), + ], + ), # Non-empty filter, expect filtered customers + ], +) +def test_get_customers(mocker, customer_status_filter, expected_ids, send_request_calls): + mock_google_api = Mock() + + mock_google_api.get_accessible_accounts.return_value = ["123", "789"] + mock_google_api.send_request.side_effect = mock_send_request + mock_google_api.parse_single_result.side_effect = lambda schema, result: result + + mock_config = {"customer_status_filter": customer_status_filter, "customer_ids": ["123", "456", "789"]} + + source = SourceGoogleAds() + + customers = source.get_customers(mock_google_api, mock_config) + + mock_google_api.send_request.assert_has_calls(send_request_calls) + + assert len(customers) == len(expected_ids) + assert {customer.id for customer in customers} == set(expected_ids) diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_streams.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_streams.py index 26b38110ddd5d..a171b869d3d22 100644 --- a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_streams.py +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_streams.py @@ -2,27 +2,19 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # -import logging + from unittest.mock import Mock import pytest from airbyte_cdk.models import SyncMode +from airbyte_cdk.utils import AirbyteTracedException from google.ads.googleads.errors import GoogleAdsException -from google.ads.googleads.v11.errors.types.errors import ErrorCode, GoogleAdsError, GoogleAdsFailure -from google.ads.googleads.v11.errors.types.request_error import RequestErrorEnum -from google.api_core.exceptions import DataLoss, InternalServerError, ResourceExhausted, TooManyRequests +from google.ads.googleads.v15.errors.types.errors import ErrorCode, GoogleAdsError, GoogleAdsFailure +from google.ads.googleads.v15.errors.types.request_error import RequestErrorEnum +from google.api_core.exceptions import DataLoss, InternalServerError, ResourceExhausted, TooManyRequests, Unauthenticated from grpc import RpcError from source_google_ads.google_ads import GoogleAds -from source_google_ads.streams import ClickView, cyclic_sieve - -from .common import MockGoogleAdsClient as MockGoogleAdsClient - - -@pytest.fixture -def mock_ads_client(mocker, config): - """Mock google ads library method, so it returns mocked Client""" - mocker.patch("source_google_ads.google_ads.GoogleAdsClient.load_from_dict", return_value=MockGoogleAdsClient(config)) - +from source_google_ads.streams import AdGroup, ClickView, Customer, CustomerLabel # EXPIRED_PAGE_TOKEN exception will be raised when page token has expired. exception = GoogleAdsException( @@ -59,7 +51,7 @@ class MockGoogleAds(GoogleAds): def parse_single_result(self, schema, result): return result - def send_request(self, query: str, customer_id: str): + def send_request(self, query: str, customer_id: str, login_customer_id: str = "none"): self.count += 1 if self.count == 1: return mock_response_1() @@ -67,7 +59,7 @@ def send_request(self, query: str, customer_id: str): return mock_response_2() -def test_page_token_expired_retry_succeeds(mock_ads_client, config, customers): +def test_page_token_expired_retry_succeeds(config, customers): """ Page token expired while reading records on date 2021-01-03 The latest read record is {"segments.date": "2021-01-03", "click_view.gclid": "4"} @@ -75,7 +67,7 @@ def test_page_token_expired_retry_succeeds(mock_ads_client, config, customers): It shouldn't read records on 2021-01-01, 2021-01-02 """ customer_id = next(iter(customers)).id - stream_slice = {"customer_id": customer_id, "start_date": "2021-01-01", "end_date": "2021-01-15"} + stream_slice = {"customer_id": customer_id, "start_date": "2021-01-01", "end_date": "2021-01-15", "login_customer_id": customer_id} google_api = MockGoogleAds(credentials=config["credentials"]) incremental_stream_config = dict( @@ -92,7 +84,9 @@ def test_page_token_expired_retry_succeeds(mock_ads_client, config, customers): result = list(stream.read_records(sync_mode=SyncMode.incremental, cursor_field=["segments.date"], stream_slice=stream_slice)) assert len(result) == 9 assert stream.get_query.call_count == 2 - stream.get_query.assert_called_with({"customer_id": customer_id, "start_date": "2021-01-03", "end_date": "2021-01-15"}) + stream.get_query.assert_called_with( + {"customer_id": customer_id, "start_date": "2021-01-03", "end_date": "2021-01-15", "login_customer_id": customer_id} + ) def mock_response_fails_1(): @@ -118,7 +112,7 @@ def mock_response_fails_2(): class MockGoogleAdsFails(MockGoogleAds): - def send_request(self, query: str, customer_id: str): + def send_request(self, query: str, customer_id: str, login_customer_id: str = "none"): self.count += 1 if self.count == 1: return mock_response_fails_1() @@ -126,13 +120,13 @@ def send_request(self, query: str, customer_id: str): return mock_response_fails_2() -def test_page_token_expired_retry_fails(mock_ads_client, config, customers): +def test_page_token_expired_retry_fails(config, customers): """ Page token has expired while reading records within date "2021-01-03", it should raise error, because Google Ads API doesn't allow filter by datetime. """ customer_id = next(iter(customers)).id - stream_slice = {"customer_id": customer_id, "start_date": "2021-01-01", "end_date": "2021-01-15"} + stream_slice = {"customer_id": customer_id, "start_date": "2021-01-01", "end_date": "2021-01-15", "login_customer_id": customer_id} google_api = MockGoogleAdsFails(credentials=config["credentials"]) incremental_stream_config = dict( @@ -146,10 +140,16 @@ def test_page_token_expired_retry_fails(mock_ads_client, config, customers): stream.get_query = Mock() stream.get_query.return_value = "query" - with pytest.raises(GoogleAdsException): + with pytest.raises(AirbyteTracedException) as exception: list(stream.read_records(sync_mode=SyncMode.incremental, cursor_field=["segments.date"], stream_slice=stream_slice)) + assert exception.value.message == ( + "Page token has expired during processing response. " + "Please contact the Airbyte team with the link of your connection for assistance." + ) - stream.get_query.assert_called_with({"customer_id": customer_id, "start_date": "2021-01-03", "end_date": "2021-01-15"}) + stream.get_query.assert_called_with( + {"customer_id": customer_id, "start_date": "2021-01-03", "end_date": "2021-01-15", "login_customer_id": customer_id} + ) assert stream.get_query.call_count == 2 @@ -165,18 +165,18 @@ def mock_response_fails_one_date(): class MockGoogleAdsFailsOneDate(MockGoogleAds): - def send_request(self, query: str, customer_id: str): + def send_request(self, query: str, customer_id: str, login_customer_id: str = "none"): return mock_response_fails_one_date() -def test_page_token_expired_it_should_fail_date_range_1_day(mock_ads_client, config, customers): +def test_page_token_expired_it_should_fail_date_range_1_day(config, customers): """ Page token has expired while reading records within date "2021-01-03", it should raise error, because Google Ads API doesn't allow filter by datetime. Minimum date range is 1 day. """ customer_id = next(iter(customers)).id - stream_slice = {"customer_id": customer_id, "start_date": "2021-01-03", "end_date": "2021-01-04"} + stream_slice = {"customer_id": customer_id, "start_date": "2021-01-03", "end_date": "2021-01-04", "login_customer_id": customer_id} google_api = MockGoogleAdsFailsOneDate(credentials=config["credentials"]) incremental_stream_config = dict( @@ -190,20 +190,27 @@ def test_page_token_expired_it_should_fail_date_range_1_day(mock_ads_client, con stream.get_query = Mock() stream.get_query.return_value = "query" - with pytest.raises(GoogleAdsException): + with pytest.raises(AirbyteTracedException) as exception: list(stream.read_records(sync_mode=SyncMode.incremental, cursor_field=["segments.date"], stream_slice=stream_slice)) - - stream.get_query.assert_called_with({"customer_id": customer_id, "start_date": "2021-01-03", "end_date": "2021-01-04"}) + assert exception.value.message == ( + "Page token has expired during processing response. " + "Please contact the Airbyte team with the link of your connection for assistance." + ) + stream.get_query.assert_called_with( + {"customer_id": customer_id, "start_date": "2021-01-03", "end_date": "2021-01-04", "login_customer_id": customer_id} + ) assert stream.get_query.call_count == 1 @pytest.mark.parametrize("error_cls", (ResourceExhausted, TooManyRequests, InternalServerError, DataLoss)) def test_retry_transient_errors(mocker, config, customers, error_cls): + customer_id = next(iter(customers)).id + mocker.patch("time.sleep") credentials = config["credentials"] credentials.update(use_proto_plus=True) api = GoogleAds(credentials=credentials) - mocked_search = mocker.patch.object(api.ga_service, "search", side_effect=error_cls("Error message")) + mocked_search = mocker.patch.object(api.ga_services["default"], "search", side_effect=error_cls("Error message")) incremental_stream_config = dict( api=api, conversion_window_days=config["conversion_window_days"], @@ -212,21 +219,82 @@ def test_retry_transient_errors(mocker, config, customers, error_cls): customers=customers, ) stream = ClickView(**incremental_stream_config) - customer_id = next(iter(customers)).id - stream_slice = {"customer_id": customer_id, "start_date": "2021-01-03", "end_date": "2021-01-04"} + stream_slice = {"customer_id": customer_id, "start_date": "2021-01-03", "end_date": "2021-01-04", "login_customer_id": "default"} records = [] - with pytest.raises(error_cls): + with pytest.raises(error_cls) as exception: records = list(stream.read_records(sync_mode=SyncMode.incremental, cursor_field=["segments.date"], stream_slice=stream_slice)) + assert exception.value.message == "Error message" + assert mocked_search.call_count == 5 assert records == [] -def test_cyclic_sieve(caplog): - original_logger = logging.getLogger("test") - sieve = cyclic_sieve(original_logger, fraction=10) - for _ in range(20): - sieve.info("Ground Control to Major Tom") - sieve.info("Your circuit's dead, there's something wrong") - sieve.info("Can you hear me, Major Tom?") - sieve.bump() - assert len(caplog.records) == 6 # 20 * 3 / 10 +def test_parse_response(mocker, customers, config): + """ + Tests the `parse_response` method of the `Customer` class. + The test checks if the optimization_score_weight of type int is converted to float. + """ + + # Prepare sample input data + response = [ + {"customer.id": "1", "segments.date": "2023-09-19", "customer.optimization_score_weight": 80}, + {"customer.id": "2", "segments.date": "2023-09-20", "customer.optimization_score_weight": 80.0}, + {"customer.id": "3", "segments.date": "2023-09-21"}, + ] + mocker.patch("source_google_ads.streams.GoogleAdsStream.parse_response", Mock(return_value=response)) + + credentials = config["credentials"] + api = GoogleAds(credentials=credentials) + + incremental_stream_config = dict( + api=api, + conversion_window_days=config["conversion_window_days"], + start_date=config["start_date"], + end_date="2021-04-04", + customers=customers, + ) + + # Create an instance of the Customer class + accounts = Customer(**incremental_stream_config) + + # Use the parse_response method and get the output + output = list(accounts.parse_response(response)) + + # Expected output after the method's logic + expected_output = [ + {"customer.id": "1", "segments.date": "2023-09-19", "customer.optimization_score_weight": 80.0}, + {"customer.id": "2", "segments.date": "2023-09-20", "customer.optimization_score_weight": 80.0}, + {"customer.id": "3", "segments.date": "2023-09-21"}, + ] + + assert output == expected_output + + +def test_read_records_unauthenticated(mocker, customers, config): + credentials = config["credentials"] + api = GoogleAds(credentials=credentials) + + mocker.patch.object(api, "parse_single_result", side_effect=Unauthenticated(message="Unauthenticated")) + + stream_config = dict( + api=api, + customers=customers, + ) + stream = CustomerLabel(**stream_config) + with pytest.raises(AirbyteTracedException) as exc_info: + list(stream.read_records(SyncMode.full_refresh, {"customer_id": "customer_id", "login_customer_id": "default"})) + + assert exc_info.value.message == ( + "Authentication failed for the customer 'customer_id'. " "Please try to Re-authenticate your credentials on set up Google Ads page." + ) + + +def test_ad_group_stream_query_removes_metrics_field_for_manager(customers_manager, customers, config): + credentials = config["credentials"] + api = GoogleAds(credentials=credentials) + stream_config = dict(api=api, customers=customers_manager, start_date="2020-01-01", conversion_window_days=10) + stream = AdGroup(**stream_config) + assert "metrics" not in stream.get_query(stream_slice={"customer_id": "123"}) + stream_config = dict(api=api, customers=customers, start_date="2020-01-01", conversion_window_days=10) + stream = AdGroup(**stream_config) + assert "metrics" in stream.get_query(stream_slice={"customer_id": "123"}) diff --git a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_utils.py b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_utils.py index 146e3b948f75d..7c42cd50360e0 100644 --- a/airbyte-integrations/connectors/source-google-ads/unit_tests/test_utils.py +++ b/airbyte-integrations/connectors/source-google-ads/unit_tests/test_utils.py @@ -2,8 +2,15 @@ # Copyright (c) 2023 Airbyte, Inc., all rights reserved. # + +from datetime import datetime +from unittest.mock import Mock + +import backoff import pytest -from source_google_ads.utils import GAQL +from airbyte_cdk.utils import AirbyteTracedException +from source_google_ads import SourceGoogleAds +from source_google_ads.utils import GAQL, generator_backoff def test_parse_GAQL_ok(): @@ -52,13 +59,15 @@ def test_parse_GAQL_ok(): assert sql.parameters == "" assert str(sql) == "SELECT t.field1, t.field2 FROM x_Table ORDER BY field2, field1 LIMIT 10" - sql = GAQL.parse(""" + sql = GAQL.parse( + """ SELECT field1, field2 FROM x_Table WHERE date = '2020-01-01' ORDER BY field2 ASC, field1 DESC LIMIT 10 - PARAMETERS include_drafts=true """) + PARAMETERS include_drafts=true """ + ) assert sql.fields == ("field1", "field2") assert sql.resource_name == "x_Table" @@ -66,20 +75,26 @@ def test_parse_GAQL_ok(): assert sql.order_by == "field2 ASC, field1 DESC" assert sql.limit == 10 assert sql.parameters == "include_drafts=true" - assert str(sql) == "SELECT field1, field2 FROM x_Table WHERE date = '2020-01-01' ORDER BY field2 ASC, field1 DESC LIMIT 10 PARAMETERS include_drafts=true" - + assert ( + str(sql) + == "SELECT field1, field2 FROM x_Table WHERE date = '2020-01-01' ORDER BY field2 ASC, field1 DESC LIMIT 10 PARAMETERS include_drafts=true" + ) -def test_parse_GAQL_fail(): - with pytest.raises(Exception) as e: - GAQL.parse("SELECT field1, field2 FROM x_Table2") - assert str(e.value) == "incorrect GAQL query statement: 'SELECT field1, field2 FROM x_Table2'" - with pytest.raises(Exception) as e: - GAQL.parse("SELECT field1, field2 FROM x_Table WHERE ") - with pytest.raises(Exception) as e: - GAQL.parse("SELECT field1, , field2 FROM table") - with pytest.raises(Exception) as e: - GAQL.parse("SELECT fie ld1, field2 FROM table") +@pytest.mark.parametrize( + "config", + [ + {"custom_queries_array": [{"query": "SELECT field1, field2 FROM x_Table2", "table_name": "test_table"}]}, + {"custom_queries_array": [{"query": "SELECT field1, field2 FROM x_Table WHERE ", "table_name": "test_table"}]}, + {"custom_queries_array": [{"query": "SELECT field1, , field2 FROM table", "table_name": "test_table"}]}, + {"custom_queries_array": [{"query": "SELECT fie ld1, field2 FROM table", "table_name": "test_table"}]}, + ], +) +def test_parse_GAQL_fail(config): + with pytest.raises(AirbyteTracedException) as e: + SourceGoogleAds._validate_and_transform(config) + expected_message = "The custom GAQL query test_table failed. Validate your GAQL query with the Google Ads query validator. https://developers.google.com/google-ads/api/fields/v15/query_validator" + assert e.value.message == expected_message @pytest.mark.parametrize( @@ -114,3 +129,75 @@ def test_parse_GAQL_fail(): ) def test_get_query_fields(query, fields): assert list(GAQL.parse(query).fields) == fields + + +def test_generator_backoff_retries_until_success(): + tries = 0 + + def flaky_function(): + nonlocal tries # Declare tries as nonlocal to modify it within the function + if tries < 2: + tries += 1 + raise ValueError("Simulated failure") + else: + yield "Success" + + # Mock on_backoff callable + mock_on_backoff = Mock() + + # Apply the decorator to the flaky_function + decorated_flaky_function = generator_backoff( + wait_gen=backoff.expo, + exception=ValueError, + max_tries=4, + max_time=5, + on_backoff=mock_on_backoff, + factor=2, + )(flaky_function) + + # Start the clock + start_time = datetime.now() + + # Run the decorated function and collect results + results = list(decorated_flaky_function()) + + # Check that the function succeeded after retries + assert results == ["Success"] + + # Check that the function was retried the correct number of times + assert mock_on_backoff.call_count == 2 + + # Check that the elapsed time is reasonable + elapsed_time = (datetime.now() - start_time).total_seconds() + # The wait times are 3 and then 2 seconds, so the elapsed time should be at least 5 seconds + assert elapsed_time >= 5 + + # Check that on_backoff was called with the correct parameters + expected_calls = [ + { + "target": flaky_function, + "args": (), + "kwargs": {}, + "tries": 1, + "elapsed": pytest.approx(0.1, abs=0.1), + "wait": pytest.approx(2, abs=0.1), + "exception": "Simulated failure", + }, + { + "target": flaky_function, + "args": (), + "kwargs": {}, + "tries": 2, + "elapsed": pytest.approx(2, abs=0.1), + "wait": pytest.approx(3, abs=0.1), + "exception": "Simulated failure", + }, + ] + + # Convert actual calls to a list of dictionaries + actual_calls = [{**c.args[0], "exception": str(c.args[0]["exception"])} for c in mock_on_backoff.call_args_list] + print(actual_calls) + + # Compare each expected call with the actual call + for expected, actual in zip(expected_calls, actual_calls): + assert expected == actual