ניתוח של משימה באמצעות יומנים

במאמר הזה מוסבר איך להפעיל, ליצור ולהציג יומנים מ-Cloud Logging עבור משימה באצווה.

אפשר להשתמש ביומנים כדי לקבל מידע שימושי לניתוח העבודות. לדוגמה, יומנים יכולים לעזור לכם לנפות באגים במשימות שנכשלו.

חשוב לדעת: יומנים נוצרים רק אחרי שהמשימה מתחילה לפעול, ורק אם הפעלתם את האפשרות 'רישום ביומן' למשימה. אם אתם צריכים לנתח עבודה בלי יומנים, אתם יכולים לראות את אירועי הסטטוס במקום.

לפני שמתחילים

  1. אם עוד לא השתמשתם ב-Batch, כדאי לעיין במאמר תחילת העבודה עם Batch ולהפעיל את Batch על ידי השלמת הדרישות המוקדמות לפרויקטים ולמשתמשים.
  2. כדי לקבל את ההרשאות שדרושות בשביל לנתח עבודה באמצעות יומנים, אתם צריכים לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:

    להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

    יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

הפעלת רישום ביומן למשימה

כדי לאפשר יצירת יומנים עבור משימה, מפעילים את היומנים מ-Cloud Logging כשיוצרים את המשימה:

  • אם יוצרים עבודה באמצעות מסוף Google Cloud , היומנים מ-Cloud Logging תמיד מופעלים.
  • אם יוצרים עבודה באמצעות ה-CLI של gcloud או Batch API, יומנים מ-Cloud Logging מושבתים כברירת מחדל. כדי להפעיל יומנים מ-Cloud Logging, צריך לכלול את ההגדרה הבאה בשדה logsPolicy כשיוצרים את העבודה:

    {
        ...
        "logsPolicy": {
            "destination": "CLOUD_LOGGING"
        }
        ...
    }
    

כתיבה ויצירה של יומנים למשימה

כשמפעילים יומנים מ-Cloud Logging למשימה, Cloud Logging יוצר באופן אוטומטי את כל היומנים שנכתבים למשימה. באופן ספציפי, למשימות Batch יכולים להיות סוגי היומנים הבאים:

  • יומני סוכנים (batch_agent_logs): יומנים של פעילויות מסוכן שירות Batch.

    מערכת Batch כותבת באופן אוטומטי יומני פעילות של סוכנים לכל משימה שהופעל בה רישום ביומן.

  • יומני משימות (batch_task_logs): יומנים של כל הנתונים שהגדרתם שרכיבי ההפעלה של משימה יכתבו לזרם הפלט הרגיל (stdout) או לזרם השגיאות הרגיל (stderr).

    אפשר גם לכתוב יומני משימות לכל עבודה שהפעלתם בה את האפשרות לרישום ביומן.

צפייה ביומנים של משימה

אפשר לראות את היומנים של עבודה באמצעות מסוף Google Cloud , ה-CLI של gcloud,‏ Logging API,‏ Go,‏ Java,‏ Python או C++.

המסוף

כדי לראות את היומנים של עבודה באמצעות המסוף Google Cloud , מבצעים את הפעולות הבאות:

  1. נכנסים לדף Job list במסוף Google Cloud .

    מעבר לרשימת המשימות

  2. בעמודה Job name (שם המשימה), לוחצים על שם המשימה. ייפתח הדף פרטי המשרה.

  3. לוחצים על הכרטיסייה יומנים. ב-Batch מוצגים כל היומנים שמשויכים למשימה.

  4. אופציונלי: כדי לסנן את היומנים, מבצעים אחת מהפעולות הבאות:

gcloud

כדי להציג יומנים באמצעות ה-CLI של gcloud, משתמשים בפקודה gcloud logging read:

gcloud logging read "QUERY"

כאשר QUERY היא שאילתה ליומני Batch שמכילה פרמטרים של מסנן Batch.

API

כדי להציג יומנים באמצעות Logging API, משתמשים ב-entries.list method:

POST https://logging.googleapis.com/v2/entries:list
{
    "resourceNames": [
        "projects/PROJECT_ID"
    ],
    "filter": "QUERY"
    "orderBy": "timestamp desc"
}

מחליפים את מה שכתוב בשדות הבאים:

המשך

Go

מידע נוסף מופיע במאמרי העזרה של Batch Go API.

כדי לבצע אימות ב-Batch, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

import (
	"context"
	"fmt"
	"io"

	batch "cloud.google.com/go/batch/apiv1"
	"cloud.google.com/go/batch/apiv1/batchpb"
	"cloud.google.com/go/logging"
	"cloud.google.com/go/logging/logadmin"
	"google.golang.org/api/iterator"
)

// Retrieve the logs written by the given job to Cloud Logging
func printJobLogs(w io.Writer, projectID string, job *batchpb.Job) error {
	// projectID := "your_project_id"

	ctx := context.Background()
	batchClient, err := batch.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("NewClient: %w", err)
	}
	defer batchClient.Close()

	adminClient, err := logadmin.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("Failed to create logadmin client: %w", err)
	}
	defer adminClient.Close()

	const name = "batch_task_logs"

	iter := adminClient.Entries(ctx,
		// Only get entries from the "batch_task_logs" log for the job with the given UID
		logadmin.Filter(fmt.Sprintf(`logName = "projects/%s/logs/%s" AND labels.job_uid=%s`, projectID, name, job.Uid)),
	)

	var entries []*logging.Entry

	for {
		logEntry, err := iter.Next()
		if err == iterator.Done {
			break
		}
		if err != nil {
			return fmt.Errorf("unable to fetch log entry: %w", err)
		}
		entries = append(entries, logEntry)
		fmt.Fprintf(w, "%s\n", logEntry.Payload)
	}

	fmt.Fprintf(w, "Successfully fetched %d log entries\n", len(entries))

	return nil
}

Java

Java

מידע נוסף מופיע במאמרי העזרה של Batch Java API.

כדי לבצע אימות ב-Batch, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

import com.google.cloud.batch.v1.Job;
import com.google.cloud.logging.v2.LoggingClient;
import com.google.logging.v2.ListLogEntriesRequest;
import com.google.logging.v2.LogEntry;
import java.io.IOException;

public class ReadJobLogs {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    // Project ID or project number of the Cloud project hosting the job.
    String projectId = "YOUR_PROJECT_ID";

    // The job which logs you want to print.
    Job job = Job.newBuilder().build();

    readJobLogs(projectId, job);
  }

  // Prints the log messages created by given job.
  public static void readJobLogs(String projectId, Job job) throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the `loggingClient.close()` method on the client to safely
    // clean up any remaining background resources.
    try (LoggingClient loggingClient = LoggingClient.create()) {

      ListLogEntriesRequest request = ListLogEntriesRequest.newBuilder()
          .addResourceNames(String.format("projects/%s", projectId))
          .setFilter(String.format("labels.job_uid=%s", job.getUid()))
          .build();

      for (LogEntry logEntry : loggingClient.listLogEntries(request).iterateAll()) {
        System.out.println(logEntry.getTextPayload());
      }
    }
  }
}

Python

Python

מידע נוסף מופיע במאמרי העזרה של Batch Python API.

כדי לבצע אימות ב-Batch, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

from __future__ import annotations

from typing import NoReturn

from google.cloud import batch_v1
from google.cloud import logging


def print_job_logs(project_id: str, job: batch_v1.Job) -> NoReturn:
    """
    Prints the log messages created by given job.

    Args:
        project_id: name of the project hosting the job.
        job: the job which logs you want to print.
    """
    # Initialize client that will be used to send requests across threads. This
    # client only needs to be created once, and can be reused for multiple requests.
    log_client = logging.Client(project=project_id)
    logger = log_client.logger("batch_task_logs")

    for log_entry in logger.list_entries(filter_=f"labels.job_uid={job.uid}"):
        print(log_entry.payload)

C++‎

C++

מידע נוסף מופיע במאמרי העזרה של Batch C++ API.

כדי לבצע אימות ב-Batch, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

#include "google/cloud/batch/v1/batch_client.h"
#include "google/cloud/logging/v2/logging_service_v2_client.h"
#include "google/cloud/location.h"
#include "google/cloud/project.h"

  [](std::string const& project_id, std::string const& location_id,
     std::string const& job_id) {
    auto const project = google::cloud::Project(project_id);
    auto const location = google::cloud::Location(project, location_id);
    auto const name = location.FullName() + "/jobs/" + job_id;
    auto batch = google::cloud::batch_v1::BatchServiceClient(
        google::cloud::batch_v1::MakeBatchServiceConnection());
    auto job = batch.GetJob(name);
    if (!job) throw std::move(job).status();

    auto logging = google::cloud::logging_v2::LoggingServiceV2Client(
        google::cloud::logging_v2::MakeLoggingServiceV2Connection());
    auto const log_name = project.FullName() + "/logs/batch_task_logs";
    google::logging::v2::ListLogEntriesRequest request;
    request.mutable_resource_names()->Add(project.FullName());
    request.set_filter("logName=\"" + log_name +
                       "\" labels.job_uid=" + job->uid());
    for (auto l : logging.ListLogEntries(request)) {
      if (!l) throw std::move(l).status();
      std::cout << l->text_payload() << "\n";
    }
  }

סינון יומנים של קובצי Batch

כדי לסנן את יומני Batch, צריך לכתוב שאילתה שכוללת אחד או יותר מהפרמטרים הבאים של המסנן ואפס או יותר אופרטורים בוליאניים (AND,‏ OR ו-NOT).

  • כדי לסנן יומנים ממשימה ספציפית, מציינים את המזהה הייחודי (UID) של המשימה:

    labels.job_uid=JOB_UID
    

    כאשר JOB_UID הוא מזהה ה-UID של המשרה. כדי לקבל את ה-UID של משימה, צופים בפרטי המשימה.

  • כדי לסנן לפי סוג מסוים של יומני אצווה, מציינים את סוג היומן:

    logName=projects/PROJECT_ID/logs/BATCH_LOG_TYPE
    

    מחליפים את מה שכתוב בשדות הבאים:

    • PROJECT_ID: מזהה הפרויקט של הפרויקט שרוצים להציג את היומנים שלו.
    • BATCH_LOG_TYPE: סוג יומני האצווה שרוצים להציג, batch_task_logs ליומני משימות או batch_agent_logs ליומני סוכנים.
  • כדי לסנן יומנים עם אירועי סטטוס בהתאמה אישית, צריך לציין שהיומן צריך להגדיר את השדה jsonPayload.batch/custom/event:

    jsonPayload.batch"/"custom"/"event!=NULL_VALUE
    
  • כדי לסנן את היומנים לפי רמת חומרה ספציפית אחת או יותר, מציינים את ההשוואה הבאה:

    severityCOMPARISON_OPERATORSEVERITY_ENUM
    

    מחליפים את מה שכתוב בשדות הבאים:

אפשרויות סינון נוספות מפורטות במאמר בנושא שפת השאילתות של Cloud Logging.

המאמרים הבאים