Strumentare le app Java per Error Reporting

Il pacchetto Error Reporting per Java ti consente di inviare eventi di errore direttamente dalle tue applicazioni Java a Error Reporting, in modo da diagnosticare e monitorare gli arresti anomali di runtime. L'instrumentazione dell'applicazione con la libreria ti consente di segnalare eventi di errore personalizzati e acquisire errori anche quando i bucket di log utilizzano chiavi di crittografia gestite dal cliente (CMEK).

Per le applicazioni in esecuzione su servizi Google Cloud integrati, tra cui funzioni Cloud Run, App Engine, Compute Engine e Google Kubernetes Engine, Error Reporting può anche dedurre gli eventi di errore automaticamente da Cloud Logging senza il pacchetto Error Reporting per Java. Affinché Error Reporting possa dedurre gli eventi di errore dai log, le voci di log devono rispettare i requisiti di formattazione degli errori ed essere archiviate in un bucket di log non CMEK di proprietà del progetto di origine o del progetto di destinazione a cui sono stati instradati i log.

Prima di iniziare

  1. Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Error Reporting API , if it is not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Error Reporting API , if it is not already enabled.

    Roles required to enable APIs

    To enable APIs, you need the serviceusage.services.enable permission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.

    Enable the API

Installa la libreria client

Il pacchetto Error Reporting per Java ti consente di monitorare e visualizzare gli eventi di errore segnalati da applicazioni Java in esecuzione praticamente ovunque.

    Se utilizzi Maven, aggiungi quanto segue al file pom.xml. Per saperne di più sulle BOM, consulta The Google Cloud Platform Libraries BOM.

    <dependencyManagement>
      <dependencies>
        <dependency>
          <groupId>com.google.cloud</groupId>
          <artifactId>libraries-bom</artifactId>
          <version>26.86.0</version>
          <type>pom</type>
          <scope>import</scope>
        </dependency>
      </dependencies>
    </dependencyManagement>
    
    <dependencies>
      <dependency>
        <groupId>com.google.cloud</groupId>
        <artifactId>google-cloud-errorreporting</artifactId>
      </dependency>
    </dependencies>

    Se utilizzi Gradle, aggiungi quanto segue alle dipendenze:

    implementation platform('com.google.cloud:libraries-bom:26.86.0')
    
    implementation 'com.google.cloud:google-cloud-errorreporting'

    Se utilizzi sbt, aggiungi quanto segue alle dipendenze:

    libraryDependencies += "com.google.cloud" % "google-cloud-errorreporting" % "0.219.0-beta"

    Se utilizzi Visual Studio Code o IntelliJ, puoi aggiungere librerie client al tuo progetto utilizzando i seguenti plug-in IDE:

    I plug-in forniscono funzionalità aggiuntive, come la gestione delle chiavi per i service account. Per informazioni dettagliate, consulta la documentazione di ogni plug-in.

Per ulteriori informazioni sull'installazione, consulta la documentazione del pacchetto Error Reporting per Java. Puoi anche segnalare i problemi utilizzando il tracker dei problemi.

Configura la libreria client

Puoi personalizzare il comportamento del pacchetto Error Reporting per Java. Consulta la documentazione di riferimento dell'API Java.

Eseguire app su Google Cloud

Per creare gruppi di errori utilizzando projects.events.report, il account di servizio richiede il ruolo Writer Error Reporting (roles/errorreporting.writer).

Alcuni servizi Google Cloud concedono automaticamente il ruolo Scrittore Error Reporting (roles/errorreporting.writer) alaccount di serviziot appropriato. Tuttavia, per alcuni servizi devi concedere questo ruolo al service account appropriato.

Cloud Run e Cloud Run Functions

Il account di servizio predefinito utilizzato da Cloud Run dispone delle autorizzazioni del ruolo Writer di Error Reporting (roles/errorreporting.writer).

Il pacchetto Error Reporting per Java può essere utilizzato senza dover fornire esplicitamente le credenziali.

Cloud Run è configurato per utilizzare Error Reporting automaticamente. Le eccezioni JavaScript non gestite verranno visualizzate in Logging ed elaborate da Error Reporting senza dover utilizzare il pacchetto Error Reporting per Java.

Ambiente flessibile di App Engine

App Engine concede automaticamente il ruolo Writer Error Reporting (roles/errorreporting.writer) al tuo account di servizio predefinito.

Il pacchetto Error Reporting per Java può essere utilizzato senza dover fornire esplicitamente le credenziali.

Error Reporting è abilitato automaticamente per le applicazioni dell'ambiente flessibile di App Engine. Non è richiesta alcuna configurazione aggiuntiva.

@WebServlet(name = "Error reporting", value = "/error")
public class ErrorReportingExample extends HttpServlet {

  private Logger logger = Logger.getLogger(ErrorReportingExample.class.getName());

  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws IOException, ServletException {

    // errors logged to stderr / Cloud logging with exceptions are automatically reported.
    logger.log(Level.SEVERE, "exception using log framework", new IllegalArgumentException());

    // use the error-reporting client library only if you require logging custom error events.
    logCustomErrorEvent();

    // runtime exceptions are also automatically reported.
    throw new RuntimeException("this is a runtime exception");
  }

  private void logCustomErrorEvent() {
    try (ReportErrorsServiceClient reportErrorsServiceClient = ReportErrorsServiceClient.create()) {
      // Custom error events require an error reporting location as well.
      ErrorContext errorContext =
          ErrorContext.newBuilder()
              .setReportLocation(
                  SourceLocation.newBuilder()
                      .setFilePath("Test.java")
                      .setLineNumber(10)
                      .setFunctionName("myMethod")
                      .build())
              .build();
      // Report a custom error event
      ReportedErrorEvent customErrorEvent =
          ReportedErrorEvent.getDefaultInstance()
              .toBuilder()
              .setMessage("custom error event")
              .setContext(errorContext)
              .build();

      // default project id
      ProjectName projectName = ProjectName.of(ServiceOptions.getDefaultProjectId());
      reportErrorsServiceClient.reportErrorEvent(projectName, customErrorEvent);
    } catch (Exception e) {
      logger.log(Level.SEVERE, "Exception encountered logging custom event", e);
    }
  }
}

Google Kubernetes Engine

Per utilizzare Error Reporting con Google Kubernetes Engine, svolgi i seguenti passaggi:

  1. Assicurati che al account di servizio da utilizzare dal tuo container sia stato concesso il ruolo Writer Error Reporting (roles/errorreporting.writer).

    Puoi utilizzare l'account di servizio predefinito di Compute Engine o un service account personalizzato.

    Per informazioni sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

  2. Crea il cluster e concedigli l'cloud-platform ambito di accesso.

    Ad esempio, il seguente comando create specifica l'ambito di accesso cloud-platform e unaccount di serviziot:

    gcloud container clusters create CLUSTER_NAME --service-account  SERVICE_ACCT_NAME --scopes=cloud-platform
    

Compute Engine

Per utilizzare Error Reporting con le istanze VM di Compute Engine, svolgi le seguenti operazioni:

  1. Assicurati che al account di servizio da utilizzare dalla tua istanza VM sia stato concesso il ruolo Writer di Error Reporting (roles/errorreporting.writer).

    Puoi utilizzare l'account di servizio predefinito di Compute Engine o un service account personalizzato.

    Per informazioni sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

  2. Nella Google Cloud console, vai alla pagina Istanze VM.

    Vai a Istanze VM

    Se utilizzi la barra di ricerca per trovare questa pagina, seleziona il risultato con il sottotitolo Compute Engine.

  3. Seleziona l'istanza VM che deve ricevere l'cloud-platform ambito di accesso.

  4. Fai clic su Interrompi e poi su Modifica.

  5. Nella sezione Identità e accesso API, seleziona un account di servizio con il ruolo Writer di Error Reporting (roles/errorreporting.writer).

  6. Nella sezione Ambiti di accesso, seleziona Consenti l'accesso completo a tutte le API Cloud e poi salva le modifiche.

  7. Fai clic su Avvia/Riprendi.

Esempio

Le eccezioni registrate utilizzando Cloud Logging Logback Appender o java.util.logging Handler vengono segnalate automaticamente alla console Error Reporting.

Il seguente esempio mostra l'utilizzo della libreria client Java per segnalare un evento di errore personalizzato:

import com.google.cloud.ServiceOptions;
import com.google.devtools.clouderrorreporting.v1beta1.ProjectName;
import com.google.devtools.clouderrorreporting.v1beta1.ReportErrorsServiceClient;
import com.google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;

/**
 * Snippet demonstrates using the Error Reporting API to report an exception.
 * <p>
 * When the workload runs on App Engine, GKE, Cloud Functions or another managed environment,
 * printing the exception's stack trace to stderr will automatically report the error
 * to Error Reporting.
 */
public class QuickStart {

  static String projectId;

  public static void main(String[] args) throws Exception {
    // Set your Google Cloud Platform project ID via environment or explicitly
    projectId = ServiceOptions.getDefaultProjectId();
    if (args.length > 0) {
      projectId = args[0];
    } else {
      String value = System.getenv("GOOGLE_CLOUD_PROJECT");
      if (value != null && value.isEmpty()) {
        projectId = value;
      }
    }

    try {
      throw new Exception("Something went wrong");
    } catch (Exception ex) {
      reportError(ex);
    }
  }

  /**
   * Sends formatted error report to Google Cloud including the error context.
   *
   * @param ex Exception containing the error and the context.
   * @throws IOException if fails to communicate with Google Cloud
   */
  private static void reportError(Exception ex) throws IOException {
    try (ReportErrorsServiceClient serviceClient = ReportErrorsServiceClient.create()) {
      StringWriter sw = new StringWriter();
      PrintWriter pw = new PrintWriter(sw);
      ex.printStackTrace(pw);

      ReportedErrorEvent errorEvent = ReportedErrorEvent.getDefaultInstance()
          .toBuilder()
          .setMessage(sw.toString())
          .build();
      // If you need to report an error asynchronously, use reportErrorEventCallable()
      // method
      serviceClient.reportErrorEvent(ProjectName.of(projectId), errorEvent);
    }
  }
}

Consulta la documentazione di riferimento dell'API Java su come recuperare e gestire le statistiche sugli errori, nonché i dati per i singoli eventi.

Esegui app in un ambiente di sviluppo locale

Per utilizzare il pacchetto Error Reporting per Java in un ambiente di sviluppo locale, ad esempio per eseguire la libreria sulla tua workstation, devi fornire al pacchetto Error Reporting per Java le credenziali predefinite dell'applicazione locale. Per saperne di più, consulta Autenticarsi in Error Reporting.

Per utilizzare gli esempi Java in questa pagina in un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.

  1. Installa Google Cloud CLI.

  2. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  3. Se utilizzi una shell locale, crea le credenziali di autenticazione locali per il tuo account utente:

    gcloud auth application-default login

    Non è necessario eseguire questa operazione se utilizzi Cloud Shell.

    Se viene restituito un errore di autenticazione e utilizzi un provider di identità (IdP) esterno, verifica di aver acceduto a gcloud CLI con la tua identità federata.

Per saperne di più, consulta Configura l'autenticazione per un ambiente di sviluppo locale.

Il metodo projects.events.report supporta anche le chiavi API. Se vuoi utilizzare le chiavi API per l'autenticazione, non devi configurare un file delle Credenziali predefinite dell'applicazione locale. Per saperne di più, consulta Crea una chiave API nella documentazione sull'autenticazione di Google Cloud .

Visualizza gruppi di errori

Nella console Google Cloud , vai alla pagina Error Reporting:

Vai a Error Reporting

Puoi trovare questa pagina anche utilizzando la barra di ricerca.

Per saperne di più, vedi Visualizzare e filtrare i gruppi di errori.