Forum Discussion
jay_41157
Aug 26, 2010Nimbostratus
Heat Maps irule by Colin.
Hi,
Thanks to Colin Walker for the great heatmap's irule.
I have tried to implement this irule but run into some problems and not sure where to look..Below is what I see in the log files..
If I have the IP randomization part of the code left in then the site (app, not the heatmaps site) loads every other time. Also I had commented out the
HTTP::respond 200 Content "Added"
Else I see Added on the real site instead of the homepage.
Please help.
Thanks,
-jay
Aug 26 17:09:42 local/tmm err tmm[5151]: 01220001:3: TCL error: heatmap_irule - Illegal value (line 1) invoked from within "table incr -subtable countries -mustexist $cloc" ("default" arm line 12) invoked from within "switch -glob [string tolower [HTTP::uri]] { "/asia" - "/africa" - "/europe" - "/middle_east" - "/south_americ..."
Aug 26 17:09:42 local/tmm1 err tmm1[5152]: 01220001:3: TCL error: heatmap_irule - Illegal value (line 1) invoked from within "table incr -subtable countries -mustexist $cloc" ("default" arm line 12) invoked from within "switch -glob [string tolower [HTTP::uri]] { "/asia" - "/africa" - "/europe" - "/middle_east" - "/south_americ..."
Aug 26 17:09:42 local/tmm1 info tmm1[5152]: 01220001:6: Per-invocation log rate exceeded; throttling.
Aug 26 17:09:42 local/tmm err tmm[5151]: 01220001:3: TCL error: heatmap_irule - Illegal value (line 1) invoked from within "table incr -subtable countries -mustexist $cloc" ("default" arm line 12) invoked from within "switch -glob [string tolower [HTTP::uri]] { "/asia" - "/africa" - "/europe" - "/middle_east" - "/south_americ..."
Aug 26 17:09:42 local/tmm info tmm[5151]: 01220001:6: Per-invocation log rate exceeded; throttling.
Aug 26 17:09:54 local/tmm1 info tmm1[5152]: 01220001:6: Resuming log processing at this invocation; held 8 messages.
- Chris_MillerAltostratusI modified it a bit, assuming you didn't need the randomization logic.
when RULE_INIT { set static::resp1 "Here is your site's usage by Country: Zoom to region: | | | | | | " } when HTTP_REQUEST { switch -glob [string tolower [HTTP::uri]] { "/asia" - "/africa" - "/europe" - "/middle_east" - "/south_america" - "/usa" - "/world" - "/heatmap*" { set chld "" set chd "" set zoom [string map {"/" "" "heatmap" "world"} [HTTP::uri]] Configure the table query to be based on the countries subtable or the states subtable if {$zoom eq "usa"} { set region "states" } else { set region "countries" } Get a list of all states or countries and the associated count of requests from that area foreach rg [table keys -subtable $region] { append chld $rg append chd "[table lookup -subtable $region $rg]," } set chd [string trimright $chd ","] Send back the pre-formatted response, set in RULE_INIT, combined with the map zoom, list of areas, and request count HTTP::respond 200 content "${static::resp1}${zoom}&chd=t:${chd}&chld=${chld}${static::resp2}" } "/resetmap" { foreach country [table keys -subtable countries] { table delete -subtable countries $country } foreach state [table keys -subtable states] { table delete -subtable states $state } HTTP::respond 200 Content " Table Cleared. " } default { Look up country & state locations set cloc [whereis [IP::client_addr] country] set sloc [whereis [IP::client_addr] abbrev] Set Country if {[table incr -subtable countries -mustexist $cloc] eq ""} { table set -subtable countries $cloc 1 indefinite indefinite } Set State if {[table incr -subtable states -mustexist $sloc] eq ""} { table set -subtable states $sloc 1 indefinite indefinite } } } }
- George_Watkins_Historic F5 AccountHi Jay,
- jay_41157Nimbostratusv10.2 on 3600's .But this is for our staging environment, once this works, I will move it to prod, where I have 9.4 and 10.1 (10.2 in the future).
- George_Watkins_Historic F5 AccountHi Jay,
- George_Watkins_Historic F5 AccountAnother note: this iRule won't work on version 9.4 as tables weren't available until version 10.1.
- jay_41157NimbostratusPosted By watkins on 10/06/2010 01:34 PM
- George_Watkins_Historic F5 AccountSorry, I was using the code that Chris had posted and it was not using the random IP stub. Could you re-post your code using the code encapsulation so I can paste it into my LTM?
- George_Watkins_Historic F5 AccountHi Jay,
- jay_41157NimbostratusSorry I hope the below works.
when RULE_INIT { Configure static portions of the HTML response for the heatmap pages set static::resp1 " Table Cleared. " } default { Look up country & state locations set cloc [whereis [IP::client_addr] country] set sloc [whereis [IP::client_addr] abbrev] If the IP doesn't resolve to anything, pick a random IP (useful for testing on private networks) if {($cloc eq "") and ($sloc eq "")} { set ip [expr { int(rand()*255) }].[expr { int(rand()*255) }].[expr { int(rand()*255) }].[expr { int(rand()*255) }] set cloc [whereis $ip country] set sloc [whereis $ip abbrev] if {($cloc eq "") or ($sloc eq "")} { set cloc "US" set sloc "WA" } } Strip slashes from URI to allow easy queries set friendlyURL [string map {/ ""} [HTTP::uri]] Create a new table named country:location or state:location set cloc "country:$cloc" if {[table incr -subtable $cloc -mustexist $friendlyURL] eq ""} { table set -subtable country:$cloc $friendlyURL 1 indefinite indefinite } Update the mytables pointer table with the new country or state table name if {[table incr -subtable mytables -mustexist country:$cloc] eq ""} { table set -subtable mytables country:$cloc 1 indefinite indefinite } Same as above for states, not countries. if {$cloc eq "US"} { if {[table incr -subtable state:$sloc -mustexist $friendlyURL] eq ""} { table set -subtable state:$sloc $friendlyURL 1 indefinite indefinite } if {[table incr -subtable mytables -mustexist state:$sloc] eq ""} { table set -subtable mytables state:$sloc 1 indefinite indefinite } } HTTP::respond 200 Content "Added - Country: $cloc State: $sloc" } } } Here is your site's usage:\ Connections per Region: " set static::resp2 " Zoom to region:\ | | | | \ | | " set static::resp4 "" } when HTTP_REQUEST timing on { switch -glob [string tolower [HTTP::uri]] { "/asia*" - "/africa*" - "/europe*" - "/middle_east*" - "/south_america*" - "/usa*" - "/world*" - "/heatmap*" { set chld "" set chd "" set zoom "" set zoomURL "" set regions "" set urlTotal 0 set regionTotal 0 Split apart the zoom region from the filter URL in the request set zoom [getfield [string map {"/" "" "heatmap" "world"} [HTTP::uri]] "?" 1] set zoomURL [getfield [string map {"/" "" "heatmap" "world"} [HTTP::uri]] "?" 2] Get a list of all states or countries, applying the URL filter where necessary and retrieve the associated count of requests from that area to that URL First step through the mytables table, which is a pointer table referencing all subtables with counter values in them foreach mysub [table keys -subtable mytables] { Next determine whether to search state or country tables if {$zoom eq "usa"} { if {$mysub starts_with "state:"} { For each state sub table step through each key, which will be a URL, and count the request to that URL. This is also where URL filtering is applied if applicable foreach myurl [table keys -subtable $mysub] { if {$zoomURL ne ""} { if {$myurl eq $zoomURL} { append chld "[getfield $mysub ":" 2]" append chd "[table lookup -subtable $mysub $myurl]," set urlTotal [table lookup -subtable $mysub $myurl] } } else { append chld "[getfield $mysub ":" 2]" append chd "[table lookup -subtable $mysub $myurl]," set urlTotal [table lookup -subtable $mysub $myurl] } set regionTotal {expr $regionTotal + $urlTotal} set urlTotal 0 } append regions "[getfield $mysub ":" 2] : $regionTotal" set regionTotal 0 } } else { if {$mysub starts_with "country:"} { foreach myurl [table keys -subtable $mysub] { if {$zoomURL ne ""} { if {$myurl eq $zoomURL} { append chld "[getfield $mysub ":" 2]" append chd "[table lookup -subtable $mysub $myurl]," set urlTotal [table lookup -subtable $mysub $myurl] } set regionTotal {expr $regionTotal + $urlTotal} set urlTotal 0 } else { append chld "[getfield $mysub ":" 2]" append chd "[table lookup -subtable $mysub $myurl]," set urlTotal [table lookup -subtable $mysub $myurl] } set regionTotal {expr $regionTotal + $urlTotal} set urlTotal 0 } append regions "[getfield $mysub ":" 2] : $regionTotal" set regionTotal 0 } } } Send back the pre-formatted response, set in RULE_INIT, combined with the map zoom, list of areas, and request count set chd [string trimright $chd ","] First loop through the trackingurls class to get a list of all URLs to be tracked and format HTML around them for links set filters "" foreach mytrackingurl class names trackingurls { append filters " | " } set filters [string trimright $filters " | "] Combine the above generated HTML with the static HTML in RULE INIT and respond to the client HTTP::respond 200 content "${static::resp1}${regions}${static::resp2}${zoom}&chd=t:${chd}&chld=${chld}${static::resp3} \ Filter by URL: | $filters\ $static::resp4" } "/resetmap" { foreach pointertable [table keys -subtable mytables] { foreach entry [table keys -subtable $pointertable] { table delete -subtable $pointertable $entry } } foreach pointerentry [table keys -subtable mytables] { table delete -subtable mytables $pointerentry } HTTP::respond 200 Content "
- jay_41157Nimbostratusany thoughts?
Recent Discussions
Related Content
DevCentral Quicklinks
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com
Discover DevCentral Connects