4 JavaScript voorverwerking

Overzicht

Dit gedeelte geeft details over voorverwerking met behulp van JavaScript.

JavaScript-voorverwerking

JavaScript-voorverwerking wordt uitgevoerd door een JavaScript-functie aan te roepen met een enkele parameter 'value' en de door de gebruiker geleverde functiebody. Het resultaat van de voorverwerkingsstap is de waarde die wordt geretourneerd door deze functie. Bijvoorbeeld, om een omrekening van Fahrenheit naar Celsius uit te voeren, moet de gebruiker het volgende invoeren:

return (value - 32) * 5 / 9

in de JavaScript-voorverwerkingsparameters, die door de server in een JavaScript-functie worden verpakt:

function (value)
       {
          return (value - 32) * 5 / 9
       }

De invoerparameter 'value' wordt altijd doorgegeven als een string. De geretourneerde waarde wordt automatisch omgezet naar een string via de ToString() methode (als dit mislukt, wordt de fout geretourneerd als een stringwaarde), met een paar uitzonderingen:

  • het retourneren van een undefined-waarde zal leiden tot een fout
  • het retourneren van een null-waarde zal ertoe leiden dat de invoerwaarde wordt genegeerd, vergelijkbaar met de voorverwerking 'Waarde negeren' bij de 'Aangepast bij fout'-actie.

Fouten kunnen worden geretourneerd door waarden/objecten te gooien (meestal strings of foutobjecten).

Bijvoorbeeld:

if (value == 0)
           throw "Nul invoerwaarde"
       return 1/value

Elk script heeft een time-out van 10 seconden voor uitvoering (afhankelijk van het script kan het langer duren voordat de time-out wordt geactiveerd); als deze wordt overschreden, wordt er een fout geretourneerd. Er geldt een limiet van 512 megabyte voor de heap (64 megabyte voor Zabbix 6.0.19).

De bytecode van de JavaScript-voorverwerkingsstap wordt gecachet en opnieuw gebruikt wanneer de stap de volgende keer wordt toegepast. Eventuele wijzigingen in de voorverwerkingsstappen van het item zorgen ervoor dat het gecachte script wordt gereset en later opnieuw wordt gecompileerd.

Aaneengesloten uitvoeringsfouten (3 op een rij) zorgen ervoor dat de engine opnieuw wordt geïnitialiseerd om de mogelijkheid te verminderen dat één script de uitvoeringsomgeving voor de volgende scripts verbreekt (deze actie wordt gelogd bij DebugLevel 4 en hoger).

JavaScript-voorverwerking is geïmplementeerd met de Duktape JavaScript-engine (https://duktape.org/).

Zie ook: Aanvullende JavaScript-objecten en globale functies

Gebruik van macro's in scripts

Het is mogelijk om gebruikersmacro's te gebruiken in JavaScript-code. Als een script gebruikersmacro's bevat, worden deze macro's opgelost door de server/proxy voordat specifieke voorverwerkingsstappen worden uitgevoerd. Let op, dat bij het testen van voorverwerkingsstappen in de frontend macrowaarden niet automatisch worden opgehaald en handmatig moeten worden ingevoerd.

De context wordt genegeerd wanneer een macro wordt vervangen door zijn waarde. De macrowaarde wordt ongewijzigd in de code ingevoegd, het is niet mogelijk om extra escaping toe te voegen voordat de waarde in de JavaScript-code wordt geplaatst. Houd er rekening mee dat dit in sommige gevallen JavaScript-fouten kan veroorzaken.

In het onderstaande voorbeeld, als de ontvangen waarde de waarde van de {$THRESHOLD} macro overschrijdt, wordt in plaats daarvan de drempelwaarde (indien aanwezig) geretourneerd:

var threshold = '{$THRESHOLD}';
       return (!isNaN(threshold) && value > threshold) ? threshold : value;