<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Multiple uses of the same lookup table - how to simplify? in Splunk Search</title>
    <link>https://community.splunk.com/t5/Splunk-Search/Multiple-uses-of-the-same-lookup-table-how-to-simplify/m-p/508958#M142198</link>
    <description>&lt;P&gt;I have a stream of events that have names and each name belongs to a certain category.&lt;BR /&gt;&lt;BR /&gt;For this example, it will be two category: "24x7" and "custom".&lt;BR /&gt;&lt;BR /&gt;There are 2 lookup tables: NoEventDates (aka Holiday table) and ZeroEvents.&lt;BR /&gt;&lt;BR /&gt;ZeroEvents table has subset of all possible event names with additional parameters:&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;TABLE border="1" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;Category&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;event&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;HourFrom&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;HourTo&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;HolidaysOff&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;DaysOfWeekOff&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;custom&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event11&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;11&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;12&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Y&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;custom&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event12&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;N&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;0,6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;custom&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event13&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;N&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;custom&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event14&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Y&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;5.6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;24X7&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event21&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;0&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;24&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;24X7&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event22&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;0&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;24&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;24X7&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event23&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;0&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;24&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;"24X7" events are expected within every 15-min all day long without holidays or weekends.&lt;BR /&gt;Custom event can have days of year (holidays) and/or days of week (such as weekend) when no events are expected.&lt;BR /&gt;Every day a custom event is expected it would come for sure only during the specific time range.&amp;nbsp;&lt;/P&gt;&lt;P&gt;The task is to discover "missing" events situation as quickly as possible.&lt;/P&gt;&lt;P&gt;Custom events will be monitored every 15-min by sliding 2-hour window within their prescribed hours.&lt;BR /&gt;&lt;BR /&gt;For "24X7" I have the following query:&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;index=...

[| inputlookup ZeroEvents.csv | where Category="24X7" | fields event | format]
| stats count as eventscount by event
| append [| inputlookup ZeroEvents.csv | search DeliveryMethod="24X7" | fields event | eval eventscount=0 ]
| stats sum(eventscount) as total by event
| where total &amp;lt; 1
| stats count as number
| eval NetcoolTitle=number + " 24X7 events with no messages" &lt;/LI-CODE&gt;&lt;P&gt;&lt;BR /&gt;I did not need to use Holiday table for that case.&lt;BR /&gt;&lt;BR /&gt;For custom events it gets more complicated&amp;nbsp; and I'm stuck trying to find a way not to repeat all conditions twice.&lt;BR /&gt;&lt;BR /&gt;Here's is the structure with one part of the "append query" hard-coded:&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;index=...
 
	[| inputlookup ZeroEvents.csv | where DeliveryMethod="Batch"  | fields event| format]
 | eval date=strftime(_time,"%Y-%m-%d")
 | lookup NoEventDates.csv NEDate as date OUTPUT NEDate as Holiday
 | eval Holiday=if(isnull(Holiday), "N", "Y")
 | eval DOW=strftime(_time,"%w") 
 | eval currentHour=strftime(now(), "%H")
 | lookup ZeroEvents.csv event OUTPUT HolidaysOff DaysOfWeek HourFrom HourTo
 | where NOT match(DaysOfWeek, DOW) AND (Holiday="N" OR HolidaysOff="N") AND currentHour &amp;gt;= HourFrom AND currentHour &amp;lt;= HourTo 
 | stats count as eventscount by topic
 | append [| inputlookup ZeroEvents.csv | eval DOW="0", Holiday="N", currentHour=1 | where DeliveryMethod="Batch" AND NOT match(DaysOfWeek, DOW) AND (Holiday="N" OR HolidaysOff="N") AND currentHour &amp;gt;= HourFrom AND currentHour &amp;lt;= HourTo | eval eventscount=0 | fields topic eventscount]
 | stats sum(eventscount) as total by events
 | where total &amp;lt; 1&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;As I mentioned, `eval DOW="0", Holiday="N", currentHour=1` should be either recalculated using the same logic or I need somehow to use variables from the outer scope.&lt;BR /&gt;&lt;BR /&gt;Is there a simpler way to write such lookup-based queries?&lt;BR /&gt;&lt;BR /&gt;Is there a solution without a massive code duplication for "custom" events?&lt;/P&gt;</description>
    <pubDate>Tue, 14 Jul 2020 02:47:14 GMT</pubDate>
    <dc:creator>pm771</dc:creator>
    <dc:date>2020-07-14T02:47:14Z</dc:date>
    <item>
      <title>Multiple uses of the same lookup table - how to simplify?</title>
      <link>https://community.splunk.com/t5/Splunk-Search/Multiple-uses-of-the-same-lookup-table-how-to-simplify/m-p/508958#M142198</link>
      <description>&lt;P&gt;I have a stream of events that have names and each name belongs to a certain category.&lt;BR /&gt;&lt;BR /&gt;For this example, it will be two category: "24x7" and "custom".&lt;BR /&gt;&lt;BR /&gt;There are 2 lookup tables: NoEventDates (aka Holiday table) and ZeroEvents.&lt;BR /&gt;&lt;BR /&gt;ZeroEvents table has subset of all possible event names with additional parameters:&amp;nbsp;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;TABLE border="1" width="100%"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;Category&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;event&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;HourFrom&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;HourTo&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;HolidaysOff&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;DaysOfWeekOff&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;custom&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event11&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;11&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;12&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Y&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;custom&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event12&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;N&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;0,6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;custom&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event13&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;N&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;custom&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event14&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Y&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;5.6&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;24X7&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event21&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;0&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;24&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;24X7&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event22&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;0&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;24&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;TR&gt;&lt;TD width="16.666666666666668%"&gt;24X7&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;Event23&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;0&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;24&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;TD width="16.666666666666668%"&gt;&amp;nbsp;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;"24X7" events are expected within every 15-min all day long without holidays or weekends.&lt;BR /&gt;Custom event can have days of year (holidays) and/or days of week (such as weekend) when no events are expected.&lt;BR /&gt;Every day a custom event is expected it would come for sure only during the specific time range.&amp;nbsp;&lt;/P&gt;&lt;P&gt;The task is to discover "missing" events situation as quickly as possible.&lt;/P&gt;&lt;P&gt;Custom events will be monitored every 15-min by sliding 2-hour window within their prescribed hours.&lt;BR /&gt;&lt;BR /&gt;For "24X7" I have the following query:&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;index=...

[| inputlookup ZeroEvents.csv | where Category="24X7" | fields event | format]
| stats count as eventscount by event
| append [| inputlookup ZeroEvents.csv | search DeliveryMethod="24X7" | fields event | eval eventscount=0 ]
| stats sum(eventscount) as total by event
| where total &amp;lt; 1
| stats count as number
| eval NetcoolTitle=number + " 24X7 events with no messages" &lt;/LI-CODE&gt;&lt;P&gt;&lt;BR /&gt;I did not need to use Holiday table for that case.&lt;BR /&gt;&lt;BR /&gt;For custom events it gets more complicated&amp;nbsp; and I'm stuck trying to find a way not to repeat all conditions twice.&lt;BR /&gt;&lt;BR /&gt;Here's is the structure with one part of the "append query" hard-coded:&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;LI-CODE lang="markup"&gt;index=...
 
	[| inputlookup ZeroEvents.csv | where DeliveryMethod="Batch"  | fields event| format]
 | eval date=strftime(_time,"%Y-%m-%d")
 | lookup NoEventDates.csv NEDate as date OUTPUT NEDate as Holiday
 | eval Holiday=if(isnull(Holiday), "N", "Y")
 | eval DOW=strftime(_time,"%w") 
 | eval currentHour=strftime(now(), "%H")
 | lookup ZeroEvents.csv event OUTPUT HolidaysOff DaysOfWeek HourFrom HourTo
 | where NOT match(DaysOfWeek, DOW) AND (Holiday="N" OR HolidaysOff="N") AND currentHour &amp;gt;= HourFrom AND currentHour &amp;lt;= HourTo 
 | stats count as eventscount by topic
 | append [| inputlookup ZeroEvents.csv | eval DOW="0", Holiday="N", currentHour=1 | where DeliveryMethod="Batch" AND NOT match(DaysOfWeek, DOW) AND (Holiday="N" OR HolidaysOff="N") AND currentHour &amp;gt;= HourFrom AND currentHour &amp;lt;= HourTo | eval eventscount=0 | fields topic eventscount]
 | stats sum(eventscount) as total by events
 | where total &amp;lt; 1&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;As I mentioned, `eval DOW="0", Holiday="N", currentHour=1` should be either recalculated using the same logic or I need somehow to use variables from the outer scope.&lt;BR /&gt;&lt;BR /&gt;Is there a simpler way to write such lookup-based queries?&lt;BR /&gt;&lt;BR /&gt;Is there a solution without a massive code duplication for "custom" events?&lt;/P&gt;</description>
      <pubDate>Tue, 14 Jul 2020 02:47:14 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Splunk-Search/Multiple-uses-of-the-same-lookup-table-how-to-simplify/m-p/508958#M142198</guid>
      <dc:creator>pm771</dc:creator>
      <dc:date>2020-07-14T02:47:14Z</dc:date>
    </item>
    <item>
      <title>Re: Multiple uses of the same lookup table - how to simplify?</title>
      <link>https://community.splunk.com/t5/Splunk-Search/Multiple-uses-of-the-same-lookup-table-how-to-simplify/m-p/509561#M142423</link>
      <description>&lt;P&gt;[&lt;EM&gt;Answering my own question.&amp;nbsp; Any ideas for improvement are welcome&lt;/EM&gt;]&lt;/P&gt;&lt;LI-CODE lang="markup"&gt; index=...
 
	[| inputlookup ZeroEvents.csv | where Category="custom"  | fields event| format]
 | stats count as eventscount by event	
 | append [
            | inputlookup ZeroEvents.csv  
			| eval currentdate=strftime(now(),"%Y-%m-%d") 
			| lookup NoEventDates.csv NEDate as date OUTPUT NEDate as Holiday
			| eval Holiday=if(isnull(Holiday), "N", "Y"), DOW=strftime(now(), "%w"), currentHour=strftime(now(), "%H")
			| where Category="custom" AND NOT match(DaysOfWeek, DOW) AND (Holiday="N" OR HolidaysOff="N") AND currentHour &amp;gt;= HourFrom AND currentHour &amp;lt;= HourTo 
            | fields event
            | eval eventscount=0 			
          ]
 | stats sum(eventscount) as total by events
 | where total &amp;lt; 1&lt;/LI-CODE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The main change is that almost all filtering is done on lookup table itself.&lt;/P&gt;&lt;P&gt;Advantages:&lt;/P&gt;&lt;OL&gt;&lt;LI&gt;DRY principle is obeyed (almost)&lt;/LI&gt;&lt;LI&gt;Main lookup logic is isolated and can be debugged on its own&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;&lt;/OL&gt;&lt;P&gt;In order to test it's necessary to replace 4 variables with desired hard-coded values.&lt;BR /&gt;&lt;BR /&gt;Due to late filtering the query will perform extra work, but its performance is still acceptable.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 16 Jul 2020 18:09:14 GMT</pubDate>
      <guid>https://community.splunk.com/t5/Splunk-Search/Multiple-uses-of-the-same-lookup-table-how-to-simplify/m-p/509561#M142423</guid>
      <dc:creator>pm771</dc:creator>
      <dc:date>2020-07-16T18:09:14Z</dc:date>
    </item>
  </channel>
</rss>

