Contoh untuk monitor sintetis

Template yang telah dikonfigurasi sebelumnya dan kode contoh memungkinkan Anda membuat monitor sintetis di Node.js dan TypeScript menggunakan framework seperti Puppeteer, Selenium WebDriver, dan Mocha. Anda dapat menggunakan contoh ini—yang tersedia di repositori GitHub synthetics-sdk-nodejs—untuk membuat kueri URL, menjalankan perjalanan pengguna berbasis browser, menguji endpoint API, atau memeriksa link yang rusak.

Panduan untuk menggunakan contoh dan menulis pengujian kustom

Sebelum Anda men-deploy sampel atau menulis pengujian kustom, tinjau persyaratan berikut:

  • Perbarui URL target: Sebelum men-deploy kode contoh, perbarui kolom url agar mengarah ke endpoint target Anda. Jangan tetapkan kolom ini ke https://www.google.com.
  • Melempar Error saat pengujian gagal: Jika Anda menulis pengujian kustom, bukan menggunakan template, pastikan pengujian Anda lulus kecuali jika Error dilempar. Sebaiknya gunakan library Assert agar kegagalan apa pun dikaitkan dengan baris kode yang benar.

Template generik

Template generik dikonfigurasi untuk mengumpulkan data log dan rekaman aktivitas untuk permintaan HTTP keluar. Solusi ini memanfaatkan modul auto-instrumentation-node OpenTelemetry dan winston logger. Karena adanya dependensi pada produk open source, Anda harus mengharapkan perubahan pada struktur data log dan rekaman aktivitas. Oleh karena itu, data log dan rekaman aktivitas 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 generik

Contoh generic-synthetic-nodejs menggambarkan cara membuat kueri URL. Contoh ini berisi kode yang sama dengan fungsi default yang ditampilkan oleh konsol Google Cloud . 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 Cloud Run 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 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, pertimbangkan untuk memulai 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, maka pertimbangkan apakah urutan pengujian harus dilanjutkan atau dihentikan saat kegagalan terjadi. Untuk menghentikan rangkaian pengujian setelah terjadi kegagalan, Anda harus menyetel flag bail.

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

Contoh mocha-url-ok mengilustrasikan cara fungsi Cloud Run dapat memanggil suite pengujian Mocha, dan menyediakan contoh suite pengujian. 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 mengilustrasikan 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