Beispiele für synthetische Monitore

In diesem Dokument werden die Vorlagen und der Beispielcode beschrieben, die Ihnen beim Erstellen von synthetischen Monitoren zur Verfügung stehen. Die Beispielfunktionen sind im GitHub-Repository Google Cloud/synthetics-sdk-nodjs verfügbar.

Wenn Sie Tests schreiben und keine Vorlage verwenden, muss Ihr Test erfolgreich sein, sofern keine Error ausgelöst wird. Wir empfehlen, die Assert-Bibliothek zu verwenden, damit Fehler der richtigen Codezeile zugeordnet werden.

Generische Vorlagen

Die generischen Vorlagen sind so konfiguriert, dass Trace- und Logdaten für ausgehende HTTP-Anfragen erfasst werden. Die Lösung nutzt das OpenTelemetry-Modul auto-instrumentation-node und den Winston-Logger. Aufgrund der Abhängigkeit von Open-Source-Produkten können Sie mit Änderungen an der Struktur von Trace- und Logdaten rechnen. Die erfassten Trace- und Logdaten sollten daher nur zu Debugging-Zwecken verwendet werden.

Sie können Ihren eigenen Ansatz implementieren, um Trace- und Logdaten für ausgehende HTTP-Anfragen zu erfassen. Ein Beispiel für einen benutzerdefinierten Ansatz finden Sie in der Klasse SyntheticAutoInstrumentation.

Generisches Node.js-Beispiel

Im Beispiel generic-synthetic-nodejs wird gezeigt, wie eine URL abgefragt wird. Dieses Beispiel enthält dieselben Informationen wie die Standardfunktion, die in der Google Cloud Konsole angezeigt wird. Wenn Sie das vollständige Beispiel sehen möchten, klicken Sie auf  Mehr und wählen Sie dann Auf GitHub ansehen aus.

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));
}));

TypeScript-Beispiel

Im Beispiel generic-synthetic-typescript wird gezeigt, wie eine URL abgefragt wird. Wenn Sie das vollständige Beispiel sehen möchten, klicken Sie auf  Mehr und wählen Sie dann Auf GitHub ansehen aus.

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));
}));

Puppeteer-Vorlage

Wenn Sie Puppeteer verwenden, sollten Sie mit dem generic-puppeteer-nodejs-Beispiel beginnen.

Erforderliche Puppeteer-Einrichtung

Führen Sie die folgenden Schritte aus, um Puppeteer zu verwenden:

  1. Fügen Sie .puppeteerrc.cjs in das Quellverzeichnis Ihrer Cloud Run-Funktion ein:

    const { join } = require('path');
    
    /**
     * @type {import("puppeteer").Configuration}
     */
    module.exports = {
      cacheDirectory: join(__dirname, '.cache', 'puppeteer'),
    };
  2. Fügen Sie der Datei package.json Ihrer Cloud Run Functions-Funktion das folgende Skript hinzu:

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

Puppeteer-Beispiel

Im Beispiel generic-puppeteer-nodejs wird veranschaulicht, wie Sie Puppeteer mit Ihrer Cloud Run-Funktion verwenden. Wenn Sie das vollständige Beispiel sehen möchten, klicken Sie auf  Mehr und wählen Sie dann Auf GitHub ansehen aus.

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();
}));

Selenium WebDriver-Vorlage

Wenn Sie Selenium WebDriver verwenden, sollten Sie mit dem generic-selenium-nodejs-Beispiel beginnen. Das Beispiel, das auf GitHub verfügbar ist, enthält eine index.js- und eine package.json-Datei.

Wenn Sie das vollständige Beispiel sehen möchten, klicken Sie auf  Mehr und wählen Sie dann Auf GitHub ansehen aus.

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();
  })
);

Mocha-Vorlage

Wenn Sie Tests schreiben, die auf der Vorlage Mocha basieren, sollten Sie überlegen, ob eine Testsequenz fortgesetzt oder beendet werden soll, wenn ein Fehler auftritt. Wenn Sie eine Testsequenz nach einem Fehler beenden möchten, müssen Sie das Flag bail festlegen.

Ein End-to-End-Beispiel, das die Bereitstellung einer API, eine Beispiel-Mocha-Testsuite für die API-Endpunkte und die Konfiguration des synthetischen Monitors umfasst, finden Sie im Blogbeitrag Google Cloud Synthetic Monitoring Tutorial.

Das mocha-url-ok-Beispiel veranschaulicht, wie eine Cloud Run-Funktion eine Mocha-Test-Suite aufrufen kann. Außerdem wird eine Beispiel-Test-Suite bereitgestellt. Wenn Sie das vollständige Beispiel sehen möchten, klicken Sie auf  Mehr und wählen Sie dann Auf GitHub ansehen aus.


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;
});

Das broken-links-ok-Beispiel zeigt, wie ein Checker für defekte Links konfiguriert wird. Für diese Vorlage geben Sie nur die Werte des options-Objekts an. Dieses Objekt gibt den zu testenden URI und die Parameter des Tests an.

Wenn Sie Puppeteer verwenden, müssen Sie die Schritte unter Erforderliche Puppeteer-Einrichtung ausführen.

Wenn Sie das vollständige Beispiel sehen möchten, klicken Sie auf  Mehr und wählen Sie dann Auf GitHub ansehen aus.


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));

Nächste Schritte