在 Elastic Stack 8.0 之前,我们使用 APM server 来采集 Application Monitoring (APM) 数据。随着 Elastic Agent 在 8.0 的推出,我们可以使用 Elastic Agent 来采集 APM 数据。如果你对 Elastic Stack 的 APM 还不是很熟的话,请阅读我之前的文章 “Solutions:应用程序性能监控/管理(APM)实践”。
在今天的文章中,我将如何:
- 收集应用程序性能监控 (APM) 数据
- 将 APM 数据发送到 Elastic Stack
- 实时探索和可视化数据
在如下的展示中,我将使用 Elastic Stack 8.1 来进行展示。
安装
你需要 Elasticsearch 来存储和搜索数据,需要 Kibana 来可视化和管理数据。 你可以使用我们在 Elastic Cloud上托管的 Elasticsearch 服务(推荐),或者在你自己的硬件上自行管理 Elastic Stack。在本文章的介绍中,我们将使用 macOS 来安装 Elasticsearch 及 Kibana。你可以参考我之前的文章 “Elastic Stack 8.0 安装 - 保护你的 Elastic Stack 现在比以往任何时候都简单” 来安装 Elasticsearch 及 Kibana。
在启动 Elasticsearch 之前,我们还必须针对 Elasticsearch 的配置文件做一项修改:
config/elasticsearch.yml
xpack.security.authc.api_key.enabled: true
我们把上面的配置添加到 config/elasticsearch.yml 文件的最后面。这个是为了能够我们使用 API key 的方式来访问 Elasticsearch。修改完毕后,我们重新启动 Elasticsearch。
我们还必须为 Kibana 做一项修正。我们首先在 Kibana 的安装目录中使用如下的命令:
./bin/kibana-encryption-keys generate
上面的命令将生成三个 keys:
xpack.encryptedSavedObjects.encryptionKey: dc03f2cd832a9c0e77d2d67491ad7e30
xpack.reporting.encryptionKey: 77c42cd9e34a64d4c651b2f479215722
xpack.security.encryptionKey: cadce1bbc11b88c47882b97d5a67528a
我们把上面的三个 keys 拷贝并粘贴到 config/kibana.yml 文件的最后面:
config/kibana.yml
添加完毕后,我们重新启动 Kibana。
Kibana 需要 Internet 连接才能从 Elastic Package Registry 下载集成包。 确保 Kibana 服务器可以连接到端口 443 上的 https://epr.elastic.co。如果你的环境有网络限制,则有一些方法可以解决此要求。 有关详细信息,请参阅气隙环境。
另外,我们必须注意的一点是 Fleet 在目前只供具有 superuser 角色的用户使用。Fleet 是 Kibana 中的界面。它被用来管理及监控 Elastic Agents。
配置 Fleet
使用 Kibana 中的 Fleet 来对 Elastic agents 进行管理。第一次使用 Fleet 时,你可能需要对其进行设置并添加 Fleet Server。要部署自我管理的 Fleet Server,请安装 Elastic Agent 并将其注册到包含 Fleet Server 集成的代理策略中:
在上面的图中,我们填入的是 macOS 机器的 IP 地址,因为我们想把 Fleet server 安装到这个机器上。 我们可以通过如下的方式来找到该机器的地址:
$ ifconfig | grep 192
inet 192.168.0.3 netmask 0xffffff00 broadcast 192.168.0.255
点击上面的 Save and apply settings:
从上面的截图中,我们可以看出来,还没有一个含有 Fleet server 的 policy。我们点击 Create policy:
我们需要等一会儿:
上面显示我们已经成功地创建了一个叫做 Fleet Server policy 1。我们也可以到 Agent policies 里进行查看:
我们点击 Fleet Server policy 1,可以看到:
在这个 policy 里它包含采集该机器的 system 日志及指标,同时也部署一个 Fleet Server。
我们再次回到 Agents 界面:
点击上面的 Go to download page。它会自动帮我待到和当前 Elasticsearch 匹配的下载网页来下载 Elastic Agent:
针对我们的情况,我们下载 MAC 版本。并保存到我们想要的目录中:
$ pwd
/Users/liuxg/elastic
$ ls elastic-agent-8.1.0-darwin-x86_64.tar.gz
elastic-agent-8.1.0-darwin-x86_64.tar.gz
$ tar xzf elastic-agent-8.1.0-darwin-x86_64.tar.gz
$ cd elastic-agent-8.1.0-darwin-x86_64
我们按照上面的命令来进行解压缩,并进入到解压缩的目录中。我们再次回到 agent 的安装页面:
我们点击上面的两个拷贝图标。保存好 Service token。我们使用下面的命令来启动 Fleet Server:
sudo ./elastic-agent install \
--fleet-server-es=https://192.168.0.3:9200 \
--fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE2NDY3OTk4MDk5NjE6dEJUTW9TLTdRV1d3RTN1cDBfaDRRdw \
--fleet-server-policy=fleet-server-policy \
--fleet-server-es-ca-trusted-fingerprint=0472a10f8a6a8a2499e32cb2d9fcb94837cbf521c35ee65afe425b8b313d8d76 \
--fleet-server-insecure-http
我们在 Elastic Agent 解压缩的目录中运行上面的命令:
我们看到成功的信息。
上面显示 Fleet Server 已经成功地连接上了。我们点击 Continue:
上面显示 status 为 updating。我们需要等一段时间:
上面的状态显示 Healthy,表明目前的 Fleet Server 已经成功地运行起来了。
几点说明:
- 强烈建议为每个 Fleet Server 创建一个唯一的 Service token。你可以使用 elasticsearch-service-tokens 来生成 service tokens
- 在上面,由于我们使用的自签名证书,所以,我们看到一个选项为 --fleet-server-insecure-http。如果你有自己的证书,你可以使用如下的命令来进行安装。必须注意的是 URL 必须与用于生成由 --fleet-server-cert 指定的证书的 DNS 名称匹配。
sudo ./elastic-agent install --url=https://192.0.2.1:8220 \
-f \
--fleet-server-es=https://192.0.2.0:9200 \
--fleet-server-service-token=AAEAaWVsYXN0aWcvZmxlZXQtc2VydmVyL3rva2VuLTE2MzIzNTYcNTQ3MjI6dER1eE9XbW5RRTZqNlJMWEdIRzAtZw \
--fleet-server-policy=27467ed1-1bfd-11ec-9b88-a7c3d83e2897 \
--certificate-authorities=<PATH_TO_CA> \
--fleet-server-es-ca=<PATH_TO_ES_CERT> \
--fleet-server-cert=<PATH_TO_FLEET_SERVER_CERT> \
--fleet-server-cert-key=<PATH_TO_FLEET_SERVER_CERT_KEY>
添加 Elastic Agent 到 Fleet
在上面,我们已经成功地运行了一个 Elastic Agent 到我们的 macOS 机器上。它事实上运行了一个 Elastic Agent。这个 Elastic Agent 可以用于收集 system 日志及指标。同时它在 macOS 上也安装了一个 Fleet Server。
Elastic Agent 是一个单一的统一代理,你可以将其部署到主机或容器以收集数据并将其发送到 Elastic Stack。 在后台,Elastic Agent 运行您的配置所需的 Beats shippers 或 Elastic Endpoint。
我们可以按照同样的方法来安装 Elastic Agent 到其它的机器上:
请注意,在上面的部署中,许多个 Elastic Agent 可以共同分享一个 Fleet Server。我们不必要为每个 Agent 分别创建一个单独的 Fleet Server。事实上,我们可以直接运行之前的那个 install 命令到其它的机器上,那么就可以在那个机器上安装一个 Elastic Agent。 比如,我运行之前的那个同样的命令到一个树莓派的机器上:
sudo ./elastic-agent install \
--fleet-server-es=https://192.168.0.3:9200 \
--fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE2NDY3OTk4MDk5NjE6dEJUTW9TLTdRV1d3RTN1cDBfaDRRdw \
--fleet-server-policy=fleet-server-policy \
--fleet-server-es-ca-trusted-fingerprint=0472a10f8a6a8a2499e32cb2d9fcb94837cbf521c35ee65afe425b8b313d8d76 \
--fleet-server-insecure-http
从上面,我们可以看出来两个机器的 Agents 的状态都是 Healthy。我们甚至可以创建其它的 policy,并把这个 agent 重新分配到其它的 policy 中去:
这里就不再累述了。
添加 APM integration
接下来,将 APM 集成添加到 Elastic Agent 使用的默认策略中。 策略跨一组弹性代理管理设置,并且可能包含任意数量的集成,用于从主机上运行的各种服务收集可观察性数据。
我们首先来看看我们到底已经安装了那些 integrations:
从上图中,我们可以看出来有三个 integrations 已经被安装了。
我们也可以查看一下我们到底有那些 policies:
从上面,我们可以看到只有一个 Fleet Server policy。 我们可以点击 Create agent policy 按钮:
从上面我们可以看出来有一个新创建的 apm policy。点击上面的链接:
由于我们已经安装 Elastic Agent 到 macOS 的机器上了。我们可以不需要再进行 enroll。我们可以跳过这里的一些步骤。如果你是有新的机器,那么你需要按照这里的步骤一步一步地进行安装。
我们再次回到 Fleet 界面:
我们需要把当前的 macOS 安装的 liuxgm.local 这个 agent 分配到 apm policy 中去,这它可以帮我们采集数据:
安装 APM agents
APM 代理使用与你的服务相同的语言编写。 要监控新服务,你必须安装代理并使用服务名称、APM 服务器主机和秘密令牌对其进行配置。
- Service name:APM 集成将检测服务的名称(在每个 APM 代理的配置中定义)映射到其数据存储在 Elasticsearch 中的索引。 服务名称不区分大小写,并且必须是唯一的。 例如,你不能拥有一个名为 Foo 的服务和另一个名为 foo 的服务。 特殊字符将从服务名称中删除并替换为下划线 (_)。
- APM Server URL:APM 服务器侦听事件的主机和端口。 这应该与设置 APM 集成时定义的主机和端口相匹配。
- Secret token:APM 代理和 APM 服务器通信的身份验证方法。 这应该与设置 APM 集成时定义的秘密令牌相匹配。
下面,我来针对 Java APM agent 来做演示。如我找不到如何安装 agents 的指令,我们可以进入这个页面:
我们需要去下载 agent jar。
我们接下参考之前的文章 “Observability:如何为 Java 应用进行 APM” 。我们使用里面的例子来进行展示。我们把上面下载的文件拷贝到项目的根目录中去。
$ pwd
/Users/liuxg/demos/apm/opbeans-java/opbeans
$ ls
elastic-apm-agent-1.29.0.jar mvnw.cmd src
mvnw pom.xml target
我们使用如下的命令来编译这个 Java 应用:
mvn package
在编译的时候需要选择 Java 8,否则我们可能会有错误。我们可以找到的被编译好的 jar 文件:
$ ls target/opbeans-0.0.1-SNAPSHOT.jar
target/opbeans-0.0.1-SNAPSHOT.jar
我们参考这里的命令来进行修改:
java -javaagent:./elastic-apm-agent-1.29.0.jar \
-Delastic.apm.service_name=opbeans-java \
-Delastic.apm.server_urls=http://localhost:8200 \
-Delastic.apm.secret_token= \
-Delastic.apm.environment=production \
-Delastic.apm.application_packages=co.elastic.apm.opbeans \
-jar ./target/opbeans-0.0.1-SNAPSHOT.jar
运行上面的指令:
在上面,我们成功地启动了 Java Spring Boot 应用。我们带自己的浏览器,并输入地址:http://localhost:8080/
我们在上面的界面中进行一些操作从能够生产一些请求。我们将在后面的 APM 应用中来分析这些请求的性能。
查看数据
我们再回到 Kibana 的界面:
从上面,我们可以看到一个叫做 opbeans-java 的服务。这个是在我们上面的命令中定义的。
我们可以点击上面的 APIResController 来查看对性能影响最大的一个 transaction:
从这里我们可以看出来这个 transaction 的时间到底花在哪里了。
从上面的整个顺序来说,我们和之前的差别不大,只是我们现在可以通过 Fleet 来对 APM server 进行集中管理。这样更容易让我们管理。