前言
你是否為了數據可視化,還在做execl圖表呢?你是否為了數據可視化,還在忙着造輪子呢(Highcharts,Echarts)?你是否.....算了,算了,還是來看看 Grafana 這一款開源的可視化套件吧。這真是像極了廣告😂😂😂😂😂😂
Grafana 是一款開源時間序列分析和可視化工具,可以與多種數據庫結合然后可視化數據展示並及時通知。具體特點還是查看grafana官網
通篇下來只有工具的安裝以及 Android 某應用 cpu 信息采集。看着這標題“Android性能監控部署”...好吧,我承認有點標題黨了。重點主要還是想實現一下從安卓設備采集的相關數據於 grafana 平台的展示
一、前提准備
本實例在 CentOS 7 虛擬機環境下實踐,並通過 docker 進行 grafana+ influxdb 的安裝
- 確保虛擬機能識別到 Android 設備(若不能識別,查看 VMware USB Arbitration Service 虛擬機USB相關服務是否開啟)
- 已配置 AndroidSDK 環境
- 已安裝且配置好 docker 相關環境
二、安裝 Grafana
先附上官網 docker 安裝 grafana 教程
1.可以先用 docker search grafana 查看 grafana 鏡像
2.使用 docker pull grafana/grafana 下拉最新版本鏡像
3.以下命令配置運行 grafana
docker run -d -p 3000:3000 --name=grafana -v ~/docker/grafana:/var/lib/grafana grafana/grafana
4.通過 ip:3000 端口訪問,出現如下則配置正常
問題: 樓主在配置完后,網頁訪問 ip:3000/login 界面不顯示登錄窗口,無法進入系統
分析: 通過 docker logs -f grafana
發現如下提示, 並查看相關提示文檔,才知道是這是權限問題導致
GF_PATHS_DATA='/var/lib/grafana' is not writable.
You may have issues with file permissions, more information here: http://docs.grafana.org/installation/docker/#migration-from-a-previous-version-of-the-docker-container-to-5-1-or-later
mkdir: cannot create directory '/var/lib/grafana/plugins': Permission denied
解決: 授予權限且重啟容器后,正常顯示
chmod 777 ~/docker/grafana 授予最高權限
docker restart <container id> 重啟 grafana 容器
三、安裝 Influxdb
參考相關文檔:https://docs.docker.com/samples/library/influxdb/
1.通過 docker pull influxdb 下拉最新版
2.生成默認配置文件 docker run --rm influxdb influxd config > ~/docekr/influxdb/influxdb.conf
3.配置運行 influxdb
cd ~/docker/influxdb
# 可通過 influxdb.conf 來修改相關配置, 此處暫不做修改
docker run -d --name=influxdb-last -p 8086:8086 -v $PWD:/var/lib/influxdb -v $PWD/influxdb.conf:/etc/influxdb/influxdb.conf:ro influxdb -config /etc/influxdb/influxdb.conf
4.通過 ip:8086 端口訪問,出現如下則配置正常
補充:可以通過如下命令來查看 influxdb 版本及數據庫相關操作
docker exec -it influxdb-laste bash 進入docker bash交互模式
cd /user/bin/
./influx 進行 influxdb 數據庫交互模式
直接進入 influxdb 數據庫交互模式
四、Grafana 添加 Influxdb 數據源
在添加數據源之前,先造一些數據. Influxdb官網文檔: 使用 curl 命令寫入數據(當然也可以在交互模式下創建)
1.數據的創建
# 創建 用戶名 和 密碼
curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE USER 'root' WITH PASSWORD 'root' WITH ALL PRIVILEGES"
# 創建 mydb 數據庫
curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE mydb"
# 查詢數據庫
curl -G -XPOST http://localhost:8086/query --data-urlencode "q=SHOW DATABASES"
# 寫入數據到 mydb 數據庫
curl -i -XPOST 'http://localhost:8086/write?db=mydb' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 '
# 查詢數據
curl -G 'http://localhost:8086/query?pretty=true' --data-urlencode "db=mydb" --data-urlencode "q=SELECT \"value\" FROM \"cpu_load_short\" WHERE \"region\"='us-west'"
2.添加 influx 數據源
a.添加數據源,選擇 influxDB
b.填寫相關信息
c.保存測試成功后,在 Home Dashboard -> New Dashboard -> Add Query(也可以選擇自定義)
d.寫入數據.設置查詢的條件/時間段/以及圖表.顯示如下
for i in $(seq 1 3 200);
do curl -i -s -XPOST 'http://localhost:8086/write?db=mydb' --data-binary "cpu_load_short,host=server01,region=us-west value=0.$i" >/dev/null&& sleep 1;
done
問題: 填寫相關信息后,點擊 "保存並測試" 按鈕后,出現 Network Error: Bad Gateway(502)
分析: 通過 docker logs -f grafana
發現如下提示.查找相關資料,防火牆導致無法連接到 influxdb
2019/07/01 17:46:56 http: proxy error: dial tcp 192.168.1.104:8086: connect: no route to host
解決: 將該端口添加到防火牆開放端口列表中
# 查看所有打開的端口
firewall-cmd --zone=public --list-all
# 添加端口(--permanent永久生效,沒有此參數重啟后失效)
firewall-cmd --zone=public --add-port=8086/tcp --permanent
# 更新防火牆規則
firewall-cmd --reload
五、Shell 腳本寫入數據到 Influxdb
這里以抖音(com.ss.android.ugc.aweme)為例。在采集 cpu 數據之前,先補充一下 android 相關的知識點. 因 android 版本預置的命令太過精簡, 以下通過 busybox 工具(下載路徑)來實現相關操作.
1.首先使用 ps 命令獲取相關進程
adb shell /data/local/tmp/busybox ps -ef | grep com.ss.android.ugc.aweme | head -n 1|cut -d " " -f 1
2.然后使用 top 工具監聽以上進程的 cpu 信息
# 22502 進程信息
adb shell /data/local/tmp/busybox top -d 1 -b | grep "^22502"
# cpu 信息
adb shell /data/local/tmp/busybox top -d 1 -b | awk '/^22502/{print $8}'
3.curl 命令 寫入數據到 influxdb
可使用官方模板: https://grafana.com/dashboards
# 創建數據庫
curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE Android"
# 寫入數據模板
curl -i -XPOST 'http://localhost:8086/write?db=Android' --data-binary "cpu,user=zzw,app=抖音 value=53"
4.shell 腳本串聯
#!/bin/bash
pname=抖音
pkg=com.ss.android.ugc.aweme
num=5
curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE Android"
pid=$(adb shell /data/local/tmp/busybox ps -ef | grep $pkg | head -n 1|cut -d " " -f 1)
for i in $(seq $num);do
cpu=$(adb shell /data/local/tmp/busybox top -d 1 -n 1 -b | grep $pid|awk '{print $7}');
echo $i $cpu;
curl -s -i -XPOST 'http://localhost:8086/write?db=Android' --data-binary "cpu,user=zzw,app=$pname value=$cpu >/dev/null;
done;
最后效果顯示如下:
注: 需對應android cpu指令集下載, 以下為 busybox 在 android 上的使用方法
# 查看 CPU 信息,busybox 官網下載對應的版本
adb shell cat /proc/cpuinfo
# Busybox 配置
adb push busybox /data/local/tmp
adb shell chmod 777 /data/local/tmp/busybox
# adb shell export bbox=/data/local/tmp/busybox