Contoh untuk monitor sintetis

Dokumen ini menjelaskan template dan kode contoh yang tersedia untuk membantu Anda membuat monitor sintetis. Contoh fungsi tersedia di repositori Google Cloud/synthetics-sdk-nodjs.

Jika Anda menulis pengujian dan tidak mengandalkan template, pastikan pengujian Anda lulus kecuali Error ditampilkan. Sebaiknya gunakan library Assert untuk memastikan bahwa saat terjadi kegagalan, kegagalan tersebut akan diatribusikan ke baris kode yang tepat.

Template umum

Template umum dikonfigurasi guna mengumpulkan data log dan rekaman aktivitas untuk permintaan HTTP keluar. Solusi ini memanfaatkan modul auto-instrumentation-node OpenTelemetry dan winston logger. Karena ketergantungan pada produk open source, Anda akan melihat perubahan pada struktur data log dan rekaman aktivitas. Oleh karena itu, data rekaman aktivitas dan log yang dikumpulkan hanya boleh digunakan untuk tujuan proses debug.

Anda dapat menerapkan pendekatan Anda sendiri untuk mengumpulkan data log dan rekaman aktivitas untuk permintaan HTTP keluar. Untuk contoh pendekatan kustom, lihat class SyntheticAutoInstrumentation.

Contoh Node.js umum

Contoh generic-synthetic-nodejs menggambarkan cara membuat kueri URL. Contoh ini berisi fungsi yang sama dengan fungsi default yang ditampilkan oleh Konsol Google Cloud.

const { instantiateAutoInstrumentation, runSyntheticHandler } = require('@google-cloud/synthetics-sdk-api');
// Run instantiateAutoInstrumentation before any other code runs, to get automatic logs and traces
instantiateAutoInstrumentation();
const functions = require('@google-cloud/functions-framework');
const axios = require('axios');
const assert = require('node:assert');

functions.http('SyntheticFunction', runSyntheticHandler(async ({logger, executionId}) => {
  /*
   * This function executes the synthetic code for testing purposes.
   * If the code runs without errors, the synthetic test is considered successful.
   * If an error is thrown during execution, the synthetic test is considered failed.
   */
  logger.info('Making an http request using synthetics, with execution id: ' + executionId);
  const url = 'https://www.google.com/'; // URL to send the request to
  return await assert.doesNotReject(axios.get(url));
}));

Contoh TypeScript

Contoh generic-synthetic-typescript menunjukkan cara membuat kueri URL.

import {runSyntheticHandler, instantiateAutoInstrumentation} from '@google-cloud/synthetics-sdk-api'
// Run instantiateAutoInstrumentation before any other code runs, to get automatic logs and traces
instantiateAutoInstrumentation();
import * as ff from '@google-cloud/functions-framework';
import axios from 'axios';
import assert from 'node:assert';
import {Logger} from 'winston';

ff.http('SyntheticFunction', runSyntheticHandler(async ({logger, executionId}: {logger: Logger, executionId: string|undefined}) => {
  /*
   * This function executes the synthetic code for testing purposes.
   * If the code runs without errors, the synthetic test is considered successful.
   * If an error is thrown during execution, the synthetic test is considered failed.
   */
  logger.info('Making an http request using synthetics, with execution id: ' + executionId);
  const url = 'https://www.google.com/'; // URL to send the request to
  return await assert.doesNotReject(axios.get(url));
}));

Template Puppeteer

Jika Anda menggunakan Puppeteer, pertimbangkan untuk memulai dengan sampel generic-puppeteer-nodejs.

Penyiapan Puppeteer yang diperlukan

Untuk menggunakan Puppeteer, pastikan Anda menyelesaikan langkah-langkah berikut:

  1. Sertakan .puppeteerrc.cjs dalam direktori sumber Cloud Function Anda:

    const { join } = require('path');
    
    /**
     * @type {import("puppeteer").Configuration}
     */
    module.exports = {
      cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
    };
  2. Tambahkan skrip berikut ke file package.json di Cloud Function Anda:

    "scripts": {
         "gcp-build": "node node_modules/puppeteer/install.mjs"
    },
    

Contoh Puppeteer

Contoh generic-puppeteer-nodejs menggambarkan cara menggunakan Puppeteer dengan Cloud Function Anda:

const { instantiateAutoInstrumentation, runSyntheticHandler } = require('@google-cloud/synthetics-sdk-api');
// Run instantiateAutoInstrumentation before any other code runs, to get automatic logs and traces
instantiateAutoInstrumentation();
const functions = require('@google-cloud/functions-framework');
const axios = require('axios');
const assert = require('node:assert');
const puppeteer = require('puppeteer');

functions.http('CustomPuppeteerSynthetic', runSyntheticHandler(async ({logger, executionId}) => {
 /*
  * This function executes the synthetic code for testing purposes.
  * If the code runs without errors, the synthetic test is considered successful.
  * If an error is thrown during execution, the synthetic test is considered failed.
  */

 // Launch a headless Chrome browser and open a new page
 const browser = await puppeteer.launch({ headless: 'new', timeout: 0});
 const page = await browser.newPage();

 // Navigate to the target URL
 const result = await page.goto('https://www.example.com', {waitUntil: 'load'});

 // Confirm successful navigation
 await assert.equal(result.status(), 200);

 // Print the page title to the console
 const title = await page.title();
 logger.info(`My Page title: ${title} ` + executionId);

 // Close the browser
 await browser.close();
}));

Template moka

Jika Anda menulis pengujian yang mengandalkan template Mocha, pertimbangkan apakah urutan pengujian harus berlanjut, atau berhenti, saat terjadi kegagalan. Untuk menghentikan urutan pengujian setelah kegagalan, Anda harus menetapkan flag bail.

Untuk contoh menyeluruh yang mencakup deployment API, contoh rangkaian pengujian Mocha untuk endpoint API, dan cara mengonfigurasi monitor sintetis, lihat blog Tutorial Pemantauan Sintetis Google Cloud.

Contoh mocha-url-ok menggambarkan cara Cloud Function memanggil rangkaian pengujian Mocha, dan menyediakan contoh rangkaian pengujian.


const functions = require('@google-cloud/functions-framework');
const GcmSynthetics = require('@google-cloud/synthetics-sdk-mocha');

/*
 * This is the server template that is required to run a synthetic monitor in
 * Google Cloud Functions.
 */

functions.http('SyntheticMochaSuite', GcmSynthetics.runMochaHandler({
  spec: `${__dirname}/mocha_tests.spec.js`
}));

/*
 * This is the file may be interacted with to author mocha tests. To interact
 * with other GCP products or services, users should add dependencies to the
 * package.json file, and require those dependencies here A few examples:
 *  - @google-cloud/secret-manager:
 *        https://www.npmjs.com/package/@google-cloud/secret-manager
 *  - @google-cloud/spanner: https://www.npmjs.com/package/@google-cloud/spanner
 *  - Supertest: https://www.npmjs.com/package/supertest
 */

const {expect} = require('chai');
const fetch = require('node-fetch');

it('pings my website', async () => {
  const url = 'https://google.com/'; // URL to send the request to
  const externalRes = await fetch(url);
  expect(externalRes.ok).to.be.true;
});

Contoh broken-links-ok menggambarkan cara mengonfigurasi pemeriksa link rusak. Untuk template ini, Anda hanya menentukan nilai objek options. Objek ini menentukan URI yang akan diuji, dan parameter pengujian. Untuk mengetahui detailnya, lihat kode berikut:

Jika menggunakan Puppeteer, pastikan Anda menyelesaikan langkah-langkah Penyiapan Puppeteer yang Diperlukan.


const functions = require('@google-cloud/functions-framework');
const GcmSynthetics = require('@google-cloud/synthetics-sdk-broken-links');

const options = {
  origin_uri: "https://example.com",
  // link_limit: 10,
  // query_selector_all: "a", // https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll
  // get_attributes: ['href'], // https://developer.mozilla.org/en-US/docs/Web/API/Element/getAttribute
  // link_order: "FIRST_N", // "FIRST_N" or "RANDOM"
  // link_timeout_millis: 30000, // timeout per link
  // max_retries: 0, // number of retries per link if it failed for any reason
  // wait_for_selector: '', // https://pptr.dev/api/puppeteer.page.waitforselector
  // per_link_options: {},
    /*
    // example:
      per_link_options: {
        'http://fake-link1': { expected_status_code: "STATUS_CLASS_4XX" },
        'http://fake-link2': { expected_status_code: 304 },
        'http://fake-link3': { link_timeout_millis: 10000 },
        'http://fake-link4': {
          expected_status_code: "STATUS_CLASS_3XX",
          link_timeout_millis: 10,
        },
      },
    */
  // total_synthetic_timeout_millis: 60000 // Timeout set for the entire Synthetic Monitor
  // screenshot_options: { capture_condition: 'FAILING', storage_location: '' }
};

functions.http('BrokenLinkChecker', GcmSynthetics.runBrokenLinksHandler(options));

Langkah selanjutnya