İhtiyaçlarınızı karşılayan bir rapor belirledikten veya oluşturduktan sonra çıkış oluşturma zamanı gelir. Rapor çıkışı, programatik olarak alınabilen ve üzerinde işlem yapılabilen rapor dosyalarında saklanır. Rapor çalıştırmanın sonucu olarak bir rapor dosyası oluşturulur.
Bu kılavuzda, Rapor hizmeti aracılığıyla rapor dosyalarının programatik olarak nasıl oluşturulacağı ayrıntılı bir şekilde açıklanmaktadır.
Rapor bulma
Rapor çalıştırmak için raporun kimliğini bilmeniz gerekir. Yeni oluşturduğunuz veya güncellediğiniz bir rapor varsa bu değeri, döndürülen rapor kaynağının id alanında bulabilirsiniz. Kullanıcıların, daha sonra arama yapmak için bu döndürülen kimlikleri saklaması ö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ı tarafından tanımlanan bazı ölçütlere göre 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));
PHP
$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 rapor listesinin nasıl sıralanacağını ve düzenleneceğini kontrol etmek için belirleyebileceğiniz isteğe bağlı parametreler hakkında bilgi edinmek üzere referans belgelerine bakın. Bu listenin sıralamasını ve düzenini kontrol etmek, özellikle son zamanlarda değiştirilen raporları bulmak için faydalı olabilir.
Rapor çalıştırma
Uygun bir rapor bulduktan sonra, bu raporu çalıştırmak ve yeni bir rapor dosyası oluşturmak için Rapor hizmetini kullanabilirsiniz. Raporun karmaşıklığına ve işlenmesinin ne kadar süreceğine bağlı olarak raporlar eşzamanlı veya eşzamansız (varsayılan) olarak çalıştırılabilir. Eşzamanlı ve eşzamansız raporlama hakkında ayrıntılı bilgi için Eşzamanlı Raporlar kılavuzuna bakın.
Rapor çalıştırmak için aşağıdaki örnekte olduğu gibi Report hizmetinin run 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();
PHP
// 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ğin yanıtı bir Files kaynağıdır. Bu, başarılı bir senkron çalıştırma isteği olsaydı döndürülen kaynağın tüm alanları doldurulur ve dosya indirilmeye hazır olurdu. Ancak bu eşzamansız bir çalıştırma isteği olduğundan, raporun çalışması henüz tamamlanmadığı için belirli anahtar alanları eksik olacak ve dosyanın status değeri PROCESSING olarak ayarlanacaktır.
Rapor ne zaman tamamlanır?
Bir 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 ne zaman tamamlandığını belirlemenize yardımcı olacak iki önemli bilgi içerir:
- Sonraki isteklerde bu dosyaya referans vermek için kullanılabilecek bir
idalanı. - Rapor çalıştırmanın mevcut durumunu gösteren bir
statusalanı.
Bir raporun ne zaman tamamlandığını belirlemek için dosyanın status bölümünü düzenli olarak kontrol etmeniz gerekir. Aşağıdaki örnekte gösterildiği gibi:
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);
PHP
// 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 simgesi REPORT_AVAILABLE olarak değiştiğinde dosya indirilmeye hazırdır. Yukarıdaki örnekte gösterildiği gibi, istek kotası kullanımınızı optimize etmek için bu şekilde yoklama yaparken eksponansiyel geri yükleme stratejisi uygulamanız önemle tavsiye edilir.