Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🎉 Source Amazon Ads : Add attribution reports #16342

Merged

Conversation

ganpatagarwal
Copy link
Contributor

What

*Add attribution reports

How

*Call attribution report API for different report types

Recommended reading order

  1. source.py
  2. streams/attribution_report.py

🚨 User Impact 🚨

No impact to existing functionality. Not a breaking change

Pre-merge Checklist

Updating a connector

Community member or Airbyter

  • Grant edit access to maintainers (instructions)
  • Secrets in the connector's spec are annotated with airbyte_secret
  • Unit & integration tests added and passing. Community members, please provide proof of success locally e.g: screenshot or copy-paste unit, integration, and acceptance test output. To run acceptance tests for a Python connector, follow instructions in the README. For java connectors run ./gradlew :airbyte-integrations:connectors:<name>:integrationTest.
  • Code reviews completed
  • Documentation updated
    • Connector's README.md
    • Connector's bootstrap.md. See description and examples
    • Changelog updated in docs/integrations/<source or destination>/<name>.md including changelog. See changelog example
  • PR name follows PR naming conventions

Airbyter

If this is a community PR, the Airbyte engineer reviewing this PR is responsible for the below items.

  • Create a non-forked branch based on this PR and test the below items on it
  • Build is successful
  • If new credentials are required for use in CI, add them to GSM. Instructions.
  • /test connector=connectors/<name> command is passing
  • New Connector version released on Dockerhub and connector version bumped by running the /publish command described here

Tests

Unit

Results (4.23s):
      55 passed
Name                                                              Stmts   Miss  Cover   Missing
-----------------------------------------------------------------------------------------------
source_amazon_ads/__init__.py                                         2      0   100%
source_amazon_ads/constants.py                                        1      0   100%
source_amazon_ads/schemas/__init__.py                                 7      0   100%
source_amazon_ads/schemas/attribution_report.py                      21      0   100%
source_amazon_ads/schemas/common.py                                  51      1    98%   26
source_amazon_ads/schemas/profile.py                                 16      0   100%
source_amazon_ads/schemas/sponsored_brands.py                        22      0   100%
source_amazon_ads/schemas/sponsored_display.py                       31      0   100%
source_amazon_ads/schemas/sponsored_products.py                      37      0   100%
source_amazon_ads/source.py                                          44      1    98%   129
source_amazon_ads/streams/__init__.py                                 7      0   100%
source_amazon_ads/streams/attribution_report.py                      78      0   100%
source_amazon_ads/streams/common.py                                  79      1    99%   157
source_amazon_ads/streams/profiles.py                                21      0   100%
source_amazon_ads/streams/report_streams/__init__.py                  5      0   100%
source_amazon_ads/streams/report_streams/brands_report.py            10      0   100%
source_amazon_ads/streams/report_streams/brands_video_report.py      10      0   100%
source_amazon_ads/streams/report_streams/display_report.py           16      0   100%
source_amazon_ads/streams/report_streams/products_report.py          18      0   100%
source_amazon_ads/streams/report_streams/report_streams.py          237     18    92%   137, 190-191, 243-244, 363-364, 396-398, 409-413, 427-428, 430
source_amazon_ads/streams/sponsored_brands.py                        17      0   100%
source_amazon_ads/streams/sponsored_display.py                       22      0   100%
source_amazon_ads/streams/sponsored_products.py                      32      0   100%
source_amazon_ads/utils.py                                            9      0   100%
unit_tests/__init__.py                                                0      0   100%
unit_tests/conftest.py                                               34      0   100%
unit_tests/test_attribution_report.py                                56      1    98%   47
unit_tests/test_report_streams.py                                   288      0   100%
unit_tests/test_source.py                                            47      0   100%
unit_tests/test_streams.py                                          126      1    99%   77
unit_tests/utils.py                                                  32      0   100%
-----------------------------------------------------------------------------------------------
TOTAL                                                              1376     23    98%
Integration

Put your integration tests output here.

Acceptance

Put your acceptance tests output here.

@github-actions github-actions bot added area/connectors Connector related issues area/documentation Improvements or additions to documentation labels Sep 6, 2022
@ganpatagarwal
Copy link
Contributor Author

Need help with acceptance tests.

With my version of secrets/config.json file, it's stuck after reaching 70%. Looks like tests are based for a specific ads account.

python -m pytest -p integration_tests.acceptance
Test session starts (platform: darwin, Python 3.9.11, pytest 6.1.2, pytest-sugar 0.9.5)
cachedir: .pytest_cache
hypothesis profile 'default' -> database=DirectoryBasedExampleDatabase('/Users/ganpatagarwal/stoke/airbyte/airbyte-integrations/connectors/source-amazon-ads/.hypothesis/examples')
rootdir: /Users/ganpatagarwal/stoke/airbyte, configfile: pytest.ini
plugins: sugar-0.9.5, requests-mock-1.9.3, mock-3.7.0, hypothesis-6.54.4, timeout-1.4.2, cov-3.0.0
collecting ...
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_config_match_spec[inputs0] ✓                                         3% ▍
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_match_expected[inputs0] ✓                                            6% ▋
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_docker_env[inputs0] ✓                                                9% ▉
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_oneof_usage[inputs0] ✓                                              12% █▎
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_required[inputs0] ✓                                                 15% █▌
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_optional[inputs0] ✓                                                 18% █▊
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_has_secret[inputs0] ✓                                               21% ██▎
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_secret_never_in_the_output[inputs0] ✓                               24% ██▌
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_defined_refs_exist_in_json_spec_file[inputs0] ✓                     27% ██▊
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_oauth_flow_parameters[inputs0] ✓                                    30% ███
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_backward_compatibility[inputs0] ✓                                   33% ███▍
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestSpec.test_additional_properties_is_true[inputs0] ✓                            36% ███▋
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestConnection.test_check[inputs0] ✓                                              39% ███▉
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestConnection.test_check[inputs1] ✓                                              42% ████▎
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_discover[inputs0] ✓                                            45% ████▋
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_defined_cursors_exist_in_schema[inputs0] ✓                     48% ████▉
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_defined_refs_exist_in_schema[inputs0] ✓                        52% █████▎
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_defined_keyword_exist_in_schema[inputs0-allOf] ✓               55% █████▌
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_defined_keyword_exist_in_schema[inputs0-not] ✓                 58% █████▊
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_primary_keys_exist_in_schema[inputs0] ✓                        61% ██████▏
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_streams_has_sync_modes[inputs0] ✓                              64% ██████▍
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_additional_properties_is_true[inputs0] ✓                       67% ██████▋
 airbyte-integrations/bases/source-acceptance-test/source_acceptance_test/tests/test_core.py::TestDiscovery.test_backward_compatibility[inputs0] ✓                              70% ███████   ^C
{"type": "LOG", "log": {"level": "INFO", "message": "/Users/ganpatagarwal/stoke/airbyte/airbyte-integrations/connectors/source-amazon-ads - SAT run - 4d86c53ca5646a106dda7d35226e032637529b26 - PASSED"}}

@sajarin sajarin added bounty-M Maintainer program: claimable medium bounty PR bounty-L Maintainer program: claimable large bounty PR and removed bounty-M Maintainer program: claimable medium bounty PR labels Sep 6, 2022
@@ -38,3 +38,5 @@ tests:
ignored_fields:
"sponsored_products_report_stream": ["updatedAt"]
timeout_seconds: 3600
- config_path: "secrets/config.json"
configured_catalog_path: "integration_tests/configured_catalog_attribution_report.json"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so, secrets/config_report.json looks like a secret for report, a little different than the one for integration_tests/configured_catalog.json, can you merge the configured catalog to either configured_catalog.json or configured_catalog_report.json

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you please differentiate between contents of files secrets/config_report.json and secrets/config.json.

Merging them with existing catalogue would still use the same secret file.

I would like to keep it segregated for attribution reports unless they are causing any issues with integration test suite.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

configured_catalog.json uses secrets/config.json, and configured_catalog_report.json uses secrets/config_report.json, if configured_catalog_attribution_report.json also uses secrets/config.json, can you merge the json to integration_tests/configured_catalog.json?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

have merged it, but if you can share the difference between contents of files secrets/config_report.json and secrets/config.json, it will be helpful to understand. Thanks

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The CI may use multiple secret sets, but I only got one set of secrets. I will ask IT to share it with me. In my local environment, I use the same content for the both.

You mentioned that you were stuck in 70%, I am able to reach 73% after fixing the test_backward_compatibility, here's my change: YiyangLi@9341fc6 since we are using different accounts, the fix doesn't help you too much. Can you try again by removing expect_records?

I am currently stuck at 73%, TestBasicRead.test_read, even if I remove basic_read section, I will be stuck at incremental read. I wonder if that's different on your side, and I may fix the dev account on our side.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After pulling the latest from master it's going till 72%, before getting stuck at TestBasicRead.test_read[inputs0]

I tried with removing expect_records section, but same results.

When I removed basic_read section, success % reached till 82% before getting stuck at incremental read.

@sajarin sajarin added bounty-XL Maintainer program: claimable extra large bounty PR and removed bounty-L Maintainer program: claimable large bounty PR labels Sep 8, 2022
@YiyangLi
Copy link
Contributor

YiyangLi commented Sep 8, 2022

regarding the test being stuck at 70%, can you remove the expect_records section and try again?

      expect_records:
        path: "integration_tests/expected_records.txt"
        extra_fields: no
        exact_order: no
        extra_records: no

@YiyangLi
Copy link
Contributor

YiyangLi commented Sep 8, 2022

@sajarin can you help cherry-pick this commit to the topic branch? YiyangLi@9341fc6

It's irrelevant to this topic branch. The acceptance test fails at TestDiscovery.test_backward_compatibility even in the master branch because of the missing data. I added the data back.

I don't know why, in my local test, the test is stuck at TestBasicRead.test_read[inputs0] for a long time, in both the topic branch and master branch.

To reproduce the issue, you can use the credential, but change the region from SANDBOX to NA.

@YiyangLi
Copy link
Contributor

YiyangLi commented Sep 9, 2022

/test connector=connectors/source-amazon-ads

@sajarin
Copy link
Contributor

sajarin commented Sep 9, 2022

/test connector=connectors/source-amazon-ads

🕑 connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3023863746
❌ connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3023863746
🐛 https://gradle.com/s/mszvkqcli3gso

Build Failed

Test summary info:

=========================== short test summary info ============================
FAILED test_core.py::TestBasicRead::test_read[inputs0] - docker.errors.Contai...
FAILED test_full_refresh.py::TestFullRefresh::test_sequential_reads[inputs0]
FAILED test_incremental.py::TestIncremental::test_two_sequential_reads[inputs0]
FAILED test_incremental.py::TestIncremental::test_read_sequential_slices[inputs0]
================== 4 failed, 28 passed in 6678.75s (1:51:18) ===================

@YiyangLi
Copy link
Contributor

@ganpatagarwal The CI throws an error of This profileID is not authorized to use Amazon Attribution. I guess that's why the acceptance tests are stuck. Can you provide the instruction about it? Or even better, can you update the doc for Amazon Ads? docs/integrations/sources/amazon-ads.md

Thanks.

@ganpatagarwal
Copy link
Contributor Author

@YiyangLi

The amazon ads account I am using for testing is not given me any issues to fetch attribution report. We had been using the attribution feature on that account and used the same to fetch the reports via API.

If you are authorizing your developer application with advertising::campaign_management scope, it should have access to Attribution APIs

My guess would be limitations with the amazon ads account your are using with CI

https://advertising.amazon.com/API/docs/en-us/amazon-attribution/troubleshooting#i-get-a-403-error-when-i-call-an-amazon-attribution-endpoint-using-my-advertisers-profile-even-though-i-am-authorized

Amazon Attribution is currently available in beta to professional seller brand owners enrolled in Amazon Brand Registry and vendors that sell products on Amazon in the following markets: US, Canada, Mexico, UK, Germany, France, Italy, Spain, and Netherlands.

I have already added the link for amazon attribution reports in docs/integrations/sources/amazon-ads.md
Please let me know if I should add any other information.

@YiyangLi
Copy link
Contributor

@YiyangLi

The amazon ads account I am using for testing is not given me any issues to fetch attribution report. We had been using the attribution feature on that account and used the same to fetch the reports via API.

If you are authorizing your developer application with advertising::campaign_management scope, it should have access to Attribution APIs

My guess would be limitations with the amazon ads account your are using with CI

https://advertising.amazon.com/API/docs/en-us/amazon-attribution/troubleshooting#i-get-a-403-error-when-i-call-an-amazon-attribution-endpoint-using-my-advertisers-profile-even-though-i-am-authorized

Amazon Attribution is currently available in beta to professional seller brand owners enrolled in Amazon Brand Registry and vendors that sell products on Amazon in the following markets: US, Canada, Mexico, UK, Germany, France, Italy, Spain, and Netherlands.

I have already added the link for amazon attribution reports in docs/integrations/sources/amazon-ads.md Please let me know if I should add any other information.

Thank you, I will get the dev account and try to get a new token. Overall, the goal is to get acceptance tests passed at 100%, then we are good to merge.

So, are you able to complete the acceptance test? If not, you could bypass the expect_records by removing the section locally? It would be great if you could share the pass rate on your end.

@ganpatagarwal
Copy link
Contributor Author

@YiyangLi

I started executing acceptance test iteratively on my local env.

First Error

------------------------------------------------------------------------------------- Captured log call --------------------------------------------------------------------------------------
ERROR    root:test_core.py:376
The sponsored_display_campaigns stream has the following schema errors:
163170956955202 is not of type 'null', 'string'

Failed validating 'type' in schema['properties']['portfolioId']:
    {'type': ['null', 'string']}

On instance['portfolioId']:
    163170956955202

Applied below fix

--- a/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display.py
+++ b/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/schemas/sponsored_display.py
@@ -16,7 +16,7 @@ class DisplayCampaign(CatalogModel):
     endDate: str = None
     costType: str
     state: str
-    portfolioId: str = None
+    portfolioId: Decimal = None
     tactic: str
     deliveryProfile: str

Second Error
With above fix applied , it's failing at backward compatibility check

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <source_acceptance_test.utils.backward_compatibility.CatalogDiffChecker object at 0x108e86ac0>, message = "The'type' field value was changed."
diff = {'dictionary_item_added': [<root['attribution_report_performance_adgroup'] t1:not present, t2:{'type': 'ob...}>, <root...ues_changed': [<root['sponsored_display_campaigns']['properties']['portfolioId']['type'][1] t1:'string', t2:'number'>]}

    def _raise_error(self, message: str, diff: DeepDiff):
>       raise NonBackwardCompatibleError(f"{message}. Diff: {diff.pretty()}", self.context)
E       source_acceptance_test.utils.backward_compatibility.NonBackwardCompatibleError: BackwardIncompatibilityContext.DISCOVER - The'type' field value was changed.. Diff: Item root['attribution_report_performance_adgroup'] added to dictionary.
E       Item root['attribution_report_performance_campaign'] added to dictionary.
E       Item root['attribution_report_performance_creative'] added to dictionary.
E       Item root['attribution_report_products'] added to dictionary.
E       Item root['sponsored_display_campaigns']['properties']['portfolioId']['type'][1] removed from iterable.

../../bases/source-acceptance-test/source_acceptance_test/utils/backward_compatibility.py:38: NonBackwardCompatibleError

How to fix this?

@YiyangLi
Copy link
Contributor

it looks like portfolioId comes from sponsored_products stream, and it's expected to be a nullable string, but the data is an integer.

def http_method(self) -> str:
return "POST"

def read_records(self, *args, **kvargs) -> Iterable[Mapping[str, Any]]:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I finally solved my local issue by adding a few profile Ids, though our dev account doesn't have any attribute reports. So, earlier, under the secrets/spec.json, when the profiles is null or empty, it continues to fetch. Can you add an if-statement around the line to skip the read_records if _profiles is empty?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

current implementation

    def read_records(self, *args, **kvargs) -> Iterable[Mapping[str, Any]]:
        """
        Iterate through self._profiles list and send read all records for each profile.
        """
        for profile in self._profiles:
            self._set_dates(profile)
            self._current_profile_id = profile.profileId
            yield from super().read_records(*args, **kvargs)

if self._profiles is empty, it should not trigger any fetches

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you do me a favor? Can you unset the profiles attribute in secrets/config.json, see if you get an error by running the read command?

python main.py read --config secrets/config.json --catalog integration_tests/configured_catalog.json

{
  "client_id": "amzn1.application-oa2-client.client-id",
  "client_secret": "secret",
  "scope": "advertising::campaign_management",
  "refresh_token": "a very long token",
  "region": "NA"
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No error when profiles attribute is removed from config.json file.

When there are no user provided profiles, API call is made to fetch all profiles.

https://github.com/airbytehq/airbyte/blob/master/airbyte-integrations/connectors/source-amazon-ads/source_amazon_ads/streams/profiles.py#L33-L48

Copy link
Contributor

@YiyangLi YiyangLi Sep 15, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for the feedback, that's really helpful.

The acceptance test is not passed. And the reason is that not all profiles are authorized to fetch reports, and the read command doesn't fail gracefully, which blocks the read on other streams.

I read the codes again, looks like a profile is not independent of the others. In our dev test account, there are about 10 profiles fetched from the API, and only 4 of them are authorized to read the attribute reports.

If I pass just these 4 profiles, the tests are good. But if I include another, the read command fails on that profile and stops fetching reports on other profiles. And under the configured_catalog.json, if I shuffle the streams collection to fetch attribute reports first, the following streams will stop.

Similarly, if I set a collection of profiles to secrets/config.json, but one of the profiles is authorized, the same error is thrown and not handled gracefully.

Under a read command, we want to fetch as much data as possible, and reports from one profile shouldn't impact another profile or other streams. Can you adjust the code to satisfy that?

You may consider to use a stream slice to store profiles, and fetch reports for each profile in that slice. The GitHub connector provides a good example in fetching users in an org.

Let me know if you have a question.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you help me in providing a way to reproduce the error?

I tried running this command

python main.py read --config secrets/config.json --catalog integration_tests/configured_catalog.json

config.json

{
  "region": "NA",
  "client_id": "amzn1.application-oa2-client.",
  "start_date": "2022-09-13",
  "client_secret": "secret",
  "refresh_token": "secret",
  "report_wait_timeout": 30,
  "report_generation_max_retries": 5,
  "profiles": [1, 2]
}

It's returning 0 records for all the streams except profiles

{"type": "LOG", "log": {"level": "INFO", "message": "Read 3 records from profiles stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing profiles"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_display_campaigns "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_display_campaigns stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_display_campaigns"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_display_campaigns 0:00:00.000228"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_display_ad_groups "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_display_ad_groups stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_display_ad_groups"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_display_product_ads "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_display_product_ads stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_display_product_ads"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_display_targetings "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_display_targetings stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_display_targetings"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_product_campaigns "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_product_campaigns stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_product_campaigns"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_campaigns 0:00:00.000159"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_product_ad_groups "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_product_ad_groups stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_product_ad_groups"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_ad_groups 0:00:00.000161\nSyncing stream sponsored_product_campaigns 0:00:00.000159"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_product_keywords "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_product_keywords stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_product_keywords"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_ad_groups 0:00:00.000161\nSyncing stream sponsored_product_campaigns 0:00:00.000159\nSyncing stream sponsored_product_keywords 0:00:00.000143"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_product_negative_keywords "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_product_negative_keywords stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_product_negative_keywords"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_ad_groups 0:00:00.000161\nSyncing stream sponsored_product_campaigns 0:00:00.000159\nSyncing stream sponsored_product_keywords 0:00:00.000143\nSyncing stream sponsored_product_negative_keywords 0:00:00.000143"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_product_ads "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_product_ads stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_product_ads"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_ad_groups 0:00:00.000161\nSyncing stream sponsored_product_ads 0:00:00.000361\nSyncing stream sponsored_product_campaigns 0:00:00.000159\nSyncing stream sponsored_product_keywords 0:00:00.000143\nSyncing stream sponsored_product_negative_keywords 0:00:00.000143"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_product_targetings "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_product_targetings stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_product_targetings"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_ad_groups 0:00:00.000161\nSyncing stream sponsored_product_ads 0:00:00.000361\nSyncing stream sponsored_product_campaigns 0:00:00.000159\nSyncing stream sponsored_product_keywords 0:00:00.000143\nSyncing stream sponsored_product_negative_keywords 0:00:00.000143\nSyncing stream sponsored_product_targetings 0:00:00.000144"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_brands_campaigns "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_brands_campaigns stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_brands_campaigns"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_brands_campaigns 0:00:00.000144\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_ad_groups 0:00:00.000161\nSyncing stream sponsored_product_ads 0:00:00.000361\nSyncing stream sponsored_product_campaigns 0:00:00.000159\nSyncing stream sponsored_product_keywords 0:00:00.000143\nSyncing stream sponsored_product_negative_keywords 0:00:00.000143\nSyncing stream sponsored_product_targetings 0:00:00.000144"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_brands_ad_groups "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_brands_ad_groups stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_brands_ad_groups"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_brands_ad_groups 0:00:00.000145\nSyncing stream sponsored_brands_campaigns 0:00:00.000144\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_ad_groups 0:00:00.000161\nSyncing stream sponsored_product_ads 0:00:00.000361\nSyncing stream sponsored_product_campaigns 0:00:00.000159\nSyncing stream sponsored_product_keywords 0:00:00.000143\nSyncing stream sponsored_product_negative_keywords 0:00:00.000143\nSyncing stream sponsored_product_targetings 0:00:00.000144"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: sponsored_brands_keywords "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from sponsored_brands_keywords stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing sponsored_brands_keywords"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_brands_ad_groups 0:00:00.000145\nSyncing stream sponsored_brands_campaigns 0:00:00.000144\nSyncing stream sponsored_brands_keywords 0:00:00.000170\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_ad_groups 0:00:00.000161\nSyncing stream sponsored_product_ads 0:00:00.000361\nSyncing stream sponsored_product_campaigns 0:00:00.000159\nSyncing stream sponsored_product_keywords 0:00:00.000143\nSyncing stream sponsored_product_negative_keywords 0:00:00.000143\nSyncing stream sponsored_product_targetings 0:00:00.000144"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: attribution_report_products "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from attribution_report_products stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing attribution_report_products"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream attribution_report_products 0:00:00.007100\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_brands_ad_groups 0:00:00.000145\nSyncing stream sponsored_brands_campaigns 0:00:00.000144\nSyncing stream sponsored_brands_keywords 0:00:00.000170\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_ad_groups 0:00:00.000161\nSyncing stream sponsored_product_ads 0:00:00.000361\nSyncing stream sponsored_product_campaigns 0:00:00.000159\nSyncing stream sponsored_product_keywords 0:00:00.000143\nSyncing stream sponsored_product_negative_keywords 0:00:00.000143\nSyncing stream sponsored_product_targetings 0:00:00.000144"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: attribution_report_performance_adgroup "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from attribution_report_performance_adgroup stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing attribution_report_performance_adgroup"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream attribution_report_performance_adgroup 0:00:00.000172\nSyncing stream attribution_report_products 0:00:00.007100\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_brands_ad_groups 0:00:00.000145\nSyncing stream sponsored_brands_campaigns 0:00:00.000144\nSyncing stream sponsored_brands_keywords 0:00:00.000170\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_ad_groups 0:00:00.000161\nSyncing stream sponsored_product_ads 0:00:00.000361\nSyncing stream sponsored_product_campaigns 0:00:00.000159\nSyncing stream sponsored_product_keywords 0:00:00.000143\nSyncing stream sponsored_product_negative_keywords 0:00:00.000143\nSyncing stream sponsored_product_targetings 0:00:00.000144"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: attribution_report_performance_campaign "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from attribution_report_performance_campaign stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing attribution_report_performance_campaign"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream attribution_report_performance_adgroup 0:00:00.000172\nSyncing stream attribution_report_performance_campaign 0:00:00.000294\nSyncing stream attribution_report_products 0:00:00.007100\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_brands_ad_groups 0:00:00.000145\nSyncing stream sponsored_brands_campaigns 0:00:00.000144\nSyncing stream sponsored_brands_keywords 0:00:00.000170\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_ad_groups 0:00:00.000161\nSyncing stream sponsored_product_ads 0:00:00.000361\nSyncing stream sponsored_product_campaigns 0:00:00.000159\nSyncing stream sponsored_product_keywords 0:00:00.000143\nSyncing stream sponsored_product_negative_keywords 0:00:00.000143\nSyncing stream sponsored_product_targetings 0:00:00.000144"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Syncing stream: attribution_report_performance_creative "}}
{"type": "LOG", "log": {"level": "INFO", "message": "Read 0 records from attribution_report_performance_creative stream"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing attribution_report_performance_creative"}}
{"type": "LOG", "log": {"level": "INFO", "message": "SourceAmazonAds runtimes:\nSyncing stream attribution_report_performance_adgroup 0:00:00.000172\nSyncing stream attribution_report_performance_campaign 0:00:00.000294\nSyncing stream attribution_report_performance_creative 0:00:00.007223\nSyncing stream attribution_report_products 0:00:00.007100\nSyncing stream profiles 0:00:00.005063\nSyncing stream sponsored_brands_ad_groups 0:00:00.000145\nSyncing stream sponsored_brands_campaigns 0:00:00.000144\nSyncing stream sponsored_brands_keywords 0:00:00.000170\nSyncing stream sponsored_display_ad_groups 0:00:00.000135\nSyncing stream sponsored_display_campaigns 0:00:00.000228\nSyncing stream sponsored_display_product_ads 0:00:00.000272\nSyncing stream sponsored_display_targetings 0:00:00.000179\nSyncing stream sponsored_product_ad_groups 0:00:00.000161\nSyncing stream sponsored_product_ads 0:00:00.000361\nSyncing stream sponsored_product_campaigns 0:00:00.000159\nSyncing stream sponsored_product_keywords 0:00:00.000143\nSyncing stream sponsored_product_negative_keywords 0:00:00.000143\nSyncing stream sponsored_product_targetings 0:00:00.000144"}}
{"type": "LOG", "log": {"level": "INFO", "message": "Finished syncing SourceAmazonAds"}}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, be happy to!

firstly, check integration_tests/configured_catalog.json, if profiles is one of the streams, the output will include the profile detail.

"Read 3 records from profiles stream"

looks like you have 3 profiles.

I guess all 3 profiles are authorized to read attribute_reports_*. Can you create another profile that is not authorized and add it to the array of profiles in secrets/config.json? For our case, if one of profiles in the array is not authorized, we will get the error of This profileID is not authorized to use Amazon Attribution, and the read stops.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any ideas on why I am not getting any error with fake profile IDs in config.json

{
  "region": "NA",
  "client_id": "amzn1.application-oa2-client.",
  "start_date": "2022-09-13",
  "client_secret": "secret",
  "refresh_token": "secret",
  "report_wait_timeout": 30,
  "report_generation_max_retries": 5,
  "profiles": [1, 2]
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not sure, maybe on the api side, the validation handles it before the authorization module is run?

@sajarin
Copy link
Contributor

sajarin commented Sep 26, 2022

/test connector=connectors/source-amazon-ads

🕑 connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3128888397
❌ connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3128888397
🐛 https://gradle.com/s/2zmhoymp77pk4

Build Failed

Test summary info:

=========================== short test summary info ============================
FAILED test_incremental.py::TestIncremental::test_read_sequential_slices[inputs0]
================== 1 failed, 31 passed in 4254.78s (1:10:54) ===================

@YiyangLi
Copy link
Contributor

@sajarin

Failed: Timeout >2400.0s

According to the log, it looks like the Integration test timeouts at incremental test, can you help to run the test again? Thanks.

@sajarin
Copy link
Contributor

sajarin commented Sep 26, 2022

/test connector=connectors/source-amazon-ads

🕑 connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3129700626
❌ connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3129700626
🐛 https://gradle.com/s/ft72ypn6sndji

Build Failed

Test summary info:

=========================== short test summary info ============================
FAILED test_incremental.py::TestIncremental::test_two_sequential_reads[inputs0]
================== 1 failed, 31 passed in 3970.08s (1:06:10) ===================

@YiyangLi
Copy link
Contributor

YiyangLi commented Sep 28, 2022

#17202 there is a patch merged to master today, @ganpatagarwal can you rebase and try again? sorry for the inconvenience.

This branch has conflicts that must be resolved

The conflict is related to the doc, hope it's quick.
docs/integrations/sources/amazon-ads.md

@ganpatagarwal
Copy link
Contributor Author

Done !!

@sajarin
Copy link
Contributor

sajarin commented Sep 28, 2022

/test connector=connectors/source-amazon-ads

🕑 connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3145122936
✅ connectors/source-amazon-ads https://github.com/airbytehq/airbyte/actions/runs/3145122936
Python tests coverage:

Name                                                              Stmts   Miss  Cover
-------------------------------------------------------------------------------------
source_amazon_ads/utils.py                                            9      0   100%
source_amazon_ads/streams/sponsored_products.py                      32      0   100%
source_amazon_ads/streams/sponsored_display.py                       22      0   100%
source_amazon_ads/streams/sponsored_brands.py                        17      0   100%
source_amazon_ads/streams/report_streams/products_report.py          18      0   100%
source_amazon_ads/streams/report_streams/display_report.py           16      0   100%
source_amazon_ads/streams/report_streams/brands_video_report.py      10      0   100%
source_amazon_ads/streams/report_streams/brands_report.py            10      0   100%
source_amazon_ads/streams/report_streams/__init__.py                  5      0   100%
source_amazon_ads/streams/profiles.py                                21      0   100%
source_amazon_ads/streams/attribution_report.py                      81      0   100%
source_amazon_ads/streams/__init__.py                                 7      0   100%
source_amazon_ads/schemas/sponsored_products.py                      37      0   100%
source_amazon_ads/schemas/sponsored_display.py                       31      0   100%
source_amazon_ads/schemas/sponsored_brands.py                        22      0   100%
source_amazon_ads/schemas/profile.py                                 16      0   100%
source_amazon_ads/schemas/attribution_report.py                      21      0   100%
source_amazon_ads/schemas/__init__.py                                 7      0   100%
source_amazon_ads/constants.py                                        1      0   100%
source_amazon_ads/__init__.py                                         2      0   100%
source_amazon_ads/streams/common.py                                  79      1    99%
source_amazon_ads/schemas/common.py                                  51      1    98%
source_amazon_ads/source.py                                          44      1    98%
source_amazon_ads/streams/report_streams/report_streams.py          240     19    92%
-------------------------------------------------------------------------------------
TOTAL                                                               799     22    97%
	 Name                                                 Stmts   Miss  Cover   Missing
	 ----------------------------------------------------------------------------------
	 source_acceptance_test/base.py                          10      4    60%   15-18
	 source_acceptance_test/config.py                        83      6    93%   78-80, 84-86
	 source_acceptance_test/conftest.py                     164    164     0%   6-282
	 source_acceptance_test/plugin.py                        48     48     0%   6-104
	 source_acceptance_test/tests/test_core.py              329    111    66%   39, 50-58, 63-70, 74-75, 79-80, 164, 202-219, 228-236, 240-245, 251, 284-289, 327-334, 374-376, 379, 439-448, 477-478, 484, 487, 520-530, 543-568, 573-577
	 source_acceptance_test/tests/test_full_refresh.py       52      2    96%   34, 65
	 source_acceptance_test/tests/test_incremental.py       152     26    83%   21-23, 29-31, 36-43, 48-61, 239, 250-258
	 source_acceptance_test/utils/asserts.py                 37      2    95%   57-58
	 source_acceptance_test/utils/common.py                  77     17    78%   15-16, 24-30, 47-54, 64, 67
	 source_acceptance_test/utils/compare.py                 62     23    63%   21-51, 68, 97-99
	 source_acceptance_test/utils/connector_runner.py       112     50    55%   23-26, 32, 36, 39-67, 70-72, 75-77, 80-82, 85-87, 90-92, 95-113, 147-149
	 source_acceptance_test/utils/json_schema_helper.py     105     13    88%   30-31, 38, 41, 65-68, 96, 120, 190-192
	 ----------------------------------------------------------------------------------
	 TOTAL                                                 1358    466    66%

Build Passed

Test summary info:

All Passed

"sponsored_brands_keywords",
"sponsored_product_keywords",
"sponsored_product_negative_keywords",
"sponsored_product_targetings",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why this streams: sponsored_product_keywords, sponsored_product_negative_keywords, sponsored_product_targetings

added as empty ?

Copy link
Contributor

@YiyangLi YiyangLi Sep 28, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it comes from me, irrelevant to the topic branch. It was about 2 weeks ago, the integration test says these streams are empty in the test account when I run it locally. And I have the login credential, but I can't access the OTP token, so I can't login.

@sajarin sajarin self-requested a review October 3, 2022 14:22
@sajarin sajarin dismissed harshithmullapudi’s stale review October 3, 2022 14:24

review has been addressed

@sajarin sajarin merged commit 454f84d into airbytehq:master Oct 3, 2022
@ganpatagarwal ganpatagarwal deleted the amazon-ads-attribution-reports branch October 4, 2022 04:46
jhammarstedt pushed a commit to jhammarstedt/airbyte that referenced this pull request Oct 31, 2022
* use data field for json response

* add attribution reports

* update changelog

* add atrribution report integration test

* clean up expected_records
add empty streams to acceptance test config

* handle exception for profile

* update tests

Co-authored-by: Yiyang Li <yiyangli2010@gmail.com>
Co-authored-by: Harshith Mullapudi <harshithmullapudi@gmail.com>
Co-authored-by: Sajarin <sajarindider@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/connectors Connector related issues area/documentation Improvements or additions to documentation bounty bounty-XL Maintainer program: claimable extra large bounty PR community connectors/source/amazon-ads releaseStage/ga reward-200
Projects
Development

Successfully merging this pull request may close these issues.

None yet

7 participants