17 Browser-Datenpunkt
Übersicht
Browser-Datenpunkte ermöglichen die Überwachung komplexer Websites und Webanwendungen mithilfe eines Browsers.
Die Unterstützung von Browser-Datenpunkten ist derzeit experimentell.
Browser-Datenpunkte erfassen Daten, indem sie benutzerdefinierten JavaScript-Code ausführen und Daten über HTTP/HTTPS abrufen. Dieser Datenpunkt kann browserbezogene Aktionen wie Klicken, Texteingabe, Navigieren durch Webseiten und andere Benutzerinteraktionen mit Websites oder Webanwendungen simulieren.
Zusätzlich zum Skript können eine optionale Liste von Parametern (Paare aus Name und Wert) sowie ein Timeout angegeben werden.
Der Datenpunkt implementiert teilweise den W3C WebDriver-Standard mit entweder Selenium Server oder einem einfachen WebDriver (zum Beispiel ChromeDriver) als Webtest-Endpunkt.
Damit der Datenpunkt funktioniert, setzen Sie den Parameter WebDriverURL in der Konfigurationsdatei des Zabbix Server/Proxy (bei Verwendung von ChromeDriver siehe Security Considerations).
Für eine bessere Leistung sollten Sie einen dedizierten Server für die Webtest-Umgebung in Betracht ziehen.
Browser-Datenpunktprüfungen werden von Browser-Pollern des Zabbix Server oder Proxy ausgeführt und verarbeitet.
Falls erforderlich, können Sie die Anzahl der vorab erzeugten Instanzen der Browser-Poller im Parameter StartBrowserPollers der Konfigurationsdatei des Zabbix Server/Proxy anpassen.
Für die Überwachung komplexer Websites und Webanwendungen steht die Vorlage Website by Browser als Out-of-the-box-Vorlage zur Verfügung.
Konfiguration
Wählen Sie im Feld Typ des Datenpunkt-Konfigurationsformulars Browser aus und füllen Sie dann die erforderlichen Felder aus.

Alle obligatorischen Eingabefelder sind mit einem roten Sternchen markiert.
Die Felder, die für Browser-Datenpunkte spezifische Informationen erfordern, sind:
| Feld | Beschreibung |
|---|---|
| Schlüssel | Geben Sie einen eindeutigen Schlüssel ein, der zur Identifizierung des Datenpunkts verwendet wird. |
| Parameter | Geben Sie die Variablen an, die als Attribut-Wert-Paare an das Skript übergeben werden sollen. Benutzermakros werden unterstützt. Um zu sehen, welche integrierten Makros unterstützt werden, suchen Sie in der Tabelle unterstützte Makros nach „Browser-Typ-Datenpunkt“. |
| Skript | Geben Sie JavaScript-Code im modalen Editor ein, der geöffnet wird, wenn Sie in das Parameterfeld klicken oder auf das Stiftsymbol daneben. Dieser Code muss die Logik zur Rückgabe des Metrikwerts bereitstellen. Der Code hat Zugriff auf alle Parameter, alle von Zabbix hinzugefügten zusätzlichen JavaScript-Objekte und JavaScript-Objekte für Browser-Datenpunkte. Siehe auch: JavaScript Guide. |
| Timeout | Zeitüberschreitung für die JavaScript-Ausführung (1–600 s; bei Überschreitung wird ein Fehler zurückgegeben). Beachten Sie, dass es je nach Skript länger dauern kann, bis die Zeitüberschreitung ausgelöst wird. Weitere Informationen zum Parameter Timeout finden Sie unter allgemeine Datenpunktattribute. |
Beispiele
Ein Beispiel dafür, wie Zabbix für die Überwachung von Websites mit der Vorlage Website by Browser eingerichtet wird, finden Sie unter Websites mit Browser-Datenpunkten überwachen.
Standardskript
Das folgende Skript:
- Initialisiert eine Browser-Sitzung.
- Navigiert zu einer angegebenen URL.
- Erfasst Performance-Einträge und Sitzungsstatistiken und gibt sie als JSON-Zeichenfolge zurück.
Geben Sie im Feld Skript Folgendes ein:
var browser = new Browser(Browser.chromeOptions());
try {
browser.navigate("http://example.com");
browser.collectPerfEntries();
}
finally {
return JSON.stringify(browser.getResult());
}
Browser mit benutzerdefinierten Fähigkeiten initialisieren
Das folgende Skript:
- Initialisiert eine Browser-Sitzung für den verfügbaren Browser auf Grundlage des ersten passenden Browsers in der im Skript angegebenen Reihenfolge.
- Definiert Browser-Fähigkeiten, einschließlich der Seitenlade-Strategie und browser-spezifischer Optionen, wie etwa den Headless-Modus für Chrome-, Firefox- und Microsoft Edge-Browser.
Geben Sie im Feld Script Folgendes ein:
var browser = new Browser({
"capabilities":{
"firstMatch":[
{
"browserName":"chrome",
"pageLoadStrategy":"normal",
"goog:chromeOptions":{
"args":[
"--headless=new"
]
}
},
{
"browserName":"firefox",
"pageLoadStrategy":"normal",
"moz:firefoxOptions":{
"args":[
"--headless"
]
}
},
{
"browserName":"MicrosoftEdge",
"pageLoadStrategy":"normal",
"ms:edgeOptions":{
"args":[
"--headless=new"
]
}
},
{
"browserName":"safari",
"pageLoadStrategy":"normal"
}
]
}
});
Browser mit GUI initialisieren
Standardmäßig werden Browsersitzungen (mit Ausnahme von Safari) im Headless-Modus initialisiert, was bedeutet, dass die grafische Benutzeroberfläche (GUI) des Browsers nicht angezeigt wird.
Das folgende Skript initialisiert eine Browsersitzung mit aktivierter GUI.
Beachten Sie, dass Sie den Pfad manuell angeben können, wenn der WebDriver die Browser-Binärdatei nicht finden kann.
var opts = Browser.chromeOptions();
opts.capabilities.alwaysMatch['goog:chromeOptions'].args = [];
// Um eine Firefox-Sitzung mit GUI zu initialisieren, kommentieren Sie die folgenden Zeilen aus:
// var opts = Browser.firefoxOptions();
// opts.capabilities.alwaysMatch['moz:firefoxOptions'].binary = 'usr/bin/firefox';
// opts.capabilities.alwaysMatch['moz:firefoxOptions'].args = [];
// Um eine Microsoft Edge-Sitzung mit GUI zu initialisieren, kommentieren Sie die folgenden Zeilen aus:
// var opts = Browser.edgeOptions();
// opts.capabilities.alwaysMatch['ms:edgeOptions'].binary = 'usr/bin/microsoft-edge';
// opts.capabilities.alwaysMatch['ms:edgeOptions'].args = [];
var browser = new Browser(opts);
Wenn Ihre Tests auf einem entfernten Server oder in einem Container ausgeführt werden, können Sie einen Virtual Network Computing-(VNC-)Client verwenden, um eine Verbindung zum VNC-Server des Computers herzustellen. So können Sie die GUI des Browsers aus der Ferne anzeigen und mit ihr interagieren.
Screenshots aufnehmen
Das folgende Skript:
- Initialisiert eine Browser-Sitzung.
- Legt die Viewport-Größe des Browsers fest, um die Größe des Screenshots zu bestimmen (als Parameter angegeben, siehe unten).
- Navigiert zu einer URL (als Parameter angegeben, siehe unten).
- Erfasst Sitzungsstatistiken, erstellt einen Screenshot und fügt ihn den erfassten Statistiken hinzu.
- Behandelt Fehler, indem Fehlermeldungen und ein Screenshot erfasst werden.
- Gibt die erfassten Ergebnisse als JSON-String zurück.
Das Skript verwendet außerdem Parameter aus dem Formular zur Konfiguration des Datenpunkts:
- webURL - http://example.com
- width - 1920
- height - 1080
Geben Sie im Feld Script Folgendes ein:
var browser, result;
var browser = new Browser(Browser.chromeOptions());
try {
var params = JSON.parse(value); // Parse the JSON string containing parameters passed from Zabbix.
browser.setScreenSize(Number(params.width), Number(params.height))
browser.navigate(params.webURL);
result = browser.getResult();
result.screenshot = browser.getScreenshot();
}
catch (err) {
if (!(err instanceof BrowserError)) {
browser.setError(err.message);
}
result = browser.getResult();
result.error.screenshot = browser.getScreenshot();
}
finally {
return JSON.stringify(result);
}
Zabbix-Anmeldung prüfen
Das folgende Skript:
- Initialisiert eine Browser-Sitzung.
- Navigiert zu einer Seite (als Parameter angegeben, siehe unten).
- Gibt den Benutzernamen und das Passwort ein (als Parameter angegeben, siehe unten).
- Findet die Anmeldeschaltfläche und klickt darauf.
- Findet die Abmeldeschaltfläche und klickt darauf.
- Erfasst Performancedaten vor und nach der Anmeldung sowie nach der Abmeldung.
- Behandelt Fehler, indem Fehlermeldungen und ein Screenshot erfasst werden.
- Gibt die erfassten Ergebnisse als JSON-Zeichenfolge zurück.
Das Skript verwendet außerdem Parameter aus dem Datenpunkt-Konfigurationsformular:
- webURL - http://{HOST.CONN}/index.php
- username - {$USERNAME}
- password - {$PASSWORD}
Geben Sie im Feld Script Folgendes ein:
var browser, result;
browser = new Browser(Browser.chromeOptions());
try {
var params = JSON.parse(value); // Parse the JSON string containing parameters passed from Zabbix.
browser.navigate(params.webURL);
browser.collectPerfEntries("open page");
var el = browser.findElement("xpath", "//input[@id='name']");
if (el === null) {
throw Error("cannot find name input field");
}
el.sendKeys(params.username);
el = browser.findElement("xpath", "//input[@id='password']");
if (el === null) {
throw Error("cannot find password input field");
}
el.sendKeys(params.password);
el = browser.findElement("xpath", "//button[@id='enter']");
if (el === null) {
throw Error("cannot find login button");
}
el.click();
browser.collectPerfEntries("login");
el = browser.findElement("link text", "Sign out");
if (el === null) {
throw Error("cannot find logout button");
}
el.click();
browser.collectPerfEntries("logout");
result = browser.getResult();
}
catch (err) {
if (!(err instanceof BrowserError)) {
browser.setError(err.message);
}
result = browser.getResult();
result.error.screenshot = browser.getScreenshot();
}
finally {
return JSON.stringify(result);
}
Links finden
Das folgende Skript:
- Initialisiert eine Browsersitzung.
- Definiert eine Funktion zum Entfernen doppelter Elemente aus einem Array (siehe Schritt 5).
- Navigiert zu einer Seite (angegeben als Parameter, siehe unten).
- Findet Links auf der Seite.
- Entfernt doppelte Links, um sicherzustellen, dass sie eindeutig sind.
- Extrahiert nur die Links, die mit "http" beginnen.
- Formatiert die extrahierten Links in eine bestimmte Struktur.
- Behandelt Fehler, indem Fehlermeldungen und ein Screenshot erfasst werden.
- Gibt die gesammelten Ergebnisse als JSON-String zurück.
Das Skript verwendet außerdem Parameter aus dem Formular zur Item-Konfiguration:
- scheme - {$WEBSITE.SCHEME}
- domain - {$WEBSITE.DOMAIN}
- path - {$WEBSITE.PATH}
Geben Sie im Feld Script Folgendes ein:
var browser, result;
browser = new Browser(Browser.chromeOptions());
try {
var params = JSON.parse(value); // Parse the JSON string containing parameters passed from Zabbix.
function uniq(a) {
return a.sort().filter(function (item, pos, ary) {
return !pos || item != ary[pos - 1];
});
}
browser.navigate(params.scheme + '://' + params.domain + params.path);
var el = browser.findElements("link text", "");
var links = [];
for (var n = 0; n < el.length; n++) {
links.push(el[n].getAttribute('href'));
}
links = uniq(links);
result = [];
for (i = 0; i < links.length; i++) {
if (links[i].match(/^http.*/)) {
var row = {};
row["{#URL}"] = links[i];
result.push(row);
}
}
}
catch (err) {
if (!(err instanceof BrowserError)) {
browser.setError(err.message);
}
result = browser.getResult();
result.error.screenshot = browser.getScreenshot();
}
finally {
return JSON.stringify(result);
}