Melaporkan error

Melaporkan error secara otomatis

Anda dapat melaporkan error dari Cloud Function ke Stackdriver Error Reporting seperti yang ditunjukkan di bawah ini:

Node.js

// These WILL be reported to Stackdriver Error Reporting
console.error(new Error('I failed you'));
console.error('I failed you', new Error('I failed you too'));
throw new Error('I failed you'); // Will cause a cold start if not caught

// These will NOT be reported to Stackdriver Error Reporting
console.info(new Error('I failed you')); // Logging an Error object at the info level
console.error('I failed you'); // Logging something other than an Error object
throw 1; // Throwing something other than an Error object
callback('I failed you');
res.status(500).send('I failed you');

Jika Anda ingin pelaporan error yang lebih detail, Anda dapat menggunakan Library Klien Stackdriver Error Reporting.

Anda dapat melihat error yang dilaporkan di Stackdriver Error Reporting pada GCP Console. Anda juga dapat melihat error yang dilaporkan dari fungsi tertentu saat memilihnya dari daftar fungsi di GCP Console.

Pengecualian yang tidak diketahui yang dihasilkan oleh fungsi Anda akan muncul di Stackdriver Error Reporting. Perlu diperhatikan bahwa beberapa pengecualian yang tidak diketahui, misalnya, yang ditampilkan secara tidak bersamaan, dapat menyebabkan cold start pada pemanggilan fungsi di masa mendatang. Hal ini akan mengurangi performa fungsi.

Jika Anda menggunakan layanan Google melalui library yang disediakan Google, Anda dapat mencatat error yang ada ke dalam log seperti yang ditunjukkan di bawah ini:

Node.js

try {
  // Throw an Error object (to simulate a GCP API failure)
  throw new Error('Error object!');
} catch (err) {
  // err is already an Error object
  console.error(err);
}

Melaporkan error secara manual

Untuk melaporkan error ke Stackdriver Error Reporting dari sebuah fungsi, gunakan Stackdriver Logging API.

Mengimpor dependensi

Dari direktori functions, instal Google Stackdriver Logging Client Library untuk Node.js:

npm install --save @google-cloud/logging

Impor Google Cloud Client Library untuk mengakses Logging API:

const Logging = require('@google-cloud/logging');

// Instantiates a client
const logging = Logging();

Mengirim ke Stackdriver

Entri log dengan format yang tepat memerlukan objek MonitoredResource dan objek ErrorEvent.

Contoh fungsi reportError ini menunjukkan data minimum yang diperlukan untuk melaporkan error ke Stackdriver Error Reporting.

function reportError(err, context = {}) {
  // This is the name of the StackDriver log stream that will receive the log
  // entry. This name can be any valid log stream name, but must contain "err"
  // in order for the error to be picked up by StackDriver Error Reporting.
  const logName = 'errors';
  const log = logging.log(logName);

  // https://cloud.google.com/logging/docs/api/ref_v2beta1/rest/v2beta1/MonitoredResource
  const metadata = {
    resource: {
      type: 'cloud_function',
      labels: {function_name: process.env.FUNCTION_NAME},
    },
  };

  // https://cloud.google.com/error-reporting/reference/rest/v1beta1/ErrorEvent
  const errorEvent = {
    message: err.stack,
    serviceContext: {
      service: process.env.FUNCTION_NAME,
      resourceType: 'cloud_function',
    },
    context: context,
  };

  // Write the error log entry
  return new Promise((resolve, reject) => {
    log.write(log.entry(metadata, errorEvent), (error) => {
      if (error) {
       return reject(error);
      }
      return resolve();
    });
  });
}

Fungsi reportError dapat digunakan untuk melaporkan error secara manual:

// Charge the Stripe customer whenever an amount is written to the Realtime database
exports.createStripeCharge = functions.database.ref('/stripe_customers/{userId}/charges/{id}')
    .onCreate((snap, context) => {
      const val = snap.val();
      // Look up the Stripe customer id written in createStripeCustomer
      return admin.database().ref(`/stripe_customers/${context.params.userId}/customer_id`)
          .once('value').then((snapshot) => {
            return snapshot.val();
          }).then((customer) => {
            // Create a charge using the pushId as the idempotency key
            // protecting against double charges
            const amount = val.amount;
            const idempotencyKey = context.params.id;
            const charge = {amount, currency, customer};
            if (val.source !== null) {
              charge.source = val.source;
            }
            return stripe.charges.create(charge, {idempotency_key: idempotencyKey});
          }).then((response) => {
            // If the result is successful, write it back to the database
            return snap.ref.set(response);
          }).catch((error) => {
            // We want to capture errors and render them in a user-friendly way, while
            // still logging an exception with StackDriver
            return snap.ref.child('error').set(userFacingMessage(error));
          }).then(() => {
            return reportError(error, {user: context.params.userId});
          });
        });

Anda dapat meneruskan detail pengguna melalui parameter ErrorContext. UI Stackdriver menampilkan detail ini dan menggunakannya untuk menghitung jumlah pengguna yang terpengaruh.

ErrorContext juga dapat berupa informasi yang diteruskan di Permintaan HTTP:

export.httpError = functions.https.onRequest((request, response) => {
  const error = new Error('Test error');
  const httpRequest = {
    method: request.method,
    url: request.originalUrl,
    userAgent: request.get('user-agent'),
    referrer: '',
    remoteIp: request.ip
  };
  reportError(error, {httpRequest}).then(() => {
    response.end();
  });
});

Kirim masukan tentang...

Butuh bantuan? Kunjungi halaman dukungan kami.