La récupération des données de compte est une fonction essentielle de nombreuses applications Google Ads. Elle est utilisée dans des cas tels que l'analyse des données, les requêtes des clients et les vérifications de conformité avec les règles. Lorsque vous récupérez les données, vous devez optimiser votre utilisation afin de ne pas surcharger les serveurs Google et de ne pas risquer d'être limité en termes de débit. Pour en savoir plus, consultez les guides sur la limitation du débit et sur la façon de maintenir une adresse e-mail de contact à jour.
Comprendre le règlement de Google sur l'utilisation des ressources pour les rapports
Pour assurer la stabilité de ses serveurs, l'API Google Ads limite les modèles de requête GoogleAdsService.Search
et GoogleAdsService.SearchStream
qui consomment une quantité excessive de ressources d'API. Si un modèle de requête spécifique est limité, les autres services, méthodes et modèles de requête continueront de fonctionner sans problème. Les erreurs suivantes sont générées pour les requêtes limitées :
Code d'erreur |
---|
QuotaError.EXCESSIVE_SHORT_TERM_QUERY_RESOURCE_CONSUMPTION
ou QuotaError.EXCESSIVE_LONG_TERM_QUERY_RESOURCE_CONSUMPTION selon la durée de l'utilisation élevée des ressources. |
Pour vous aider à identifier et à surveiller vos rapports coûteux, nous vous fournirons également une métrique de coût pour chaque rapport.
Méthode | Champ "Coût" |
---|---|
GoogleAdsService.Search |
SearchGoogleAdsResponse.query_resource_consumption |
GoogleAdsService.SearchStream |
SearchGoogleAdsStreamResponse.query_resource_consumption |
La métrique de coût renvoyée par ces champs dépend de divers facteurs, tels que
- Taille de vos comptes
- Vues et colonnes que vous récupérez dans vos rapports
- Charge sur les serveurs de l'API Google Ads.
Pour vous aider à suivre les requêtes coûteuses, nous publions des statistiques agrégées initiales sur la consommation de ressources de différents modèles de requêtes que nous observons sur nos serveurs. Nous publierons régulièrement des chiffres mis à jour pour vous aider à affiner vos requêtes.
Période | Moyenne (p50) | P70 (modérément élevé) | P95 (très élevé) |
---|---|---|---|
Court terme (5 min) | 6000 | 30000 | 1800000 |
Longue durée (24 h) | 16000 | 90000 | 8400000 |
Par exemple, supposons que vous exécutez un modèle de requête comme suit, qui consomme 600 unités de ressources par rapport.
SELECT campaign.id, campaign.name, metrics.cost_micros FROM campaign WHERE
segments.date = "YYYY-MM-DD"
Vous exécutez cette requête pour plusieurs comptes client pour plusieurs dates individuelles en modifiant la requête afin de remplacer différentes valeurs pour le filtre segments.date
. Le tableau suivant indique le nombre de rapports que vous pouvez exécuter dans une période donnée afin que votre utilisation des ressources corresponde à différents buckets d'utilisation des ressources.
Période | Moyenne | Modérément élevé | Très élevé |
---|---|---|---|
Court terme (5 min) | 10 | 50 | 3000 |
Longue durée (24 h) | 26 | 150 | 14000 |
Exécuter ce modèle de requête 10 fois en 5 minutes serait considéré comme une utilisation moyenne, tandis qu'exécuter 3 000 rapports en 5 minutes serait considéré comme une utilisation très élevée.
Il existe plusieurs stratégies pour optimiser la consommation de ressources de vos rapports. Le reste de ce guide aborde certaines de ces stratégies.
Mettre en cache vos données
Vous devez mettre en cache les détails des entités que vous récupérez à partir des serveurs d'API dans une base de données locale au lieu d'appeler le serveur chaque fois que vous avez besoin des données, en particulier pour les entités auxquelles vous accédez fréquemment ou qui changent rarement. Utilisez change-event et change-status lorsque cela est possible pour détecter les objets qui ont changé depuis votre dernière synchronisation des résultats.
Optimiser la fréquence d'exécution des rapports
Google Ads a publié des consignes concernant la fraîcheur des données et la fréquence à laquelle elles sont mises à jour. Vous devez utiliser ces consignes pour déterminer la fréquence à laquelle récupérer les rapports.
Si vous devez mettre à jour régulièrement des comptes, nous vous recommandons de limiter leur nombre à un petit ensemble (par exemple, les 20 premiers comptes Google Ads). Le reste peut être mis à jour moins fréquemment, par exemple une ou deux fois par jour.
Optimiser la taille de vos rapports
Votre application doit récupérer de grands ensembles de données au lieu d'exécuter un grand nombre de petits rapports. Les limites de compte sont un facteur qui entre en jeu dans ce choix.
Par exemple, prenons le code suivant qui extrait les statistiques de groupes d'annonces spécifiques et met à jour une table de base de données de statistiques :
List<long> adGroupIds = FetchAdGroupIdsFromLocalDatabase();
foreach (long adGroupId in adGroupIds)
{
string query = "SELECT ad_group.id, ad_group.name, metrics.clicks, " +
"metrics.cost_micros, metrics.impressions, segments.date FROM " +
"ad_group WHERE segments.date DURING LAST_7_DAYS AND " +
"ad_group.id = ${adGroupId}";
List<GoogleAdsRow> rows = RunGoogleAdsReport(customerId, query);
InsertRowsIntoStatsTable(adGroupId, rows);
}
Ce code fonctionne bien sur un petit compte de test. Toutefois, Google Ads accepte jusqu'à 20 000 groupes d'annonces par campagne et 10 000 campagnes par compte. Par conséquent, si ce code s'exécute sur un grand compte Google Ads, il peut surcharger les serveurs de l'API Google Ads, ce qui entraîne une limitation du débit et une régulation.
Une meilleure approche consiste à exécuter un seul rapport et à le traiter localement. Une de ces approches utilisant une carte en mémoire est présentée.
Hashset<long> adGroupIds = FetchAdGroupIdsFromLocalDatabase();
string query = "SELECT ad_group.id, ad_group.name, metrics.clicks, " +
"metrics.cost_micros, metrics.impressions, segments.date FROM " +
"ad_group WHERE segments.date DURING LAST_7_DAYS";
List<GoogleAdsRow> rows = RunGoogleAdsReport(customer_id, query);
var memoryMap = new Dictionary<long, List<GoogleAdsRow>>();
for each (GoogleAdsRow row in rows)
{
var adGroupId = row.AdGroup.Id;
if (adGroupIds.Contains(adGroupId))
{
CheckAndAddRowIntoMemoryMap(row, adGroupId, memoryMap);
}
}
foreach (long adGroupId in memoryMap.Keys())
{
InsertRowsIntoStatsTable(adGroupId, rows);
}
Cela réduit la charge sur les serveurs de l'API Google Ads en raison du nombre moins élevé de rapports exécutés.
Si vous constatez que le rapport est trop volumineux pour tenir en mémoire, vous pouvez également diviser la requête en groupes plus petits en ajoutant une clause LIMIT
comme celle-ci :
SELECT
ad_group.id,
ad_group.name,
metrics.clicks,
metrics.cost_micros,
metrics.impressions,
segments.date
FROM ad_group
WHERE segments.date DURING LAST_7_DAYS
AND ad_group.id IN (id1, id2, ...)
LIMIT 100000
Les libellés sont un autre moyen de regrouper les entités et de réduire le nombre de requêtes de reporting. Pour en savoir plus, consultez le guide sur les libellés.
Optimiser ce que vous récupérez
Lorsque vous exécutez des rapports, vous devez faire attention aux colonnes que vous incluez dans vos requêtes. Prenons l'exemple suivant, qui est programmé pour s'exécuter toutes les heures :
SELECT
customer.id,
customer.currency_code,
campaign.id,
campaign.name,
ad_group.id,
ad_group.name,
ad_group_criterion.keyword.match_type,
ad_group_criterion.keyword.text,
ad_group_criterion.criterion_id,
ad_group_criterion.quality_info.creative_quality_score,
ad_group_criterion.system_serving_status,
ad_group_criterion.negative,
ad_group_criterion.quality_info.quality_score,
ad_group_criterion.quality_info.search_predicted_ctr,
ad_group_criterion.quality_info.post_click_quality_score,
metrics.historical_landing_page_quality_score,
metrics.search_click_share,
metrics.historical_creative_quality_score,
metrics.clicks,
metrics.impressions
FROM keyword_view
WHERE segments.date DURING LAST_7_DAYS
Les seules colonnes susceptibles de changer toutes les heures sont metrics.clicks
et metrics.impressions
. Toutes les autres colonnes sont mises à jour rarement, voire jamais. Il est donc très inefficace de les récupérer toutes les heures. Vous pouvez stocker ces valeurs dans une base de données locale et exécuter un rapport change-event ou change-status pour télécharger les modifications une ou deux fois par jour.
Dans certains cas, vous pouvez réduire le nombre de lignes que vous téléchargez en appliquant les filtres appropriés.
Supprimer les comptes inutilisés
Si votre application gère des comptes clients tiers, vous devez la développer en tenant compte du taux de désabonnement des clients. Vous devez nettoyer régulièrement vos processus et vos magasins de données pour supprimer les comptes des clients qui n'utilisent plus votre application. Lorsque vous supprimez des comptes Google Ads inutilisés, gardez à l'esprit les conseils suivants :
- Révoquez l'autorisation que votre client a accordée à votre application pour gérer son compte.
- Arrêtez d'effectuer des appels d'API vers les comptes Google Ads du client. Cela s'applique en particulier aux tâches hors connexion telles que les tâches Cron et les pipelines de données conçus pour s'exécuter sans intervention de l'utilisateur.
- Si le client a révoqué son autorisation, votre application doit gérer la situation de manière appropriée et éviter d'envoyer des appels d'API non valides aux serveurs d'API de Google.
- Si le client a résilié son compte Google Ads, vous devez le détecter et éviter d'envoyer des appels d'API non valides aux serveurs d'API de Google.
- Supprimez les données que vous avez téléchargées à partir des comptes Google Ads du client de votre base de données locale après un délai approprié.