Menyiapkan Error Reporting di Amazon EC2

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

Menggunakan Logging untuk melaporkan error

Untuk menghubungkan aplikasi EC2 ke Error Reporting, kirim pengecualian atau error lainnya ke Logging.

Contoh:

  1. Menghubungkan sistem Amazon Web Services (AWS) ke Google Cloud. Untuk informasi selengkapnya, lihat Menginstal Agen Logging pada masing-masing VM.
  2. Instal agen Logging google-fluentd sebagaimana mestinya untuk lingkungan Anda. Untuk mengetahui petunjuknya, lihat Menginstal agen Logging.
  3. Ubah aplikasi Anda agar membuat log pengecualian dan pelacakan tumpukan 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 digabung, Error Reporting mungkin tidak mendeteksi error tersebut. Anda dapat menggunakan format JSON terstruktur untuk payload entri log Anda guna menyertakan berbagai jenis informasi untuk setiap error.

  4. Java

    Tambahkan berikut ini ke file pom.xml:

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

    Lalu, 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
    

    Lalu, 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
    

    Lalu, 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/
    

    Lalu, 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 ASP.NET NuGet melaporkan pengecualian yang tidak tertangkap dari aplikasi web ASP.NET ke Error Reporting.

    Menginstal paket NuGet

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

    1. Klik kanan solusi Anda, lalu pilih Manage NuGet packages for solution.
    2. Centang kotak Sertakan pra-rilis.
    3. Telusuri dan instal paket bernama Google.Cloud.Diagnostics.AspNet.

    Penggunaan

    Setelah menginstal paket Stackdriver ASP.NET NuGet, 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 aplikasi web .NET Anda (ganti your-project-id dengan project ID yang 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 setiap pengecualian tidak tertangkap yang terjadi saat dilaporkan ke Google Cloud di bagian Error Reporting pada Konsol Google Cloud.

    C#

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

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

    Pastikan untuk 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 Error Reporting untuk Go.

    Java

    Lihat Menyiapkan Error Reporting untuk Java.

    Node.js

    Lihat Menyiapkan Error Reporting untuk Node.js.

    Ruby

    Lihat Menyiapkan Error Reporting untuk Ruby.

    Python

    Lihat Menyiapkan Error Reporting untuk Python.

    PHP

    Lihat artikel Menyiapkan Error Reporting untuk PHP.

    Lihat grup error

    Di panel navigasi konsol Google Cloud, pilih Error Reporting, lalu pilih project Google Cloud Anda:

    Buka Error Reporting