Email Alerts and Notifications

Monitoring Queue Sizes

Contents

One of the great things about the Translator is how easy it is to extend the functionality of Iguana. This is an example of writing a module in Iguana to monitor the queue count for a channel. This shows the usage of a queuemon module to check that the count of messages on a queue has not exceeded the given threshold.

If the queue count exceeds the threshold the script will log “ALERT:” followed by a description of the problem. That makes it very easy to detect this condition using a standard notification rule.

There are two examples given of calling this function. If no arguments are given then the script defaults to the current channel name and will raise an alert if the channel count exceeds 100.

These defaults can be overridden which is what the second example shows:

Here is the code to copy:

require 'queuemon'

function main()
   -- Using default parameters
   queuemon.checkQueue()
   -- Setting the channel name and count explicitly
   queuemon.checkQueue{channel = '<your channel name>', count = 10000}   
end

The queuemon module makes use of this module called iguanaconfig:

-- This module does a lazy load of the Iguana Configuration file - it only loads the file once
iguanaconfig={}

-- We open the configuration file once at compile time
local F = io.open('IguanaConfiguration.xml', 'r')
local C = F:read('*a')
F:close() -- best practice to close (open filehandle can prevent Iguana updating config file on Win machines)

function iguanaconfig.config(A)
   return xml.parse{data=C}
end

The iguanaconfig module just loads the IguanaConfiguration.xml file and returns it as a XML document. It’s extremely useful for all sorts of things.

In this case we use it to pull back the port number that the Iguana instance is listening on. The source to the queuemon module is here:

require("node")
require("iguanaconfig")

queuemon = {}

local function trace(a,b,c,d) return end

local function CheckChannel(Chan, Count, Name)
   if Chan.Name:nodeValue() == Name then
      local QC = tonumber(Chan.MessagesQueued:nodeValue())
      trace(QC)
      if QC > Count then
         print('ALERT:\n Channel '..Name..' has '..QC..' messages queued.') 
      end   
   end
end

function queuemon.checkQueue(Param)
   -- We default to a queue count of 100
   if not Param then Param = {} end
   if not Param.count then Param.count = 100 end
   if not Param.channel then Param.channel= iguana.channelName() end
   local url = 'http://localhost:'..
    iguanaconfig.config().iguana_config.web_config.port..'/status.html'
   trace(url)
   -- We need a user login here.  Best to use a user with few
   -- permissions.
   local S = net.http.get{url=url, 
      parameters={UserName='admin',Password='password', Format='xml'}, 
      live=true}
   S = xml.parse{data=S}

   for i = 1, S.IguanaStatus:childCount('Channel') do
      local Chan = S.IguanaStatus:child("Channel", i)
      CheckChannel(Chan, Param.count, Param.channel)
   end
   return "Checking queue of "..Param.channel..
          ' is less than '..Param.count
end

This module uses the web monitoring URL to pull back the XML summary and parses it to find the queue counts for the channel. In this case we are only selecting one channel to check the queue count but there is no reason we could not check all the channels or even parse a group of channels and only check the queue counts on that channel group.

If you would like to see this script extended in that manner please contact support at support@interfaceware.com.