汇总新旧事件的统计数据

汇总新旧事件的统计数据

我们希望将 CDN 日志输入 Graphite 并汇总其中发现的数字(不同 HTTP 状态代码的速率、平均响应大小、平均缓存命中率等)。

然而,日志只是偶尔上传给我们,有时甚至失灵-- 有时,早上的日志可能会在晚上上传,而下午的日志则在几个小时后才上传和处理。此外,由于 CDN(显然)有多个服务器和数据中心,因此不同的日志可能会覆盖重叠期间。

这意味着,任何聚合器都需要保持对全部在处理新日志时,可以使用早期的统计数据来增强聚合......

有什么可以做到这一点吗?我该如何配置 logstash 以将其输入其中?谢谢!

答案1

正如您所知,这是一个复杂的问题。您在问题中标记了 Logstash,所以我假设您有这个标记。

Logstash 负责采集日志。它具有file {}输入插件只是为了:

input {
  file {
    path => [ '/opt/export/cdn_logs/*.csv'
    tags => [ 'cdnlogs' ]
  }
}

csv {}过滤器以便于获取 CSV 数据。

filter {
  if 'cdnlogs' in [tags] {
    csv {
      source => "message"
      columns => [
        'cdndate',
        'host_server',
        [...]
        'response_time' ]
    }
  }
}

如果您没有 CSV 数据,也许这些行是相当正常的 Apache 格式,一切都不会丢失。您可能需要花时间使用 grok。那是它自己的事。

只要你小心地保留时间戳并且不使用显然没有保存它们。如果您还没有这样做,Logstash 可以获取日志文件中的日期并将其作为事件的日期/时间戳。

filter {
  date {
    match => [ "cdndate", "ISO8601" ]
  }
}

这将获取日志行的日期/时间戳作为事件的时间戳。太棒了,现在将其变成有用的东西。

Logstash 的库存数据存储是,Elastic(公司)正忙于将其宣传为与 InfluxDB 或 OpenTSDB 等专用工具一样出色的时间序列数据存储。它可以是,但根据我的经验,专用工具的性能更好。所有这些工具都可以(假设您输入正确)以正确的顺序存储无序事件,以便后续查询可以吸收新信息。

Logstash 的输出graphite {}将保留时间戳,如果您愿意,可以使用石墨作为您的后备存储。

influxdb {}和输出插件opentsdb {}存在并将把您的数据放入真正的时间序列数据库中。

从那里开始,近期数据(距离您的解释有几天的时间)的聚合/汇总应该在查询时完成。类似可以处理多个数据存储,使显示更加容易。一旦您越过了日志到达的风险区,您就可以运行后续的 ETL 流程,根据以下信息生成数据库内聚合/汇总完全的数据集。然后根据需要清除完整详细日志。

简而言之,该方法:

  1. 使用 Logstash 提取文件。
  2. 利用过滤从 CDN 日志文件中提取字段。
  3. 用途过滤date {}将日志的时间戳拉入事件的时间戳中。
  4. 将数据导出到某些东西(弹性、石墨或其他时间序列数据库)
  5. 显示工具使用实时聚合查询向消费者显示数据,至少是近期数据。
  6. 经过一段时间(可能是几天)后,脚本或其他自动化过程会生成聚合并将其输入到数据存储中。
  7. 经过一段时间后,全分辨率数据将被清除,仅留下聚合数据。

相关内容