Cómo analizar una tarea con registros

En este documento, se describe cómo habilitar, generar y visualizar registros de Cloud Logging para un trabajo por lotes.

Puedes usar los registros para obtener información útil para analizar tus trabajos. Por ejemplo, los registros pueden ayudarte a depurar trabajos con errores.

En particular, los registros solo se generan después de que un trabajo comienza a ejecutarse y solo si se habilitó el registro para el trabajo. Si necesitas analizar un trabajo sin registros, ver eventos de estado en su lugar.

Antes de comenzar

  1. Si nunca usaste Batch, consulta Cómo comenzar a usar Batch y habilita Batch completando los requisitos previos para proyectos y usuarios.
  2. A fin de obtener los permisos que necesitas para analizar un trabajo con registros, solicita a tu administrador que te otorgue el los siguientes roles de IAM:

    Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

    También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.

Habilita el registro de un trabajo

Para permitir que se generen registros para un trabajo, habilita los registros de Cloud Logging cuando lo crees:

  • Si creas un trabajo con la consola de Google Cloud, los registros de Cloud Logging siempre están habilitados.
  • Si creas un trabajo con gcloud CLI o API de Batch, los registros de Cloud Logging están inhabilitados de forma predeterminada. Para habilitar los registros de Cloud Logging, incluye la siguiente configuración para el campo logsPolicy cuando crees el trabajo:

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

Cómo escribir y generar registros para un trabajo

Cuando se habilitan los registros de Cloud Logging para un trabajo, Cloud Logging automáticamente cualquiera de los registros que se escriben para el trabajo. En particular, los trabajos por lotes pueden tener los siguientes tipos de registro:

Visualiza los registros de un trabajo

Puedes ver los registros de un trabajo con la consola de Google Cloud, la CLI de gcloud, la API de Logging, Go, Java, Python o C++.

Console

Para ver los registros de un trabajo con la consola de Google Cloud, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Lista de trabajos.

    Ir a la lista de trabajos

  2. En la columna Nombre del trabajo, haz clic en el nombre de un trabajo. Se abrirá la página Detalles del trabajo.

  3. Haz clic en la pestaña Registros. Batch muestra todos los registros asociados con el trabajo.

  4. Opcional: Para filtrar los registros, realiza una de las siguientes acciones:

gcloud

Para ver registros con gcloud CLI, usa la Comando gcloud logging read:

gcloud logging read "QUERY"

En el ejemplo anterior, QUERY es un valor por lotes que contenga Parámetros de filtro por lotes.

API

Para ver registros con la API de Logging, usa el Método entries.list:

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

Reemplaza lo siguiente:

Go

Go

Para obtener más información, consulta la API de Go por lotes documentación de referencia.

Para autenticarte en Batch, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

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

Para obtener más información, consulta la API de Java por lotes documentación de referencia.

Para autenticarte en Batch, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

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

Para obtener más información, consulta la API de Python por lotes documentación de referencia.

Para autenticarte en Batch, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

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++

Para obtener más información, consulta la API de C++ por lotes documentación de referencia.

Para autenticarte en Batch, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

#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";
    }
  }

Filtra registros de Batch

Puedes filtrar los registros por lotes escribiendo una consulta que incluya uno o más de los siguientes parámetros de filtro, y cero o más operadores booleanos (AND, OR y NOT).

  • Para filtrar registros de un trabajo específico, especifica el ID único (UID) del trabajo:

    labels.job_uid=JOB_UID
    

    En el que JOB_UID es el UID de la tarea. Para obtener el UID de un trabajo, consulta los detalles del trabajo.

  • Para filtrar un tipo específico de registros de lotes, especifica el tipo de registro:

    logName=projects/PROJECT_ID/logs/BATCH_LOG_TYPE
    

    Reemplaza lo siguiente:

    • PROJECT_ID: el ID del proyecto del proyecto para el que quieres ver los registros.
    • BATCH_LOG_TYPE: Es el tipo de registros de lotes que deseas ver, ya sea batch_task_logs para los registros de tareas o batch_agent_logs para los registros de agentes.
  • Para filtrar registros con eventos de estado personalizados, especifica que el registro debe definir el campo jsonPayload.batch/custom/event:

    jsonPayload.batch"/"custom"/"event!=NULL_VALUE
    
  • Para filtrar registros de una o más gravedades específicas, especifica la siguiente comparación:

    severityCOMPARISON_OPERATORSEVERITY_ENUM
    

    Reemplaza lo siguiente:

Para obtener más opciones de filtro, consulta la documentación del lenguaje de consulta de Cloud Logging.

¿Qué sigue?