记一次试用阿里公有云ARMS(应用实时监控服务)产品

in DevOps with 0 comment

在阿里公有云上手抖买了云服务器ECS(Elastic Compute Service)好久了,花了几百大洋,肉痛。。。那时刚好正值阿里云ARMS(应用实时监控服务)开通试用,那就玩一把吧。ARMS是基于Agent的无侵入式APM(应用性能管理)方案,它对性能监控、分布式链路追踪、故障诊断都有很强的支持,包含应用监控、前端监控、容器监控甚至是自定义监控等非常大而全的功能,简直是一站式全家桶服务。

准备ECS环境

只有一台ECS,那就要物尽其用,体验ECS环境下的ARMS。对ECS进行操作,需先配置安全组规则,定义出入方向的端口等等,第一次SSH登录,需重置密码。考虑只有一台ECS环境,可能要测试多应用,安装Docker和Nginx环境。

1、安装docker环境,启动测试,判断是否安装成功

# 修改软件源
sudo yum-config-manager \
    --add-repo \
    https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

sudo sed -i 's/download.docker.com/mirrors.ustc.edu.cn\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
sudo yum makecache fast
sudo yum install docker-ce
sudo systemctl enable docker
sudo systemctl start docker
# hello world镜像测试服务
docker run hello-world

参考:https://yeasy.gitbooks.io/docker_practice/content/install/centos.html

2、docker下安装nginx

# 安装Nginx,并挂载资源和配置
docker run -d -p 80:80 --name nginx-web \
  -v /home/nginx/www:/usr/share/nginx/html \
  -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
  -v /home/nginx/logs:/var/log/nginx \
  nginx

vi /home/nginx/www/index.html 编写测试首页

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Nginx test !!!</title>
</head>
<body>
    <h1>Nginx</h1>
    <p>Hello,wenqy!</p>
</body>
</html>

vi /home/nginx/conf/nginx.conf配置路由到首页

server {
        listen       80;
        #server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }
}

curl 127.0.0.1:80 测试访问

3、docker镜像加速

开通镜像服务器:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

公网访问

ECS安全组规则里,配置入口方向,开放端口,0.0.0.0/0

curl 123.56.xxx.xxx访问

image-20201113151306820

RDS环境

准备RDS环境,有条件的同学也可以购买RDS(关系型数据库服务),进行RDS操作时,需添加白名单和安全组,申请外网地址,创建数据库账号等等。

ARMS环境

阿里云官网,开通ARMS试用,注意不要选择专业版,专业版按量付费,不差钱的那就另说了。

单应用测试

Docker安装demo应用

准备应用,从start.aliyun.com (类似https://start.spring.io/在线项目初始化器)下载 demo

mvn clean install
java -jar demo-0.0.1-SNAPSHOT.jar 

启动失败,提示没有清单属性,META-INF没有定义主类

修改插件配置

<plugin>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-maven-plugin</artifactId>
	<version>2.2.6.RELEASE</version>
	<executions>
         <execution>
           <goals>
              <goal>repackage</goal>
           </goals>
         </execution>
    </executions>
	<configuration>
		<mainClass>com.wenqy.demo.DemoApplication</mainClass>
	</configuration>
</plugin>

还要写controller类,来暴露REST服务,本想体验一把start.aliyun.com的便捷性,可能我操作不对,直接放弃,改用之前写的demo

https://github.com/wenqy/java-study/tree/master/spring-security-study/securing-web

准备好应用和Dockerfile文件后,构建demo镜像

[root@iZ2ze7666pvq2l4otgrbseZ securing-web]# docker build -t wenqy/securing-web:1.0.0 .
Sending build context to Docker daemon  20.98MB
Step 1/4 : FROM openjdk:8-jdk-alpine
8-jdk-alpine: Pulling from library/openjdk
e7c96db7181b: Pull complete 
f910a506b6cb: Pull complete 
c2274a1a0e27: Pull complete 
Digest: sha256:94792824df2df33402f201713f932b58cb9de94a0cd524164a0f2283343547b3
Status: Downloaded newer image for openjdk:8-jdk-alpine
 ---> a3562aa0b991
Step 2/4 : COPY securing-web-0.0.1-SNAPSHOT.jar /securing-web-0.0.1-SNAPSHOT.jar
 ---> d4b27dd36821
Step 3/4 : ENTRYPOINT ["java","-jar","/securing-web-0.0.1-SNAPSHOT.jar"]
 ---> Running in fbc474735d0b
Removing intermediate container fbc474735d0b
 ---> 13efd600069c
Step 4/4 : EXPOSE 8080
 ---> Running in d11d875488b3
Removing intermediate container d11d875488b3
 ---> ea41dcbbfac0
Successfully built ea41dcbbfac0
Successfully tagged wenqy/securing-web:1.0.0
[root@iZ2ze7666pvq2l4otgrbseZ securing-web]# docker images
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
wenqy/securing-web   1.0.0               ea41dcbbfac0        9 seconds ago       126MB
nginx                latest              ed21b7a8aee9        3 weeks ago         127MB
openjdk              8-jdk-alpine        a3562aa0b991        11 months ago       105MB
hello-world          latest              fce289e99eb9        15 months ago       1.84kB

运行容器应用,测试是否启动成功

[root@iZ2ze7666pvq2l4otgrbseZ securing-web]# docker run -d -p 8080:8080 --name securing-web  wenqy/securing-web:1.0.0
02f8d461e6b9566ccd84d225f8d6d301a057650d2334bda3b5b5174ec80d04cd
[root@iZ2ze7666pvq2l4otgrbseZ securing-web]# docker ps
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS              PORTS                    NAMES
02f8d461e6b9        wenqy/securing-web:1.0.0   "java -jar /securing…"   5 seconds ago       Up 5 seconds        0.0.0.0:8080->8080/tcp   securing-web
3a5f171848e0        nginx                      "nginx -g 'daemon of…"   8 days ago          Up 7 days           0.0.0.0:80->80/tcp       nginx-web
[root@iZ2ze7666pvq2l4otgrbseZ securing-web]# curl localhost:8080
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Spring Security Example</title>
    </head>
    <body>
        <h1>Welcome!</h1>

        <p>Click <a href="/hello">here</a> to see a greeting.</p>
    </body>
</html>[root@iZ2ze7666pvq2l4otgrbseZ securing-web]# 

配置Nginx,将请求转发至应用端口,其中ifconfig 使用docker0的ip

location / {
     proxy_pass http://172.17.0.1:8080;
}

docker restart nginx重启nginx后,查看效果,访问成功

image-20201113154057488

Docker安装demo应用Agent

1、准备ARMS的licenseKey

ARMS控制台要接入的应用里获取licenseKey

2、集成已有镜像

编辑Dockerfile文件来集成镜像,注意修改应用和licenseKey。

##       RMS APM DEMO Docker    ###
##          For Java            ###
##      withAgent   V0.1        ###
##                              ###
###################################
FROM wenqy/securing-web:1.0.0
WORKDIR /root/
# 请根据所在地域替换探针的下载地址。
RUN wget "http://arms-apm-hangzhou.oss-cn-hangzhou.aliyuncs.com/ArmsAgent.zip" -O ArmsAgent.zip
RUN unzip ArmsAgent.zip -d /root/
# LicenseKey 在控制台应用监控接入页面查看。
# AppName 为用户自定义 ARMS 监控应用名称,用户名暂不支持中文。
# 若所有镜像都接入同一个应用监控任务,配置此处的 arms_licenseKey 和 arms_appName 即可。
# 若需将镜像接入其他应用监控任务,可在 docker run 中使用 -e 参数指定该应用的 arms_licenseKey 和 arms_appName 参数,以覆盖此处的配置。
ENV arms_licenseKey=ARMS控制台分配的Key
ENV arms_appName=ARMS控制台接入应用
ENV JAVA_TOOL_OPTIONS ${JAVA_TOOL_OPTIONS} '-javaagent:/root/ArmsAgent/arms-bootstrap-1.7.0-SNAPSHOT.jar -Darms.licenseKey='${arms_licenseKey}' -Darms.appName='${arms_appName}
### for check the args
RUN env | grep JAVA_TOOL_OPTIONS
### 下面可加入用户 自定义 dockerfile 逻辑。
### ......

3、构建并启动新镜像

构建Agent镜像

docker build -t wenqy/arms-springboot:1.0.0 -f Dockerfile .

启动Agent镜像

docker run -d -e "arms_licenseKey=xxxxxx" -e "arms_appName=application" -p 8081:8080 wenqy/arms-springboot:1.0.0

启动成功后,登录ARMS控制台,进行结果验证

编写脚本,对应用进行访问,预热

#!/bin/bash
while true
do
curl localhost:8081
sleep 1
done

监控信息有一定延迟,一段时间后查看控制台

查看接入应用列表

image-20200424151739176

查看应用metric概览统计分析

image-20200424152057519

查看应用详情监控信息,JVM监控

image-20200424152203039

查看应用详情监控信息,CPU、内存、磁盘等主机监控

image-20200424152321428

应用诊断,线程分析,分析线程栈信息

image-20200424152807520

docker安装探针,参考:https://help.aliyun.com/document_detail/85906.html?spm=a2c4g.11186623.6.588.58b8e108Khh65I

决定应用上下文id的名称org.springframework.boot.context.ContextIdApplicationContextInitializer.getApplicationId(ConfigurableEnvironment)

微服务应用测试

准备应用

像单应用测试一样准备多个微服务应用demo

account-demo https://github.com/wenqy/springcloud-study/tree/master/account-demo

order-demo https://github.com/wenqy/springcloud-study/tree/master/order-demo

inventory-demo https://github.com/wenqy/springcloud-study/tree/master/inventory-demo

eureka-server https://github.com/wenqy/springcloud-study/tree/master/eureka-server

涉及数据库的,对RDS数据库表初始化

构建并启动镜像

Docker构建微服务demo镜像

docker build -t weny/account-demo:1.0.0 .
docker build -t weny/order-demo:1.0.0 .
docker build -t weny/inventory-demo:1.0.0 .
docker build -t weny/eureka-server:1.0.0 .

然后像单应用测试一样为每个微服务demo应用安装Agent镜像,最后启动Agent镜像

docker run -d -p 8400:8400 --name order-demo wenqy/agent-order-demo:1.0.0
docker run -d -p 8401:8401 --name inventory-demo wenqy/agent-inventory-demo:1.0.0
docker run -d -p 8402:8402 --name account-demo wenqy/agent-account-demo:1.0.0
docker run -d -p 9000:9000 --name eureka-server wenqy/eureka-server:1.0.0

测试应用链路是否正常

[root@iZ2ze7666pvq2l4otgrbseZ ~]# curl -X POST "http://172.17.0.1:8400/order/orderPay?amount=1&count=1"
success[root@iZ2ze7666pvq2l4otgrbseZ ~]# curl -X POST "http://172.17.0.1:8400/order/orderPay?amount=1&count=1"
success[root@iZ2ze7666pvq2l4otgrbseZ ~]# 

服务调用关系

order-service -> account-service
	      -> inventory-service

成功插入订单,服务调用正常

image-20200424210440614

编写访问请求的脚本,让监控探针采集一段时间

#!/bin/bash
while true
do
curl -X POST "http://172.17.0.1:8400/order/orderPay?amount=1&count=1"
sleep 2
done

登录控制台,等待一段时间查看结果

ARMS图例

调用链路查询,查询调用链路列表

image-20200424212804528

调用链路详情,查看调用关系和耗时

image-20200424212847358

调用链路方法栈,查看方法栈耗时

image-20200424212906055

应用列表,加入探针的应用列表

image-20200424213006101

应用总览,CPU、内存等系统信息

image-20200424213202626

应用总览,慢调用统计分析信息

image-20200424213120089

应用总览,服务拓扑图

image-20200424213248959

应用详情,SQL分析,SQL调用次数和平均耗时

image-20200424213353984

应用详情,异常分析,异常统计及异常堆栈

image-20200424213410635

应用详情,错误分析

image-20200424213421806

应用详情,接口快照

image-20200424213454698

接口调用,错误分析

image-20200424213547982

接口调用,链路下游

image-20200424213612952

数据库调用,QPS、响应时间统计

image-20200424213755250

外部调用,HTTP状态统计、错误数统计等等

image-20200424213821169

应用诊断,异常分析

image-20200424213944981

进入Agent容器,查出探针日志

~/diamond/fixed-139.196.135.144_diamond/snapshot-tenant/c845a7b4-23a1-4f28-a380-5ab30d8a280f/cn-hangzhou # cat arms.trace.cj44pq0njo-3a979069aa8c619 
{"profiler":{"agent":{"logger":{"level":"WARN"}},"enable":true,"sampling":{"enable":true,"rate":100,"deadline":1587738635558},"dubbo":{"enable":true},"googlehttpclient":{"enable":true},"hsf":{"enable":true},"httpclient3":{"enable":true},"httpclient4":{"enable":true},"jdkhttp":{"enable":true},"jetty":{"enable":true},"mybatis":{"enable":true},"mysql":{"enable":true},"okhttp":{"enable":true},"oracle":{"enable":true},"postgresql":{"enable":true},"redis":{"enable":true},"spring":{"enable":true},"springboot":{"enable":true},"tomcat":{"enable":true},"mongodb":{"enable":true},"lettuce":{"enable":true},"grpc":{"enable":true},"thrift":{"enable":true},"defined":{"excludeurl":""},"thresholds":{"apdex":500,"sql":500,"interface":500,"limit":100},"callstack":{"maxLength":128},"callsql":{"maxLength":1024}}}~/diamond/fixed-139.196.135.144_diamond/snapshot-tenant/c845a7b4-23a1-4f28-a380-5ab30d8a280f/cn-hangzhou # 
~/diamond/fixed-139.196.135.144_diamond/snapshot-tenant/c845a7b4-23a1-4f28-a380-5ab30d8a280f/cn-hangzhou # 
cd ~
~ # ls -ltr
total 43816
-rw-r--r--    1 root     root      44865284 Apr 24 12:14 ArmsAgent.zip
drwxr-xr-x    1 root     root            18 Apr 24 12:23 ArmsAgent
drwxr-xr-x    3 root     root            43 Apr 24 13:40 diamond
drwxr-xr-x    5 root     root           104 Apr 26 02:34 logs
~ # cd logs/
~/logs # ls -ltr
total 2028
drwxr-xr-x    3 root     root            23 Apr 24 12:23 arms
drwxr-xr-x    2 root     root            32 Apr 24 12:23 diamond-client
drwxr-xr-x    2 root     root            57 Apr 26 02:34 spas
-rw-r--r--    1 root     root         44448 Apr 26 02:34 spring.log.2020-04-24.0.gz
-rw-r--r--    1 root     root       1350554 Apr 26 02:47 spring.log

查看镜像容器的依赖包,你会发现它依赖许多第三方开源组件,如:pinpoint、zipkin、opencensus等链路跟踪和其他RPC组件等等。

ARMS提供性能监控、用户体验监控、调用链追踪以及故障诊断等功能,在故障排查,分析和诊断性能瓶颈具重大作用。置于ARMS的Agent方式是否会对应用性能本身造成影响,还有待观察。类似Agent无侵入方法的开源产品有PinpointSkywalking,但很显然,没有商用ARMS整合的大而全。如果应用有ARMS组件的加持,在服务监控预警、故障排查和性能诊断等多方面确实提供很大便利和帮助。

最后的最后,如果有想买阿里云ECS服务,想自己玩玩的胖友,那就顺手使用我的推广链接吧,买过的直接略过。

https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=n85o6zdm

参考

https://help.aliyun.com/product/34364.html?spm=a2c4g.11186623.6.540.167d31d3gH64oQ

https://yq.aliyun.com/articles/721312?spm=5176.7946893.1411534..7cfa75baEBYWPa