Correct notifications on threshold script errors
authorVictor Kirhenshtein <victor@netxms.org>
Mon, 2 May 2016 13:40:18 +0000 (16:40 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Mon, 2 May 2016 13:40:18 +0000 (16:40 +0300)
ChangeLog
src/server/core/container.cpp
src/server/core/dcithreshold.cpp
src/server/core/template.cpp
src/server/include/nms_dcoll.h
src/server/libnxsrv/messages.mc

index c7a5dc6..f83caab 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,7 @@
 
 - New parameters in Linux platform subagent to get additional CPU information (frequency, model, etc.)
 - Fixed bugs in LLDP based network topology discovery
+- Correct notifications on threshold script errors
 - Management console
        - Improved dashboard gauge widget
        - Added translucence option for dashboard line charts
index 89b6d70..b3e0556 100644 (file)
@@ -93,7 +93,12 @@ bool Container::loadFromDatabase(DB_HANDLE hdb, UINT32 dwId)
       TCHAR error[256];
       m_bindFilter = NXSLCompile(m_bindFilterSource, error, 256, NULL);
       if (m_bindFilter == NULL)
+      {
+         TCHAR buffer[1024];
+         _sntprintf(buffer, 1024, _T("Container::%s::%d"), m_name, m_id);
+         PostEvent(EVENT_SCRIPT_ERROR, g_dwMgmtNode, "ssd", buffer, error, m_id);
          nxlog_write(MSG_CONTAINER_SCRIPT_COMPILATION_ERROR, NXLOG_WARNING, "dss", m_id, m_name, error);
+      }
    }
    DBFreeResult(hResult);
 
@@ -284,7 +289,12 @@ void Container::setAutoBindFilter(const TCHAR *script)
 
                        m_bindFilter = NXSLCompile(m_bindFilterSource, error, 256, NULL);
                        if (m_bindFilter == NULL)
+                       {
+                TCHAR buffer[1024];
+                _sntprintf(buffer, 1024, _T("Container::%s::%d"), m_name, m_id);
+                PostEvent(EVENT_SCRIPT_ERROR, g_dwMgmtNode, "ssd", buffer, error, m_id);
                                nxlog_write(MSG_CONTAINER_SCRIPT_COMPILATION_ERROR, EVENTLOG_WARNING_TYPE, "dss", m_id, m_name, error);
+                       }
                }
                else
                {
index aa80935..4490d97 100644 (file)
@@ -289,30 +289,43 @@ ThresholdCheckResult Threshold::check(ItemValue &value, ItemValue **ppPrevValues
    {
       if (m_script != NULL)
       {
-         NXSL_Value *parameters[2];
-         parameters[0] = new NXSL_Value(value.getString());
-         parameters[1] = new NXSL_Value(m_value.getString());
-         m_script->setGlobalVariable(_T("$object"), target->createNXSLObject());
-         if (target->getObjectClass() == OBJECT_NODE)
+         NXSL_VM *vm = new NXSL_VM(new NXSL_ServerEnv());
+         if (vm->load(m_script))
          {
-            m_script->setGlobalVariable(_T("$node"), new NXSL_Value(new NXSL_Object(&g_nxslNodeClass, target)));
-         }
-         m_script->setGlobalVariable(_T("$dci"), dci->createNXSLObject());
-         m_script->setGlobalVariable(_T("$isCluster"), new NXSL_Value((target->getObjectClass() == OBJECT_CLUSTER) ? 1 : 0));
-         if (m_script->run(2, parameters))
-         {
-            NXSL_Value *result = m_script->getResult();
-            if (result != NULL)
+            NXSL_Value *parameters[2];
+            parameters[0] = new NXSL_Value(value.getString());
+            parameters[1] = new NXSL_Value(m_value.getString());
+            vm->setGlobalVariable(_T("$object"), target->createNXSLObject());
+            if (target->getObjectClass() == OBJECT_NODE)
+            {
+               vm->setGlobalVariable(_T("$node"), new NXSL_Value(new NXSL_Object(&g_nxslNodeClass, target)));
+            }
+            vm->setGlobalVariable(_T("$dci"), dci->createNXSLObject());
+            vm->setGlobalVariable(_T("$isCluster"), new NXSL_Value((target->getObjectClass() == OBJECT_CLUSTER) ? 1 : 0));
+            if (vm->run(2, parameters))
             {
-               bMatch = (result->getValueAsInt32() != 0);
+               NXSL_Value *result = vm->getResult();
+               if (result != NULL)
+               {
+                  bMatch = (result->getValueAsInt32() != 0);
+               }
+            }
+            else
+            {
+               TCHAR buffer[1024];
+               _sntprintf(buffer, 1024, _T("DCI::%s::%d::%d::ThresholdScript"), target->getName(), dci->getId(), m_id);
+               PostDciEvent(EVENT_SCRIPT_ERROR, g_dwMgmtNode, dci->getId(), "ssd", buffer, vm->getErrorText(), dci->getId());
+               nxlog_write(MSG_THRESHOLD_SCRIPT_EXECUTION_ERROR, NXLOG_WARNING, "sdds", target->getName(), dci->getId(), m_id, vm->getErrorText());
             }
          }
          else
          {
             TCHAR buffer[1024];
             _sntprintf(buffer, 1024, _T("DCI::%s::%d::%d::ThresholdScript"), target->getName(), dci->getId(), m_id);
-            PostDciEvent(EVENT_SCRIPT_ERROR, g_dwMgmtNode, dci->getId(), "ssd", buffer, m_script->getErrorText(), dci->getId());
+            PostDciEvent(EVENT_SCRIPT_ERROR, g_dwMgmtNode, dci->getId(), "ssd", buffer, vm->getErrorText(), dci->getId());
+            nxlog_write(MSG_THRESHOLD_SCRIPT_EXECUTION_ERROR, NXLOG_WARNING, "sdds", target->getName(), dci->getId(), m_id, vm->getErrorText());
          }
+         delete vm;
       }
       else
       {
@@ -816,8 +829,16 @@ void Threshold::setScript(TCHAR *script)
       StrStrip(m_scriptSource);
       if (m_scriptSource[0] != 0)
       {
-                       /* TODO: add compilation error handling */
-         m_script = NXSLCompileAndCreateVM(m_scriptSource, NULL, 0, new NXSL_ServerEnv);
+         TCHAR errorText[1024];
+         m_script = NXSLCompile(m_scriptSource, errorText, 1024, NULL);
+         if (m_script == NULL)
+         {
+            TCHAR buffer[1024], defaultName[32];
+            _sntprintf(defaultName, 32, _T("[%d]"), m_targetId);
+            _sntprintf(buffer, 1024, _T("DCI::%s::%d::%d::ThresholdScript"), GetObjectName(m_targetId, defaultName), m_itemId, m_id);
+            PostDciEvent(EVENT_SCRIPT_ERROR, g_dwMgmtNode, m_itemId, "ssd", buffer, errorText, m_itemId);
+            nxlog_write(MSG_THRESHOLD_SCRIPT_COMPILATION_ERROR, NXLOG_WARNING, "sdds", GetObjectName(m_targetId, defaultName), m_itemId, m_id, errorText);
+         }
       }
       else
       {
index e700f9d..3cbc3e7 100644 (file)
@@ -1,6 +1,6 @@
 /*
 ** NetXMS - Network Management System
-** Copyright (C) 2003-2015 Victor Kirhenshtein
+** Copyright (C) 2003-2016 Victor Kirhenshtein
 **
 ** This program is free software; you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
@@ -156,7 +156,12 @@ void Template::setAutoApplyFilter(const TCHAR *filter)
                m_applyFilterSource = _tcsdup(filter);
                m_applyFilter = NXSLCompile(m_applyFilterSource, error, 256, NULL);
                if (m_applyFilter == NULL)
-                       nxlog_write(MSG_TEMPLATE_SCRIPT_COMPILATION_ERROR, EVENTLOG_WARNING_TYPE, "dss", m_id, m_name, error);
+               {
+         TCHAR buffer[1024];
+         _sntprintf(buffer, 1024, _T("Template::%s::%d"), m_name, m_id);
+         PostEvent(EVENT_SCRIPT_ERROR, g_dwMgmtNode, "ssd", buffer, error, m_id);
+                       nxlog_write(MSG_TEMPLATE_SCRIPT_COMPILATION_ERROR, NXLOG_WARNING, "dss", m_id, m_name, error);
+               }
        }
        else
        {
@@ -205,7 +210,12 @@ bool Template::loadFromDatabase(DB_HANDLE hdb, UINT32 dwId)
       TCHAR error[256];
       m_applyFilter = NXSLCompile(m_applyFilterSource, error, 256, NULL);
       if (m_applyFilter == NULL)
+      {
+         TCHAR buffer[1024];
+         _sntprintf(buffer, 1024, _T("Template::%s::%d"), m_name, m_id);
+         PostEvent(EVENT_SCRIPT_ERROR, g_dwMgmtNode, "ssd", buffer, error, m_id);
          nxlog_write(MSG_TEMPLATE_SCRIPT_COMPILATION_ERROR, EVENTLOG_WARNING_TYPE, "dss", m_id, m_name, error);
+      }
    }
    DBFreeResult(hResult);
 
@@ -893,7 +903,12 @@ UINT32 Template::modifyFromMessageInternal(NXCPMessage *pRequest)
 
                        m_applyFilter = NXSLCompile(m_applyFilterSource, error, 256, NULL);
                        if (m_applyFilter == NULL)
+                       {
+                TCHAR buffer[1024];
+                _sntprintf(buffer, 1024, _T("Template::%s::%d"), m_name, m_id);
+                PostEvent(EVENT_SCRIPT_ERROR, g_dwMgmtNode, "ssd", buffer, error, m_id);
                                nxlog_write(MSG_TEMPLATE_SCRIPT_COMPILATION_ERROR, EVENTLOG_WARNING_TYPE, "dss", m_id, m_name, error);
+                       }
                }
                else
                {
index 8a8afb1..cf0abee 100644 (file)
@@ -113,7 +113,7 @@ private:
        BYTE m_currentSeverity;   // Current everity (NORMAL if threshold is inactive)
    int m_sampleCount;        // Number of samples to calculate function on
    TCHAR *m_scriptSource;
-   NXSL_VM *m_script;
+   NXSL_Program *m_script;
    BOOL m_isReached;
        int m_numMatches;                       // Number of consecutive matches
        int m_repeatInterval;           // -1 = default, 0 = off, >0 = seconds between repeats
index a66c0da..95f78b8 100644 (file)
@@ -1010,4 +1010,16 @@ Language=English
 Failed to execute transformation script for object %1 "%2" DCI %3 "%4": %5
 .
 
+MessageId=
+SymbolicName=MSG_THRESHOLD_SCRIPT_COMPILATION_ERROR
+Language=English
+Failed to compile threshold script for node "%1" DCI %2 threshold %3: %4
+.
+
+MessageId=
+SymbolicName=MSG_THRESHOLD_SCRIPT_EXECUTION_ERROR
+Language=English
+Failed to execute threshold script for node "%1" DCI %2 threshold %3: %4
+.
+
 ;#endif