Pretty much every query language, indeed any coding language, has a form of an if statement. An if statement evaluates a condition for true or false, then takes an action based on that result.
In KQL, this is manifested using the
iif function. In this post we’ll see two examples of how an
iif can be used in your Kusto queries.
If you recall from previous posts in the series, the samples in this post will be run inside the LogAnalytics demo site found at https://aka.ms/LADemo. This demo site has been provided by Microsoft and can be used to learn the Kusto Query Language at no cost to you.
If you’ve not read my introductory post in this series, I’d advise you to do so now. It describes the user interface in detail. You’ll find it at https://arcanecode.com/2022/04/11/fun-with-kql-the-kusto-query-language/.
Note that my output may not look exactly like yours when you run the sample queries for several reasons. First, Microsoft only keeps a few days of demo data, which are constantly updated, so the dates and sample data won’t match the screen shots.
Second, I’ll be using the column tool (discussed in the introductory post) to limit the output to just the columns needed to demonstrate the query. Finally, Microsoft may make changes to both the user interface and the data structures between the time I write this and when you read it.
In our first example, we’ll examine the free disk space counter. If the value is under 70%, we want to display a message to the user that they should look at that computer.
As we’ve done many times in this series, we start with the
Perf table, and filter the results to only rows with the
% Free Space counter. We’ll then grab just 100 using the
take operator to keep a small sample set for this demo.
Next, we use an
extend to create a new column FreeState. Then we call our
The first parameter is the condition. In this case,
CounterValue < 70. If this evaluates to
true, the statement in the second parameter is executed. In this case, it returns
You might want to look at this.
Should the condition evaluate to
false, the statement in the third parameter is executed. Here, it returns the string
In the results pane, you can see the counter values, along with the FreeState column. You can verify that the
iif statement functioned correctly.
Evaluating Dates with IIF
Let’s do something a little more useful with
iif. We’ll examine the current time, and if the TimeGenerated is more than one hour hold, we’ll apply a weighted factor to our counter value. Sometimes we assign more importance to some data points, for example ones that are more recent may have more importance than older values. Weighted factors are a way of achieving this.
In this case, if the counter value is more than one hour hold we’ve decided it is not as important as more recent entries. Thus we’ll use a weighted factor of 0.5, in other words we’ll divide the value by 2. If the counter is within the current hour, we’ll multiply by 2, indicating it’s data is more important.
We start with our good old
Perf table. We’ll use a
where to limit the results to our
% Processor Time counter where its value is greater than zero.
Next we use
take to limit the result set. We then use an
extend to capture the current time into the new RightNow column. We do this so the value will be consistent across the rest of our query, otherwise you could introduce a subtle bug.
From here we fall into a second
extend with our
iif statements. In the first, we use
datetime_part to get the hour of day from the TimeGenerated column. We call on
datetime_part again to get the current hour from the RightNow column we just created.
If they are equal we know this row of data was recent, within the current hour, so we want to apply a double weight to it. For this demo query, we’ll illustrate it by returning the text
Double Weight. Else we return
Half Weight. This will make it easy to identify which rows should be double and which half.
Now we fall to a second
iif. The condition is the same as the previous
iif. For a positive result though, we take our CounterValue column and multiply by
2. In the else portion we divide by 2. (We could have also multiplied by 0.5, and produced the same result.)
Looking over the results pane, you can see we had some rows with a double weight. Looking at the adjusted value we can verify it is indeed twice the original counter value. Likewise we can see the half weight rows are indeed half the counter value.
Note there are other methods we could have used for comparison. Rather than seeing if the TimeGenerated was in the same hour of the day as the current time we could have used some date/time arithmetic to see if the TimeGenerated occurred within the last sixty minutes.
The following operators, functions, and/or plugins were used or mentioned in this article’s demos. You can learn more about them in some of my previous posts, linked below.
This article showed a few uses for the
iif function. First we used it to return a text string based on a condition. Then we performed one of two calculations based on the
iif condition and returned the result.
In the next article we’ll look at another way to make decisions based on a condition, the
The demos in this series of blog posts were inspired by my Pluralsight courses Kusto Query Language (KQL) from Scratch and Introduction to the Azure Data Migration Service, two of the many courses I have on Pluralsight. All of my courses are linked on my About Me page.
If you don’t have a Pluralsight subscription, just go to my list of courses on Pluralsight . At the top is a Try For Free button you can use to get a free 10 day subscription to Pluralsight, with which you can watch my courses, or any other course on the site.