LAMbot Configuration
LAMbots are JavaScript modules associated with every LAM. The LAMbots control the actions the LAM performs at startup and any necessary processing before forwarding objects to the Message Bus.
You can configure a LAMbot by modifying the functions and modules within its configuration file. The LAMbot files are located at $MOOGSOFT_HOME/bots/lambots.
LAMbot Functions
Each LAMbot includes an onLoad
function that runs at startup and a presend
function that processes and filters objects before sending them to the Message Bus.
REST-based LAMbotscall modifyResponse
after they receive an object and convert it to JSON.
REST Client-based LAMbots call preClientSend
before they send a request to a polled server and modifyResponse
after a response is received from a polled server.
onLoad
Every instance of a LAMbot calls the onLoad
function at startup. We recommend setting up shared values or lookup tables in the onLoad
function. You can use it to initalize internal variables, load external JavaScript modules and set up structures needed for the filter function. For example:
var config = MooBot.loadModule('Config'); var moogUrl; function onLoad() { var servletsConf = config.getConfig('servlets.conf'); if (servletsConf) { moogUrl = servletsConf.webhost; } }
The onLoad
function:
Stores the value of the servlets configuration in the
config
module to a variable "servletsConf".Sets the variable
moogURL
to the servletswebhost
value.
presend
The LAMbot calls the presend
function every time it assembles an object to publish on the Message Bus. Moogfarmd processes objects and turns them into alerts and Situations. An example presend
function is:
function presend(event) { event.setCustomInfoValue("eventDetails",overflow); if (overflow.LamInstanceName && (overflow.LamInstanceName === "DATA_SOURCE")) { delete overflow.LamInstanceName; } event.setCustomInfoValue("nodeSeverity", overflow.Severity); event.setCustomInfoValue("nodeMachineType", overflow.MachineType); event.setCustomInfoValue("nodeVendor", overflow.Vendor); return true; }
The presend
function:
Adds the
overflow
object as event details.Checks whether LamInstanceName is the default value DATA_SOURCE and if so, removes it from custom info.
Saves three overflow fields to custom info.
Returns a true response to indicate that the object will be passed to the Message Bus.
You can partition event streams into substreams for differential processing in a distributed environment. You can send a boolean response if the configuration dictates that all objects will or will not be sent to the bus.
Instead of a boolean response, you can configure the function to return a JSON object containing two members: "passed" which is either true or false, and "stream" which defines the substream to send the event. For example:
function presend(event) { return ({ "stream" : "my_stream", "passed" : true }); }
You can configure the event inside the presend
function. For example you can:
Change values
Access lookup tables
Add or remove key value bindings
Access regular expressions
Extract tokens
In the LAMbot, the following line instructs the LAM to use the presend
function. It calls filterFunction
using the global LamBot
variable:
LamBot.filterFunction("presend");
The filterFunction
function receives a string, which is the name of the function to use for filtering.
You define the presend
processing file or stream in individual LAM configuration files. See "Filtering" in Tokenize Source Event Data for more information.
preClientSend
REST Client-based LAMbots call preClientSend
before they send a request to a polled server. The function accepts an object and returns a modified version that is then sent by the Rest Client LAM. An example preClientSend
function is:
function preClientSend(outBoundEvent) { outBoundEvent.set('method', 'Post'); var header = outBoundEvent.value('header'); header['Content-Type'] = 'application/json'; outBoundEvent.set('header', header); var body = { 'events': 'all', 'type': { 'id': '12345', 'name': 'incident' } }; outBoundEvent.set('body', body); return true; }
The function generates a POST request with body type JSON.
In the LAMbot, the following line instructs the LAM to use the preClientSend
function. It calls preClientSendFunction
using the global LamBot
variable:
LamBot.preClientSendFunction("preClientSend");
modifyResponse
You can modify the response sent by a REST-based LAMbot after it receives an object and a REST Client-based LAMbot after it receives a response from a polled server. An example modifyResponse
function is:
function modifyResponse(inBoundEventData) { var response = JSON.parse(inBoundEventData.value('responseData')); if (inBoundEventData.value('moog_target_name') == 'target1') { response['manager'] = 'primary'; } else { response['manager'] = 'secondary'; } inBoundEventData.set('responseData', JSON.stringify(response)); return true; }
The function generates a different response depending on the name of the REST client target called.
In the LAMbot, the following line instructs the LAM to use the modifyResponse
function. It calls modifyResponseFunction
using the global LamBot
variable:
LamBot.modifyResponseFunction("modifyResponse");
LAMbot Modules
You can load modules into a LAMbot to perform various tasks. The most commonly used modules are:
Logger: Moogsoft Enterprise components generate log files to report their activity.
Constants: Used to share logic, states and flags between LAMbots.
Utilities: A JavaScript utility used to escape and convert XML strings and JSON objects.
Define a global object to load a module into a LAMbot. For example:
var logger = LamBot.loadModule("Logger"); var constants = LamBot.loadModule("Constants"); var utilities = LamBot.loadModule("Utilities");