19 Item del browser

Panoramica

I Browser item consentono di monitorare siti web complessi e applicazioni web utilizzando un browser.

Il supporto dei Browser item è attualmente sperimentale.

I Browser item raccolgono dati eseguendo codice JavaScript definito dall'utente e recuperando dati tramite HTTP/HTTPS. Questo item può simulare azioni correlate al browser come fare clic, inserire testo, navigare tra pagine web e altre interazioni dell'utente con siti web o applicazioni web.

Oltre allo script, è possibile specificare un elenco facoltativo di parametri (coppie di nome e valore) e un timeout.

L'item implementa parzialmente lo standard W3C WebDriver utilizzando come endpoint di test web Selenium Server oppure un WebDriver semplice (ad esempio, ChromeDriver). Affinché l'item funzioni, impostare l'endpoint nel parametro WebDriverURL del file di configurazione di Zabbix server/proxy (se si utilizza ChromeDriver, vedere Security Considerations). Per prestazioni migliori, valutare l'utilizzo di un server dedicato per l'ambiente di test web.

I controlli dei Browser item vengono eseguiti ed elaborati dai browser poller di Zabbix server o proxy. Se necessario, è possibile regolare il numero di istanze pre-fork dei browser poller nel parametro StartBrowserPollers del file di configurazione di Zabbix server/proxy.

Per il monitoraggio di siti web complessi e applicazioni web, è disponibile il template Website by Browser come template predefinito.

Configurazione

Nel campo Tipo del modulo di configurazione dell'item, selezionare Browser e quindi compilare i campi richiesti.

Tutti i campi di input obbligatori sono contrassegnati da un asterisco rosso.

I campi che richiedono informazioni specifiche per gli item Browser sono:

Campo Descrizione
Key Inserire una chiave univoca che verrà utilizzata per identificare l'item.
Parameters Specificare le variabili da passare allo script come coppie attributo-valore.
Sono supportate le macro utente. Per vedere quali macro integrate sono supportate, cercare "Browser-type item" nella tabella delle macro supportate.
Script Inserire il codice JavaScript nell'editor modale che si apre facendo clic nel campo del parametro o sull'icona della matita accanto ad esso. Questo codice deve fornire la logica per restituire il valore della metrica.
Il codice ha accesso a tutti i parametri, a tutti gli oggetti JavaScript aggiuntivi e agli oggetti JavaScript dell'item Browser aggiunti da Zabbix.
Vedere anche: Guida JavaScript.
Timeout Timeout di esecuzione di JavaScript (1-600s; se superato, verrà restituito un errore).
Si noti che, a seconda dello script, potrebbe essere necessario più tempo prima che il timeout venga attivato.
Per ulteriori informazioni sul parametro Timeout, vedere attributi generali dell'item.

Esempi

Per un esempio di come configurare Zabbix per il monitoraggio dei siti web utilizzando il template Website by Browser, vedere Monitor websites with Browser items.

Script predefinito

Lo script seguente:

  1. Inizializza una sessione del browser.
  2. Passa a un URL specificato.
  3. Raccoglie le voci delle prestazioni e le statistiche della sessione e le restituisce come stringa JSON.

Nel campo Script, inserire:

var browser = new Browser(Browser.chromeOptions());

try {
    browser.navigate("http://example.com");
    browser.collectPerfEntries();
}
finally {
    return JSON.stringify(browser.getResult());
}
Inizializzare il browser con capacità personalizzate

Lo script seguente:

  1. Inizializza una sessione del browser per il browser disponibile in base al primo browser corrispondente nell'ordine specificato nello script.
  2. Definisce le capacità del browser, inclusa la strategia di caricamento della pagina e le opzioni specifiche per ciascun browser, come la modalità headless per i browser Chrome, Firefox e Microsoft Edge.

Nel campo Script, inserire:

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"
            }
        ]
    }
});
Inizializzare il browser con GUI

Per impostazione predefinita, le sessioni del browser (Safari escluso) vengono inizializzate in modalità headless, il che significa che l'interfaccia grafica utente (GUI) del browser non viene visualizzata.

Lo script seguente inizializza una sessione del browser con la GUI abilitata.

Si noti che, se WebDriver non riesce a individuare il file binario del browser, è possibile specificarne manualmente il percorso.

var opts = Browser.chromeOptions();
opts.capabilities.alwaysMatch['goog:chromeOptions'].args = [];

// To initialize a Firefox session with GUI, uncomment the following lines:
// var opts = Browser.firefoxOptions();
// opts.capabilities.alwaysMatch['moz:firefoxOptions'].binary = 'usr/bin/firefox';
// opts.capabilities.alwaysMatch['moz:firefoxOptions'].args = [];

// To initialize a Microsoft Edge session with GUI, uncomment the following lines:
// 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);

Se i test sono in esecuzione su un server remoto o in un container, è possibile utilizzare un client Virtual Network Computing (VNC) per connettersi al server VNC della macchina. In questo modo è possibile visualizzare e interagire da remoto con la GUI del browser.

Acquisire screenshot

Il seguente script:

  1. Inizializza una sessione del browser.
  2. Imposta la dimensione della viewport del browser per determinare la dimensione dello screenshot (specificata come parametri, vedi sotto).
  3. Apre un URL (specificato come parametro, vedi sotto).
  4. Raccoglie le statistiche della sessione, acquisisce uno screenshot e lo aggiunge alle statistiche raccolte.
  5. Gestisce gli errori acquisendo i messaggi di errore e uno screenshot.
  6. Restituisce i risultati raccolti come stringa JSON.

Lo script utilizza anche i parametri del modulo di configurazione dell'item:

Nel campo Script, inserire:

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);
}
Verifica dell'accesso a Zabbix

Lo script seguente:

  1. Inizializza una sessione del browser.
  2. Apre una pagina (specificata come parametro, vedi sotto).
  3. Inserisce il nome utente e la password (specificati come parametri, vedi sotto).
  4. Trova e fa clic sul pulsante di accesso.
  5. Trova e fa clic sul pulsante di disconnessione.
  6. Raccoglie i dati sulle prestazioni prima e dopo l'accesso, nonché dopo la disconnessione.
  7. Gestisce gli errori acquisendo i messaggi di errore e una schermata.
  8. Restituisce i risultati raccolti come stringa JSON.

Lo script utilizza anche i parametri del modulo di configurazione dell'item:

Nel campo Script, inserire:

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

Il seguente script:

  1. Inizializza una sessione del browser.
  2. Definisce una funzione per rimuovere gli elementi duplicati da un array (vedere il passaggio 5).
  3. Accede a una pagina (specificata come parametri, vedere sotto).
  4. Trova i link nella pagina.
  5. Rimuove i link duplicati per garantire che siano univoci.
  6. Estrae solo i link che iniziano con "http".
  7. Formatta i link estratti secondo una struttura specifica.
  8. Gestisce gli errori acquisendo i messaggi di errore e uno screenshot.
  9. Restituisce i risultati raccolti come stringa JSON.

Lo script utilizza anche i parametri del modulo di configurazione dell'item:

  • scheme - {$WEBSITE.SCHEME}
  • domain - {$WEBSITE.DOMAIN}
  • path - {$WEBSITE.PATH}

Nel campo Script, inserire:

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