Samples für synthetisches Monitoring

In diesem Dokument werden die verfügbaren Vorlagen und Beispielcodes beschrieben. um synthetisches Monitoring zu erstellen. Die Beispielfunktionen sind in der Google Cloud/synthetics-sdk-nodjs GitHub-Repository.

Wenn Sie Tests schreiben und sich nicht auf eine Vorlage verlassen, sollten Sie sicherstellen, geht weiter, es sei denn, ein Error wird geworfen. Wir empfehlen, dass Sie die Assert-Bibliothek verwenden, um sicherzustellen, wenn Fehler auftreten, werden sie der richtigen Codezeile zugeschrieben.

Allgemeine Vorlagen

Die generischen Vorlagen sind so konfiguriert, dass sie Trace- und Logdaten für ausgehende HTTP-Anfragen. Die Lösung nutzt die OpenTelemetry-Modul auto-instrumentation-node und dem Winston-Logger. Aufgrund der Abhängigkeit von Open-Source-Produkten sind Änderungen Struktur von Trace- und Logdaten. Der erfasste Trace und Protokolldaten sollten nur zur Fehlerbehebung verwendet werden.

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

Generisches Node.js-Beispiel

Das Beispiel generic-synthetic-nodejs veranschaulicht, wie eine URL abgefragt wird. Dieses Beispiel enthält dieselbe wie die Standardfunktion in der Google Cloud Console angezeigt. Um das vollständige Beispiel anzusehen, 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

generic-synthetic-typescript-Beispiel zeigt, wie eine URL abgefragt wird. Um das vollständige Beispiel anzusehen, 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.

Erforderliche Puppeteer-Einrichtung

Um Puppeteer zu verwenden, müssen Sie die folgenden Schritte ausführen:

  1. Fügen Sie .puppeteerrc.cjs im Quellverzeichnis Ihrer Cloud Functions-Funktion:

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

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

Puppeteer-Beispiel

Das Beispiel generic-puppeteer-nodejs veranschaulicht, um Puppeteer mit Ihrer Cloud Functions-Funktion zu verwenden. Um das vollständige Beispiel anzusehen, 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. Das Beispiel, die auf GitHub verfügbar ist, enthält die Dateien index.js und package.json.

Um das vollständige Beispiel anzusehen, 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();
  })
);

Vorlage für Mokka

Wenn Sie Tests schreiben, die auf der Mocha-Vorlage basieren, Dann überlegen Sie, ob eine Reihe von Tests fortgesetzt oder beendet werden soll, wenn eine Fehler auftreten. Um eine Reihe von Tests nach einem Fehler zu stoppen, müssen Sie den Parameter bail-Flag.

Ein End-to-End-Beispiel, das die Bereitstellung einer API umfasst, ist ein Beispiel-Mocha-Test. für die API-Endpunkte und zur Konfiguration des synthetischen Monitors finden Sie in der Blog mit der Anleitung zum synthetischen Monitoring von Google Cloud.

Das Beispiel mocha-url-ok veranschaulicht, kann eine Cloud Function Mocha-Testsuite, das auch eine Beispiel-Testsuite zur Verfügung stellt. Um das vollständige Beispiel anzusehen, 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;
});

Die broken-links-ok Das Beispiel zeigt, wie eine Prüfung auf fehlerhafte 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 Testparameter an.

Wenn Sie Puppeteer verwenden, müssen Sie Erforderliche Puppeteer-Einrichtungsschritte.

Um das vollständige Beispiel anzusehen, 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