{"id":3532,"date":"2021-07-15T20:52:57","date_gmt":"2021-07-15T20:52:57","guid":{"rendered":"https:\/\/wiki.thomasandsofia.com\/?p=3532"},"modified":"2021-07-20T11:46:09","modified_gmt":"2021-07-20T11:46:09","slug":"zenoss-monitoring-ii","status":"publish","type":"post","link":"https:\/\/wiki.thomasandsofia.com\/?p=3532","title":{"rendered":"Zenoss Monitoring II"},"content":{"rendered":"<p>Day 1<\/p>\n<ul>\n<li>Video\n<ul>\n<li>Link: https:\/\/zenoss.zoom.us\/rec\/share\/8It3IwK8EQDqhaP7zOgudyKEOE0pbaSFapwIkZFLOrmjp88YGJZ6TzQT1y1kew6S.4dRbOfbs9UmwHG_R<\/li>\n<li><span style=\"font-family: verdana, sans-serif;\">p&amp;xdK1G1<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h1>Day 1<\/h1>\n<h2>Zenbatchload<\/h2>\n<p>0:40:00<\/p>\n<ul>\n<li>Used to add or modify devices<\/li>\n<li>Device Classes are created automatically<\/li>\n<\/ul>\n<h3>Configuration Syntax<\/h3>\n<p># Comment<br \/>\n\/Devices\/Device\/Class<br \/>\nhost1.name.tld | IP.ADD.RE.SS [ option1=NUMBER, option2=&#8217;String&#8217;, &#8230; ]<br \/>\nhost2.name.tld | IP.ADD.RE.SS [ option1=NUMBER, option2=&#8217;String&#8217;, &#8230; ]<\/p>\n<h3>Setting Options<\/h3>\n<ul>\n<li>Any zProperty\n<ul>\n<li>zSnmpCommunity &#8230;<\/li>\n<\/ul>\n<\/li>\n<li>setManageIp &#8211; Specify a device&#8217;s IP<\/li>\n<li>setPerformanceMonitor &#8211; Define the device&#8217;s collector<\/li>\n<li>Non-numeric values must be enclosed in matching quotes<\/li>\n<li>Lists must be enclosed in square brackets &#8211; [&#8216;x1&#8217;, &#8216;x2&#8217;, 5 ]<\/li>\n<li>Models by default unless <code>--nomodel<\/code><\/li>\n<\/ul>\n<h3>Example File<\/h3>\n<p>pdf Pg. 43<\/p>\n<pre># Start of zenbatchload file\r\n\r\n# Create the parent device class and set the zSnmpCommunity zProp to 'underwriting'\r\n\/Devices\/Server\/Linux zSnmpCommunity='underwriting'\r\n\r\n\/Devices\/Server\/Linux\r\ndns.hypothetical.loc\r\n\r\n\/Devices\/Server\/Linux\/WordPress\r\ndns.hypothetical.loc\r\n\r\n\/Devices\/Server\/Linux\/MySQL\r\nmysql.hypothetical.loc<\/pre>\n<h3>Run the file<\/h3>\n<ul>\n<li>Place the file FILENAME.TXT in a world writable folder in CC Master<\/li>\n<li>CD to ^^ folder<\/li>\n<li>serviced service shell zope<\/li>\n<li>cd \/mnt\/pwd<\/li>\n<li>zenbatchload FILENAME.TXT<\/li>\n<\/ul>\n<p><strong>Results<\/strong><\/p>\n<pre># Last 2 lines of output\r\nINFO zen.BatchDeviceLoader: Processed 3 of 3 devices, with 0 errors\r\nINFO zen.BatchDeviceLoader:  Unable to process 0 entries<\/pre>\n<p><strong>zenbatchload &#8211;sample_configs<\/strong><\/p>\n<pre>#\r\n# Example zenbatchloader file (Groups, Systems Locations, Devices, etc.)\r\n#\r\n# This file is formatted with one entry per line, like this:\r\n#\r\n# \/Devices\/device_class_name Python-expression\r\n# hostname Python-expression\r\n#\r\n# For organizers (for example, the \/Devices path), the Python-expression\r\n# is used to define defaults to be used for devices listed\r\n# after the organizer. The defaults that can be specified are:\r\n#\r\n# * loader arguments (use the --show_options flag to show these)\r\n#\r\n# * zProperties (from a device, use the 'Configuration Properties'\r\n# menu item to see the available ones.)\r\n#\r\n# NOTE: new zProperties *cannot* be created through this file\r\n#\r\n# * cProperties (from a device, use the 'Custom Properties'\r\n# menu item to see the available ones.)\r\n#\r\n# NOTE: new cProperties *cannot* be created through this file\r\n#\r\n# The Python-expression is used to create a dictionary of settings.\r\n# device_settings = eval( 'dict(' + python-expression + ')' )\r\n#\r\n\r\n# Defining groups\r\n\/Groups\/Admin\r\n\/Groups\/Support\r\n\r\n#Defining systems\r\n\/Systems\/Production\r\n\/Systems\/Staging\r\n\r\n# Defining locations\r\n\/Locations\/Canada address=\"Canada\"\r\n\/Locations\/Canada\/Alberta address=\"Alberta, Canada\"\r\n\/Locations\/Canada\/Alberta\/Calgary address=\"Calgary, Alberta, Canada\"\r\n\r\n# If no organizer is specified at the beginning of the file,\r\n# defaults to the \/Devices\/Discovered device class.\r\ndevice0 comments=\"A simple device\"\r\n# All settings must be seperated by a comma.\r\ndevice1 comments=\"A simple device\", zSnmpCommunity='blue', zSnmpVer='v1'\r\n\r\n# Notes for this file:\r\n# * Oraganizer names *must* start with '\/'\r\n#\r\n\/Devices\/Server\/Linux zSnmpPort=1543\r\n# Python strings can use either ' or \" -- there's no difference.\r\n# As a special case, it is also possible to specify the IP address\r\nlinux_device1 setManageIp='10.10.10.77', zSnmpCommunity='blue', zSnmpVer=\"v2c\"\r\n# A '' at the end of the line allows you to place more\r\n# expressions on a new line. Don't forget the comma...\r\nlinux_device2 zLinks=\"&lt;a href='http:\/\/example.org'&gt;Support site&lt;\/a&gt;\", zTelnetEnable=True, zTelnetPromptTimeout=15.3\r\n\r\n# A new organizer drops all previous settings, and allows\r\n# for new ones to be used.\r\n\/Devices\/Server\/Windows zWinUser=\"administrator\", zWinPassword='fred'\r\n# Bind templates\r\nwindows_device1 zDeviceTemplates=[ 'Device', 'myTemplate' ], rackSlot=1\r\n# Override the default from the organizer setting.\r\nwindows_device2 zWinUser=\"administrator\", zWinPassword='thomas', setProdState=500, rackSlot=2, settingsDevice setManageIp='10.10.10.77', setLocation=\"123 Elm Street\", setSystems=['\/mySystems'], setPerformanceMonitor='remoteCollector1', setHWSerialNumber=\"abc123456789\", setGroups=['\/myGroup'], # Apply custom schema properties (c-properties) to a device\r\nwindows_device7 cDateTest='2010\/02\/28'\r\n\r\n# If the device or device class contains a space, then it must be quoted (either ' or \")\r\n\"\/Server\/Windows\/WMI\/Active Directory\/2008\"\r\nwindows_device_3 setTitle=\"Windows AD Server 1\", setHWTag=\"service-tag-ABCDEF\", setPriority=2\r\n\r\n# Now, what if we have a device that isn't really a device, and requires\r\n# a special loader?\r\n# The 'loader' setting requires a registered utility, and 'loader_arg_keys' is\r\n# a list from which any other settings will be passed into the loader callable.\r\n#\r\n# Here is a commmented-out example of how a VMware endpoint might be added:\r\n#\r\n#\/Devices\/VMware loader='vmware', loader_arg_keys=['host', 'username', 'password', 'useSsl', 'id']\r\n#esxwin2 id='esxwin2', host='esxwin2.zenoss.loc', username='testuser', password='password', useSsl=True\r\n\r\n# The following are wrapper methods that specifically set properties on a device:\r\n# setManageIp\r\n# setPerformanceMonitor\r\n# setTitle\r\n# setHWTag\r\n# setHWSerialNumber\r\n# setProdState\r\n# setPriority\r\n# setGroups\r\n# setSystems<\/pre>\n<h2>Event Handling<\/h2>\n<h3>Deduplication<\/h3>\n<ul>\n<li>Device|Component|Event Class|Event Key|Severity|Summary\n<ul>\n<li>Event Class can be empty<\/li>\n<li>Summary is omitted if Event Key is present.<\/li>\n<\/ul>\n<\/li>\n<li>Aged events are eligible for Deduplication.\u00a0 Clear, Closed and Archived events are not.<\/li>\n<\/ul>\n<h3>Auto-Clear Correlation<\/h3>\n<ul>\n<li>if the Component UUID field is present\n<ul>\n<li>ComponentUUID<\/li>\n<li>eventClass<\/li>\n<li>eventKey<\/li>\n<\/ul>\n<\/li>\n<li>If the Component UUID field is NOT present\n<ul>\n<li>Device<\/li>\n<li>Component (can be blank)<\/li>\n<li>eventKey (can be blank)<\/li>\n<li>eventClass<\/li>\n<\/ul>\n<\/li>\n<li>zEventClearClasses are applied on the Clear Event&#8217;s event class to tell them which classes they can clear.\n<ul>\n<li>Start events will clear Stop events.\n<ul>\n<li><code>zEventClearClasses<\/code> = <code>\/App\/Stop<\/code><\/li>\n<\/ul>\n<\/li>\n<li>Do not specify the Start class in the Stop event&#8217;s zEventClearClasses<\/li>\n<li>This property can accept a list of classes these events can clear.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Event Suppression<\/h3>\n<ul>\n<li>Requirements\n<ul>\n<li>Must first be enabled via the <code>zL2SuppressIfPathsDown<\/code> zProp on the device or device class.<\/li>\n<li>Requires the zenoss.snmp.ClientMACs modeler plugin is enabled and functioning on all network devices in the path.<\/li>\n<\/ul>\n<\/li>\n<li>When a device is modeled, an NMAP is also performed and a network map is discovered.<\/li>\n<li>If a device is found to be behind Switch or Router or some other device and that device is found to be down, then events from devices behind these are &#8216;Suppressed&#8217;<\/li>\n<\/ul>\n<h3>Event Mappings<\/h3>\n<p>02:57:00<\/p>\n<ul>\n<li>Unknown events are compared to Event Mappings.\u00a0 If a matching Event Mapping is found, the event is sent to that class.<\/li>\n<li>Only applied to \/Unknown events\n<ul>\n<li>This generally means &#8220;unsolicited&#8221; events because we did not actively go out and get them<\/li>\n<li>Exception might be events provided via APIs.<\/li>\n<\/ul>\n<\/li>\n<li>Normal monitoring does not make \/Unknown events.\u00a0 These event classes are pre-defined in the monitoring templates.<\/li>\n<li>Unknown events come from\n<ul>\n<li>Trap\n<ul>\n<li>If the MIB is installed, the name of the trap becomes the Event Key<\/li>\n<\/ul>\n<\/li>\n<li>Syslog messages<\/li>\n<li>Email<\/li>\n<\/ul>\n<\/li>\n<li>Uses the Event Class Key to determine how to match.<\/li>\n<\/ul>\n<h3>Event Thresholds<\/h3>\n<p>3:42:00<\/p>\n<ul>\n<li>Minimum Only: Event created if the value &lt; Minimum.<\/li>\n<li>Maximum Only: Event created if the value &gt; Maximum.<\/li>\n<li>Minimum and Maximum same: Event created if value != Min and Max<\/li>\n<li>Minimum &lt; Maximum: Event created if value &lt; Minimum or value &gt; Maximum<\/li>\n<li>Minimum &gt; Maximum: Event created if value &gt; Maximum AND value &lt; Minimum. (event on anything in between)\n<ul>\n<li>This is good for &#8220;Warning&#8221; type thresholds where there is another threshold for Critical<\/li>\n<li>Disk Usage Warning Min=95 Max=85<\/li>\n<li>Disk Usage Critical Max=85<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Event Transforms<\/h3>\n<p>03:27:00<\/p>\n<ul>\n<li>Applied zeneventd.<\/li>\n<li>If zeneventd is bottlenecking, the rabbit queue will start growing.<\/li>\n<\/ul>\n<h3>Heartbeat Events<\/h3>\n<p>02:48:00<\/p>\n<ul>\n<li>Requires a heartbeat to be received before it starts working<\/li>\n<li>If no additional heartbeats are received within the timeout value, an event is generated.<\/li>\n<li>Advanced &gt; Events &gt; Clear heartbeat events\n<ul>\n<li>Dangerous.\u00a0 If a daemon is down and you clear these events, no further heartbeat events will be received.<\/li>\n<li>Good if you started a daemon you did not want and then stop it. Use this to clear those events.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<pre>serviced service attach mariadb-events\r\nmysql -uroot\r\nuse zenoss_zep;\r\nshow tables;\r\nselect * from daemon_heartbeat;<\/pre>\n<p>&nbsp;<\/p>\n<h2>Network Mapping<\/h2>\n<ul>\n<li>https:\/\/help.zenoss.com\/in\/zenpack-catalog\/open-source\/layer2<\/li>\n<li>\u00a0Requirements:\n<ul>\n<li>Network devices must be monitored by Zenoss<\/li>\n<li>Layer 3 &#8211; Ping based. IP Addresses<\/li>\n<li>Layer 2 &#8211; MAC Addresses\n<ul>\n<li>Must have <strong>CDP<\/strong> (<strong>C<\/strong>isco <strong>D<\/strong>iscovery <strong>P<\/strong>rotocol) or <strong>LLDP<\/strong> (Open Sourced <strong>L<\/strong>ink <strong>L<\/strong>ayer <strong>D<\/strong>iscovery <strong>P<\/strong>rotocol) enabled to provide information about its neighbors.<\/li>\n<li>These use the CISCO-CDP-MIB and LLDP-MIB<\/li>\n<li>These protocols are provided by the layer2 ZenPack<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h1>Day 2<\/h1>\n<p>Video:<\/p>\n<ul>\n<li><span style=\"font-family: verdana, sans-serif;\">s:\/\/zenoss.zoom.us\/rec\/share\/I4MbuDWD0jd-SpFD9EDUXINFLUIGmH0_PJ9i9Fkd67bqQa_u0NjTbdSjfP6O-s21.dO3WRCjbMAVe1frx<\/span><\/li>\n<li><span style=\"font-family: verdana, sans-serif;\">eW7rP%m<\/span><\/li>\n<\/ul>\n<p>Overview of Day 1<\/p>\n<p>Modeling vs. Monitoring<\/p>\n<h2>IP Services<\/h2>\n<p>1:10:00<\/p>\n<p><a href=\"https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/IP-services.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3539\" src=\"https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/IP-services.png\" alt=\"\" width=\"969\" height=\"441\" srcset=\"https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/IP-services.png 969w, https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/IP-services-300x137.png 300w, https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/IP-services-768x350.png 768w, https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/IP-services-150x68.png 150w\" sizes=\"auto, (max-width: 969px) 100vw, 969px\" \/><\/a><\/p>\n<ul>\n<li>Network services that respond on the port defined by an entry in the Global IP Services list\n<ul>\n<li>Opens a connection to the port and looks for a response.<\/li>\n<\/ul>\n<\/li>\n<li>Most NOT monitored by default<\/li>\n<li>UDP are detected but cannot be monitored\n<ul>\n<li>Connectionless.\u00a0 Point and shoot but don&#8217;t check if you hit.<\/li>\n<\/ul>\n<\/li>\n<li>TCP services are detected and can be monitored if they bind to\n<ul>\n<li>an external interface address (not localhost \/ 127.x.x.x)<\/li>\n<li>or all available network interfaces (0.0.0.0)<\/li>\n<\/ul>\n<\/li>\n<li>A send string \/ expect regular expression can be specified for TCP services<\/li>\n<li>Cautions\n<ul>\n<li>This is a very low level service.\u00a0 If there are other means of monitoring the port (Application monitoring), IP Services really is not required.<\/li>\n<li>There are some applications that view this test as a failed login.\u00a0 After several perceived &#8220;failed logins&#8221; the application may block all log in attempts (including legitimate ones). (Mysql?) so only use if required and no other means.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Regular Expressions<\/h2>\n<p>1:23:00<\/p>\n<p>HTTPS:\/\/regex101.com<\/p>\n<ul>\n<li>Alphanumerif characters match themselves\n<ul>\n<li><strong>zebra<\/strong> = <code>zebra<\/code>, <code>the zebra<\/code> and <code>zebras<\/code><\/li>\n<\/ul>\n<\/li>\n<li>. (dot) matches any single character\n<ul>\n<li><strong>m.st<\/strong> = <code>mist<\/code> and <code>most<\/code> but NOT <code>mst<\/code><\/li>\n<\/ul>\n<\/li>\n<li>* (asterisk) matches any string of zero, one or more characters\n<ul>\n<li><strong>&lt;.*&gt;<\/strong> = <code>&lt;p&gt;<\/code>, <code>&lt;\/p&gt;<\/code> and <code>&lt;&gt;<\/code><\/li>\n<li><strong>hap*y<\/strong> = <code>hapy<\/code>, <code>happy<\/code>, <code>happppy<\/code> but not <code>hapxy<\/code><\/li>\n<\/ul>\n<\/li>\n<li>[&#8230;] (character set) matches any single character with the brackets\n<ul>\n<li><strong>[dfc]og<\/strong> = <code>dog<\/code>, <code>fog<\/code> and <code>cog<\/code> but not <code>jog<\/code> or <code>og<\/code><\/li>\n<li>Can include a set<\/li>\n<li><strong>[a-z]og<\/strong> will also match <code>job<\/code>, but not <code>og<\/code> or <code>Dog<\/code><\/li>\n<li><strong>dev[1-5]<\/strong> = <code>dev1<\/code> and <code>dev2<\/code> but not <code>dev0<\/code>, <code>dev6<\/code> nor <code>deva<\/code><\/li>\n<\/ul>\n<\/li>\n<li>\\s (any single white space)\n<ul>\n<li><strong>hey\\sthere<\/strong> = <code>hey there<\/code>, <code>hey\\tthere<\/code> (tab) and <code>hey\\nthere<\/code> (new line)<\/li>\n<\/ul>\n<\/li>\n<li>\\w (word character)\n<ul>\n<li><strong>\\w<\/strong> = <code>a<\/code>, <code>B<\/code>, <code>1<\/code> and <code>_<\/code> but not <code>!<\/code><\/li>\n<\/ul>\n<\/li>\n<li>\\b (break) Any word character to a non-word character.\n<ul>\n<li>Start of string counts!<\/li>\n<li><strong>\\bgrep\\b<\/strong> = <code>grep<\/code>, <code>grep! \/grep\/<\/code> but not <code>fgrep<\/code> or <code>greps<\/code><\/li>\n<\/ul>\n<\/li>\n<li>^ (caret) = Beginning of string\n<ul>\n<li><strong>^grep<\/strong> = <code>grep this<\/code> and <code>greppers!<\/code> but not <code>You can't grep this!<\/code><\/li>\n<\/ul>\n<\/li>\n<li>[^&#8230;] (Character set starting with a caret)\n<ul>\n<li><strong>dev[^1-5]<\/strong> = <code>dev0<\/code> and <code>dev6<\/code> but not <code>dev1<\/code>, <code>dev3<\/code> nor <code>dev5<\/code><\/li>\n<\/ul>\n<\/li>\n<li>$ (Dollar sign) End of string\n<ul>\n<li><strong>zebra$<\/strong> = <code>my zebra<\/code> and <code>zebra<\/code> but not <code>zebras<\/code><\/li>\n<\/ul>\n<\/li>\n<li>? (Question mark) Search Lazy\n<ul>\n<li>.*?mysqld = <code>\/usr\/lib\/mysqld<\/code> but not <code>\/usr\/lib\/mysqld --myfake=\/var\/log\/mysqld<\/code><\/li>\n<\/ul>\n<\/li>\n<li>| (vertical bar \/ pipe symbol) Logical OR\n<ul>\n<li><strong>answer yes|no<\/strong> = <code>answer yes<\/code> and <code>answer no<\/code> but not <code>answer ok<\/code><\/li>\n<\/ul>\n<\/li>\n<li>(&#8230;) (parentheses) Used for grouping or capturing\n<ul>\n<li><strong>(red|green|blue)<\/strong> = <code>red<\/code>, <code>green<\/code> or <code>blue<\/code> but not <code>yellow<\/code>\u00a0and puts the matching string and stores it as \/1 (incremented by the number of grouping sets)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Process Monitoring<\/h2>\n<p>1:54:00<\/p>\n<ul>\n<li>Infrastructure &gt; Processes<\/li>\n<li>Organized by Service Name (Apache, MySQL&#8230;)<\/li>\n<li>Sub-oranized by Process Name (apache2, mysqld&#8230;)<\/li>\n<li>Processes are pulled by zenprocess\n<ul>\n<li>snmp?<\/li>\n<\/ul>\n<\/li>\n<li><strong>Primary reason for Process Sets was for Oracle Databases.<\/strong><\/li>\n<\/ul>\n<h3>Matching Rules<\/h3>\n<p>Compares the process list pulled to the list of defined processes looking for matches using regex<\/p>\n<ul>\n<li>Include processes like: Expression you are looking for\n<ul>\n<li><code>\/mysqld\\s<\/code>, <code>\/mysqld[ ]<\/code><\/li>\n<\/ul>\n<\/li>\n<li>Exclude processes like: Additional expressions you are NOT looking for\n<ul>\n<li>&#8220;If you find the above expression, ignore it if it also contains this&#8230;&#8221;<\/li>\n<li><code>\\b(vim|tail|grep|tar|cat|bash)\\b<\/code><\/li>\n<\/ul>\n<\/li>\n<li>Replace command line text: Used with &#8216;With&#8217; field below.\u00a0 Allows you to use a Regex to replace the full command line with something easier to read.\n<ul>\n<li><code>\/usr\/libexec\/mysqld --basedir=\/usr --datadir=\/var\/lib\/mysql --plugin-dir=...<\/code><\/li>\n<li>Replace command line text: `(^\/.*?\/mysqld) .*`<\/li>\n<\/ul>\n<\/li>\n<li>With:\n<ul>\n<li>\\1<\/li>\n<li>Result: <code>\/usr\/libexec\/mysqld<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Process Count Threshold<\/h3>\n<p>Set the number of processes you would expect to see<\/p>\n<ul>\n<li>Minimum\n<ul>\n<li>Often set to 1.<\/li>\n<li>If you are running multiple instances (possibly 2 or more instances of MySQL on different ports) then set to the minimum you expect.<\/li>\n<li>Good example of multiple processes running is httpd.<\/li>\n<\/ul>\n<\/li>\n<li>Maximum\n<ul>\n<li>Often left blank (infinity) to allow for worker processes<\/li>\n<li>If a process goes crazy and launches 100 workers, you might set this to create an event.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Configuration Properties<\/h3>\n<p>Inherited from root &#8220;Processes&#8221; organizer.\u00a0 These can be overridden by a device&#8217;s Configuration Properties<\/p>\n<ul>\n<li>Set Local Value: Do you want to monitor this process?<\/li>\n<li>Send Event on Restart (zAlertOnRestart)\n<ul>\n<li>Determined by looking at the process ID.\u00a0 If it changes between monitoring cycles, the process must have restarted.<\/li>\n<li>Default Yes<\/li>\n<\/ul>\n<\/li>\n<li>Failure Event Severity (zFailSeverity)\n<ul>\n<li>Set the severity of failed events<\/li>\n<li>Default Error<\/li>\n<\/ul>\n<\/li>\n<li>Lock Process Components (zModelerLock)\n<ul>\n<li>Prevent this process from being deleted if it is not found during the next Modeling cycel<\/li>\n<li>Default &#8220;Unlocked&#8221; (OK to delete)<\/li>\n<\/ul>\n<\/li>\n<li>Send event wen action is blocked (zSendEventWhenBlockedFlag)\n<ul>\n<li>Send an event if Modeler attempts to delete if it is not found and it is locked?<\/li>\n<li>Default No<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>2:14:30<\/p>\n<p>Notes:<\/p>\n<ul>\n<li>mysqld_safe\n<ul>\n<li>Shell script that starts mysqld and if mysqld stops, attempts to restart it.<\/li>\n<li>Does NOT process database calls, so should not be counted as a mysqld process.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Application Process Monitoring Examples<\/h2>\n<p>2:49:00 \/ 3:04:00<\/p>\n<ul>\n<li>Require ZenPacks : http:\/\/zenpacks.zenoss.com<\/li>\n<li>Must be configured both on the application side and on Zenoss side.\n<ul>\n<li>Both are outlined in the link above.<\/li>\n<\/ul>\n<\/li>\n<li>You will need to bind the template to the device class.<\/li>\n<\/ul>\n<h3>Best Practices<\/h3>\n<ul>\n<li>Whenever possible restrict access to the application monitoring to specific hosts or networks.<\/li>\n<li>Recommended to use a device class for devices monitoring this application<\/li>\n<\/ul>\n<h3>Addition Application Process Monitoring notes<\/h3>\n<ul>\n<li>Most Applications are bound at the device level<\/li>\n<li>MySql may have multiple instances, so will be added as a component.\n<ul>\n<li>These Application must have the Application Modeler Plugin added<\/li>\n<li>You may also need to add the user credentials\n<ul>\n<li>Recommend creating a special user\/password for these<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Virtual Web Host Monitoring<\/h2>\n<p>3:32:00<\/p>\n<ul>\n<li>Cannot have multiple devices with same IP address<\/li>\n<li>Solution: Create placeholder devices (aka psudo-devices) with hostnames that do not resolve in DNS\n<ul>\n<li><strong>auto.hypothetical.loc<\/strong> become <strong>site-auto.hypothetical.loc<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Setup<\/h3>\n<p><a href=\"https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/psudoclass-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3547\" src=\"https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/psudoclass-2.png\" alt=\"\" width=\"1404\" height=\"534\" srcset=\"https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/psudoclass-2.png 1404w, https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/psudoclass-2-300x114.png 300w, https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/psudoclass-2-1024x389.png 1024w, https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/psudoclass-2-768x292.png 768w, https:\/\/wiki.thomasandsofia.com\/wp-content\/uploads\/2021\/07\/psudoclass-2-150x57.png 150w\" sizes=\"auto, (max-width: 1404px) 100vw, 1404px\" \/><\/a><\/p>\n<ul>\n<li>Create a subclass under HTTP that inherits the HttpMonitor Template<\/li>\n<li>Remove the Device template<\/li>\n<li>Bind the DnsMonitor Template<\/li>\n<li>Create the psudo-devices in the new class<\/li>\n<li>Create the following Custom Properties\n<ul>\n<li>cDnsExpectedIP<\/li>\n<li>cHostName<\/li>\n<li>cHttpExpectRegExp<\/li>\n<\/ul>\n<\/li>\n<li>Create local copies of the DNS and Http templates\n<ul>\n<li>These will be modified to use custom properties vs configuration properties<\/li>\n<li>Technique here is out of date.\u00a0 Can create local bindings directly on the Class Details page now.<\/li>\n<li>Advanced &gt; Monitoring Templates &gt; Copy \/ Override Template &gt; Select Http\/AgentBlogs<\/li>\n<\/ul>\n<\/li>\n<li>Edit the templates to use custom configuration properties\n<ul>\n<li>DNSMonitor\n<ul>\n<li>Host Name: ${dev\/cHostName}<\/li>\n<li>Expected IP Address: ${Dev\/cDnsExpectedIp}<\/li>\n<\/ul>\n<\/li>\n<li>HttpMonitor\n<ul>\n<li>Host Name: ${dev\/cHostName}<\/li>\n<li>IP Address or Proxy Address: &lt;Delete to force to resolve the cHostName&gt;<\/li>\n<li>Regular Expression: ${cHttpExpectRegExp}<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Update the Custom Properties per devices as required<\/li>\n<\/ul>\n<h2>Twill<\/h2>\n<p>4:33:00<\/p>\n<h3>Overview<\/h3>\n<ul>\n<li>Twill is a scripting language designed for testing web sites<\/li>\n<li>Allows you to simulate a browser session: follow links, fill out and submit forms, check for specific content, etc.<\/li>\n<li>The approach is often referred to as monitoring with <em>synthetic web transactions.<\/em><\/li>\n<li>Monitoring with Twill often starts with a trial-and-error process using the interactive Twill shell.<\/li>\n<li>Note: Twill does NOT interpret Javascript.<\/li>\n<\/ul>\n<h3>Run the shell<\/h3>\n<pre>serviced service shell zope\r\nsu - zenoss\r\n# cd \/opt\/zenoss\/ZenPacks\/ZenPacks.zenoss.ZenWebTx-3.0.2-py2.7.egg\/\r\ncd \/opt\/zenoss\/ZenPacks\/*ZenWebTX*\r\ncd ZenPacks\/zenoss\/ZenWebTx\r\n# All of the required libraries are stored here\r\n\r\n#Set the Python Path\r\nexport PYTHONPATH=$PYTHONPATH:$PWD\r\necho $PYTHONPATH\r\n\r\n#Run the CLI\r\npython bin\/twill-sh\r\n\r\n-= Welcome to twill! =-\r\n&gt;&gt;<\/pre>\n<h3>Commands<\/h3>\n<ul>\n<li>&lt;Ctrl&gt;&lt;D&gt; Exit the editor and save your commands\n<ul>\n<li><code>cat .twill-history<\/code><\/li>\n<li>Shows all command ran during the session.<\/li>\n<\/ul>\n<\/li>\n<li><code>cat .twill-history<\/code> Show all commands ran during the last session<\/li>\n<li>find TEXT &#8211; Searches the page for the existence of TEXT<\/li>\n<li>follow &#8220;link text&#8221; &#8211; follows a link<\/li>\n<li>formvalue FormName_Or_Number FormField FormFieldValue\n<ul>\n<li>FormName recommended in case a new form is inserted above the desired form<\/li>\n<li>Example:\n<ul>\n<li><code>formvalue loginform user_name admin<\/code><\/li>\n<li><code>formvalue loginform user_pass Zenny123<\/code><\/li>\n<li><code>submit<\/code><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>go SUB.DOMAIN.TLD<\/li>\n<li>help &lt;command&gt;<\/li>\n<li>showforms: Show all forms on the current page<\/li>\n<\/ul>\n<h3>Example Script<\/h3>\n<p>Note: Script will parse through Tails before sending to Twill, so you can substitute tails expressions in the code.<\/p>\n<pre>go http:\/\/${dev\/cHostName}\r\nfollow 'Log in'\r\nformvalue loginform user_login admin\r\nformvalue loginform user_pass Zenny123\r\nsubmit\r\nfind Dashboard\r\nfollow 'Log Out'\r\nfind 'You are now logged out.'<\/pre>\n<h3>Create a Twill monitoring template<\/h3>\n<ul>\n<li>Advanced &gt; Monitoring Templates &gt; [ + ] &gt; Add Template\n<ul>\n<li>Name<\/li>\n<li>Path = Device Class<\/li>\n<\/ul>\n<\/li>\n<li>Use left menu pane to locate the new template.<\/li>\n<li>Data Sources &gt; [ + ] &gt; Add Data Source\n<ul>\n<li>Type: WebTX (Web Transactions)<\/li>\n<\/ul>\n<\/li>\n<li>Twill Commands: Past in Twill commands<\/li>\n<li>Save (Required for testing)<\/li>\n<\/ul>\n<h3>Metrics Collected<\/h3>\n<ul>\n<li>&lt;name&gt;.available<\/li>\n<li>&lt;name&gt;.totalTime<\/li>\n<\/ul>\n<h3>Final Step &#8211; Bind the template to the Device Class<\/h3>\n<h3>Hints<\/h3>\n<ul>\n<li>Errors created using the Twill CLI will result in events in Zenoss<\/li>\n<\/ul>\n<h1>Appendix A: Additional Information<\/h1>\n<h2>ZenPacks<\/h2>\n<ul>\n<li>Commercial: Available to anyone with a commercial license (any support level)<\/li>\n<li>Open Source: Available to commercial and community users.\n<ul>\n<li>Written and supported by Zenoss<\/li>\n<\/ul>\n<\/li>\n<li>Community:\n<ul>\n<li>Written by the Zenoss community or perhaps a vendor<\/li>\n<li>Not supported by Zenoss<\/li>\n<li>Good chance they are out of date.<\/li>\n<\/ul>\n<\/li>\n<li>Subscription: Available with a subscription only.\u00a0 Requires commercial license.\n<ul>\n<li>Written by Zenoss Professional Services.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Day 1 Video Link: https:\/\/zenoss.zoom.us\/rec\/share\/8It3IwK8EQDqhaP7zOgudyKEOE0pbaSFapwIkZFLOrmjp88YGJZ6TzQT1y1kew6S.4dRbOfbs9UmwHG_R p&amp;xdK1G1 Day 1 Zenbatchload 0:40:00 Used to add or modify devices Device Classes are created automatically Configuration Syntax # Comment \/Devices\/Device\/Class host1.name.tld | IP.ADD.RE.SS [ option1=NUMBER, option2=&#8217;String&#8217;, &#8230; ] host2.name.tld | IP.ADD.RE.SS [ option1=NUMBER, option2=&#8217;String&#8217;, &#8230; ] Setting Options Any zProperty zSnmpCommunity &#8230; setManageIp &#8211; Specify a device&#8217;s IP setPerformanceMonitor ..<\/p>\n<div class=\"clear-fix\"><\/div>\n<p><a href=\"https:\/\/wiki.thomasandsofia.com\/?p=3532\" title=\"read more...\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[59],"tags":[],"class_list":["post-3532","post","type-post","status-publish","format-standard","hentry","category-zenoss"],"_links":{"self":[{"href":"https:\/\/wiki.thomasandsofia.com\/index.php?rest_route=\/wp\/v2\/posts\/3532","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wiki.thomasandsofia.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wiki.thomasandsofia.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wiki.thomasandsofia.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wiki.thomasandsofia.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3532"}],"version-history":[{"count":15,"href":"https:\/\/wiki.thomasandsofia.com\/index.php?rest_route=\/wp\/v2\/posts\/3532\/revisions"}],"predecessor-version":[{"id":3551,"href":"https:\/\/wiki.thomasandsofia.com\/index.php?rest_route=\/wp\/v2\/posts\/3532\/revisions\/3551"}],"wp:attachment":[{"href":"https:\/\/wiki.thomasandsofia.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3532"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wiki.thomasandsofia.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3532"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wiki.thomasandsofia.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3532"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}