Contoh untuk monitor sintetis

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

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

Template generik

Template generik dikonfigurasi untuk mengumpulkan data log dan pelacakan untuk permintaan HTTP keluar. Solusi ini memanfaatkan modul auto-instrumentation-node OpenTelemetry dan logger winston. Karena bergantung pada produk open source, Anda harus mengharapkan perubahan dalam struktur data log dan pelacakan. Oleh karena itu, data log dan pelacakan yang dikumpulkan hanya boleh digunakan untuk tujuan proses debug.

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

Contoh Node.js generik

Contoh generic-synthetic-nodejs menunjukkan cara membuat kueri URL. Contoh ini berisi fungsi yang sama dengan fungsi default yang ditampilkan oleh Google Cloud konsol. Untuk melihat contoh lengkap, di toolbar contoh, pilih logo GitHub.

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. Untuk melihat contoh lengkap, di toolbar contoh, pilih logo GitHub.

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, sebaiknya mulai dengan contoh generic-puppeteer-nodejs.

Penyiapan Puppeteer yang diperlukan

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

  1. Sertakan .puppeteerrc.cjs di direktori sumber fungsi Cloud Run Anda:

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

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

Contoh Puppeteer

Contoh generic-puppeteer-nodejs menunjukkan cara menggunakan Puppeteer dengan fungsi Cloud Run Anda. Untuk melihat contoh lengkap, di toolbar contoh, pilih logo GitHub.

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 Selenium WebDriver

Jika Anda menggunakan Selenium WebDriver, sebaiknya mulai dengan contoh generic-selenium-nodejs. Contoh, yang tersedia di GitHub, mencakup file index.js dan package.json.

Untuk melihat contoh lengkap, di toolbar contoh, pilih logo GitHub.

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 assert = require('node:assert');

const { Builder, Browser, By } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');

/*
 * 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.
 */
functions.http(
  'CustomSeleniumSynthetic',
  runSyntheticHandler(async ({ logger, executionId }) => {
    /*
     * Construct chrome options
     * Note: `setChromeBinaryPath` must be set to '/srv/bin/chromium' when running in
     *   GCF (but will need to be changed if running on local machine).
     */
    const options = new chrome.Options();
    options.setChromeBinaryPath('/srv/bin/chromium');
    options.addArguments('--headless', '--disable-gpu', '--no-sandbox');

    // Launch headless chrome webdriver with options
    const driver = await new Builder()
      .forBrowser(Browser.CHROME)
      .setChromeOptions(options)
      .build();

    // Navigate to the target URL
    await driver.get('https://example.com');

    // Retrieve title and `a` tag of page
    const title = await driver.getTitle();
    const aTag = await driver.findElement(By.css('a')).getText();

    // assert title is as expected and print to console
    await assert.equal(title, 'Example Domain');
    logger.info(`My URL title is: ${title} ` + executionId);

    await driver.quit();
  })
);

Template Mocha

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

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

Contoh mocha-url-ok menunjukkan cara fungsi Cloud Run dapat memanggil suite pengujian Mocha, dan menyediakan suite pengujian contoh. Untuk melihat contoh lengkap, di toolbar contoh, pilih logo GitHub.


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 menunjukkan cara mengonfigurasi pemeriksa link rusak. Untuk template ini, Anda hanya menentukan nilai objek options. Objek ini menentukan URI yang akan diuji, dan parameter pengujian.

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

Untuk melihat contoh lengkap, di toolbar contoh, pilih logo GitHub.


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 berikutnya