Splunk智能运维学习笔记二

一、前言

上一章我们学习了如何将数据发送到splunk服务器并索引数据,本章接着进行讨论如何去更好的搜索数据

二、数据搜索和报表

2.1.SPL搜索语言

Splunk有自己的搜索语言,叫做SPL,包含了上百条搜索命令。搜索一般以基本搜索开头,然后通过一系列管道符分隔,管道左侧的命令结果作为管道右侧的命令的输入

2.2.SPL用到的运算符

在Splunk中只能使用三种布尔运算符,且只能是大写,分别是OR AND NOT
在splunk中搜索命令有很多,具体可以去官网下载search reference查看

2.3.搜索的字段

每个数据源默认的字段有四个。分别是源、源类型、索引、主机,对于含有XML和json格式的数据splunk会自动提取字段并使其可搜索
sourcetype=access_combined status!=200
搜索到的数据可以点击右上角的另存为报表

2.4.让原始事件具有可读性

index=main sourcetype="access_combined"会列出原始事件

index=main sourcetype="access_combined" | table _time,referer_domain,method,uri_path,status,JSESSIONID,useragent     

上面的命令会显示相同数目的事件,但是是以列表的形式展示并且只展示指定字段。
table表示管道左边的数据以列表的方式展示,table后买你的字段表示只展示这些字段的值,table命令在进行大范围的搜索会有性能方面的影响,应尽量把table命令放在最后
上面是将某几个字段弄成可读的表了
如果我们想将全部的字段弄的具有可读性,可以使用下面的命令
index=main sourcetype="access_combined" | table *
如果我们想去除其中的几个字段
index=main sourcetype="access_combined" | fields - sourcetype index | table *
如果是下面这条命令
index=main sourcetype="access_combined" | fields sourcetype index | table * 删除除sourcetype和index的字段

2.5.找出某个时间内访问最多网页

我们可以通过splunk来搜索web访问日志来查看哪个网页在某个时间段内访问次数最多,这样方便我们进行网站优化
index=main sourcetype=access_combined | stats count by uri_path | sort -count
第一个管道前的命令表示按照字段名来过滤事件,stats命令表示根据uri_path字段来计算每个页面的访问次数,sort命令表示按照搜索出来的次数降序排列
但是有时候我们只需拍前的数据,这时候可以使用top命令来管道,默认会显示前十的数据
index=main sourcetype=access_combined | top uri_path
如果要显示访问靠前的前20个网页
index=main sourcetype=access_combined | top limit=20 uri_path

2.6.找出用户经常访问的网页

index=main sourcetype=access_combined | stats dc(uri_path) by user | sort - user

2.7.找出最常用的Web浏览器

也是一个搜索语句,挺复杂的,写上来随时查阅

index=main sourcetype=access_combined | eval browser=useragent | replace *Firefox* with Firefox,*Chrome* with Chrome,*MSIE* with "Internet Explorer",*Version*Safari* with Safari,*Opera* with  Opera in browser | top limit=5 useother=t browser

eval browser=useragent表示创建了新的字段browser,并将useragent字段的内容填充进去
replace命令是将browser字段中的内容替换成缩短的浏览器名称
top limit=5表示找出排前5的浏览器
userother=t 表示将其他浏览器的值归到other下面
我们还能找出用户操作系统

index=main sourcetype="access_combined" | eval os=useragent | replace *Windows* with Windows,*Linux* with Linux,*Macintosh* with Apple in os | top limit=3 useother=t os

2.8.找出浏览量来源最多的网站

index=main sourcetype=access_combined | stats dc(clientip) AS Referals by referer_domain | sort - Referals

找出浏览量来源排名前5的网站

index=main sourcetype=access_combined | stats dc(clientip) AS Referals by referer_domain | sort - Referals | head 5

2.9.统计页面访问的成功次数和失败次数

index=main sourcetype="access_combined" | chart count(eval(like(status,"2%"))) AS Success,count(eval(like(status,"4%") OR like(status,"5%"))) AS Error  by uri_path

汇总成功和失败的次数

index=main sourcetype="access_combined" uri_path="/addItem" OR uri_path="/checkout" | chart count(eval(like(status,"2%"))) AS Success,count(eval(like(status,"4%") OR like(status,"5%"))) AS Error  by uri_path | addcoltotals label=Total labelfield=uri_path

2.10.计算网页的一天中平均响应时间

index=main sourcetype="access_combined" | timechart span=6h avg(response) AS  avg_response |  eval avg_response=round(avg_response/1000,2)

timechart 这条命令是计算每六个小时页面的平均相应时间
eval 这条命令是将ms的结果转换成s级结果并保留2位数
计算不同网页的平均相应时间

index=main sourcetype="access_combined" uri_path=* | timechart span=6h avg(response) by uri_path | foreach * [eval <<FIELD>>=round(<<FIELD>>/1000,2)]

2.11.计算那个产品被浏览的最多

index=main sourcetype=access_combined uri_path="/viewItem" OR uri_path="/addItem" status=200 | dedup JSESSIONID uri_path item | chart count(eval(uri_path="/viewItem"))  AS view,count(eval(uri_path="/addItem")) AS add by item | sort - view | head 10

该搜索展示浏览量前10的商品,但是光有这个还不行,我们还需要知道这前10的商品哪些是被添加进了购物车的

index=main sourcetype=access_combined uri_path="/viewItem" OR uri_path="/addItem" status=200 | dedup JSESSIONID uri_path item | chart count(eval(uri_path="/viewItem"))  AS view,count(eval(uri_path="/addItem")) AS add by item | sort - view | head 10 | eval cart_conversion=round(add/view*100)."%"

2.12.计算应用程序对用户请求的响应时间

index=main sourcetype=log4j | transaction maxspan=4h threadId | timechart span=6h max(duration) AS max,mean(duration) AS mean,min(duration) AS min

transaction命令是将具有相同threadId的时间合并为单一事件,同时在使用这一命令的时候一定要使用函数maxspan来规定一个合适的时间

2.13.计算应用程序内存使用情况

index=main sourcetype=log4j perfType="MEMORY" | eval mem_used_pc=round((mem_used/mem_total)*100) | eval mem_remain_pc=(100-mem_used_pc) | timechart span=15m avg(mem_remain_pc) avg(mem_used_pc)

每十五分钟计算一次

2.14.计算数据库的连接数

index=main sourcetype=log4j perfType="db"  | eval threshold=con_total/100*70 | where con_used>=threshold | timechart span=4h count(con_used) AS CountOverThreshOld