在最近的一篇文章中,我们向您展示了如何开始使用 Elastic 可观测性的免费开放层。下面,我们将逐步介绍您需要做些什么来扩展您的部署,以便您可以开始从可观测性集群中的应用程序性能监控 (APM) 或“跟踪”数据中免费收集指标。
什么是 APM?
应用程序性能监控可让您了解应用程序花费的时间、它们正在做什么、它们正在调用哪些其他应用程序或服务以及它们正在遇到的错误或异常。
此外,APM 还允许您查看关键性能指标(如延迟和吞吐量)以及事务和依赖性信息的历史记录和趋势
无论您是在为 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", "https://127.0.0.1:8200"),}
elasticapm.instrumentation.control.instrument()
client = Client(app.config["ELASTIC_APM"])
Flask 的 Python 库能够自动检测事务,但您也可以按照以下示例在代码中启动事务,就像我们在本示例中所做的那样
@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 Server 的请求,但它们要求 APM Server 设置了 SSL/TLS 并且设置了密钥令牌。我们不在代理和 APM Server 之间使用 HTTPS,因此我们将注释掉此项。
- server_url: 这是代理如何访问 Elastic Agent 内的 APM 集成的方式。将其替换为运行 Elastic Agent 的主机的名称或 IP。
现在,Elastic APM 端的配置已完成,我们只需按照 README 中的步骤进行启动。
docker-compose up --build -d
构建步骤将需要几分钟时间。
您可以通过访问 https://127.0.0.1:5001 导航到正在运行的示例应用程序。示例中没有太多内容,但它会生成一些 APM 数据。要生成一些负载,您可以重新加载几次页面或运行一个快速小脚本
#!/bin/bash
# load_test.sh
url="https://127.0.0.1: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 将我们带到服务概览页面,该页面显示服务内的各种事务(回想一下,我的脚本正在点击 / 端点,如 Transactions 部分所示)。我们得到了更大的 Latency(延迟)、Throughput(吞吐量)、Errors(错误)和 Error Rates(错误率)图表。
当您在真实负载下检测真实应用程序时,您会看到更多的连接(和错误!)
在事务视图中单击一个事务,在本例中,是我们的示例应用程序的 demo-transaction 事务,我们可以准确地看到调用了哪些操作
这包括关于外部服务调用的详细信息,例如数据库查询
下一步是什么?
既然您已经启动并运行了 Elastic Observability 集群,并且正在收集开箱即用的应用程序跟踪数据,请探索您的应用程序正在使用的语言的公共 API,这使您可以将 APM 数据提升到一个新的水平。这些 API 允许您添加自定义元数据、定义业务事务、创建自定义 span 等。您可以在 APM 代理文档页面上找到各种 APM 代理(例如 Java、 Ruby、Python 等)的公共 API 规范。
如果您想了解有关 Elastic APM 的更多信息,请查看我们在向云原生转变中关于 Elastic APM 的网络研讨会,以了解 Elastic APM 如何在您的生态系统中为您提供帮助的其他方法。
如果您决定希望我们托管您的可观测性集群,您可以注册 Elastic Cloud 上的 Elasticsearch Service 的免费试用版,并更改您的代理以指向您的新集群。
最初发布于 2021 年 5 月 5 日;更新于 2023 年 4 月 6 日。