《Elastic(中国)基础开发宝典》——添加免费且开放的 Elastic APM 作为Elastic可观测性部署的一部分(上):https://developer.aliyun.com/article/1220747?spm=a2c6h.13148508.setting.18.5c6c4f0eIizOJG
4. 使用 Elastic APM 代理装载示例代码
各种语言代理的指令会因编程语言而有所不同,但大致流程相似。首先,在语言的本机规范中添加代理的依赖项,然后配置代理,让它知道如何查找 APM 服务器。
您可以尝试任何您喜欢的类型,但我将使用我找到的全栈 Ruby 示例来演练 Ruby on Rails 说明。我在运行这个示例时确实遇到了一个问题,原来是类似于这个的 bootsnap 缓存问题。这个问题通过在我的 docker 文件中添加一行就可以解决:
volumes: - .:/app # 不要挂载 tmp 目录 - /app/tmp
它包含在我的上述存储库的分叉中。
首先,我克隆 GitHub 存储库,然后更改到以下目录:
git clone https://github.com/jamiesmith/docker-rails-example.git cd docker-rails-example
(如果没有安装git,只需下载一个zip文件并将其解压缩即可)
6. 添加依赖项
按照说明,我编辑了项目的依赖项规范(如果用的是Ruby,那就是Gemfile),并添加了 gem 'elastic-apm'。
我把它放在了靠近顶部的位置:
source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.7.2' # 启用 Elastic APM gem 'elastic-apm' # 捆绑边缘 Rails 代替:gem 'rails', github: 'rails/rails' gem 'rails', '~> 6.1.0'
保存文件并继续下一步一开始配置代理。
请注意,完整的Gemfile作为Gemfile.elastic-apm包含在存储库中。
7. 配置代理
代理需要将应用程序跟踪数据发送到APM服务器,所以必须能够访问到它。如果您 还记得,我们的配置是侦听主机IP,因此子网中的任何应用程序都可以向它发送数 据。我们需要在项目中添加另一个文件,以在项目开始时进行选取。在项目顶部的 config目录下新建一个文件,并添加以下类似于docs的注释:
# 设置服务名称 - 允许使用的字符:a-z、A-Z、0-9、-、_ 和空格 # 默认为 Rails 应用的名称 service_name: 'my-service' # APM 服务器需要密钥令牌时使用 # secret_token: '' # 设置自定义 APM 服务器 URL(默认:http://localhost:8200) server_url: 'http://192.168.1.175:8200' # 设置服务环境 environment: 'production'
对上述注释的一些解释:
• service_name:如果您忽略此项,它将默认为应用程序的名称,但您可以在此 处覆盖这个名称;
• secret_token:使用密钥令牌,您可以授权对APM服务器的请求,但APM服 务器必须设置了 SSL/TLS,并且已设置密钥令牌。我们没有在代理和APM服务 器之间使用HTTPS,因此我们会将这项注释掉;
• server_url:这是代理能够访问APM服务器的方式,请将它替换为主机的名称 或IP;
• environment:这允许您向服务添加元数据。例如,您可能在QA中有一个版 本,在生产中有另一个版本。
请注意,示例config文件作为config/e〔astic_apm.ymLe〔astic-apm包含在存储库中。
至此,Elastic APM端的配置已经完成,接下来只需按照README中的步骤启动即 可。我们复制两个文件,然后构建并运行:
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服务(我运行了我的服务,所以它显示了更多的历史记录):
服务概述页面对服务运行状况提供了一个总体性的概述。如果您是开发人员或SRE, 可以从这个页面中查看以下几个方面:
• 新部署对性能有何影响?
• 对哪些事务的影响最大?
• 性能如何与底层基础架构相关联?
这个视图列出了在指定时间段内(本例中为过去15分钟)向Elastic APM发送应用 程序跟踪数据的所有应用程序。此外,还有以迷你图形式显示延迟、吞吐量和错误 率的波形图。单击my-service,即会转到服务概述页面,其中显示了服务中的各种 事务(回想一下,我的脚本正在命中/和/up终端,它们是PageController的一部 分,如事务部分所示)。我们看到的图表,比如延迟、吞吐量、错误和错误率(目前 尚未出现错误)会更大,并且列出了此服务所依赖的服务和应用程序,在本例中, 它所依赖的唯一服务是Postgres:
当您在真实负载下装载实际应用程序时,您将看到更多的连接(和错误!)
单击事务视图中的事务(在本例中,显示的是我们示例应用的PagesController#up 事务)我们可以确切地看到调用了哪些操作:
或者,如果是更为复杂的调用其他微服务和外部服务的事务,我们看到的细节会更多:
包括有关调用外部服务(如数据库查询)的详细信息:
8.后续操作
至此,您的Elastic可观测性集群已设置好并开始运行,收集了开箱即用的应用程序 跟踪数据。接下来会探索您的应用程序所用语言的公共API,这会让您将APM数据 提升到下一个级别。使用这些API,您可以添加定制元数据,定义业务事务,创建定 制范围等。您可以在APM代理文档页面上找到各种APM代理(例如Java、Ruby 等)的公共API规范。如果您想了解有关Elastic APM的更多信息,请查看关于Elastic APM转向云原生的网络研讨会,了解Elastic APM可在您的生态系统中助您一臂之力的其他方式。