Analise uma tarefa através de registos

Este documento descreve como ativar, gerar e ver os registos do Cloud Logging para uma tarefa em lote.

Pode usar os registos para obter informações úteis para analisar os seus trabalhos. Por exemplo, os registos podem ajudar a depurar tarefas falhadas.

Em particular, os registos só são gerados depois de uma tarefa começar a ser executada e apenas se o registo tiver sido ativado para a tarefa. Se precisar de analisar uma tarefa sem registos, veja os eventos de estado.

Antes de começar

  1. Se nunca usou o Batch, reveja o artigo Comece a usar o Batch e ative o Batch concluindo os pré-requisitos para projetos e utilizadores.
  2. Para receber as autorizações de que precisa para analisar uma tarefa através de registos, peça ao seu administrador para lhe conceder as seguintes funções de IAM:

    Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

    Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

Ative o registo para uma tarefa

Para permitir a geração de registos para uma tarefa, ative os registos do Cloud Logging quando criar a tarefa:

  • Se criar uma tarefa através da Google Cloud consola, os registos do Cloud Logging estão sempre ativados.
  • Se criar uma tarefa através da CLI gcloud ou da API Batch, os registos do Cloud Logging são desativados por predefinição. Para ativar os registos do Cloud Logging, inclua a seguinte configuração para o campo logsPolicy ao criar a tarefa:

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

Escreva e gere registos para um trabalho

Quando os registos do Cloud Logging estão ativados para uma tarefa, o Cloud Logging gera automaticamente todos os registos escritos para a tarefa. Especificamente, as tarefas em lote podem ter os seguintes tipos de registos:

  • Registos do agente (batch_agent_logs): registos de atividades do agente do serviço em lote.

    O lote escreve automaticamente registos do agente para cada tarefa que tenha o registo ativado.

  • Registos de tarefas (batch_task_logs): registos de todos os dados para os quais configurou executáveis de uma tarefa para escrever no fluxo de saída padrão (stdout) ou no fluxo de erro padrão (stderr).

    Opcionalmente, pode escrever registos de tarefas para cada trabalho que tenha o registo ativado.

Veja os registos de um trabalho

Pode ver os registos de uma tarefa através da Google Cloud consola, da CLI gcloud, da API Logging, do Go, do Java, do Python ou do C++.

Consola

Para ver os registos de uma tarefa através da Google Cloud consola, faça o seguinte:

  1. Na Google Cloud consola, aceda à página Lista de tarefas.

    Aceda à lista de trabalhos

  2. Na coluna Nome da tarefa, clique no nome de uma tarefa. É apresentada a página Detalhes do trabalho.

  3. Clique no separador Registos. O Batch apresenta todos os registos associados à tarefa.

  4. Opcional: para filtrar os registos, faça qualquer uma das seguintes ações:

gcloud

Para ver os registos através da CLI gcloud, use o comando gcloud logging read:

gcloud logging read "QUERY"

onde QUERY é uma consulta para registos em lote que contém parâmetros de filtro em lote.

API

Para ver registos através da API Logging, use o método entries.list:

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

Substitua o seguinte:

Ir

Go

Para mais informações, consulte a documentação de referência da API Go em lote.

Para se autenticar no Batch, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento 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 mais informações, consulte a documentação de referência da API Java em lote.

Para se autenticar no Batch, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento 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 mais informações, consulte a documentação de referência da API Python em lote.

Para se autenticar no Batch, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento 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 mais informações, consulte a documentação de referência da API C++ em lote.

Para se autenticar no Batch, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento 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";
    }
  }

Filtre registos de lotes

Pode filtrar os registos em lote escrevendo uma consulta que inclua um ou mais dos seguintes parâmetros de filtro e zero ou mais operadores booleanos (AND, OR e NOT).

  • Para filtrar registos de uma tarefa específica, especifique o ID exclusivo (UID) da tarefa:

    labels.job_uid=JOB_UID
    

    onde JOB_UID é o UID da tarefa. Para obter o UID de uma tarefa, veja os detalhes da tarefa.

  • Para filtrar um tipo específico de registos de comandos em lote, especifique o tipo de registo:

    logName=projects/PROJECT_ID/logs/BATCH_LOG_TYPE
    

    Substitua o seguinte:

    • PROJECT_ID: o ID do projeto do projeto cujos registos quer ver.
    • BATCH_LOG_TYPE: o tipo de registos em lote que quer ver, batch_task_logs para registos de tarefas ou batch_agent_logs para registos de agentes.
  • Para filtrar registos com eventos de estado personalizado, especifique que o registo tem de definir o campo jsonPayload.batch/custom/event:

    jsonPayload.batch"/"custom"/"event!=NULL_VALUE
    
  • Para filtrar registos de uma ou mais gravidades específicas, especifique a seguinte comparação:

    severityCOMPARISON_OPERATORSEVERITY_ENUM
    

    Substitua o seguinte:

Para mais opções de filtro, consulte a documentação sobre a linguagem de consulta do Cloud Logging.

O que se segue?