Splunk Search

Simple Search Turned complicated. Problem with subtracting 2 values from different indexes

singhh4
Path Finder

Hey people!

So I may be a big idiot and be missing something very simple but i cant seem to figure it out.

here is my search:

index=server1
|stats avg(score) as avgscore1
|append [index=server2
     |stats avg(score) as avgscore2

|eval avgscore1=tonumber(avgscore1)
|eval avgscore2=tonumber(avgscore2)
|eval diff = avgscore1 - avgscore2
|eval change=if(diff > 0,"Down",if(diff < 0,"Up",if(diff == 0,"Same","Broken")))

No matter what I try i keep getting "Broken" even when i know the numbers are different. When i table diff, its blank. I've tried |eval diff = 5 - 7 and it works fine. Thinking that the avgscores weren't numbers, i used tonumber() so convert them but didnt work either. Any ideas?

Thank you in advanced!

0 Karma
1 Solution

sundareshr
Legend

When you use append, splunk adds the result as rows and not columns. So in your example you have two rows, one with a col called avgscore1 and second with avgscore2 neither have both. Hence always "Broken". What you need is appendcols. Like this

 index=server1
 |stats avg(score) as avgscore1
 |appendcols [index=server2
      |stats avg(score) as avgscore2

 |eval avgscore1=tonumber(avgscore1)
 |eval avgscore2=tonumber(avgscore2)
 |eval diff = avgscore1 - avgscore2
 |eval change=case(diff > 0,"Down", diff < 0, "Up", diff == 0, "Same",1=1, "Broken")

*OR

index=server1 OR index=server2 | eval x= " " | chart avg(score) as avg by x server | fields - x | eval diff=server1-server2 | eval change = case(diff > 0,"Down", diff < 0, "Up", diff == 0, "Same",1=1, "Broken")

View solution in original post

sundareshr
Legend

When you use append, splunk adds the result as rows and not columns. So in your example you have two rows, one with a col called avgscore1 and second with avgscore2 neither have both. Hence always "Broken". What you need is appendcols. Like this

 index=server1
 |stats avg(score) as avgscore1
 |appendcols [index=server2
      |stats avg(score) as avgscore2

 |eval avgscore1=tonumber(avgscore1)
 |eval avgscore2=tonumber(avgscore2)
 |eval diff = avgscore1 - avgscore2
 |eval change=case(diff > 0,"Down", diff < 0, "Up", diff == 0, "Same",1=1, "Broken")

*OR

index=server1 OR index=server2 | eval x= " " | chart avg(score) as avg by x server | fields - x | eval diff=server1-server2 | eval change = case(diff > 0,"Down", diff < 0, "Up", diff == 0, "Same",1=1, "Broken")

singhh4
Path Finder

I know i was missing something simple! Thank you for the help!

0 Karma
Got questions? Get answers!

Join the Splunk Community Slack to learn, troubleshoot, and make connections with fellow Splunk practitioners in real time!

Meet up IRL or virtually!

Join Splunk User Groups to connect and learn in-person by region or remotely by topic or industry.

Get Updates on the Splunk Community!

All Work and No Play? Not at .conf26! Unwind at These Evening Events

Between hands-on technical sessions, keynote reveals, and diving into live architectures, .conf26 is packed ...

Join the Hackathon at .conf26 and build a No-Code AI agent

Join us for the AI Agent Buildathon, an in-person, three-hour hands-on Hackathon where you’ll use Splunk Agent ...

Level Up Your Workflow: Mastering Splunk Cloud Management via Terraform

Tech Talk Recap   From Chaos to Control: Scaling Splunk Cloud with Infrastructure as Code Managing apps in ...