Délais avant expiration

La bibliothèque cliente pour Python ne spécifie aucun délai avant expiration par défaut, et aucun délai avant expiration par défaut n'est spécifié au niveau de la couche transport gRPC. Par défaut, la bibliothèque cliente pour Python délègue le comportement de délai avant expiration au serveur.

Cette valeur par défaut convient à la plupart des cas d'utilisation. Toutefois, si vous devez spécifier un délai avant expiration côté client, la bibliothèque cliente Python accepte les remplacements de délai avant expiration par requête (spécifiés en secondes sous la forme d'un int ou d'un float) pour les appels en streaming et unaires. Les délais avant expiration par défaut à l'échelle du client ne peuvent pas être configurés dans google-ads.yaml.

Vous pouvez définir un délai avant expiration personnalisé de deux heures (7 200 secondes) ou plus, mais l'API peut toujours expirer pour les requêtes de très longue durée et renvoyer une erreur d'état gRPC DEADLINE_EXCEEDED. Si cela devient un problème, divisez la requête en fragments plus petits et exécutez-les en parallèle. Cela évite qu'une requête de longue durée échoue et que la seule façon de récupérer soit de redémarrer la requête depuis le début.

Délais avant expiration des appels de flux

La seule méthode de service de l'API Google Ads qui utilise un flux de réponse est GoogleAdsService.SearchStream.

Pour remplacer le délai avant expiration par défaut, transmettez le paramètre timeout (en secondes) lors de l'appel de la méthode :

def make_server_streaming_call(
    client: GoogleAdsClient, customer_id: str
) -> None:
    """Makes a server streaming call using a custom client timeout.

    Args:
        client: An initialized GoogleAds client.
        customer_id: The str Google Ads customer ID.
    """
    ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService")
    campaign_ids: List[str] = []

    try:
        search_request: SearchGoogleAdsStreamRequest = client.get_type(
            "SearchGoogleAdsStreamRequest"
        )
        search_request.customer_id = customer_id
        search_request.query = _QUERY
        stream: Iterator[SearchGoogleAdsStreamResponse] = (
            ga_service.search_stream(
                request=search_request,
                # When making any request, an optional "timeout" parameter can be
                # provided to specify a client-side response deadline in seconds.
                # If not set, then no timeout will be enforced by the client and
                # the channel will remain open until the response is completed or
                # severed, either manually or by the server.
                timeout=_CLIENT_TIMEOUT_SECONDS,
            )
        )

        batch: SearchGoogleAdsStreamResponse
        for batch in stream:
            row: GoogleAdsRow
            for row in batch.results:
                campaign_ids.append(row.campaign.id)

        print("The server streaming call completed before the timeout.")
    except DeadlineExceeded:
        print("The server streaming call did not complete before the timeout.")
        sys.exit(1)
    except GoogleAdsException as ex:
        print(
            f"Request with ID '{ex.request_id}' failed with status "
            f"'{ex.error.code().name}' and includes the following errors:"
        )
        for error in ex.failure.errors:
            print(f"\tError with message '{error.message}'.")
            if error.location:
                for field_path_element in error.location.field_path_elements:
                    print(f"\t\tOn field: {field_path_element.field_name}")
        sys.exit(1)

    print(f"Total # of campaign IDs retrieved: {len(campaign_ids)}")
      

Délais avant expiration des appels unaires

La plupart des méthodes de service de l'API Google Ads utilisent des appels unaires. Les exemples types sont GoogleAdsService.Search et GoogleAdsService.Mutate.

Pour remplacer les paramètres de délai avant expiration et de nouvelle tentative par défaut pour un appel unaire, transmettez un objet google.api_core.retry.Retry à l'aide du paramètre retry (ou transmettez timeout en secondes pour un délai avant expiration d'une seule tentative) :

def make_unary_call(client: GoogleAdsClient, customer_id: str) -> None:
    """Makes a unary call using a custom client timeout.

    Args:
        client: An initialized GoogleAds client.
        customer_id: The Google Ads customer ID.
    """
    ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService")
    campaign_ids: List[str] = []

    try:
        search_request: SearchGoogleAdsRequest = client.get_type(
            "SearchGoogleAdsRequest"
        )
        search_request.customer_id = customer_id
        search_request.query = _QUERY
        results: Iterator[GoogleAdsRow] = ga_service.search(
            request=search_request,
            # When making any request, an optional "retry" parameter can be
            # provided to specify its retry behavior. Complete information about
            # these settings can be found here:
            # https://googleapis.dev/python/google-api-core/latest/retry.html
            retry=Retry(
                # Sets the maximum accumulative timeout of the call; it
                # includes all tries.
                deadline=_CLIENT_TIMEOUT_SECONDS,
                # Sets the timeout that is used for the first try to one tenth
                # of the maximum accumulative timeout of the call.
                # Note: This overrides the default value and can lead to
                # RequestError.RPC_DEADLINE_TOO_SHORT errors when too small. We
                # recommend changing the value only if necessary.
                initial=_CLIENT_TIMEOUT_SECONDS / 10,
                # Sets the maximum timeout that can be used for any given try
                # to one fifth of the maximum accumulative timeout of the call
                # (two times greater than the timeout that is needed for the
                # first try).
                maximum=_CLIENT_TIMEOUT_SECONDS / 5,
            ),
        )

        row: GoogleAdsRow
        for row in results:
            campaign_ids.append(row.campaign.id)

        print("The unary call completed before the timeout.")
    except DeadlineExceeded:
        print("The unary call did not complete before the timeout.")
        sys.exit(1)
    except GoogleAdsException as ex:
        print(
            f"Request with ID '{ex.request_id}' failed with status "
            f"'{ex.error.code().name}' and includes the following errors:"
        )
        for error in ex.failure.errors:
            print(f"\tError with message '{error.message}'.")
            if error.location:
                for field_path_element in error.location.field_path_elements:
                    print(f"\t\tOn field: {field_path_element.field_name}")
        sys.exit(1)

    print(f"Total # of campaign IDs retrieved: {len(campaign_ids)}")