Contoh untuk monitor sintetis

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

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

Template generik

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

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

Contoh Node.js generik

Contoh generic-synthetic-nodejs mengilustrasikan cara membuat kueri URL. Contoh ini berisi hal yang sama dengan fungsi default yang ditampilkan oleh konsol Google Cloud. Untuk melihat contoh lengkapnya, klik Lainnya, lalu pilih Lihat di 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 mengilustrasikan cara membuat kueri URL. Untuk melihat contoh lengkapnya, klik Lainnya, lalu pilih Lihat di 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 dalam 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 mengilustrasikan cara menggunakan Puppeteer dengan fungsi Cloud Run Anda. Untuk melihat contoh lengkapnya, klik Lainnya, lalu pilih Lihat di 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 sampel generic-selenium-nodejs. Contoh ini, yang tersedia di GitHub, menyertakan file index.js dan package.json.

Untuk melihat contoh lengkapnya, klik Lainnya, lalu pilih Lihat di 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 moka

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

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

Contoh mocha-url-ok menggambarkan cara fungsi Cloud Run dapat memanggil rangkaian pengujian Mocha, dan memberikan contoh rangkaian pengujian. Untuk melihat contoh lengkapnya, klik Lainnya, lalu pilih Lihat di 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 lengkapnya, klik Lainnya, lalu pilih Lihat di 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 selanjutnya