目标:我想计算一个特殊事件持续多久使用logstash的持续时间。
场景:考虑从我的页面搜索要购买的产品的客户。他访问的每个页面都记录在日志中,并且持续时间。现在我想知道普通客户为获得产品需要多长时间。我的服务器花了多长时间回复他。
现在这是我的日志文件:
16-09-2004 00:37:22 BEGIN_CUST
ts:16-09-2004T00:37:26+05:30
ID-XYZ456
16-09-2004 00:37:23 PAGE_1
ID-XYZ456
ts:16-09-2004T00:39:26+05:30
16-09-2004 00:37:23 PAGE_2
ID-XYZ456
ts:16-09-2004T00:41:26+05:30
16-09-2004 00:37:23 BUT_REQ
ID-XYZ456
ts:16-09-2004T00:43:26+05:30
16-09-2004 00:37:23 PURCHASE
ID-XYZ456
ts:16-09-2004T00:47:26+05:30
16-09-2004 00:51:22 BEGIN_CUST
ts:16-09-2004T00:52:26+05:30
ID-YUB98I
16-09-2004 00:53:23 PAGE_1
ID-YUB98I
16-09-2004 00:55:23 PURCHASE
ID-YUB98I
在上面的日志文件中,很明显BEGIN_CUST
是事件的开始,PURCHASE
是事件的结束。
ID(作为每个客户的唯一ID)。
我尝试过脚本字段。但由于以下几点,它并没有给我正确的结果,
有没有什么方法可以更好地在Kibana的单独字段中绘制个人客户的持续时间,以使用Logstash将其可视化。
先谢谢。
答案 0 :(得分:1)
只要您将ElasticSearch用作商店,the elasticsearch
filter就可以满足您的需求。诀窍是,只要您收到BEGIN_CUST
事件,就会搜索PURCHASE
事件。此插件的文档包含了您正在寻找的大部分内容的示例,但这里有一个摘要:
if [trans_type] == "PURCHASE" {
elasticsearch {
hosts => localhost,
query => "trans_type:BEGIN_CUST AND cust_id:%{[cust_id]}],
fields => { "@timestamp" => "started" }
}
date {
match => [ "[started]", "ISO8601" ]
target => "[started]"
}
ruby {
code => "event['shopping_time'] = (event['@timestamp'] - event['started'] rescue nil"
}
}
在shopping_time
记录到达和第一个BEGIN_CUST
到达之间,以秒为单位生成PURCHASE
字段。如果客户购买了两次,那么每个PURCHASE
记录将根据相同的shopping_time
拥有自己的BEGIN_CUST
字段。
这可以通过查询ElasticSearch的BEGIN_CUST记录,并在PURCHASE记录的@timestamp
字段中使用该记录上的started
数据来实现。然后date {}
过滤器将其转换为日期时间数据类型。最后,ruby {}
块计算当前@timestamp
字段与退出ElasticSearch的字段之间的时间差,创建shopping_time
字段。