Rapor Bulun ve Çalıştırın

İhtiyaçlarınızı karşılayan bir rapor tanımladıktan veya oluşturduktan sonra çıkış oluşturma zamanı gelmiş demektir. Rapor çıkışı, rapor dosyalarında depolanır. Bunlar, programatik olarak alınıp manipüle edilebilir. Rapor çalıştırmanın sonucunda rapor dosyası oluşturulur.

Bu kılavuzda, Raporlar hizmeti üzerinden rapor dosyalarının programatik olarak nasıl oluşturulacağı açıklanmaktadır.

Rapor bulma

Bir rapor çalıştırmak için raporun kimliğini bilmeniz gerekir. Kısa süre önce bir rapor oluşturduysanız veya güncellediyseniz bu değer, döndürülen rapor kaynağının id alanında bulunabilir. Kullanıcıların daha sonra arama yapmak için bu döndürülen kimlikleri depolaması önerilir.

Çalıştırmak istediğiniz raporun kimliğini bilmiyorsanız istediğiniz raporu bulmak için mevcut tüm raporların listesine göz atabilirsiniz. Aşağıdaki örnekte, kullanıcı tanımlı bazı ölçütlere göre bir raporun nasıl aranacağı gösterilmektedir:

C#

Report target = null;
ReportList reports;
String nextPageToken = null;

do {
  // Create and execute the reports list request.
  ReportsResource.ListRequest request = service.Reports.List(profileId);
  request.PageToken = nextPageToken;
  reports = request.Execute();

  foreach (Report report in reports.Items) {
    if (IsTargetReport(report)) {
      target = report;
      break;
    }
  }

  // Update the next page token.
  nextPageToken = reports.NextPageToken;
} while (target == null
    && reports.Items.Any()
    && !String.IsNullOrEmpty(nextPageToken));

Java

Report target = null;
ReportList reports;
String nextPageToken = null;

do {
  // Create and execute the reports list request.
  reports = reporting.reports().list(profileId).setPageToken(nextPageToken).execute();

  for (Report report : reports.getItems()) {
    if (isTargetReport(report)) {
      target = report;
      break;
    }
  }

  // Update the next page token.
  nextPageToken = reports.getNextPageToken();
} while (target == null
    && !reports.getItems().isEmpty()
    && !Strings.isNullOrEmpty(nextPageToken));

2.999

$target = null;
$response = null;
$pageToken = null;

do {
    // Create and execute the report list request.
    $response = $this->service->reports->listReports(
        $userProfileId,
        ['pageToken' => $pageToken]
    );

    foreach ($response->getItems() as $report) {
        if ($this->isTargetReport($report)) {
            $target = $report;
            break;
        }
    }

    $pageToken = $response->getNextPageToken();
} while (empty($target) && !empty($response->getItems()) && !empty($pageToken));

Python

target = None

# Construct the request.
request = service.reports().list(profileId=profile_id)

while True:
  response = request.execute()

  for report in response['items']:
    if is_target_report(report):
      target = report
      break

  if not target and response['items'] and response['nextPageToken']:
    request = service.reports().list_next(request, response)
  else:
    break

Ruby

page_token = nil
target = nil

loop do
  result = service.list_reports(profile_id, page_token: page_token)

  result.items.each do |report|
    if target_report?(report)
      target = report
      break
    end
  end

  page_token = (result.next_page_token if target.nil? && result.items.any?)
  break if page_token.to_s.empty?
end

Döndürülen raporlar listesinin nasıl sıralandığını ve sıralandığını kontrol etmek amacıyla belirtebileceğiniz isteğe bağlı parametreler için referans belgelere bakın. Bu listenin sıralamasını ve sıralamasını kontrol etmek özellikle yakın zamanda değiştirilen raporları bulmak için faydalı olabilir.

Rapor çalıştırma

Uygun bir rapor bulduğunuzda, raporu çalıştırmak ve yeni bir rapor dosyası oluşturmak için Rapor hizmetini kullanabilirsiniz. Raporlar, raporun karmaşıklığına ve işlenmesi için gereken süreye bağlı olarak eşzamanlı veya eşzamansız olarak (varsayılan) çalıştırılabilir. Eşzamanlı ve eşzamansız raporlamayla ilgili ayrıntılar için Eşzamanlı Raporlar kılavuzuna bakın.

Rapor çalıştırmak için aşağıdaki örnekte olduğu gibi Rapor hizmetinin koşu yöntemini çağırırsınız:

C#

// Run the report.
File file = service.Reports.Run(profileId, reportId).Execute();

Java

// Run the report.
File file = reporting.reports().run(profileId, reportId).execute();

2.999

// Run the report.
$file = $this->service->reports->run($userProfileId, $reportId);

Python

# Run the report.
report_file = service.reports().run(
    profileId=profile_id, reportId=report_id).execute()

Ruby

# Run the report.
report_file = service.run_report(profile_id, report_id)

Bu isteğe verilen yanıt bir Dosyalar kaynağıdır. Bu, başarılı bir eşzamanlı çalıştırma isteğiyse döndürülen kaynağın tüm alanları doldurulur ve dosya indirilmeye hazır olur. Ancak bu, eşzamansız bir çalıştırma isteği olduğundan, raporun çalışması henüz tamamlanmadığından, bazı önemli alanlar eksik olacak ve dosyanın status kısmı PROCESSING olarak ayarlanacaktır.

Raporun çalıştırılması ne zaman tamamlanır?

Raporu eşzamansız olarak çalıştırdığınızda hemen bir yer tutucu dosya oluşturulur ve rapor işlenmek üzere sıraya alınır. Yer tutucu, raporun çalıştırıldığı zamanı belirlemenize yardımcı olmak için iki temel bilgi içerir:

  1. Sonraki isteklerde bu dosyaya başvuruda bulunmak için kullanılabilecek bir id alanı.
  2. Rapor çalıştırmanın mevcut durumunu temsil eden bir status alanı.

Bir raporun çalışmasının ne zaman tamamlandığını belirlemek için, aşağıdaki örnekte gösterildiği gibi, dosyanın status değerini düzenli olarak kontrol etmeniz gerekir:

C#

// Wait for the report file to finish processing.
// An exponential backoff policy is used to limit retries and conserve quota.
int sleep = 0;
int startTime = GetCurrentTimeInSeconds();
do {
  File file = service.Files.Get(reportId, fileId).Execute();

  if ("REPORT_AVAILABLE".Equals(file.Status)) {
    Console.WriteLine("File status is {0}, ready to download.", file.Status);
    return;
  } else if (!"PROCESSING".Equals(file.Status)) {
    Console.WriteLine("File status is {0}, processing failed.", file.Status);
    return;
  } else if (GetCurrentTimeInSeconds() - startTime > MAX_RETRY_ELAPSED_TIME) {
    Console.WriteLine("File processing deadline exceeded.");
    return;
  }

  sleep = GetNextSleepInterval(sleep);
  Console.WriteLine("File status is {0}, sleeping for {1} seconds.", file.Status, sleep);
  Thread.Sleep(sleep * 1000);
} while (true);

Java

BackOff backOff =
    new ExponentialBackOff.Builder()
        .setInitialIntervalMillis(10 * 1000) // 10 second initial retry
        .setMaxIntervalMillis(10 * 60 * 1000) // 10 minute maximum retry
        .setMaxElapsedTimeMillis(60 * 60 * 1000) // 1 hour total retry
        .build();

do {
  File file = reporting.files().get(reportId, fileId).execute();

  if ("REPORT_AVAILABLE".equals(file.getStatus())) {
    // File has finished processing.
    System.out.printf("File status is %s, ready to download.%n", file.getStatus());
    return file;
  } else if (!"PROCESSING".equals(file.getStatus())) {
    // File failed to process.
    System.out.printf("File status is %s, processing failed.", file.getStatus());
    return null;
  }

  // The file hasn't finished processing yet, wait before checking again.
  long retryInterval = backOff.nextBackOffMillis();
  if (retryInterval == BackOff.STOP) {
    System.out.println("File processing deadline exceeded.%n");
    return null;
  }

  System.out.printf("File status is %s, sleeping for %dms.%n", file.getStatus(), retryInterval);
  Thread.sleep(retryInterval);
} while (true);

2.999

// Wait for the report file to finish processing.
// An exponential backoff policy is used to limit retries and conserve
// quota.
$sleep = 0;
$startTime = time();

do {
    $file = $this->service->files->get($reportId, $fileId);

    if ($file->getStatus() === 'REPORT_AVAILABLE') {
        printf('File status is %s, ready to download<br>', $file->getStatus());
        return $file;
    } elseif ($file->getStatus() !== 'PROCESSING') {
        printf('File status is %s, processing failed<br>', $file->getStatus());
        return null;
    } elseif (time() - $startTime > self::MAX_RETRY_ELAPSED_TIME) {
        printf('File processing deadline exceeded<br>');
        return null;
    }

    $sleep = $this->getNextSleepInterval($sleep);
    printf(
        'File status is %s, sleeping for %d seconds<br>',
        $file->getStatus(),
        $sleep
    );
    $this->sleep($sleep);
} while (true);

Python

# Wait for the report file to finish processing.
# An exponential backoff strategy is used to conserve request quota.
sleep = 0
start_time = time.time()
while True:
  report_file = service.files().get(
      reportId=report_id, fileId=file_id).execute()

  status = report_file['status']
  if status == 'REPORT_AVAILABLE':
    print 'File status is %s, ready to download.' % status
    return
  elif status != 'PROCESSING':
    print 'File status is %s, processing failed.' % status
    return
  elif time.time() - start_time > MAX_RETRY_ELAPSED_TIME:
    print 'File processing deadline exceeded.'
    return

  sleep = next_sleep_interval(sleep)
  print 'File status is %s, sleeping for %d seconds.' % (status, sleep)
  time.sleep(sleep)

Ruby

# Wait for the report file to finish processing.
# An exponential backoff strategy is used to conserve request quota.
interval = 0
start_time = Time.now
loop do
  report_file = service.get_file(report_id, file_id)

  status = report_file.status
  if status == 'REPORT_AVAILABLE'
    puts format('File status is %s, ready to download.', status)
    break
  elsif status != 'PROCESSING'
    puts format('File status is %s, processing failed.', status)
    break
  elsif Time.now - start_time > MAX_RETRY_ELAPSED_TIME
    puts 'File processing deadline exceeded.'
    break
  end

  interval = next_sleep_interval(interval)
  puts format('File status is %s, sleeping for %d seconds.', status,
    interval)
  sleep(interval)
end

status REPORT_AVAILABLE olarak değiştiğinde dosya indirilmeye hazır olur. Yukarıdaki örnekte gösterildiği gibi, istek kota kullanımınızı optimize etmek için buna benzer bir anket yaparken eksponansiyel geri yükleme stratejisi uygulamanız önemle tavsiye edilir.