工程

添加免费且开放的 Elastic APM 作为 Elastic 可观测性部署的一部分

在最近的一篇博文中,我们向大家介绍了如何开始使用 Elastic 可观测性的免费开放层。下面,我们将介绍扩展部署时所需的操作,以便您开始收集来自应用程序性能监测 (APM) 的指标,或者“跟踪”可观测性集群中的数据,所有这些都可以免费实现。

什么是 APM?

利用应用程序性能监测,您可以查看应用程序将时间花在哪些地方、在执行哪些操作、在调用哪些其他应用程序或服务,以及遇到了哪些错误或异常情况。

distributed-trace.png

此外,通过 APM,您还可以了解关键性能指标的历史记录和趋势,比如延迟和吞吐量,以及事务和依赖信息:

ruby-overview.png

无论您是针对 SLA 违规设置告警,还是要衡量最新版的影响,亦或是决定下次改进所涉及的方面,APM 都可以帮助您进行根本原因分析,进而改善用户体验,并不断缩短平均解决时间 (MTTR)。

逻辑架构

Elastic APM 会依赖 Elastic Agent 中的 APM 集成,用于将应用程序痕迹和指标数据从安装有 APM 代理的应用程序转发到 Elastic 可观测性集群。Elastic APM 支持多种代理类型:

  • 原生 Elastic APM 代理,支持多种语言,包括 Java、.NET、Go、Ruby、Python、Node.js、 PHP 和客户端 JavaScript
  • 已装载 OpenTelemetry 测量工具的代码
  • 已装载 OpenTracing 测量工具的代码
  • 已装载 Jaeger 测量工具的代码

在本篇博文中,我们会通过一个简单示例,说明如何使用原生 Elastic APM Python 代理来装载代码,但总体步骤其实与其他语言类似。

请注意,Elastic APM 代理Elastic Agent 之间有着很大的区别。正如您在上面的图表中看到的,这些组件截然不同,因此切勿将他们搞混。

安装 Elastic Agent

第一步是安装 Elastic Agent。您可以选择先安装 Fleet,也可以独立安装 Elastic Agent。按照本指南在某个位置安装 Elastic Agent。此操作将提供一个可供您命中的 APM 集成终端。请注意,在 Elastic Cloud 中不需要执行这一步骤,因为我们为您托管了 APM 集成。通过运行以下命令检查 Elastic Agent 是否已启动:

curl <ELASTIC_AGENT_HOSTNAME>:8200

使用 Elastic APM 代理装载示例代码

各种语言代理的指令会因编程语言而有所不同,但大致流程相似。首先,在语言的本机规范中添加代理的依赖项,然后配置代理,让它知道如何查找 APM 集成。

您可以尝试任何自己喜欢的类型,但我将使用我创建的 Python 示例来演练 Python 指令。

获取示例代码(也可用您自己的代码)

首先克隆 GitHub 存储库,然后更改到以下目录:

git clone https://github.com/davidgeorgehope/PythonElasticAPMExample
cd PythonElasticAPMExample

如何添加依赖项

添加 Elastic APM 依赖项的步骤很简单,只需在 Github 存储库检查 app.py 文件即可,然后您会注意到以下几行代码。

import elasticapm
from elasticapm import Client

app = Flask(__name__)
app.config["ELASTIC_APM"] = { "SERVICE_NAME": os.environ.get("APM_SERVICE_NAME", "flask-app"), "SECRET_TOKEN": os.environ.get("APM_SECRET_TOKEN", ""), "SERVER_URL": os.environ.get("APM_SERVER_URL", "http://localhost:8200"),}
elasticapm.instrumentation.control.instrument()
client = Client(app.config["ELASTIC_APM"])

Python Flask 库能够自动检测事务,但您也可以按照如下方式通过代码启动事务,就像我们在本例中所做的那样:

@app.route("/")
def hello():
client.begin_transaction('demo-transaction')
client.end_transaction('demo-transaction', 'success')

配置代理

代理需要将应用程序痕迹数据发送到 APM 集成,所以必须能够访问到它。我已将 Elastic Agent 配置为侦听本地主机 IP,因此子网中的任何应用程序都可以向它发送数据。从下面的代码中可以看出,我们使用 docker-compose.yml 来通过环境变量传入配置。请针对您自己的 Elastic 安装编辑这些变量。

# docker-compose.yml
version: "3.9"
services:
flask_app:
build: .
ports:
- "5001:5001"
environment:
- PORT=5001
- APM_SERVICE_NAME=flask-app
- APM_SECRET_TOKEN=your_secret_token
- APM_SERVER_URL=http://host.docker.internal:8200

对上述注释的一些解释:

  • service_name:如果您忽略此项,它将默认为应用程序的名称,但您可以在此处覆盖这个名称。
  • secret_token:使用密钥令牌,您可以授权对 APM 服务器的请求,但 APM 服务器必须设置了 SSL/TLS,并且已设置密钥令牌。我们没有在代理和 APM 服务器之间使用 HTTPS,因此我们会将这项注释掉。
  • server_url:这是代理在 Elastic Agent 内部访问 APM 集成的方式。请将此替换为运行 Elastic Agent 的主机的名称或 IP。

至此,Elastic APM 端的配置已经完成,接下来只需按照 README 中的步骤启动即可。

docker-compose up --build -d

构建步骤将需要几分钟的时间。

您可以通过访问 http://localhost:5001 前往正在运行的示例应用程序。虽然示例数量不多,但它确实生成了一些 APM 数据。要生成一点负载,您可以重新加载几次,也可以运行一个快速加载的小脚本:

#!/bin/bash
# load_test.sh
url="http://localhost:5001"
for i in {1..1000}
do
curl -s -o /dev/null $url
sleep 1
done

这样每秒都会重新加载页面。

返回 Kibana,重新转到 APM 应用(单击汉堡图标,然后选择 APM),您应该会看到新的 flask-app 服务(我运行了我的服务,所以它显示了更多的历史记录):

服务概述页面对服务运行状况提供了一个总体性的概述。如果您是开发人员或 SRE,可以从这个页面中查看以下几个方面: 

  • 新部署对性能有何影响?
  • 对哪些事务的影响最大?
  • 性能如何与底层基础架构相关联?

这个视图列出了在指定时间段内(本例中为过去 15 分钟)向 Elastic APM 发送应用程序痕迹数据的所有应用程序。此外,还有以迷你图形式显示延迟、吞吐量和错误率的波形图。单击 flask-app,即会转到服务概述页面,其中显示了服务中的各种事务(回想一下,我的脚本正在命中 / 终端,如事务部分所示)。我们得到了显示延迟吞吐量错误错误率的更大图表。

当您在真实负载下装载实际应用程序时,您将看到更多的连接(和错误!)

单击事务视图中的事务(在本例中,显示的是我们示例应用的 demo-transaction 事务),我们可以确切地看到调用了哪些操作:

这包括有关调用外部服务(如数据库查询)的详细信息:

后续操作

至此,您的 Elastic 可观测性集群已设置好并开始运行,收集了开箱即用的应用程序痕迹数据。接下来会探索您的应用程序所用语言的公共 API,这会让您将 APM 数据提升到新的水平。使用这些 API,您可以添加定制元数据,定义业务事务,创建定制范围等。您可以在 APM 代理文档页面上找到各种 APM 代理(例如 JavaRubyPython 等)的公共 API 规范。 

如果您想了解有关 Elastic APM 的更多信息,请查看关于 Elastic APM 转向云原生的网络研讨会,了解如何利用 Elastic APM 在您的生态系统中助您一臂之力的其他方式。

如果您决定让我们托管您的可观测性集群,则可以进行注册,以在 Elastic Cloud 上免费试用 Elasticsearch Service,并将您的代理更改为指向您的新集群。

最初发布于 2021 年 5 月 5 日;更新于 2023 年 4 月 6 日。