2018年10月31日 工程

如何从 Elastic APM 通过 Logstash 或 Kafka 发送数据

作者 Gil Raphaelli

在现代部署中,相较于其他组件(例如消息队列或数据库),应用服务器的使用寿命通常较短,所用硬件的可靠性也较差(可抢占/低优先级 VM、Spot 实例)。在这种情况下,最佳做法是将数据尽快转移至更可靠的系统。

从 6.4.0 版本开始,APM 服务器能够将数据发送到 Logstash 或 Kafka,从而将可靠性要求转移到这些系统。如果使用 Logstash,您还有机会使用现有的诸多 Logstash 插件之一来扩充您的 APM 数据。

我们在本文中将会逐步讲解配置过程,并说明在将数据采集到 Elasticsearch 之前通过其他系统发送数据时需要注意的几点事项。

  1. 配置 Logstash 以将数据输出至 Elasticsearch
  2. 配置 Elastic APM 服务器以将数据发送至 Logstash
  3. 配置 Elasticsearch
  4. 选择性包括源映射
  5. 引入 Kafka

配置 Logstash

首先,添加一个管道以对 Logstash 进行配置,让 Logstash 可以通过 beats/lumberjack 协议从 APM 服务器接收事件,并将事件继续发送到 Elasticsearch。

input {
   beats {
        id => "apm-server"
        port => 5044
  }
}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "apm-%{[beat][version]}-%{[processor][event]}-%{+YYYY.MM.dd}"
  }
}

正如默认 APM 服务器配置会生成索引一样,Logstash 每天也会为每种事件类型(例如事务、跨度等)创建一个索引。 源映射为这一步提供了一种巧妙的方法,我们将会在本文后面详细解释。

如果仔细观察的话,您可能会想,到底为什么要引用 Beat 呢。 APM 服务器是在 Beats Framework(Beats 框架)的基础上构建的,因此会在事件中传送同样的元数据。 这意味着在同一个 Logstash 实例中处理 APM 数据时,和处理其他 Beat 数据一样,可以通过对 [@metadata][beat] == "apm-server" 使用条件语句来完成。

配置 APM 服务器

现在 Logstash 已经配置完毕,接下来更新 APM 服务器的 apm-server.yml,从而相应地输出事件:

output.elasticsearch:
  enabled: false
output.logstash
  enabled: true
  hosts: ["logstash:5044"]

其他选项(包括 backoff、proxy 和 ssl 设置)在Elastic APM 服务器文档中有详细描述。

如果您已在 APM 服务器上启用了监测功能,务必进行下列设置:

xpack.monitoring.elasticsearch:
  enabled: true
  hosts: ["elasticsearch:9200"]

这会持续将 APM 服务器自身的监测信息直接发送到 Elasticsearch。

配置 Elasticsearch

再有一步,我们便可以启动 APM 服务器了。 Elasticsearch 首先需要知道如何按照 APM UI 预期的方式对 APM 数据进行存储,即 Elastic 需要一个索引模板。 可以通过两种方式来加载此模板。

如果您能暂时为 Elasticsearch 指定一个 APM 服务器,可以通过下列代码来加载:

 apm-server setup --template

否则,首先将此模板从 APM 服务器导出:

apm-server export template > apm-6.4.2.tmpl.json

然后再将模板加载到 Elasticsearch 中。 如使用 curl,可以使用下列代码来实现此操作:

curl -XPUT -H 'Content-Type: application/json' http://elasticsearch:9200/_template/apm-6.4.2 -d @apm-6.4.2.tmpl.json

这些命令应该会报告每个操作是否成功完成。 如要确认模板是否加载成功,请查询 _template/apm-*。 此命令应该返回类似下面的文档集合:

{
  "apm-6.4.2": {
    "order":1,
    "index_patterns": [
      "apm-6.4.2-*"
    ],
...

请注意,索引模式与我们之前在 Logstash 步骤中配置的索引模式匹配。 此外,还请注意,其包含版本信息,这意味着完成此设置步骤时应该确保下面两点:

1.应该使用与连接至 Logstash 的 APM 服务器完全相同的版本执行此设置步骤。
1.每次升级 APM 服务器时,均应重复此设置步骤。

使用就行啦

现在启动 APM 服务器,并开始分析您的应用程序的行为吧。

源映射

源映射用于将难以理解的代码映射为最初的源代码。 源映射最常用于将缩短后的 Javascript 代码还原为源代码。

如果 APM 服务器的输出不是 Elasticsearch,您尤其需要关注源映射。 无论最终通过何种方式到达 Elasticsearch,源映射都必须存储在 Elasticsearch 中以供 APM 服务器使用。
如需配置源映射存储,请对 rum.source_mapping.elasticsearch 进行如下设置:

apm-server:
  rum:
    source_mapping:
      elasticsearch:
        hosts: ["elasticsearch:9200"]
        index_pattern: "apm-*-sourcemap*"

这会指示 APM 服务器在符合 apm-*-sourcemap* 的索引中寻找源映射。

尽管源映射可以通过 Logstash 加载,但我们建议在部署过程中直接将源映射发送到 Elasticsearch,以确保在收到需要映射的任何事件之前便已将源映射存储在 Elasticsearch 中。 如果这种方法不可行,本文提供的 Logstash 配置在需要应用源映射时会与用于检索源映射的默认索引模式相匹配,因此无需其他改动。

向流中引入 Kafka

Kafka 也可作为缓存暂时存储 APM 服务器的事件输出,并将事件传输到 Elasticsearch。 下面是使用 Kafka 时 APM 服务器的简单配置信息:

output.kafka:
  enabled: true
  hosts: ["kafka:9092"]
  topics:
    - default: 'apm'
      topic: 'apm-%{[context.service.name]}'

在此处的演示中,使用的是每项服务一个主题,但这并非强制要求。 更多配置选项,详见相关文档。

事件传输到 Kafka 之后,用户可以对 Logstash 进行配置以将数据输送到 Elasticsearch。 例如:

input {
  kafka {
    id => "apm-server-kafka"
    bootstrap_servers => ["kafka:9092"]
    topics_pattern => "apm.*"
    codec => "json"
  }
}
output {
  elasticsearch {
    hosts => ["elasticsearch:9200"]
    index => "apm-%{[beat][version]}-%{[processor][event]}-%{+YYYY.MM.dd}"
  }
}

再说一遍,正如默认 APM 服务器配置会生成索引一样,Logstash 每天也会为每种事件类型(例如事务、跨度等)创建一个索引。 有关 Logstash Kafka 输入插件的更多选项,详见此文档

欢迎试用

APM 服务器提供了一些灵活选择,能够让您使用 Logstash 或 Kafka 传输 APM 数据。 欢迎试用,并在我们的论坛中提供反馈。 我们一直以来都十分重视大家的贡献,所以欢迎您查看源代码,并提交问题或拉取请求。