阅读视图

发现新文章,点击刷新页面。
🔲 ☆

Splunk数据搜索和报表

Splunk 数据搜索和报表

Splunk 是?

Splunk是机器数据分析平台,他可以收集并处理所有有机器产生的日志数据,在Splunk中可以做到”any data from any source”。我们作为管理员可以使用Splunk生成这些数据的报表、仪表盘等,赋予这冰冷枯燥日志数据的新生。

搜索是Splunk核心功能之一,基本上近乎所有的功能都是由搜索展开的。充分挖掘这些数据并从中获得有价值的信息,这让我想起在泥沙中淘金的感觉。从基本的报表和仪表,再到数据模型和功能完备的Splunk应用程序,这些都是由Splunk搜索在后台提供着支撑。

Splunk使用自己的搜索语言(SPL)。SPL有很多搜索指令,其中大部分包含有多种函数,参数和字句。

搜索

Splunk的搜索以基本搜索开头,之后是一系列的搜索指令,命令之间由管道符号(|)分割。Splunk搜索时经常会使用管道符不断精炼数据结果。

当然Splunk也可以直接搜索你想要的元素,比如一个agent、IP、error。但是只有在数据量很少的情况下才可以这么用,否则在海量(GB)级别的文本数据中搜索一个单词或者一个IP地址还不如淘到金子的可能性大。因此使用SPL和多种Splunk命令来提炼搜索。搜索的越精细,搜索的执行时间就越少,也能尽快的找到这些所需要的数据。

尽可能的在第一个管道符之前尽可能多的过滤内容,这会节省CPU和磁盘I/O。并且在编写完查询指令后可以先将搜索时间番位设置较短的区间,如果查找的结果是需要的数据再扩大搜索范围。

常用搜索指令

命令描述
chart/
timechart
将结果以表格的形式输出。或者借助Splunk图表按时间顺序展示输出结果
dedup根据指定的字段删除重复的结果
eval评估新的或现有的字段和值。eval可以实用化许多不同的函数
fields指定在搜索结果中保留或移除字段
head该命令保留前X(指定值)行的结果
lookup从外部源或列表查找字段,返回附加的字段值
rare从字段中找到最少值
rename重新命名字段
replace该命令允许随后对结果进行搜索和过滤
sort该命令按升降序对结果进行排序
stats对结果执行统计运算。stats命令可以使用许多不同的函数
table该命令把结果以列表的格式输出
tail保留最后X(指定)行的结果
top从字段中找到最常见的值
transaction该命令根据共同的事务标识符将多个时间合并为单一事件

高级时间配置

在搜索框的右面可以选择限定时间范围,当你所要查找的时间比较复杂的时候,可以尝试使用高级选项来选取时间范围。

高级时间配置-2020-06-10

时间修饰符可以接受多种时间单位:秒(s),分钟(m),小时(h),天(d),星期(w),月(mon),季度(q),年(y)等。

比如要搜索在一天前的半夜整点到距离当前时间30分钟前出现过的全部事件可以这样表示:最早=-1d@d/最晚=-30m

时间修饰符-2020-06-10

(@)是向下取整标志符。

布尔运算符

Splunk中可以使用三种类型的布尔运算符:AND、OR、NOT。Splunk只会识别这三个大写的运算符,所以要大写!默认情况下AND运算符是隐含的,可以不写。比如 ssh AND failure等同于ssh failure

搜索字段

Splunk中的字段可以被认为是有着一个或多个值的关键词。这些字段都可以被Splunk搜索。进入到Splunk的每一个数据源都会至少包含源、主机、索引、源类型这四个字段,一些数据源会有数百个附加的字段。如果原始日志数据包含有键值对或以JSON或XML结构化格式呈现的数据,Splunk会自动提取字段并使其可供搜索。

搜索特定的字段值也很简单,在当你Splunk自动识别或手表标记好的字段后,直接输入字段名与布尔运算符就可以进行搜索。如sourcetype="access_combined" status!=200,就可以搜索含有来源类型为access_combined,并且status字段值不等于200的事件。

报表

在搜索结束后可以保存搜索供以后继续使用或者用于仪表盘。保存的搜索被称之为报表。

将搜索结果存储为报表-2020-06-10

让搜索的结果更具有可读性

有了上面的基础,就可以来为这些数据填些花样玩法。

table命令生成数据列表

在Splunk首页选择“搜索和报表”应用程序。时间选择器选择“过去24小时”。之后搜索index=main sourcetypee=access,之后会返回原始数据搜索事件。

此时我们在刚才的搜索指令使用管道符相连table命令:index="main" sourcetype="access_combined" | table _time,referer_domain,method,uri_path,JSESSIONID,useragent

这样的列表会只显示你关注的字段,而不现实原始事件,将数据以数据列表形式呈现。

table命令1-2020-06-10

点击右上角的另存为——>报表,就可以将将搜索存储为报表,方便下次的时候使用。

搜索分段描述
index=”main”Splunk中所有的数据都会保存在一个或多个索引中。尽管没有强制要求,不过再好在搜索时指定索引,这样能更快并且更精确的得到搜索结果
sourcetype=”access_combined”只搜索与access_combined数据源类型
|table _time,referer_domain,method,uri_path,JSESSIONID,useragent使用table命令时,将上一步的搜索结果放到管道左面。并告知Splunk以列表格式返回数据。Splunk会在搜索结果中只显示table命令中规定的字段

table命令对大范围数据搜索有很高的性能需求,尽可能的要将table用在搜索末尾,当其他的Splunk命令处理完毕后,再执行table命令。

下载报表

我们已经把数据呈现为可读的格式,因此可以下载这些数据并存储为CSV文件格式方便我们统计数据。在搜索栏右侧下方有一个导出按钮,这里可以选择其他格式:JSON、XML、CSV。

将每个字段制表

如果需要将所有字段都列成表格,没必要指定所有字段名。可以使用通配符(*)。

index="main" sourcetype="access_combined" | table *

但是!假设全部的字段有很多,然而你还不想要全部字段,只需要大部分的字段,那么你可以在使用table命令之前使用fields命令先移除你不需要的字段再使用通配符(*)。

index="main" sourcetype="access_combined" |fields - sourcetype,index,_row,date* linecount| table *

fields过滤前-2020-06-10

fields过滤后-2020-06-10

在fields命令后加上一个减号(-),Splunk会将后面的字段移除。

找出最常访问的网页

在获得了Web服务器日志后,你就能看得到你的客户喜欢哪些网站,如果可以找到最常访问的网页,那么可以在这些页面上继续开发新功能!哪些访问次数较少的可以将他们移除掉或者重新设计一下!

index="main" sourcetype="access_combined" | stats count by uri_path | sort - count

搜索分段描述
stats count by uri_path使用stats命令,将上一步的搜索结果放在管道左侧,并告知Splunk计算每个uri_path字段值的数量。
sort - count将上一步stats命令生成的count字段作为输入,并告知Splunk将统计结果进行降序(-),最常访问的网站就会显示在结果的顶端

搜索访问量排名前10的网页

可以使用top代替stats命令。默认情况下top会显示排名前10的网页

index="main" sourcetype="access_combined" | top uri_path

如果你需要查看更多的排行,用limit可以满足你!

index="main" sourcetype="access_combined" | top limit=20 uri_path

找出最常使用的Web浏览器

Web日志中也包含了useragent相关信息,其中包括浏览器信息和操作系统信息。

index="main" sourcetype="access_combined" | eval browser=useragent | replace *Firefox* with Firefox,*Chrome* with Chrome,*MSIE* with IE,*Safari* with Safari,*Opera* with Opera in browser | top useother=t browser

搜索分段描述
eval browser=useragent使用eval命令,创建一个新的字段browser并将useragent字段中的内通存放到browser字段中
replace *Firefox* with Firefox,*Chrome* with Chrome,*MSIE* with IE,*Safari* with Safari,*Opera* with Opera in browser使用replace命令,利用通配符(*)将browser中匹配到的内容使用with参数后面的文本替换。如果包含空格的值要加上引号,否则会导致语法识别错误
top limit=5 userother=t browsertop命令告知Splunk找到排名前5的浏览器,并将limit所限制导致溢出的值都归到OTHER下

浏览器信息统计-2020-06-10

同理也可以统计出用户所使用的操作系统。

index="main" sourcetype="access_combined" | eval os=useragent | replace *Windows* with Windows系统 ,*Mac* with Mac系统,*Linux* with Linux系统 in os | top limit=10 useother=t os

操作系统信息统计-2020-06-10

🔲 ☆

Nginx反向代理下载传输超过1G大文件时断开问题

Nginx反向代理下载传输超过1G大文件时断开问题

问题描述

42Team社团上线下载站,使用Nginx反向代理为用户提供服务。问题的现象是当用户下载文件超过1G大小时出现断开下载连接的情况导致下载失败。

问题分析

一开始以为是Flask的流传输出了问题,调试并跟踪代码后并没有发现问题,而且直接在本地代码调试下载大文件不会出现断开情况。那么开发环境与生产环境中只相差了中间有一层Nginx反向代理,那么初步问题定位到Nginx的反向代理配置上。

经过在网上进行搜索“反向代理下载大文件失败断开连接”等关键字后找到了一篇其他人写的博文,遇到过类似的问题。

发现可能是因为超时的原因导致,因为反向代理服务器和部署下载站服务的服务器之间的网络传输速度和磁盘性能非常好,所以他们之间传递1G以上的大文件仅仅有几秒的时间,而Nginx反向代理服务器将文件传输到用户端可能需要数分钟或数十分钟,由于这之间的时间差非常大,所以超过了Nginx的默认连接超时时间,导致此问题发生

问题解决

禁用缓存

禁用缓存,客户端的每次清求都转发到被代理服务器,做法是在代理服务器的Nginx配置里面添加:

proxy_pass http://172.17.8.88:5050/;
proxy_redirect default;
proxy_buffering off;

加大Nginx服务器与另一服务器之间的超时等待时间

keepalive_timeout 15;
send_timeout 3600;

Nginx反向代理导致大文件下载失败

❌