Configurazione su Google Kubernetes Engine

Mantieni tutto organizzato con le raccolte Salva e classifica i contenuti in base alle tue preferenze.

Puoi inviare gli errori dalle applicazioni Google Kubernetes Engine a Error Reporting in uno dei due modi riportati di seguito:

Utilizzare Logging per segnalare gli errori

Per connettere le applicazioni Google Kubernetes Engine a Error Reporting, invia le eccezioni o altri errori a Logging utilizzando un nome di log dedicato per mantenere gli errori separati dagli altri log.

Per monitorare altri log di Google Kubernetes Engine oltre ai log dell'applicazione, puoi creare metriche basate su log.

Ad esempio:

  1. Attiva l'API Cloud Logging.

    Abilita l'API

  2. Installa l'agente Logging google-fluentd come appropriato per il tuo ambiente. Per le istruzioni, consulta la pagina relativa all'installazione dell'agente Logging. Tieni presente che google-fluentd viene installato automaticamente per le applicazioni GKE.

  3. Modifica la tua applicazione in modo che registri le eccezioni e le relative analisi dello stack in Logging. Scegli un nome di log per le informazioni sugli errori per tenerlo separato dalle altre informazioni registrate.

    Devi includere tutte le informazioni relative a un singolo errore o a un'eccezione nella stessa voce di log, inclusi tutti i frame di qualsiasi analisi dello stack. Se tutte le informazioni non sono insieme, Error Reporting potrebbe non raccoglierle. Puoi utilizzare il formato JSON strutturato per i payload delle voci di log per includere diversi tipi di informazioni per ogni errore.

Java

Aggiungi quanto segue al tuo file pom.xml:

<dependency>
  <groupId>org.fluentd</groupId>
  <artifactId>fluent-logger</artifactId>
  <version>0.3.4</version>
</dependency>

Poi utilizza il codice seguente per inviare i dati dell'eccezione:

public class ExceptionUtil {
  private static FluentLogger ERRORS = FluentLogger.getLogger("myapp");

  public static void main(String[] args) {
    try {
      throw new Exception("Generic exception for testing Stackdriver");
    } catch (Exception e) {
      report(e);
    }
  }

  public static void report(Throwable ex) {
    StringWriter exceptionWriter = new StringWriter();
    ex.printStackTrace(new PrintWriter(exceptionWriter));
    Map<String, Object> data = new HashMap<>();
    data.put("message", exceptionWriter.toString());
    Map<String, String> serviceContextData = new HashMap<>();
    serviceContextData.put("service", "myapp");
    data.put("serviceContext", serviceContextData);
    // ... add more metadata
    ERRORS.log("errors", data);
  }
}

Python

Innanzitutto, installa la libreria fluent-logger-python:

sudo pip install fluent-logger

Poi utilizza il codice seguente per inviare i dati dell'eccezione:

import traceback

import fluent.event
import fluent.sender

def simulate_error():
    fluent.sender.setup('myapp', host='localhost', port=24224)

    def report(ex):
        data = {}
        data['message'] = '{0}'.format(ex)
        data['serviceContext'] = {'service': 'myapp'}
        # ... add more metadata
        fluent.event.Event('errors', data)

    # report exception data using:
    try:
        # simulate calling a method that's not defined
        raise NameError
    except Exception:
        report(traceback.format_exc())

Node.js

Innanzitutto, installa la libreria fluent-logger-node:

npm install --save fluent-logger

Poi utilizza il codice seguente per inviare i dati dell'eccezione:

const structuredLogger = require('fluent-logger').createFluentSender('myapp', {
  host: 'localhost',
  port: 24224,
  timeout: 3.0,
});

const report = (err, req) => {
  const payload = {
    serviceContext: {
      service: 'myapp',
    },
    message: err.stack,
    context: {
      httpRequest: {
        url: req.originalUrl,
        method: req.method,
        referrer: req.header('Referer'),
        userAgent: req.header('User-Agent'),
        remoteIp: req.ip,
        responseStatusCode: 500,
      },
    },
  };
  structuredLogger.emit('errors', payload);
};

// Handle errors (the following uses the Express framework)
// eslint-disable-next-line no-unused-vars
app.use((err, req, res, next) => {
  report(err, req);
  res.status(500).send(err.response || 'Something broke!');
});

Go

Innanzitutto, installa il pacchetto fluent-logger-golang:

go get github.com/fluent/fluent-logger-golang/

Poi utilizza il codice seguente per inviare i dati di errore:


package main

import (
	"log"
	"net/http"
	"os"
	"runtime"

	"github.com/fluent/fluent-logger-golang/fluent"
)

var logger *fluent.Fluent

func main() {
	var err error
	logger, err = fluent.New(fluent.Config{
		FluentHost: "localhost",
		FluentPort: 24224,
	})
	if err != nil {
		log.Fatal(err)
	}

	http.HandleFunc("/demo", demoHandler)

	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
	}
	log.Printf("Listening on port %s", port)
	if err := http.ListenAndServe(":"+port, nil); err != nil {
		log.Fatal(err)
	}
}

func report(stackTrace string, r *http.Request) {
	payload := map[string]interface{}{
		"serviceContext": map[string]interface{}{
			"service": "myapp",
		},
		"message": stackTrace,
		"context": map[string]interface{}{
			"httpRequest": map[string]interface{}{
				"method":    r.Method,
				"url":       r.URL.String(),
				"userAgent": r.UserAgent(),
				"referrer":  r.Referer(),
				"remoteIp":  r.RemoteAddr,
			},
		},
	}
	if err := logger.Post("myapp.errors", payload); err != nil {
		log.Print(err)
	}
}

// Handler for the incoming requests.
func demoHandler(w http.ResponseWriter, r *http.Request) {
	// How to handle a panic.
	defer func() {
		if e := recover(); e != nil {
			stack := make([]byte, 1<<16)
			stackSize := runtime.Stack(stack, true)
			report(string(stack[:stackSize]), r)
		}
	}()

	// Panic is triggered.
	x := 0
	log.Println(100500 / x)
}

Utilizzo dell'API Error Reporting per scrivere errori

L'API Error Reporting fornisce un endpoint report per la scrittura delle informazioni sugli errori nel servizio.

  1. Attiva l'API Error Reporting.

    Abilita l'API

  2. Segnala gli errori all'API utilizzando l'API REST o una libreria client.

Esempi

ASP.NET

I report sul pacchetto ASP.NET NuGet non hanno riscontrato eccezioni dalle applicazioni web ASP.NET a Error Reporting.

Installa il pacchetto NuGet

Per installare il pacchetto NuGet Stackdriver ASP.NET in Visual Studio:

  1. Fai clic con il pulsante destro del mouse sulla soluzione e seleziona Gestisci pacchetti NuGet per la soluzione.
  2. Seleziona la casella di controllo Includi prerelease.
  3. Cerca e installa il pacchetto Google.Cloud.Diagnostics.AspNet.

Utilizzo

Dopo aver installato il pacchetto Stackdriver Get ASP.NET Stackdriver, aggiungi la seguente istruzione al codice dell'applicazione per iniziare a inviare errori a Stackdriver:

using Google.Cloud.Diagnostics.AspNet;

Aggiungi il seguente codice HttpConfiguration al metodo Register della tua app web .NET (sostituendo your-project-id con il tuo ID progetto effettivo per attivare il reporting delle eccezioni:

public static void Register(HttpConfiguration config)
{
    string projectId = "YOUR-PROJECT-ID";
    string serviceName = "NAME-OF-YOUR-SERVICE";
    string version = "VERSION-OF-YOUR-SERVCICE";
    // ...
    // Add a catch all for the uncaught exceptions.
    config.Services.Add(typeof(IExceptionLogger),
        ErrorReportingExceptionLogger.Create(projectId, serviceName, version));
    // ...
}

Dopo aver aggiunto questo metodo alla tua applicazione ASP.NET, puoi visualizzare eventuali eccezioni non rilevate che si verificano durante la segnalazione a Google Cloud nella sezione Error Reporting della console Google Cloud.

C#

Il seguente esempio è disponibile nel repository GoogleCloudPlatform/dotnet-docs-samples. Per utilizzarlo, dopo aver creato il progetto, specifica l'ID progetto:

C:\...\bin\Debug> set GOOGLE_PROJECT_ID=[YOUR_PROJECT_ID]

Assicurati di sostituire [YOUR_PROJECT_ID] con il valore corretto di Google Cloud Console.

Poi, invia dati di eccezione con un codice simile al seguente:

public class ErrorReportingSample
{
    public static void Main(string[] args)
    {
        try
        {
            throw new Exception("Generic exception for testing Stackdriver Error Reporting");
        }
        catch (Exception e)
        {
            report(e);
            Console.WriteLine("Stackdriver Error Report Sent");
        }
    }

    /// <summary>
    /// Create the Error Reporting service (<seealso cref="ClouderrorreportingService"/>)
    /// with the Application Default Credentials and the proper scopes.
    /// See: https://developers.google.com/identity/protocols/application-default-credentials.
    /// </summary>
    private static ClouderrorreportingService CreateErrorReportingClient()
    {
        // Get the Application Default Credentials.
        GoogleCredential credential = GoogleCredential.GetApplicationDefaultAsync().Result;

        // Add the needed scope to the credentials.
        credential.CreateScoped(ClouderrorreportingService.Scope.CloudPlatform);

        // Create the Error Reporting Service.
        ClouderrorreportingService service = new ClouderrorreportingService(new BaseClientService.Initializer
        {
            HttpClientInitializer = credential,
        });
        return service;
    }

    /// <summary>
    /// Creates a <seealso cref="ReportRequest"/> from a given exception.
    /// </summary>
    private static ReportRequest CreateReportRequest(Exception e)
    {
        // Create the service.
        ClouderrorreportingService service = CreateErrorReportingClient();

        // Get the project ID from the environement variables.
        string projectId = Environment.GetEnvironmentVariable("GOOGLE_PROJECT_ID");

        // Format the project id to the format Error Reporting expects. See:
        // https://cloud.google.com/error-reporting/reference/rest/v1beta1/projects.events/report
        string formattedProjectId = string.Format("projects/{0}", projectId);

        // Add a service context to the report.  For more details see:
        // https://cloud.google.com/error-reporting/reference/rest/v1beta1/projects.events#ServiceContext
        ServiceContext serviceContext = new ServiceContext()
        {
            Service = "myapp",
            Version = "8c1917a9eca3475b5a3686d1d44b52908463b989",
        };
        ReportedErrorEvent errorEvent = new ReportedErrorEvent()
        {
            Message = e.ToString(),
            ServiceContext = serviceContext,
        };
        return new ReportRequest(service, errorEvent, formattedProjectId);
    }

    /// <summary>
    /// Report an exception to the Error Reporting service.
    /// </summary>
    private static void report(Exception e)
    {
        // Create the report and execute the request.
        ReportRequest request = CreateReportRequest(e);
        request.Execute();
    }
}

Go

Vedi Configurazione di Error Reporting per Go.

Java

Consulta Configurazione di Error Reporting per Java.

Node.js

Consulta la pagina relativa alla configurazione di Error Reporting per Node.js.

Ruby

Vedi Configurazione di Error Reporting per Ruby.

Python

Consulta la pagina relativa alla configurazione di Error Reporting per Python.

PHP

Consulta la pagina relativa alla configurazione di Error Reporting per PHP.