Observability:在 Elastic Observability 部署中添加免费和开放的 Elastic APM
2021年5月17日 | by mebius
在最近的一篇文章中,我们向你展示了如何开始使用 Elastic Observability 的免费开放层。 今天,我们将逐步介绍扩展部署所需的操作,以便你可以免费从应用程序性能监视(APM)或 “可观测性” 群集中的 “跟踪” 数据中收集指标。
什么是 APM?
通过应用程序性能监视,你可以查看应用程序在哪里花费的时间,它们在做什么,它们在调用什么其他应用程序或服务以及遇到什么错误或异常。
此外,APM 还使你可以查看关键性能指标的历史和趋势,例如延迟和吞吐量,以及事务和相关性信息:
无论你是针对违反 SLA 的行为设置警报,尝试评估最新版本的影响,还是决定下一步的改进,APM 都可以帮助你进行根本原因分析,以帮助改善用户体验并推动你的发展平均解决时间(MTTR)接近零。
逻辑架构
Elastic APM 依赖于 APM 服务器,该服务器将应用程序跟踪和指标数据从装有 APM 代理的应用程序转发到 Elastic Observability 集群。 Elastic APM 支持多种不同的代理风格:
- 本机 Elastic APM 代理,可用于多种语言,包括 Java,.NET,Go,Ruby,Python,Node.js,PHP 和客户端 JavaScript
- 带有 OpenTelemetry 的代码
- 带有OpenTracing 的代码
- 用 Jaeger 编写的代码
在此博客中,我们将提供一个简单的示例,说明如何使用本机 Elastic APM Ruby 代理检测代码,但是其他语言的总体步骤相似。
设置 APM 服务器
APM 服务器将跟踪和应用程序指标数据从 APM 代理转发到 Elasticsearch。 要将 APM 数据添加到你的 Elastic Observability 集群中,我们可以按照 Kibana 中的高级说明进行操作。 在 Kibana 里,它将检测你是在 Elastic Cloud(我们的托管 Elasticsearch 服务)中运行还是在运行自我管理的集群。 就我而言,它是自我管理的。 一旦我们确认Elasticsearch 和 Kibana 正在运行,就可以连接到我们的 Kibana 实例。 如果你不记得 Kibana URL,则可以在 Kibana 日志的开头找到它。 例如,我的有:
log [07:30:58.643] [info][server][Kibana][http] http server running at https://192.168.1.175:5601
登录到 Kibana 后(在我的情况下,使用 elastic/password),单击 “汉堡包(Elastic Logo )”,然后从主菜单中选择 APM,导航到 APM 应用程序:
Kibana 检测到尚无任何 APM 数据,并通过指示链接提示我:
从那里开始,它提供了一系列步骤。
我们将严格按照说明进行操作; 我使用的是自签名证书,因此我需要执行一些额外的步骤,但是大概步骤是相同的。
- 下载 APM 服务器
- 将 APM 服务器连接到 Elasticsearch
- 将代理连接到 APM 服务器
步骤1:下载APM服务器
Elastic APM 和 APM Server 是 Elastic Observability 的免费和开放层的一部分-如果你愿意,可以下载源代码,如果要进行增强则可以提交 PR (pull request),或者在遇到问题时可以提交问题。
按照 Kibana 中的说明,我们从与操作系统匹配的说明开始。 我在 Mac 上运行,因此我将按照这些说明进行设置。 第一步,我们下载了APM Server tarball(或所选操作系统系列使用的任何安装包类型)并进行安装。 对于 MacOS,这只是意味着将其解压缩并更改为新创建的目录:
curl -L -O https://artifacts.elastic.co/downloads/apm-server/apm-server-7.12.0-darwin-x86_64.tar.gz
tar xzvf apm-server-7.12.0-darwin-x86_64.tar.gz
cd apm-server-7.12.0-darwin-x86_64/
进入 apm-server-7.12.0-darwin-x86_64 目录后,我们会看到一些文件:
~/elk/apm-server-7.12.0-darwin-x86_64 $ >ls -lF
total 132724
-rw-r--r-- 1 jamie staff 13K Mar 18 01:07 LICENSE.txt
-rw-r--r-- 1 jamie staff 1.1M Mar 18 01:07 NOTICE.txt
-rw-r--r-- 1 jamie staff 661B Mar 18 01:29 README.md
-rwxr-xr-x 1 jamie staff 123M Mar 18 03:11 apm-server*
-rw------- 1 jamie staff 52K Mar 18 01:08 apm-server.yml
-rw-r--r-- 1 jamie staff 323K Mar 18 01:08 fields.yml
drwxr-xr-x 3 jamie staff 96B Mar 18 01:08 ingest/
包括一些文档,字段规范,配置文件和 APM Server 可执行文件。
步骤2:编辑APM服务器配置
这是我们将略微偏离说明的地方。 我们仍将设置 Elasticsearch 输出部分:
output.elasticsearch:
hosts: [""]
username:
password:
但是,由于 Elasticsearch 使用的是自签名证书,因此我们也需要对其进行配置。
就我而言,Elasticsearch 正在监听 “https://192.168.1.175:9200″,因此我们将使用它来设置值对于 hosts 和 protocol keys:
output.elasticsearch:
hosts: ["192.168.1.175:9200"]
protocol: "https"
我们可以使用 elastic 用户将 APM 服务器连接到 Elasticsearch,但是 APM 服务器不需要超级用户特权。 我将创建一个角色,该角色具有工作所需的最少特权,并将其称为apm_server。 我们在 Kibana 的 “Security Management” 部分中进行了此操作。 要到达那里,请单击 Kibana 左上方的汉堡包图标,然后导航到 “Stack Management”,我们在其中找到 Security 部分。 单击角色,然后单击创建角色,然后添加 apm_server 角色:
然后保存。 接下来,选择 “User”→“Create user”,然后添加 apm_server_user:
当然,你可以为角色和用户使用自己的名称,或者如上所述,仅对 elastic 用户进行试验。
接下来,我们还将要使用的用户名和密码的凭据添加到配置中,因此现在看起来像这样:
output.elasticsearch:
hosts: ["192.168.1.175:9200"]
protocol: "https"
username: "apm_server_user"
password: "password"
我们即将能够启动 APM 服务器,但是如果这样做,我们将遇到有关由未知授权机构签署的证书的错误:
./apm-server -e {“log.level”:”error”,”@timestamp”:”2021-04-27T13:21:51.497-0400″,”log.logger”:”publisher_pipeline_output”,”log.origin”:{“file.name”:”pipeline/output.go”,”file.line”:154},”message”:”Failed to connect to backoff(elasticsearch(https://192.168.1.175:9200)): Get “https://192.168.1.175:9200″: x509: certificate signed by unknown authority”,”ecs.version”:”1.6.0″}
为了减轻这种情况,我们需要向 APM 服务器告知我们的证书颁发机构,对我而言,该证书颁发机构位于 ~/elk/elasticsearch 文件夹下。 首先,我们将 ca.crt 复制到 APM Server 的目录层次结构中(我们可以通过它现在的位置来引用位于 elasticsearch 目录下的证书,但是在现实世界中,你可能会在不同的主机上运行每个服务):
/Users/liuxg/elk/apm-server-7.12.0-darwin-x86_64
mkdir certs
cp ~/elk/elasticsearch/ca/ca.crt certs/
然后,通过向 apm_server.yml 的 elasticsearch.output 部分添加另一个密钥,将新的 ca.crt 指定为授权:
output.elasticsearch:
hosts: ["192.168.1.175:9200"]
protocol: "https"
username: "elastic"
password: "ThisIsTooEasy"
ssl.certificate_authorities: ["certs/ca.crt"]
步骤3:启动APM服务器
我们现在可以启动 APM Server,它将连接到 Elasticsearch,但是现在它仅在 localhost 上侦听。 我想对配置进行更多更改,以便它侦听主机 IP 而不是本地主机,以便防火墙后面的其他主机可以访问它。 在 apm-server.yml 文件顶部附近,有一个地方可以做到这一点。 我的 APM 服务器将与其他设备在同一台计算机上运行,因此我将使用相同tgcode的 192.168.1.175 地址,现在的配置如下所示:
apm-server:
# Defines the host and port the server is listening on. Use "unix:/path/to.sock" to listen on a unix domain socket.
host: "192.168.1.175:8200"
我们最终可以使用 ./apm-server -e 启动 APM 服务器(-e 使其运行的日志输出到 console 中,这对于启动时很有用)。
如果我们回到 Kibana,则 APM 应用程序中仍然没有任何显示,但是有一个小按钮 Check APM Server Status。 单击该按钮查看你是否得到信息 You have correctly set up APM Server:
你可能还已经注意到,状态检查下面还有一个关于 APM 代理的部分:
让我们在那里获取一些实际的数据!
使用 Elastic APM 代理插桩示例代码
各种语言代理的指令根据编程语言而有所不同,但从总体上讲,其流程类似。 首先,在语言的本机规范中添加代理的依赖关系,然后配置代理以使其了解如何查找 APM 服务器。
你可以尝试任何喜欢的口味,但是我将使用我发现的完整的 Ruby 示例来逐步了解 Ruby on Rails 的说明。 我确实遇到了一个问题,无法运行该示例,事实证明这是与此类似的引导缓存问题,此问题已通过在我的 docker 文件中添加一行来解决:
volumes:
- .:/app
# don't mount tmp directory
- /app/tmp
这包含在上述存储库的 fork 中。
获取示例代码(或使用你自己的代码)
首先,克隆 GitHub 存储库,然后转到目录:
git clone htgcodettps://github.com/jamiesmith/docker-rails-example.git
cd docker-rails-example
(如果你没有安装 git,则只需下载一个 zip 文件并将其展开)
添加依赖项
按照说明,我编辑项目的依赖关系规范(对于Ruby,这就是 Gemfile),并添加 gem ‘elastic-apm’。你可以在上面tgcode克隆的项目的根目录中发现一个叫做 Gemfile 的文件:
$ pwd
/Users/liuxg/elk/docker-rails-example
$ ls Gemfile
Gemfile
我只是把它扔在顶部附近:
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.7.2'
# enable Elastic APM
gem 'elastic-apm'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.1.0'
在上面,我们添加了 gem ‘elastic-apm’ 这一行。保存文件,然后继续下一步,配置代理。请注意,完整的 Gemfile 作为 Gemfile.elastic-apm 包含在存储库中。
配置代理
代理需要将应用程序跟踪数据发送到 APM 服务器,并且必须做到这一点。 如果你还记得的话,我们的配置为侦听主机的 IP,因此我们子网中的任何内容都可以向其发送数据。 我们需要向项目添加另一个文件,该文件将在启动时被拾取。 在项目顶部的 config 目录下创建一个新文件,并添加与文档类似的以下内容并添加注释:
config/elastic_apm.yml
service_name: 'my-service'
# Use if APM Server requires a secret token
# secret_token: ''
# Set the custom APM Server URL (default: http://localhost:8200)
# server_url: 'http://:8200'
server_url: 'http://192.168.1.175:8200'
# Set the service environment
environment: 'production'
关于以上内容的一些评论:
- service_name:如果省略此名称,它将仅默认为应用程序的名称,但是你可以在此处覆盖该名称。
- secret_token:秘密令牌允许你授权对 APM 服务器的请求,但要求使用 SSL/TLS 设置 APM 服务器,并且已经设置了秘密令牌。 我们不在代理和 APM 服务器之间使用HTTPS,因此我们将其注释掉。
- server_url:这是代理可以访问 APM 服务器的方式,将其替换为主机的名称或 IP。
- environment:这允许你将元数据添加到服务中。 例如,你可能在质量检查中有一个版本,而在生产中又有一个版本。
请注意,示例配置文件以 config/elastic_apm.yml.elastic-apm 的形式包含在存储库中。
现在已经完成了配置的弹性 APM 端,我们只需按照自述文件中的步骤进行启动。 我们复制两个文件,然后生成并运行:
cp .env.example .env
cp docker-compose.override.yml.example docker-compose.override.yml
docker-compose up --build
构建步骤将花费几分钟。 完成后,在同一目录的另一个终端窗口中,运行:
./run rails db:setup
来设置初始数据库。
你可以通过访问 http://localhost:8000 和 http://localhost:8000/up 导航到正在运行的示例应用程序。 该示例没有太多内容,但它确实会生成一些 APM 数据。 要产生一点负载,你可以将它们重新加载几次,或运行一个快速的小脚本:
while [ 1 ]
do
curl localhost:8000/up
curl localhost:8000
sleep 1
done
它将每秒重新加载页面。
返回 Kibana,导航回 APM 应用程序(汉堡图标,然后选择 APM),你将看到我们的 my-service:
“Sevice Overview” 页面提供了一个服务运行状况摘要。如果你是开发人员或 SRE,则此页面将帮助你回答以下问题:
- 新部署如何影响性能?
- 影响最大的交易是什么?
- 性能如何与基础架构相关联?
该视图提供了在指定时间段(在本例中为最后15分钟)内已将应用程序跟踪数据发送到 Elastic APM 的所有应用程序的列表。也有迷你图显示了延迟,吞吐量和错误率的微型图。单击 my-service 将带我们进入服务概述页面,该页面显示了服务内的各种事务(请注意,我的脚本正在访问 / 和 /up 端点,这是 PageController 的一部分,在 Transactions 部分中看到)。我们获得了更大的延迟,吞吐量,错误和错误率(没有错误)图表,并列出了该服务所依赖的服务和应用程序,在这种情况下,它所依赖的唯一服务是 Postgres:
在测试实际应用程序时,在实际负载下,你会看到更多的连接性(以及错误!)。
在事务视图中单击事务,在本例中为示例应用程序的 PagesController#up 事务,我们可以确切地看到被调用的操作:
但是,通过调用其他微服务和外部服务的更复杂的事务,我们可以看到更多详细信息:
包括有关调用外部服务(例如数据库查询)的详细信息:
下一步是什么?
既然你已经启动并运行了 Elastic Observability 集群并收集了现成的应用程序跟踪数据,请探索应用程序所使用语言的公共 API,从而使你可以将 APM 数据用于下一个级别。 使用API,你可以添加自定义元数据,定义业务交易,创建自定义范围等。 你可以在 APM 代理程序文档页面上找到各种 APM 代理程序(例如 Java,Ruby 等)的公共 API 规范。 如果你想了解有关 Elastic APM 的更多信息,请查看我们在 Elastic APM 上的网络研讨会,转向向云原生迁移,以了解 Elastic APM 在你的生态系统中可以为你提供帮助的其他方式。
如果你决定让我们托管您的可观察性集群,则可以注册 Elastic Cloud 上的 Elasticsearch Service 的免费试用版,并更改代理以指向你的新集群。
文章来源于互联网:Observability:在 Elastic Observability 部署中添加免费和开放的 Elastic APM