Para recuperar entidades e dados de relatórios da API Google Ads, use um destes métodos:
Confira as principais diferenças entre os dois métodos:
| GoogleAdsService.SearchStream | GoogleAdsService.Search | |
|---|---|---|
| Adequado para código de produção | Sim | Sim |
| Serviço | GoogleAdsService |
GoogleAdsService |
| Cenário | Buscando objetos e relatórios | Buscando objetos e relatórios |
| Resposta | Stream de objetos GoogleAdsRow |
Páginas de objetos GoogleAdsRow |
| Campos da resposta | Somente as especificadas na consulta | Somente as especificadas na consulta |
| Limites diários | Limites diários com base nos níveis de acesso | Limites diários com base nos níveis de acesso |
SearchStream x Search
Enquanto Search envia várias solicitações paginadas para
fazer o download de um relatório inteiro, SearchStream envia
uma única solicitação e inicia uma conexão gRPC persistente com a API Google Ads,
independentemente do tamanho do relatório.
Para SearchStream, os pacotes de dados começam a ser baixados imediatamente em lotes de
SearchGoogleAdsStreamResponse objetos. Seu código pode
iterar sobre os lotes recebidos conforme eles chegam, sem esperar que todo o
stream seja concluído.
Ao eliminar o tempo de ida e volta da rede necessário para solicitar cada página individual de uma resposta Search, o SearchStream oferece um desempenho melhor do que a paginação, especialmente para relatórios grandes.
Exemplo
Este exemplo analisa um relatório que consiste em 100,000 linhas. A tabela
a seguir detalha as diferenças de solicitação e resposta entre os dois métodos:
| SearchStream | Pesquisar | |
|---|---|---|
| Tamanho da página | Não relevante | 10.000 linhas por página |
| Número de solicitações de API | 1 solicitação | 10 solicitações |
| Número de respostas da API | 1 stream contínuo | 10 respostas |
Fatores de performance
Para a maioria dos casos de uso, recomendamos SearchStream em vez de Search pelos seguintes
motivos:
- Relatórios de uma única página (menos de 10.000 linhas): não há diferenças significativas de desempenho entre os dois métodos.
- Relatórios de várias páginas: o
SearchStreamgeralmente é mais rápido porque várias viagens de ida e volta de rede são evitadas, e a leitura ou gravação do cache em disco é menos importante. - Eficiência de memória: ao processar relatórios grandes com
SearchStream, itera os blocos de stream e processa as linhas conforme elas chegam, em vez de armazenar todas as linhas na memória de uma só vez para evitar erros de falta de memória (OOM, na sigla em inglês). - Resiliência da conexão: como o
SearchStreamdepende de uma conexão persistente, os streams de longa duração podem ser interrompidos por quedas de rede ou tempos limite. Configure tempos limite de RPC adequados e implemente uma lógica de nova tentativa para erros de stream temporários.
Limites de taxas
Os limites diários de operação para os dois métodos seguem os limites padrão e os
níveis de acesso do seu projeto do Google Cloud. Uma única consulta de relatório lógico é contabilizada como uma operação na sua cota diária de operações, independentemente de o resultado ser transmitido com SearchStream ou recuperado em várias páginas armazenadas em cache usando Search com um page_token. No entanto, cada
solicitação Search paginada ainda conta como uma chamada RPC individual em relação aos limites de taxa
de curto prazo.
Exemplo de código
O exemplo de código a seguir demonstra como executar uma consulta de relatório de streaming usando as bibliotecas de cliente:
Java
private void runExample(GoogleAdsClient googleAdsClient, long customerId) { try (GoogleAdsServiceClient googleAdsServiceClient = googleAdsClient.getLatestVersion().createGoogleAdsServiceClient()) { String query = "SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id"; // Constructs the SearchGoogleAdsStreamRequest. SearchGoogleAdsStreamRequest request = SearchGoogleAdsStreamRequest.newBuilder() .setCustomerId(Long.toString(customerId)) .setQuery(query) .build(); // Creates and issues a search Google Ads stream request that will retrieve all campaigns. ServerStream<SearchGoogleAdsStreamResponse> stream = googleAdsServiceClient.searchStreamCallable().call(request); // Iterates through and prints all of the results in the stream response. for (SearchGoogleAdsStreamResponse response : stream) { for (GoogleAdsRow googleAdsRow : response.getResultsList()) { System.out.printf( "Campaign with ID %d and name '%s' was found.%n", googleAdsRow.getCampaign().getId(), googleAdsRow.getCampaign().getName()); } } } }
C#
public void Run(GoogleAdsClient client, long customerId) { // Get the GoogleAdsService. GoogleAdsServiceClient googleAdsService = client.GetService( Services.V26.GoogleAdsService); // Create a query that will retrieve all campaigns. string query = @"SELECT campaign.id, campaign.name, campaign.network_settings.target_content_network FROM campaign ORDER BY campaign.id"; try { // Issue a search request. googleAdsService.SearchStream(customerId.ToString(), query, delegate (SearchGoogleAdsStreamResponse resp) { foreach (GoogleAdsRow googleAdsRow in resp.Results) { Console.WriteLine("Campaign with ID {0} and name '{1}' was found.", googleAdsRow.Campaign.Id, googleAdsRow.Campaign.Name); } } ); } catch (GoogleAdsException e) { Console.WriteLine("Failure:"); Console.WriteLine($"Message: {e.Message}"); Console.WriteLine($"Failure: {e.Failure}"); Console.WriteLine($"Request ID: {e.RequestId}"); throw; } }
PHP
public static function runExample(GoogleAdsClient $googleAdsClient, int $customerId) { $googleAdsServiceClient = $googleAdsClient->getGoogleAdsServiceClient(); // Creates a query that retrieves all campaigns. $query = 'SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id'; // Issues a search stream request. /** @var GoogleAdsServerStreamDecorator $stream */ $stream = $googleAdsServiceClient->searchStream( SearchGoogleAdsStreamRequest::build($customerId, $query) ); // Iterates over all rows in all messages and prints the requested field values for // the campaign in each row. foreach ($stream->iterateAllElements() as $googleAdsRow) { /** @var GoogleAdsRow $googleAdsRow */ printf( "Campaign with ID %d and name '%s' was found.%s", $googleAdsRow->getCampaign()->getId(), $googleAdsRow->getCampaign()->getName(), PHP_EOL ); } }
Python
def main(client: GoogleAdsClient, customer_id: str) -> None: ga_service: GoogleAdsServiceClient = client.get_service("GoogleAdsService") query: str = """ SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id""" # Issues a search request using streaming. stream: Iterator[SearchGoogleAdsStreamResponse] = ga_service.search_stream( customer_id=customer_id, query=query ) for batch in stream: rows: List[GoogleAdsRow] = batch.results for row in rows: print( f"Campaign with ID {row.campaign.id} and name " f'"{row.campaign.name}" was found.' )
Ruby
def get_campaigns(customer_id) # GoogleAdsClient will read a config file from # ENV['HOME']/google_ads_config.rb when called without parameters client = Google::Ads::GoogleAds::GoogleAdsClient.new responses = client.service.google_ads.search_stream( customer_id: customer_id, query: 'SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id', ) responses.each do |response| response.results.each do |row| puts "Campaign with ID #{row.campaign.id} and name '#{row.campaign.name}' was found." end end end
Perl
sub get_campaigns { my ($api_client, $customer_id) = @_; # Create a search Google Ads stream request that will retrieve all campaigns. my $search_stream_request = Google::Ads::GoogleAds::V26::Services::GoogleAdsService::SearchGoogleAdsStreamRequest ->new({ customerId => $customer_id, query => "SELECT campaign.id, campaign.name FROM campaign ORDER BY campaign.id" }); # Get the GoogleAdsService. my $google_ads_service = $api_client->GoogleAdsService(); my $search_stream_handler = Google::Ads::GoogleAds::Utils::SearchStreamHandler->new({ service => $google_ads_service, request => $search_stream_request }); # Issue a search request and process the stream response to print the requested # field values for the campaign in each row. $search_stream_handler->process_contents( sub { my $google_ads_row = shift; printf "Campaign with ID %d and name '%s' was found.\n", $google_ads_row->{campaign}{id}, $google_ads_row->{campaign}{name}; }); return 1; }