보고서 스트리밍

Search Ads 360 Reporting API를 사용하여 항목 및 보고 데이터를 검색하는 메서드에는 두 가지가 있습니다.

이 가이드에서는 주로 SearchAds360Service의 스트리밍 데이터를 중점적으로 설명합니다. 두 가지 데이터 검색 방법에 대한 대략적인 차이점은 다음과 같습니다.

SearchAds360Service.SearchStream SearchAds360Service.Search
프로덕션 코드에 적합
서비스 SearchAds360Service SearchAds360Service
시나리오 객체 및 보고서 가져오기 객체 및 보고서 가져오기
응답 SearchAds360Row 객체의 스트림 SearchAds360Row 객체의 페이지
응답 필드 검색어에 지정된 항목만 검색어에 지정된 항목만
일일 한도 API 한도 및 할당량을 참조하세요. API 한도 및 할당량을 참조하세요.

Search은 페이지 매김된 여러 요청을 전송하여 전체 보고서를 다운로드할 수 있지만 SearchStream는 보고서 크기에 관계없이 단일 요청을 보내고 Search Ads 360 Reporting API와 영구 연결을 시작합니다.

SearchStream의 경우 데이터 패킷이 즉시 다운로드되기 시작하고 전체 결과가 데이터 버퍼에 캐시됩니다. 전체 스트림이 완료될 때까지 기다릴 필요 없이 코드에서 버퍼링된 데이터 읽기를 시작할 수 있습니다.

앱에 따라 Search 응답의 각 개별 페이지를 요청하는 데 필요한 왕복 네트워크 시간을 없애 SearchStream를 사용하면 특히 크기가 큰 보고서에서 페이징보다 향상된 성능을 제공할 수 있습니다.

예를 들어 100,000개 행으로 구성된 보고서를 살펴보겠습니다. 다음 표에서는 두 가지 방법의 계산 차이를 설명합니다.

SearchStream 검색
페이지 크기 해당 없음 페이지당 10,000행
API 요청 수 요청 1개 요청 10개
API 응답 수 연속 스트림 1개 응답 10개

성능 요소

일반적으로 다음과 같은 이유로 Search보다 SearchStream를 사용하는 것이 좋습니다.

  • 단일 페이지 보고서 (10,000행 미만): 두 방법 간에 큰 성능 차이가 없습니다.

  • 여러 페이지 보고서의 경우: 일반적으로 여러 번의 왕복을 피하고 디스크 캐시에서의 읽기/쓰기가 중요하지 않으므로 SearchStream이 더 빠릅니다.

비율 제한

두 메서드의 일일 한도는 표준 API 한도 및 할당량을 준수합니다. 단일 쿼리 또는 보고서는 페이징되거나 스트리밍되는 결과에 관계없이 하나의 작업으로 계산됩니다.

스트리밍 예

Java

// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package sample;

import com.beust.jcommander.Parameter;
import com.google.ads.searchads360.v0.lib.SearchAds360Client;
import com.google.ads.searchads360.v0.services.SearchAds360Row;
import com.google.ads.searchads360.v0.services.SearchAds360ServiceClient;
import com.google.ads.searchads360.v0.services.SearchSearchAds360StreamRequest;
import com.google.ads.searchads360.v0.services.SearchSearchAds360StreamResponse;
import com.google.api.gax.rpc.ServerStream;

/** Get campaign details using SearchStream. */
public class GetCampaignsStream {
  private static class GetCampaignsStreamParams extends CodeSampleParams {

    @Parameter(names = "--customerId", required = true)
    private String customerId;

    @Parameter(names = "--loginCustomerId")
    private String loginCustomerId;
  }

  public static void main(String[] args) {
    GetCampaignsStreamParams params = new GetCampaignsStreamParams();
    if (!params.parseArguments(args)) {
      // Optional: You may pass the loginCustomerId on the command line or specify a loginCustomerId
      // here (10 digits, no dashes). If neither are set, customerId will be used as
      // loginCustomerId.
      // params.loginCustomerId = Long.parseLong("INSERT_LOGIN_CUSTOMER_ID_HERE");
    }
    final String loginCustomerId = params.loginCustomerId;
    final String customerId = params.customerId;

    try {
      // Creates a SearchAds360Client with the specified loginCustomerId. If there's
      // no loginCustomerId, customerId will be used instead.
      final SearchAds360Client searchAds360Client =
          SearchAds360Client.newBuilder()
              .setLoginCustomerId(loginCustomerId == null ? customerId : loginCustomerId)
              .fromPropertiesFile()
              .build();
      // Creates the Search Ads 360 Service client.
      SearchAds360ServiceClient client = searchAds360Client.create();
      new GetCampaignsStream().runExample(client, customerId);
    } catch (Exception exception) {
      System.err.printf("Failed with exception: %s%n", exception);
      exception.printStackTrace();
      System.exit(1);
    }
  }

  private void runExample(SearchAds360ServiceClient searchAds360ServiceClient, String customerId) {
    // Creates a query that retrieves all campaigns under the customerId.
    String query = "SELECT campaign.name, campaign.id, campaign.status FROM campaign";
    SearchSearchAds360StreamRequest request =
        SearchSearchAds360StreamRequest.newBuilder()
            .setCustomerId(customerId)
            .setQuery(query)
            .build();

    // Issues a search stream request.
    ServerStream<SearchSearchAds360StreamResponse> stream =
        searchAds360ServiceClient.searchStreamCallable().call(request);

    for (SearchSearchAds360StreamResponse response : stream) {
      for (SearchAds360Row element : response.getResultsList()) {
        System.out.printf(
            "Campaign found with name '%s', ID %d, and status: %s.%n",
            element.getCampaign().getName(),
            element.getCampaign().getId(),
            element.getCampaign().getStatus());
      }
    }
  }
}

GetCampaignsStream.java 다운로드

Python

#!/usr/bin/env python
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Retrieves campaigns for a customer using a stream request."""

import argparse
import traceback
from google.ads.searchads360.v0.services.types.search_ads360_service import SearchSearchAds360StreamRequest
from util_searchads360 import SearchAds360Client


def main(client, customer_id) -> None:
  search_ads_360_service = client.get_service()

  query = """
      SELECT
        campaign.name,
        campaign.id,
        campaign.status
      FROM campaign"""

  request = SearchSearchAds360StreamRequest()
  request.customer_id = customer_id
  request.query = query

  # Issues a search stream request.
  results = search_ads_360_service.search_stream(request=request)

  for response in results:
    for result in response.results:
      campaign = result.campaign
      print(
          f'campaign "{campaign.name}" has id {campaign.id} and status {campaign.status.name}'
      )


if __name__ == "__main__":
  # SearchAds360Client will read the search-ads-360.yaml configuration file in
  # the home directory if none is specified.
  search_ads_360_client = SearchAds360Client.load_from_file()

  parser = argparse.ArgumentParser(
      description=("Retrieves campaigns for a customer."))
  # Arguments to provide to run the example.
  parser.add_argument(
      "-c",
      "--customer_id",
      type=str,
      required=True,
      help="The Search Ads 360 customer ID (10 digits, no dashes).",
  )

  parser.add_argument(
      "-l",
      "--login_customer_id",
      type=str,
      required=False,
      help="The Search Ads 360 login customer ID (10 digits, no dashes).",
  )

  args = parser.parse_args()

  search_ads_360_client.set_ids(args.customer_id, args.login_customer_id)

  try:
    main(search_ads_360_client, args.customer_id)
  except Exception:  # pylint: disable=broad-except
    traceback.print_exc()

get_campaigns_stream.py 다운로드