Berichte mit GoogleAdsService streamen

Verwenden Sie eine der folgenden Methoden, um Google Ads API-Entitäten und Berichtsdaten abzurufen:

Hier sind die wichtigsten Unterschiede zwischen den beiden Methoden:

GoogleAdsService.SearchStream GoogleAdsService.Search
Geeignet für Produktionscode Ja Ja
Dienst GoogleAdsService GoogleAdsService
Szenario Objekte und Berichte werden abgerufen Objekte und Berichte werden abgerufen
Antwort Stream von GoogleAdsRow-Objekten Seiten mit GoogleAdsRow-Objekten
Antwortfelder Nur die in der Abfrage angegebenen Nur die in der Abfrage angegebenen
Tageslimits Tageslimits basierend auf Zugriffsebenen Tageslimits basierend auf Zugriffsebenen

Während Search mehrere paginierte Anfragen sendet, um einen gesamten Bericht herunterzuladen, sendet SearchStream eine einzelne Anfrage und initiiert eine persistente gRPC-Verbindung mit der Google Ads API, unabhängig von der Berichtsgröße.

Bei SearchStream werden Datenpakete sofort in Batches von SearchGoogleAdsStreamResponse Objekten heruntergeladen. Ihr Code kann eingehende Batches iterieren, sobald sie eintreffen, ohne auf den Abschluss des gesamten Streams warten zu müssen.

Da die Netzwerkzeit für die Hin- und Rückübertragung entfällt, die für die Anforderung jeder einzelnen Seite einer Search-Antwort erforderlich ist, bietet SearchStream eine bessere Leistung als die Paginierung, insbesondere bei großen Berichten.

Beispiel

In diesem Beispiel wird ein Bericht mit 100,000 Zeilen verwendet. In der folgenden Tabelle werden die Unterschiede zwischen den beiden Methoden in Bezug auf Anfragen und Antworten aufgeführt:

SearchStream Suchen
Seitengröße Nicht zutreffend 10.000 Zeilen pro Seite
Anzahl der API-Anfragen 1 Anfrage 10 Anfragen
Anzahl der API-Antworten 1 kontinuierlicher Stream 10 Antworten

Leistungsfaktoren

Für die meisten Anwendungsfälle empfehlen wir aus folgenden Gründen SearchStream statt Search:

  • Einseitige Berichte (unter 10.000 Zeilen): Es gibt keine nennenswerten Leistungsunterschiede zwischen den beiden Methoden.
  • Mehrseitige Berichte: SearchStream ist in der Regel schneller, da mehrere Netzwerk-Roundtrips vermieden werden und das Lesen oder Schreiben aus dem Datenträger-Cache weniger ins Gewicht fällt.
  • Speichereffizienz: Wenn Sie große Berichte mit SearchStream verarbeiten, sollten Sie die Stream-Chunks durchlaufen und die Zeilen bei ihrem Eintreffen verarbeiten, anstatt alle Zeilen auf einmal im Speicher zu puffern. So vermeiden Sie Fehler aufgrund von unzureichendem Arbeitsspeicher (Out-of-Memory, OOM).
  • Verbindungsstabilität: Da SearchStream auf einer persistenten Verbindung basiert, können lang laufende Streams durch Netzwerkunterbrechungen oder Zeitüberschreitungen unterbrochen werden. Konfigurieren Sie geeignete RPC-Zeitlimits und implementieren Sie eine Wiederholungslogik für vorübergehende Streamfehler.

Ratenlimits

Die täglichen Vorgangslimits für beide Methoden entsprechen den Standardlimits und Zugriffsebenen Ihres Google Cloud-Projekts. Eine einzelne logische Berichtsanfrage wird als ein Vorgang auf Ihr tägliches Vorgangskontingent angerechnet, unabhängig davon, ob das Ergebnis mit SearchStream gestreamt oder über mehrere im Cache gespeicherte Seiten mit Search und einem page_token abgerufen wird. Jede paginierte Search-Anfrage wird jedoch weiterhin als einzelner RPC-Aufruf auf die kurzfristigen Ratenbegrenzungen angerechnet.

Codebeispiel

Im folgenden Codebeispiel wird gezeigt, wie Sie eine Streaming-Berichtsabfrage mithilfe der Clientbibliotheken ausführen:

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;
}
      

curl