The TAO of Tables - Part Three

This is a series of articles to introduce you to the many uses of tables.

Last week we discussed how we could use tables to profile the execution of an iRule, so let's take it to the next level and profile the variables of an iRule. Say you have an iRule that has to run many iterations in testing and you want to make sure nothing is going awry. Wouldn't it be nice to be able to actually see what is being assigned to the variables in your iRule? Well I will show you how you can... but first lets discuss variable scope.

As a general rule, when talking to people on variables I discuss scope and what it means to them. You write an iRule, time passes, another person writes an iRule performing some other function and attaches it to the same virtual. What happens if you both use the same variable name such as count? Bad things that's what, because the variable scope is across all iRules attached to that virtual. You have contaminated each other's variable space.

So I suggest where there is a likelihood of more than one iRule they come up with a project related prefix to attach to their variable names. It can be something as simple as a two characters "p1_count". But it is enough to separate iRule variables into a project related scope and prevent this kind of issue. There are some other advantages to doing this as well. Imagine all your variables start with "p1_" except those which use random numbers to generate content. For those use something like "p1r_". We will get to why in a moment. Now we have a single common set of characters that link all your variables together. We can use this with a command in TCL called info to retrieve these variable names and use them in interesting ways...

when HTTP_REQUEST {
    foreach name [info locals p1_*] {
       table add -subtable $name [set $name] 0 indef 3600
       table add -subtable tracking $name 0 indef 3600
    }
}

This will create subtables based on the variable names. Each table entry will have a key that is the content of that variable. Since keys are unique then all the entries in this table will represent every unique value assigned to that variable over the last hour. Of course that timeframe can be adjusted by changing 3600 to something else or even indefinite. If you do make them indefinite just make sure you add an iRule to delete the variable and tracking table when you are finished or it will sit in your F5 until it is rebooted, or forever in the case of a HA pair. We will get to that in another article.
This iRule would be added after your main processing iRules to collect information on every unique value assigned to every single variable in your iRule solution. How to retrieve this information now we have stored it in a table? Attach the following iRule to any virtual to display a dump of the variable contents of your solution over the last hour.

when HTTP_REQUEST {

    if {[HTTP::uri] ne "/variables"} { return }

    set content "<html><head>VariableDump</head><body>"
    foreach name [table keys -subtable tracking] {
       append content "<p>Variable: $name<br>"
       foreach key [table keys -subtable $name] {
           append content "$key<br>"
       }
    append content "</body></html>"
    HTTP::respond 200 content $content
    event disable all
}

Which will give you the variable dump shown below. When there is a lot of variable data it is not reasonable to check each and every unique value but it's very useful for checking the pattern of a variable content and look for exceptions. iRules ultimately are dealing with customer traffic which can be unpredictable. This will allow you to skim through variable data looking for strange or unexpected content. I have used this to identify subtle iRule errors only revealed by strange data appearing in variable profiling.

Variable Dump
my_count
0
1
2
3
4
5
6
7
8
9
10

my_header
712
883
449
553
55
222
555

my_status
success: main code
success: alternate code
falure: no header
failure no html

I hope by now you are starting to get an idea of what is possible with tables. The truth is you are only limited by what you can think up yourself. More on this next week!
As always please add comments or feedback below.

Updated Aug 16, 2022
Version 2.0

Was this article helpful?

2 Comments

  • Hi Kevin,

     

     

    These are great articles and very informative. So far you have demonstrated viewing the contents of tables via another iRule, and passing it to a browser. Is there a way to view the contents of a table from tmsh or iControl?

     

     

    Thanks.
  • James_Deucker_2's avatar
    James_Deucker_2
    Historic F5 Account
    Today, up to V11.4, there is no way way to view the content of the tables from the CLI (tmsh) or iControl.