প্রতিবেদনগুলি খুঁজুন এবং চালান৷

একবার আপনি সনাক্ত বা একটি প্রতিবেদন তৈরি করেছেন যা আপনার চাহিদা পূরণ করে, এটি আউটপুট তৈরি করার সময়। রিপোর্ট আউটপুট রিপোর্ট ফাইলগুলিতে সংরক্ষণ করা হয়, যা পুনরুদ্ধার করা যায় এবং প্রোগ্রামগতভাবে ম্যানিপুলেট করা যায়। একটি রিপোর্ট চালানোর ফলে একটি রিপোর্ট ফাইল তৈরি করা হয়।

রিপোর্ট পরিষেবার মাধ্যমে কীভাবে প্রোগ্রামেটিকভাবে রিপোর্ট ফাইল তৈরি করতে হয় এই নির্দেশিকাটি বিশদ বিবরণ দেয়৷

একটি রিপোর্ট খুঁজুন

একটি রিপোর্ট চালানোর জন্য, আপনাকে রিপোর্টের আইডি জানতে হবে। আপনি যদি সবেমাত্র একটি প্রতিবেদন তৈরি বা আপডেট করে থাকেন , তাহলে এই মানটি রিপোর্ট রিসোর্সের id ফিল্ডে পাওয়া যাবে যা ফেরত দেওয়া হয়েছে। এটি সুপারিশ করা হয় যে ব্যবহারকারীরা এই ফেরত আইডিগুলিকে পরবর্তীতে দেখার জন্য সংরক্ষণ করুন৷

আপনি যে প্রতিবেদনটি চালাতে চান তার আইডি যদি আপনি না জানেন, তাহলে আপনি যেটি চান তা খুঁজে পেতে সমস্ত উপলব্ধ প্রতিবেদনের তালিকা দেখতে পারেন। নীচের উদাহরণটি ব্যাখ্যা করে যে কীভাবে কিছু ব্যবহারকারী-সংজ্ঞায়িত মানদণ্ড দ্বারা একটি প্রতিবেদন দেখতে হয়:

সি#

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));

জাভা

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));

পিএইচপি

$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));

পাইথন

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

রুবি

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

ঐচ্ছিক পরামিতিগুলির জন্য রেফারেন্স ডকুমেন্টেশন পড়ুন যেগুলি আপনি নির্দিষ্ট করতে পারেন কিভাবে প্রত্যাবর্তিত প্রতিবেদনের তালিকা সাজানো এবং অর্ডার করা হয় তা নিয়ন্ত্রণ করতে। এই তালিকার বাছাই এবং ক্রম নিয়ন্ত্রণ করা সাম্প্রতিককালে পরিবর্তিত প্রতিবেদনগুলি খুঁজে পেতে বিশেষভাবে কার্যকর হতে পারে।

একটি প্রতিবেদন চালান

একবার আপনি একটি উপযুক্ত প্রতিবেদন খুঁজে পেলে, আপনি এটি চালানোর জন্য এবং একটি নতুন প্রতিবেদন ফাইল তৈরি করতে প্রতিবেদন পরিষেবা ব্যবহার করতে পারেন। রিপোর্টের জটিলতা এবং এটি প্রক্রিয়া করতে যে সময় লাগবে তার উপর নির্ভর করে রিপোর্টগুলি সিঙ্ক্রোনাস বা অ্যাসিঙ্ক্রোনাসভাবে (ডিফল্ট) চালানো যেতে পারে। সিঙ্ক্রোনাস বনাম অ্যাসিঙ্ক্রোনাস রিপোর্টিংয়ের বিশদ বিবরণের জন্য সিঙ্ক্রোনাস রিপোর্ট গাইড দেখুন।

একটি প্রতিবেদন চালানোর জন্য, আপনি প্রতিবেদন পরিষেবার রান পদ্ধতিতে একটি কল করেন, যেমনটি নীচের উদাহরণে রয়েছে:

সি#

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

জাভা

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

পিএইচপি

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

পাইথন

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

রুবি

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

এই অনুরোধের প্রতিক্রিয়া হল একটি ফাইল সম্পদ । যদি এটি একটি সফল সিঙ্ক্রোনাস রানের অনুরোধ হয়, তবে প্রত্যাবর্তিত সংস্থানের সমস্ত ক্ষেত্র পূরণ করা হবে এবং ফাইলটি ডাউনলোডের জন্য প্রস্তুত হবে। যেহেতু এটি একটি অ্যাসিঙ্ক্রোনাস রান অনুরোধ ছিল, তবে, কিছু কী ক্ষেত্র অনুপস্থিত থাকবে এবং ফাইলের status PROCESSING এ সেট করা হবে, যেহেতু রিপোর্টটি এখনও চালানো শেষ হয়নি৷

যখন একটি রিপোর্ট চলমান শেষ হয়?

আপনি যখন অ্যাসিঙ্ক্রোনাসভাবে একটি প্রতিবেদন চালান, তখন একটি স্থানধারক ফাইল অবিলম্বে তৈরি হয় এবং প্রতিবেদনটি প্রক্রিয়া করার জন্য একটি সারিতে রাখা হয়। প্রতিবেদনটি কখন চালানো শেষ হবে তা নির্ধারণ করতে আপনাকে সাহায্য করার জন্য স্থানধারকটিতে দুটি মূল তথ্য থাকবে:

  1. একটি id ক্ষেত্র, যা পরবর্তী অনুরোধে এই ফাইলটি উল্লেখ করতে ব্যবহার করা যেতে পারে।
  2. একটি status ক্ষেত্র, যা প্রতিবেদনের বর্তমান অবস্থার প্রতিনিধিত্ব করে।

একটি প্রতিবেদন কখন চালানো শেষ হয়েছে তা নির্ধারণ করতে, আপনাকে পর্যায়ক্রমে ফাইলটির status পরীক্ষা করতে হবে, যেমনটি নীচের উদাহরণে রয়েছে:

সি#

// 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);

জাভা

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);

পিএইচপি

// 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);

পাইথন

# 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)

রুবি

# 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 এ পরিবর্তিত হয়, ফাইলটি ডাউনলোডের জন্য প্রস্তুত। উপরের উদাহরণে যেমন দেখানো হয়েছে, আপনার অনুরোধের কোটা ব্যবহারের অপ্টিমাইজ করার জন্য এইভাবে পোলিং করার সময় আপনি একটি সূচকীয় ব্যাকঅফ কৌশল প্রয়োগ করার জন্য দৃঢ়ভাবে সুপারিশ করা হয়।