Skip to content

Commit b95d331

Browse files
Source Facebook Marketing: retry FacebookBadObjectError (#15788)
* #404 oncall: source facebook marketing - retry 'facebook bad object error' * source facebook marketing: upd changelog * auto-bump connector version [ci skip] Co-authored-by: Octavia Squidington III <[email protected]>
1 parent 626f51f commit b95d331

File tree

6 files changed

+25
-6
lines changed

6 files changed

+25
-6
lines changed

airbyte-config/init/src/main/resources/seed/source_definitions.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@
256256
- name: Facebook Marketing
257257
sourceDefinitionId: e7778cfc-e97c-4458-9ecb-b4f2bba8946c
258258
dockerRepository: airbyte/source-facebook-marketing
259-
dockerImageTag: 0.2.59
259+
dockerImageTag: 0.2.60
260260
documentationUrl: https://docs.airbyte.io/integrations/sources/facebook-marketing
261261
icon: facebook.svg
262262
sourceType: api

airbyte-config/init/src/main/resources/seed/source_specs.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1857,7 +1857,7 @@
18571857
supportsNormalization: false
18581858
supportsDBT: false
18591859
supported_destination_sync_modes: []
1860-
- dockerImage: "airbyte/source-facebook-marketing:0.2.59"
1860+
- dockerImage: "airbyte/source-facebook-marketing:0.2.60"
18611861
spec:
18621862
documentationUrl: "https://docs.airbyte.io/integrations/sources/facebook-marketing"
18631863
changelogUrl: "https://docs.airbyte.io/integrations/sources/facebook-marketing"

airbyte-integrations/connectors/source-facebook-marketing/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py"
1313
ENTRYPOINT ["python", "/airbyte/integration_code/main.py"]
1414

1515

16-
LABEL io.airbyte.version=0.2.59
16+
LABEL io.airbyte.version=0.2.60
1717
LABEL io.airbyte.name=airbyte/source-facebook-marketing

airbyte-integrations/connectors/source-facebook-marketing/source_facebook_marketing/streams/async_job.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,23 @@
88
from enum import Enum
99
from typing import Any, Iterator, List, Mapping, Optional, Type, Union
1010

11+
import backoff
1112
import pendulum
1213
from facebook_business.adobjects.ad import Ad
1314
from facebook_business.adobjects.adaccount import AdAccount
1415
from facebook_business.adobjects.adreportrun import AdReportRun
1516
from facebook_business.adobjects.adset import AdSet
1617
from facebook_business.adobjects.campaign import Campaign
1718
from facebook_business.adobjects.objectparser import ObjectParser
18-
from facebook_business.api import FacebookAdsApi, FacebookAdsApiBatch, FacebookResponse
19+
from facebook_business.api import FacebookAdsApi, FacebookAdsApiBatch, FacebookBadObjectError, FacebookResponse
20+
from source_facebook_marketing.streams.common import retry_pattern
1921

2022
logger = logging.getLogger("airbyte")
2123

2224

25+
backoff_policy = retry_pattern(backoff.expo, FacebookBadObjectError, max_tries=5, factor=5)
26+
27+
2328
def update_in_batch(api: FacebookAdsApi, jobs: List["AsyncJob"]):
2429
"""Update status of each job in the list in a batch, making it most efficient way to update status.
2530
@@ -338,6 +343,7 @@ def _check_status(self) -> bool:
338343

339344
return False
340345

346+
@backoff_policy
341347
def get_result(self) -> Any:
342348
"""Retrieve result of the finished job."""
343349
if not self._job or self.failed:

airbyte-integrations/connectors/source-facebook-marketing/unit_tests/test_async_job.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from facebook_business.adobjects.adset import AdSet
1515
from facebook_business.adobjects.adsinsights import AdsInsights
1616
from facebook_business.adobjects.campaign import Campaign
17-
from facebook_business.api import FacebookAdsApiBatch
17+
from facebook_business.api import FacebookAdsApiBatch, FacebookBadObjectError
1818
from source_facebook_marketing.api import MyFacebookAdsApi
1919
from source_facebook_marketing.streams.async_job import InsightAsyncJob, ParentAsyncJob, Status, update_in_batch
2020

@@ -299,6 +299,18 @@ def test_get_result(self, job, adreport, api):
299299
assert result[0].export_all_data() == {"some_data": 123}
300300
assert result[1].export_all_data() == {"some_data": 77}
301301

302+
def test_get_result_retried(self, mocker, job, api):
303+
job.start()
304+
api.call().json.return_value = {"data": [{"some_data": 123}, {"some_data": 77}]}
305+
ads_insights = AdsInsights(api=api)
306+
ads_insights._set_data({"items": [{"some_data": 123}, {"some_data": 77}]})
307+
with mocker.patch(
308+
"facebook_business.adobjects.objectparser.ObjectParser.parse_multiple",
309+
side_effect=[FacebookBadObjectError("Bad data to set object data"), ads_insights],
310+
):
311+
# in case this is not retried, an error will be raised
312+
job.get_result()
313+
302314
def test_get_result_when_job_is_not_started(self, job):
303315
with pytest.raises(RuntimeError, match=r"Incorrect usage of get_result - the job is not started or failed"):
304316
job.get_result()

docs/integrations/sources/facebook-marketing.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ Please be informed that the connector uses the `lookback_window` parameter to pe
120120

121121
| Version | Date | Pull Request | Subject |
122122
|:--------|:-----------|:---------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
123-
| 0.2.59 | 2022-08-04 | [15327](https://github.com/airbytehq/airbyte/pull/15327) | Shift date validation from config validation to stream method |
123+
| 0.2.60 | 2022-08-19 | [15788](https://github.com/airbytehq/airbyte/pull/15788) | Retry FacebookBadObjectError |
124+
| 0.2.59 | 2022-08-04 | [15327](https://github.com/airbytehq/airbyte/pull/15327) | Shift date validation from config validation to stream method |
124125
| 0.2.58 | 2022-07-25 | [15012](https://github.com/airbytehq/airbyte/pull/15012) | Add `DATA_RETENTION_PERIOD`validation and fix `failed_delivery_checks` field schema type issue |
125126
| 0.2.57 | 2022-07-25 | [14831](https://github.com/airbytehq/airbyte/pull/14831) | Update Facebook SDK to version 14.0.0 |
126127
| 0.2.56 | 2022-07-19 | [14831](https://github.com/airbytehq/airbyte/pull/14831) | Add future `start_date` and `end_date` validation |

0 commit comments

Comments
 (0)