作者:David Hope
在最近的一篇博文中,我们向你展示了如何开始使用 Elastic 可观察性的免费开放层。 下面,我们将介绍你需要做些什么来扩展你的部署,这样你就可以开始免费从应用程序性能监控(APM)或跟踪集群中的数据中收集指标。
APM 是什么?
应用程序性能监控让你可以了解你的应用程序将时间花在哪里、它们在做什么、它们正在调用哪些其他应用程序或服务,以及它们遇到了哪些错误或异常。
此外,APM 还可以让你查看关键性能指标的历史和趋势,例如延迟和吞吐量,以及 transaction 和依赖信息:
无论你是要设置 SLA 违规警报、尝试衡量最新版本的影响,还是决定在何处进行下一次改进,APM 都可以帮助你进行根本原因分析,从而帮助改善用户体验并提高你的平均水平 解决时间(MTTR)趋近于零。
有关 Elastic APM 的更多介绍,请阅读文章 “Observability:应用程序性能监控/管理(APM)实践”。
逻辑架构
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 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"])
Flask 的 Python 库能够自动检测 transactions,但你也可以按照以下代码在代码中启动 transactions,就像我们在本例中所做的那样:
@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:秘密 token 允许你授权对 APM 服务器的请求,但它们要求 APM 服务器设置有 SSL/TLS 并且已经设置了秘密 token。 我们没有在代理和 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,此页面将帮助你回答以下问题:
- 新部署如何影响性能?
- 受影响最大的 transaction 是什么?
- 性能与底层基础设施有何关联?
此视图提供了在指定时间段(在本例中为过去 15 分钟)内已将应用程序跟踪数据发送到 Elastic APM 的所有应用程序的列表。 还有迷你图显示延迟、吞吐量和错误率的迷你图。 单击 flask-app 将我们带到 service overview 页面,该页面显示了服务中的各种 transaction(回想一下我的脚本正在访问 / 端点,如 Transactions 部分所示)。 我们得到了更大的延迟、吞吐量、错误和错误率图表。
当你在实际负载下检测真实应用程序时,你会看到更多的连接(和错误!)
单击交易视图中的 transaction,在本例中,我们的示例应用程序的 demo-transaction transaction,我们可以确切地看到调用了哪些操作:
这包括有关调用外部服务的详细信息,例如数据库查询:
下一步是什么?
现在你已经启动并运行了 Elastic 可观察性集群并收集了开箱即用的应用程序跟踪数据,探索应用程序使用的语言的公共 API,这使你可以将 APM 数据带到下一个等级。 这些 API 允许你添加自定义元数据、定义业务 transaction、创建自定义跨度(span)等。 你可以在 APM 代理文档页面上找到各种 APM 代理(例如 Java、Ruby、Python 等)的公共 API 规范。
如果你想了解有关 Elastic APM 的更多信息,请观看我们关于 Elastic APM 向云原生转变的网络研讨会,了解 Elastic APM 可以在你的生态系统中为你提供帮助的其他方式。
如果你决定宁愿让我们托管你的可观察性集群,你可以注册免费试用 Elastic Cloud 上的 Elasticsearch 服务,并更改你的代理以指向你的新集群。