使用Logstash计算特定Log事件的持续时间

时间:2017-06-26 10:20:17

标签: elasticsearch timestamp logstash kibana

目标:我想计算一个特殊事件持续多久使用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将其可视化。

先谢谢。

1 个答案:

答案 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字段。