Menyiapkan di Compute Engine

Anda dapat mengirim error dari aplikasi Compute Engine ke Error Reporting dengan salah satu dari dua cara berikut:

Menggunakan Logging untuk melaporkan error

Untuk menghubungkan aplikasi Compute Engine ke Pelaporan Error, kirim pengecualian atau error lainnya ke Logging.

Contoh:

  1. Instal agen google-fluentd Logging sesuai dengan lingkungan Anda. Untuk mengetahui petunjuknya, lihat Menginstal agen Logging.
  2. Ubah aplikasi Anda agar mencatat pengecualian dan stack trace-nya ke Logging.

    Anda harus menyertakan semua informasi untuk satu error atau pengecualian dalam entri log yang sama, termasuk semua frame stack trace. Jika semua informasi tidak bersama, Pelaporan Error mungkin tidak mendeteksi error. Anda dapat menggunakan format JSON terstruktur untuk payload entri log guna menyertakan berbagai jenis informasi untuk setiap error.

  3. Java

    Tambahkan kode berikut ke file pom.xml Anda:

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

    Kemudian, gunakan kode seperti berikut untuk mengirim data pengecualian:

    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

    Pertama, instal library fluent-logger-python:

    sudo pip install fluent-logger
    

    Kemudian, gunakan kode seperti berikut untuk mengirim data pengecualian:

    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

    Pertama, instal library fluent-logger-node:

    npm install --save fluent-logger
    

    Kemudian, gunakan kode seperti berikut untuk mengirim data pengecualian:

    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

    Pertama, instal paket fluent-logger-golang:

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

    Kemudian, gunakan kode seperti berikut untuk mengirim data error:

    
    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)
    }
    

    Menggunakan Error Reporting API untuk menulis error

    Error Reporting API menyediakan endpoint report untuk menulis informasi error ke layanan.

    1. Enable the Error Reporting API.

      Enable the API

    2. Laporkan error ke API menggunakan REST API atau library klien.

    Sampel

    ASP.NET

    Paket NuGet ASP.NET melaporkan pengecualian yang tidak tertangkap dari aplikasi web ASP.NET ke Error Reporting.

    Menginstal paket NuGet

    Untuk menginstal paket NuGet Stackdriver ASP.NET di Visual Studio:

    1. Klik kanan solusi Anda, lalu pilih Kelola paket NuGet untuk solusi.
    2. Centang kotak Include prerelease.
    3. Telusuri dan instal paket bernama Google.Cloud.Diagnostics.AspNet.

    Penggunaan

    Setelah menginstal paket NuGet Stackdriver ASP.NET, tambahkan pernyataan berikut ke kode aplikasi Anda untuk mulai mengirim error ke Stackdriver:

    using Google.Cloud.Diagnostics.AspNet;
    

    Tambahkan kode HttpConfiguration berikut ke metode Register dari aplikasi web .NET Anda (mengganti your-project-id dengan project ID sebenarnya untuk mengaktifkan pelaporan pengecualian:

    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));
        // ...
    }
    

    Setelah menambahkan metode ini ke aplikasi ASP.NET, Anda dapat melihat pengecualian yang tidak tertangkap yang terjadi saat dilaporkan ke Google Cloud di bagian Pelaporan Error pada konsol Google Cloud.

    C#

    Contoh berikut dapat ditemukan di repositori GoogleCloudPlatform/dotnet-docs-samples. Untuk menggunakannya, setelah mem-build project, tentukan project ID Anda:

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

    Pastikan Anda mengganti [YOUR_PROJECT_ID] dengan nilai yang benar dari konsol Google Cloud.

    Kemudian, kirim data pengecualian dengan kode yang mirip dengan berikut ini:

    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

    Lihat Menyiapkan Pelaporan Error untuk Go.

    Java

    Lihat Menyiapkan Pelaporan Error untuk Java.

    Node.js

    Lihat Menyiapkan Pelaporan Error untuk Node.js.

    Ruby

    Lihat Menyiapkan Error Reporting untuk Ruby.

    Python

    Lihat Menyiapkan Error Reporting untuk Python.

    PHP

    Lihat Menyiapkan Pelaporan Error untuk PHP.

    Melihat grup error

    Di konsol Google Cloud, buka halaman Pelaporan Error:

    Buka Error Reporting

    Anda juga dapat menemukan halaman ini menggunakan kotak penelusuran.