如何将Splunk子搜索结果赋值给变量以生成仪表板令牌?
问题解决方法
你的查询报错是因为子搜索默认返回domain1Users=XXX这种键值对格式,直接赋值给eval时会被当成字符串,无法进行数值运算。以下两种方案可以解决问题:
方案1:修改子搜索返回纯数值
在每个子搜索末尾添加| return $字段名,让子搜索只输出数值而非键值对,这样eval就能正确识别并赋值:
<search id="app_logs"> <query> index=my_logs | eval domain1Count = [ search "Middleware" "www.example-domain-1.com" | stats distinct_count(UserId) as domain1Users | return $domain1Users ] | eval domain2Count = [ search "Middleware 2" "www.example-domain-2.com" | stats distinct_count(UserId) as domain2Users | return $domain2Users ] | eval totalCount = domain1Count + domain2Count | table domain1Count domain2Count totalCount </query> <done> <set token="domain1Count">$result.domain1Count$</set> <set token="domain2Count">$result.domain2Count$</set> <set token="totalCount">$result.totalCount$</set> </done> </search>
方案2:优化查询(推荐)
多次子搜索会增加Splunk的查询开销,尤其是数据量较大时。可以通过一次扫描日志,统一统计两个域名的用户数,再转成所需字段:
<search id="app_logs"> <query> index=my_logs (("Middleware" "www.example-domain-1.com") OR ("Middleware 2" "www.example-domain-2.com")) | eval domain=case( match(_raw, "Middleware") AND match(_raw, "www.example-domain-1.com"), "domain1", match(_raw, "Middleware 2") AND match(_raw, "www.example-domain-2.com"), "domain2" ) | stats dc(UserId) as userCount by domain | transpose 2 column_name=domain | rename "domain1" as domain1Count, "domain2" as domain2Count | eval totalCount = domain1Count + domain2Count | table domain1Count domain2Count totalCount </query> <done> <set token="domain1Count">$result.domain1Count$</set> <set token="domain2Count">$result.domain2Count$</set> <set token="totalCount">$result.totalCount$</set> </done> </search>
两种方案都能让查询正常运行,生成的令牌可以直接在仪表板中引用。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

