보고서 스트리밍

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 한도 및 할당량을 준수합니다. 단일 쿼리 또는 보고서는 페이징되거나 스트리밍되는 결과와 관계없이 하나의 작업으로 집계됩니다.

스트리밍 예시

자바

// 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 다운로드