Buka konsol

Melaporkan error

English Context Link

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 menginginkan 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 suatu 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 yang dibentuk dengan benar membutuhkan 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.firestore.document('stripe_customers/{userId}/charges/{id}').onCreate(async (snap, context) => {
      const val = snap.data();
      try {
        // Look up the Stripe customer id written in createStripeCustomer
        const snapshot = await admin.firestore().collection(`stripe_customers`).doc(context.params.userId).get()
        const snapval = snapshot.data();
        const customer = snapval.customer_id
        // 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;
        }
        const response = await stripe.charges.create(charge, {idempotency_key: idempotencyKey});
        // If the result is successful, write it back to the database
        return snap.ref.set(response, { merge: true });
      } catch(error) {
        // We want to capture errors and render them in a user-friendly way, while
        // still logging an exception with StackDriver
        console.log(error);
        await snap.ref.set({error: userFacingMessage(error)}, { merge: true });
        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 meneruskan informasi tentang 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();
  });
});