测试右移:线上质量监控 ELK 实战
【测试右移】介绍
为什么要做测试右移?
- 测试环境不能完全模拟线上环境。
- 线上质量不仅取决于已发布代码,还取决于数据变更与配置变更。
- 线上测试可以获得更多质量数据,以辅助产品更新。
测试右移主要实践:
- 应用监控
- 综合监控质量监控(ContinuousQuality Monitoring)
- A/B 测试
- 金丝雀部署(Canary Releases)
- TIP 线上测试
- 故障注入/混沌工程(Chaostesting)

为什么要搭建监控系统:
- 测试数据收集
- 测试数据分析
- 测试数据可视化与分析
质量监控:
- apm 应用性能监控
- 全链路监控 zipkin、skywalking
- 崩溃率监控 bugly
- 线上用户体验特征监控与分析

测试监控:
- 优化测试的深度
- 优化测试的速度
- 优化测试的广度
- 优化测试进度管理

ELK Stack 介绍
ELK Stack 代指 Elasticsearch、Logstash 和 Kibana ,在这个生态圈慢慢发展过程中,加入了一个新成员 Beats。
ElasticSearch:基于 Java,一个开源的分布式搜索引擎。LogStash:基于 Java,开源的用于收集、分析和存储日志的工具。(它和 Beats 有重叠的功能。Beats 出现之后,LogStash 则专门做日志的分析)Kibana:基于 Node.js,主要为 ElasticSearch 和 LogStash 提供 Web 页面展示,可以汇总,分析搜索信息。Beats:数据采集,它其实是一个综合的名字,它由一些子项目组合而成。- Packetbeat(搜集网络流量数据)
- Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
- Filebeat(用于监控,搜集服务器日志文件)
- Winlogbeat( Windows 事件日志数据收集)
- Metricbeat(可定期获取外部系统的监控指标信息,可用于监控、收集 Apache、Mysql、Nginx、Redis、Zookeeper 等服务)

ELK 监控体系搭建
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.1.2
docker pull docker.elastic.co/kibana/kibana:8.1.2
docker pull docker.elastic.co/logstash/logstash:8.1.2
ES & Kibana 搭建
# 创建子网
docker create network elastic
# 启动 elasticsearch 容器
docker run -d --name es01 --net elastic -p 9200:9200 docker.elastic.co/elasticsearch/elasticsearch:8.1.2
# 由于启动时间较久,可使用 docker logs -f es01 查看启动日志
记录启动日志中的登录密码及 Token(注意有效期为半小时):

-> Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
DB1ngqLjym5Zg3n-doni
-> HTTP CA certificate SHA-256 fingerprint:
2cffe4439402214dcd28786c835fcd9fdce82f266a8cfd915cdd9fd52facdea3
-> Configure Kibana to use this cluster:
* Run Kibana and click the configuration link in the terminal when Kibana starts.
* Copy the following enrollment token and paste it into Kibana in your browser (valid for the next 30 minutes):
eyJ2ZXIiOiI4LjEuMiIsImFkciI6WyIxNzIuMTkuMC4yOjkyMDAiXSwiZmdyIjoiMmNmZmU0NDM5NDAyMjE0ZGNkMjg3ODZjODM1ZmNkOWZkY2U4MmYyNjZhOGNmZDkxNWNkZDlmZDUyZmFjZGVhMyIsImtleSI6InZ5UkZySUVCYzFJYTJ4eXZWUXRLOlJSYW03X1FnU3ZxdUZqT0lnOEZLTUEifQ==
-> Configure other nodes to join this cluster:
* Copy the following enrollment token and start new Elasticsearch nodes with `bin/elasticsearch --enrollment-token <token>` (valid for the next 30 minutes):
eyJ2ZXIiOiI4LjEuMiIsImFkciI6WyIxNzIuMTkuMC4yOjkyMDAiXSwiZmdyIjoiMmNmZmU0NDM5NDAyMjE0ZGNkMjg3ODZjODM1ZmNkOWZkY2U4MmYyNjZhOGNmZDkxNWNkZDlmZDUyZmFjZGVhMyIsImtleSI6IndTUkZySUVCYzFJYTJ4eXZWUXVsOlF0bFNtVnVCVFhXVV83UThUcVZETkEifQ==
If you're running in Docker, copy the enrollment token and run:
`docker run -e "ENROLLMENT_TOKEN=<token>" docker.elastic.co/elasticsearch/elasticsearch:8.1.2`
证书认证:
# 拷贝证书到本地
docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .
# 进行认证
curl --cacert http_ca.crt -u elastic https://localhost:9200
# 输入刚刚记录下的密码

启动 Kibana:
docker run -d \
--name kibana \
--link elasticsearch:elasticsearch \
--net elastic \
-p 5601:5601 \
docker.elastic.co/kibana/kibana:8.1.2

输入 ES 启动日志中的 Token 及 Kibana 启动日志中的 code:

输入 ES 启动日志中的用户名/密码:

Nginx 日志自动采集
示例:使用 ES 提供的集成工具(Nginx Agent),自动采集服务器上的 Nginx 日志数据到 ES 中
Nginx Agent



使用默认配置进行保存:




将上述 ES 提供的日志采集 Agent 下载到 Nginx 服务器中:
[root@localhost es_agent]# wget https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-8.1.2-linux-x86_64.tar.gz
创建 elastic-agent.yml 配置文件:

解压 agent 并执行:

[root@localhost es_agent]# tar -zxvf elastic-agent-8.1.2-linux-x86_64.tar.gz
...
[root@localhost es_agent]# ls
elastic-agent-8.1.2-linux-x86_64 elastic-agent-8.1.2-linux-x86_64.tar.gz elastic-agent.yml
[root@localhost es_agent]# ./elastic-agent-8.1.2-linux-x86_64/elastic-agent install
Elastic Agent will be installed at /opt/Elastic/Agent and will run as a service. Do you want to continue? [Y/n]:y
Do you want to enroll this Agent into Fleet? [Y/n]:n
Elastic Agent has been successfully installed.
# 此时 agent 会被成功安装在 /opt/Elastic/Agent/ 目录
替换刚下载的配置文件:
[root@localhost Agent]# mv elastic-agent.yml elastic-agent.yml_bak
[root@localhost Agent]# mv ../elastic-agent.yml .
[root@localhost Agent]# vi elastic-agent.yml

# 重启 agent
[root@localhost Agent]# ./elastic-agent restart
安装 Nginx 服务器
# 下载 nginx
[root@localhost Agent]# yum install nginx
# 启动 nginx
[root@localhost Agent]# systemctl start nginx
# 查看 nginx 日志,发现已被 agent 监控
[root@localhost Agent]# less /var/log/nginx/access.log
127.0.0.1 - - [29/Jun/2022:12:42:23 +0800] "GET /nginx_status HTTP/1.1" 404 3971 "-" "Elastic-Metricbeat/8.1.2 (linux; amd64; 6118f25235a52a7f0c4937a0a309e380c92d8119; 2022-03-29 22:45:47 +0000 UTC)" "-"
127.0.0.1 - - [29/Jun/2022:12:42:40 +0800] "GET /nginx_status HTTP/1.1" 404 3971 "-" "Elastic-Metricbeat/8.1.2 (linux; amd64; 6118f25235a52a7f0c4937a0a309e380c92d8119; 2022-03-29 22:45:47 +0000 UTC)" "-"
...
数据分析
确认日志数据正常被采集到 ES 中:


创建自定义视图(正则匹配所需要的日志文件):

创建完成后,会自动解析字段:

查看自定义视图的统计图及明细数据:

更多的数据分析功能:

Logstash 搭建
配置文件:vi $PWD/pipeline/logstash.conf
# 输入
input {
file {
path => [ "/data/*.log" ] # logstash的data目录下的log
}
}
# 过滤
filter {
grok {
match => { "message" => ["%{IPORHOST:[nginx][access][remote_ip]} - %{DATA:[nginx][access][user_name]} \[%{HTTPDATE:[nginx][access][time]}\] \"%{WORD:[nginx][access][method]} %{DATA:[nginx][access][url]} HTTP/%{NUMBER:[nginx][access][http_version]}\" %{NUMBER:[nginx][access][response_code]} %{NUMBER:[nginx][access][body_sent][bytes]} \"%{DATA:[nginx][access][referrer]}\" \"%{DATA:[nginx][access][agent]}\""] }
remove_field => "message"
}
}
# 输出
output {
stdout {} # 标准输出
elasticsearch { # 输出到 es
hosts => ["https://192.168.3.222:9200"] # es主机
index => "logstash-nginx-%{+YYYY.MM.dd}" # 生成的索引
user => "elastic" # es用户名
password => "-yAoRIIni3qy*RW*Q8Nc" # es密码
ssl_certificate_verification => false # 关闭es证书认证
}
}
启动 logstash:
# 配置文件
[root@localhost logstash]# vi logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: ["https://192.168.3.222:9200"]
xpack.monitoring.elasticsearch.username: "elastic"
xpack.monitoring.elasticsearch.password: "-yAoRIIni3qy*RW*Q8Nc"
xpack.monitoring.enabled: true
# 启动 logstash
docker run --name logstash --rm -d --net elastic \
-v $PWD/logstash.yml:/usr/share/logstash/config/logstash.yml \ # 挂载配置文件
-v $PWD/pipeline:/usr/share/logstash/pipeline/ \ # 挂载采集配置文件目录
-v /var/log/nginx/access.log:/data/access.log \ # 挂载nginx的访问日志
-v /var/log/nginx/error.log:/data/error.log \ # 挂载nginx的错误日志
docker.elastic.co/logstash/logstash:8.1.2 \
--config.reload.automatic # 热更新配置文件
查看成功生成的索引:

接着便可创建自定义视图(data view)并进行数据分析。
测试右移:线上质量监控 ELK 实战的更多相关文章
- 使用Fabric一键批量部署上线/线上环境监控
本文讲述如何使用fabric进行批量部署上线的功能 这个功能对于小应用,可以避免开发部署上线的平台,或者使用linux expect开发不优雅的代码. 前提条件: 1.运行fabric脚本的机器和其他 ...
- 使用percona-xtrabackup实现对线上zabbix监控系统数据库mariadb5.5.47的主从同步
使用percona-xtrabackup实现对线上zabbix监控系统数据库的主从同步 业务背景: zabbix3.0.4是业务的主要监控,部署在一台单机中,为避免数据丢失先对其做数据主从同步,因主数 ...
- 10-28质量监控ELK
监控业务范围 app崩溃监控(Bugly) 应用性能监控(APM) 业务监控(TalkingData.友盟) 质量监控(缺位) 质量监控平台ELK elk官网 数据构造 线上错误状态分布 故障影响范围 ...
- robot framework 测试/预发/线上环境快捷切换
通常情况下布署的三套环境:测试.预发及线上环境.调试或者辅助验证测试时,切环境改变量甚是麻烦.这些变量包括但不限于:一些url信息,数据库信息,预置用户信息等. 切换环境方法一:使用变量文件,通过判断 ...
- gradle测试与线上打包
首先,第一反应理所当然的是profile : <?xml version="1.0" encoding="UTF-8"?> <beans xm ...
- HBase工程师线上工作经验总结----HBase常见问题及分析
阅读本文可以带着下面问题:1.HBase遇到问题,可以从几方面解决问题?2.HBase个别请求为什么很慢?你认为是什么原因?3.客户端读写请求为什么大量出错?该从哪方面来分析?4.大量服务端excep ...
- (转)HBase工程师线上工作经验总结----HBase常见问题及分析
阅读本文可以带着下面问题:1.HBase遇到问题,可以从几方面解决问题?2.HBase个别请求为什么很慢?你认为是什么原因?3.客户端读写请求为什么大量出错?该从哪方面来分析?4.大量服务端excep ...
- Java线上问题排查神器Arthas实战分析
概述 背景 是不是在实际开发工作当中经常碰到自己写的代码在开发.测试环境行云流水稳得一笔,可一到线上就经常不是缺这个就是少那个反正就是一顿报错抽风似的,线上调试代码又很麻烦,让人头疼得抓狂:而且deb ...
- 线上日志集中化可视化管理:ELK
本文来自网易云社区 作者:王贝 为什么推荐ELK: 当线上服务器出了问题,我们要做的最重要的事情是什么?当需要实时监控跟踪服务器的健康情况,我们又要拿什么去分析?大家一定会说,去看日志,去分析日志.是 ...
随机推荐
- 多线程的创建,并发,静态代理,Lambda表达式
程序是指令和数据的有序集合,本身没有任何运行的含义.是一个静态的概念. 在操作系统中运行的程序就是进程(Process),如:QQ,播放器,游戏等等. 进程是程序的一次执行过程,是一个动态的概念,是系 ...
- Persistent Bits - 题解【二进制】
题面: WhatNext Software creates sequence generators that they hope will produce fairly random sequence ...
- A标签上使用onclick事件,js函数响应成功,单会刷新当前页面陷阱
BEGIN; 最近在做html页面时,有时候会遇到以前没遇到的各种奇葩问题. 目前要记载的,就是其中之一. 我们在写链接的时候,即A标签,最普通的写法无非是 <a href='http://ww ...
- 【2022.04.19】Docker-compose一键安装mirai,搭建QQ机器人最快方法
先用官方的脚本安装下docker curl -sSL https://get.docker.com/ | sh 安装docker-compose curl -L "https://githu ...
- JVM垃圾回收篇
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 基础概念 GC=jvm垃圾回收,垃圾回收机制是由垃圾回收器Garbage ...
- Protobuf在Python中的应用(序列化数据)
1.了解Protobuf Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单.您可以定义数据的结构化,然后可 ...
- 干货 | LVM快照学习
一个执着于技术的公众号 前言 在上一章节,我们学习了LVM逻辑卷管理技术,知道了LVM能够通过增减PE的数量来弹性调整文件系统的大小.除此之外,LVM还有另一个重要功能「LVM快照技术」,也就是可以给 ...
- Git 使用心得 & 常见问题整理
开源Linux 回复"读书",挑选书籍资料~ Git 流程图 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remot ...
- Android8.0 后台服务保活的一种思路
原文地址:Android8.0 后台服务保活的一种思路 | Stars-One的杂货小窝 项目中有个MQ服务,需要一直连着,接收到消息会发送语音,且手机要在锁屏也要实现此功能 目前是使用广播机制实现, ...
- Hadoop介绍篇
Hadoop详解 1.前言 对于初次接触Hadoop的小伙伴来说,Hadoop是一个很陌生的东西,尤其是Hadoop与大数据之间的关联,写这篇文章之前,我也有许多关于Hadoop与大数据的疑惑,接下来 ...