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 abrufen Objekte und Berichte abrufen
Antwort Stream von GoogleAdsRow-Objekten Seiten mit GoogleAdsRow-Objekten
Felder der Antwort Nur die in der Abfrage angegebenen Nur die in der Abfrage angegebenen
Tageslimits Tageslimits basierend auf Zugriffsebenen Tageslimits basierend auf Zugriffsebenen

Bei Search werden mehrere paginierte Anfragen gesendet, um einen vollständigen Bericht herunterzuladen. Bei SearchStream wird unabhängig von der Berichtsgröße eine einzelne Anfrage gesendet und eine persistente gRPC-Verbindung mit der Google Ads API hergestellt.

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

Da die Roundtrip-Netzwerkzeit entfällt, die zum Anfordern 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 betrachtet. In der folgenden Tabelle sind die Unterschiede zwischen den beiden Methoden in Bezug auf Anfragen und Antworten aufgeschlüsselt:

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 SearchStreamSearch aus den folgenden Gründen:

  • Berichte mit einer Seite (unter 10.000 Zeilen): Es gibt keine signifikanten Leistungsunterschiede zwischen den beiden Methoden.
  • Berichte mit mehreren Seiten: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 Stream-Chunks durchlaufen und Zeilen verarbeiten, sobald sie eintreffen. So vermeiden Sie OOM-Fehler (Out-of-Memory), die auftreten können, wenn alle Zeilen gleichzeitig im Arbeitsspeicher gepuffert werden.
  • 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-Zeitüberschreitungen und implementieren Sie die Wiederholungslogik für vorübergehende Streamfehler.

Ratenlimits

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

Codebeispiel

Das folgende Codebeispiel zeigt, wie Sie mithilfe der Clientbibliotheken eine Streaming-Berichtsanfrage 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.V25.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::V25::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