18 - Traces - 观察应用程序的效能瓶颈 (2/6) - 使用 APM-Integratoin-Testing 建立 Elastic APM 的模拟环境

Traces - 观察应用程序的效能瓶颈 系列文章


本篇学习重点

  • 如何使用 Elastic 官方提供的 APM Integration Testing 工具

前言

前面的章节介绍了 Elastic APM,由於 Elastic APM 的运作,会需要有实际的应用程序及服务,让使用者把 APM Agent 埋进去,同时也要有足够复杂的情境,才能展示 APM 的相关功能,因此在这边直接使用 Elastic 官方所提供的一个开放原始码的专案 - APM Integration Testing,让我们透过这个专案所建立的情境,快速的架设一组实际的 Elastic APM 解决方案及实用实例,从中学习 Elastic APM 的布署方式与使用方法。

简介 APM Integration Testing

APM Integration Testing 是一个公开在 GitHub 的开放原始码的专案,这个专案主要语言是用 Python 撰写,并且使用 Docker 来运作 Elastic Stack 的各种服务以及 opbeans 这个 Demo 专用的库存管理系统,让我们能够拥有一个 Elastic APM 所需要执行的情境,并且能够将当中的某些元件替换成真实运作的版本,可以协助开发人员进行 debug,或是协助整合测试 (Integration Test) 所需使用的复杂的环境。

包含的角色

以下几种角色,是 APM Integration Testing 的 Docker Containers 运作起来时,里面有的角色:

  • Elastic Stack
    • Elasticsearch
    • Kibana
    • APM Server
    • Heartbeat
    • Filebeat
    • Metricbeat
    • Packetbeat
  • opbeans 库存管理系统的各种语言版本的实作,并且埋入 APM Agent
    • opbeans-go
    • opbeans-java
    • opbeans-ruby
    • opbeans-dotnet
    • opbeans-node
    • opbeans-python
  • 针对 opbeans 库存管理的系统的 node.js 版本,实作 Real User Monitoring
    • opbeans-rum
  • opbeans 所使用到的 Database 或是 Cache 等服务
    • PostgreSQL
    • Redis
  • 自动模拟存取流量的 opbeans-load-generator
  • 专门制造错误情况发生,让压测能更拟真的 Dyno

APM Integration Testing 就是以这些角色组成一个让我们可以进行测试及使用的环境,以下画面,是使用预设配置所建立的环境当中所包含的角色:

18-apm-tools-service-map

安装 APM Integration Testing

接下来说明安装 APM Integration Testing 的步骤及要注意的事项。

准备环境

在执行 APM Integration Testing 的环境,我们会需要准备:

  • Docker
  • Docker compose
  • Python 3

注意:Mac M1 目前实测 build 到 RUM 的部份时,会发生 chrome 相关套件的错误,所以请不要用 M1 来执行。

执行 APM Integration Testing

要执行 APM Integration Testing,首先我们将整个专案从 GitHub 抓下来:

git clone https://github.com/elastic/apm-integration-testing.git

里面有一个 Python 程序 ./scripts/compose.py,会是主要的执行档,我们先透过这们程序来安装一个『完整版』的环境:

./scripts/compose.py start --all 7.15.0 --release

主要的参数如下:

  • start:初始化并且启动整个所有的环境。
  • --all:完整版的各种服务及元件都会进行安装
  • 7.15.0:Elastic Stack 的指定版本
  • --release:使用 release 的版本 (如果不指定的话,会使用 snapshot 的版本)。

其他可选用的参数,因为支援的参数非常非常多,我这边只举几个例子:

  • --with-opbeans-java:当我们不使用 --all 时,可以指定我们要安装哪些版本的 opbeans 环境。

  • --no-apm-server:不要启动 APM Server。

  • --no-kibana--no-elasticsearch:不要启动 Kibana、Elasticsearch,也可以另外指定外部的 Elasticsearch 或 Kibana。

  • --with-dyno:启动 Dyno Mode。

一开始执行时,因为会 build 相关的 Docker image,会跑蛮久的,以下是执行的 gif 画面。

apm-int-testing-compose

Docker-Compose

当执行完 start 之後,会在执行的目录底下,建立一个 docker-compose.yml 的档案,并且实际执行的运作,就是透过 docker-compose 运作起来。

因此我们後续可以使用 docker-compose stopdocker-compose up 等指令来停止或启动,也可以直接去修改 docker-compose.yml 里面的一些配置。

查看 APM Integration Testing 所建立的环境

当安装及布署完成之後,我们可以直接从 Kibana 查看,这边注意预设是有开启 X-Pack Security,并且预设的密码会是 changeme

18-kibana-login

登入之後,我们就可以在 Observability 的画面,查看由 APM Integration Testing 这个环境及里面的流量产生工具,所产生出来的各种服务存取的资讯,我们就有许多 APM 的资料可以来查看 APM 所提供的功能。

以下是使用 gif 档来录制操作的画面:

18-apm-int-testing-kibana-overview

压测时的好帮手 - Dyno Mode

APM Dyno 是一个能帮我们在 opbeans 的这些运作的 demo 环境之中,建立出一些情境,这些情境是能协助我们进行压测时,能模拟出更接近真实情境的环境,

例如:

  • 容器里的 CPU 能力
  • 容器里的 Memory 数量
  • 网路的 latency
  • 网路频宽
  • 网路不稳的状况
  • 产生压测请求的 worker 数量
  • 产生一定比例的 Error rate

这些功能有透过 UI 的方式让我们能直接进行调整,并且可以针对某一台 Container 进行指定。

18-apm-dyno

不过 Dyno mode 只有提供 opbeans-python 版本能使用,并不是所有的 opbeans 版本都支援。

注意:官方文件写的指令 --dyno 实际使用时发现是写错的,是要带入 --with-dyno 才是正确的。

使用云端主机服务 AWS 或 GCP

文件中有特别提到,如果使用的是 AWS、GCP 这种云端主机服务时,要用 APM Integration Testing 的这个工具,可以透过 port forwarding 的方式来转接。

例如以下在 ~/.ssh/config 定义 gcptunnel 的这台主机:

Host gcptunnel
    HostName <my.gcp.host.ip>
    IdentityFile ~/.ssh/google_compute_engine           <--- yours may differ
    User jamie                                          <--- yours probably differs
    Compression yes
    ExitOnForwardFailure no
    LocalForward 3000 127.0.0.1:3000
    LocalForward 3001 127.0.0.1:3001
    LocalForward 3002 127.0.0.1:3002
    LocalForward 3003 127.0.0.1:3003
    LocalForward 3004 127.0.0.1:80
    LocalForward 5601 127.0.0.1:5601
    LocalForward 8000 127.0.0.1:8000
    LocalForward 9200 127.0.0.1:9200
    LocalForward 9222 127.0.0.1:9222

并使用 ssh gcptunnel 来执行。

参考资料

  1. GitHub: APM Integration Testing

查看最新 Elasticsearch 或是 Elastic Stack 教育训练资讯: https://training.onedoggo.com
欢迎追踪我的 FB 粉丝页: 乔叔 - Elastic Stack 技术交流
不论是技术分享的文章、公开线上分享、或是实体课程资讯,都会在粉丝页通知大家哦!


<<:  [Day25] Vue 3 - 认识框架

>>:  【领域展开 18 式】 我的 Bluehost 帐密不是我 WordPress 的帐密

线性串列的循序储存 - DAY 4

定义 指的是用一段连续的储存单元一次储存线性串列的资料元素 优缺 优点: 无须为表示串列中元素之间的...

DAY 05 实作环境配置 - 2

安装套件 Visual Studio Code 上有很多方便编写程序的扩充套件,能让我们在使用上更加...

D11 新增测试页

新增一个测试页 主要是进行对资料库的动作 还有前端的展示 可以在浏览器上按F5就快速新增测试资料到资...

【PHP Telegram Bot】Day09 - 用 PHP 主动接收和发送讯息吧!

前置作业 复制程序码 还记得前天最後建立的资料夹吗,把它用 VS code 打开,再建立一个 php...

你想成为的是?

早起运动Day11 - 来自周遭的祝福​ ​ 「你知道吗?当时最让我触动的地方,是你接受了我的情绪。...