是否有一个简单的工具或库,用于将具有时间戳的一组事件“卷起”到给定跨度的每个时间窗口中的事件计数?

时间:2012-04-11 18:13:53

标签: events rollup

我的具体问题是我有一组Apache访问日志,我想通过将它们分组到指定时间的一组时间窗口中从中提取“累积”的请求数。

我的数据示例:

127.0.0.1 - - [01/Dec/2011:00:00:11 -0500] "GET / HTTP/1.0" 304 266 "-" "Sosospider+(+http://help.soso.com/webspider.htm)"
127.0.0.1 - - [01/Dec/2011:00:00:24 -0500] "GET /feed/rss2/ HTTP/1.0" 301 447 "-" "Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=12878631678486589417)"
127.0.0.1 - - [01/Dec/2011:00:00:25 -0500] "GET /feed/ HTTP/1.0" 304 189 "-" "Feedfetcher-Google; (+http://www.google.com/feedfetcher.html; 1 subscribers; feed-id=12878631678486589417)"
127.0.0.1 - - [01/Dec/2011:00:00:30 -0500] "GET /robots.txt HTTP/1.0" 200 333 "-" "Mozilla/5.0 (compatible; ScoutJet; +http://www.scoutjet.com/)"
127.0.0.1 - - [01/Dec/2011:00:00:30 -0500] "GET / HTTP/1.0" 200 10011 "-" "Mozilla/5.0 (compatible; ScoutJet; +http://www.scoutjet.com/)"

如您所见,每一行代表一个事件 - 在本例中是一个HTTP请求 - 并包含一个时间戳。

假设我的数据涵盖了3天,并且我指定了1天的时间窗口大小,我想生成这样的内容:

Start    End     Count
2011-12-01 05:00     2011-12-02 05:00    2822
2011-12-02 05:00     2011-12-03 05:00    2572
2011-12-03 05:00     2011-12-04 05:00    604

但是我需要能够改变窗口的大小 - 我可能想要使用5分钟,10分钟,1小时,1天或1周的窗口来分析给定的数据集等。

我还需要库/工具能够分析数百甚至数千兆字节的数据集(一系列行)。

一个可以通过标准输入接受数据的预构建工具会很棒,但是库可以完全没问题,因为我可以在库周围构建工具。任何语言都可以;如果我不知道,我可以学习它。

我更喜欢通过将访问日志数据直接传递到具有最小依赖性的工具/库中来实现这一点 - 我不是在寻找将数据存储在数据库中然后查询数据库以进行分析的建议。如果我需要,我可以自己解决这个问题。

我尝试过Splunk,发现它的重量级太复杂而且复杂。它不仅仅是一个工具,它是一个拥有自己的数据存储区,复杂的索引和查询能力等的整个系统。

我的问题是:这样的库和/或工具是否存在?

完全披露

我必须承认,几个月前我实际上尝试过但未能找到这样的东西,所以我写了自己的。出于某种原因,我当时并不认为会发布这个问题。我将很快分享我在回答中写的lib /工具。但我真的很好奇这样的事情确实存在;也许我几个月前在搜索时就错过了它。

3 个答案:

答案 0 :(得分:1)

正如问题中所提到的那样,几个月前我实际上尝试过找不到这样的东西,但是我写了自己的东西。 (出于某种原因,我当时并不认为会发布这个问题。)

我把这当作学习函数式编程(FP)的机会,并提高了我对CoffeeScript的熟练程度。因此,我将Rollups编写为CoffeeScript工具,该工具在Node上运行。我已经添加了ScalaClojure版本,作为我进一步探索FP的一部分。

所有版本都可用作工具和库,尽管它们只是实现这一目标的一部分 - 我认为目前只有Clojure版本才能真正安全地用作库,而我没有那样测试过。

这些工具就像我在我的问题中描述的那样工作。给定一个包含Apache访问日志的文件或文件集,我会这样调用它们:

$ gzcat *.access.log.gz | rollup.clj -w 1d

(或rollup.coffeerollup.scala),输出与问题中的示例完全相同。

这个工具解决了我的问题,我不再在日常工作中积极使用它。但是如果我知道其他人正在使用它,我会喜欢进一步改善它以供其他人使用。所以欢迎反馈!

答案 1 :(得分:0)

Splunk(http://www.splunk.com/)将成为我想到的类似问题的工具。它有免费和付费版本;我自己没有许可,只是已经安装好了。

答案 2 :(得分:0)

那么,这必须是多么自动化?我能否给出一个仍然有用的非真实答案?

如果你想成为真正的贫民窟,那么我通常做的就是一次性破坏一堆丑陋的贝壳。这是一个按小时使用一些cut技巧和awk总结的(我确实不是很擅长但速度非常快且功能强大)。

cat access_log | cut -d '[' -f 2 | cut -d ' ' -f 1 | cut -d ':' -f 1,2 | awk '{ date=$1; if (date==olddate) sum=sum+1; else { if (olddate!="") {print olddate,sum}; olddate=date; sum=1}} END {print date,sum}'

This post on plotting with awk帮助我找出了聚合位。)

那应该输出如下内容:

12/Apr/2012:11 207
12/Apr/2012:12 188
12/Apr/2012:13 317

这可以很容易地与自己玩。 Awk很整洁。