Grafana
Table of Contents
Section titled “Table of Contents”Grafana 用于展示 Prometheus 采集的监控数据, 通过 promQL 语句绘制图表或使用第三方模板进行数据可视化
Grafana Download
Grafana Template
$ tar -zxvf grafana-enterprise-9.5.9.linux-arm64.tar.gz $ cd grafana-9.5.9 && ./bin/grafana-server > ... > logger=licensing t=2023-12-07T15:06:25.331289546+08:00 level=info msg="Validated license token" appURL=http://localhost:3000/ source=disk status=NotFound > ...
配置文件 conf/default.ini
, 示例 conf/sample.ini
修改 default_language
选项为 detect
(使用浏览器语言)
默认端口是 3000
初始用户 admin
初始密码 admin
- 仪表盘: 监控面板列表
- 连接: 连接第三方数据源泉(prometheus 或 数据库)
- 管理: grafana 设置和用户管理
Grafana 本身只用于显示数据无法采集数据, 需要其它工具提供数据
Grafana 使用 promql, sql 从数据源中获取数据, 在 web 上使用图表, 表格等方式显示
常用的数据源(Grafana 自带):
- prometheus
- alertmanager
- mysql
- postgres
部分数据源 grafana 如 mongo 有支持, 但需要下载额外插件
有两种方式创建面板
- json 文件导入
- 自定义
json 导入
Section titled “json 导入”- 进入面板页面, 点击右上角 分享, 选择 导出, 保存至文件
- 官方提供的模板 Grafana Template 下载(部分使用旧版本生成, 可能不兼容或者需要修改)
- 进入仪表盘页面, 点击 新建, 选择 导入, 选择面板 json 文件导入
创建一个面板, 在面板上自定义多个图表, 每个图表自定义数据源, 图表类型, 显示样式
官方创建面板教程
官方创建图表教程
- 进入仪表盘页面, 点击 新建, 选择 新建仪表板, 选择面板 添加可视化
- 选择数据源, 配置仪表盘, 右上角 apply 完成单个图表
- 右上角 保存图标, 填写 commit 保存面板
面板配置: 面板名称, 时间等基本设置, 面板全局变量, JSON 配置
图表配置: 图表类型, 数据内容, 显示样式
面板全局变量使用
设置全局变量
# 获取 node_uname_info 命令包含 tag 属性的列表 label_values(node_uname_info,tag) # 获取 node_uname_info 命令包含 host 属性且 tag 值等于全局变量中的 tag 的数据列表 label_values(node_uname_info{tag="$tag"},host)
# promql 中使用全局变量 node_time_seconds{host="$host",tag="$tag"} - node_boot_time_seconds{host="$host",tag="$tag"} # 特殊变量 $__timeFrom Grafana 选择的时间起始值 $__timeFrom -> timestamp $__timeTo Grafana 选择的时间结束值 $__timeTo -> timestamp $__timeFilter 判断时间点是否在 Grafana 时间段内容 $__timeFilter(timestamp) -> bool
使用脚本快速操作 grafana
服务
CURRENT_DIR=$(pwd) SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" START_COMMAND="./bin/grafana-server" function kill_process() { cd $SCRIPT_DIR if [[ ! -f pid ]]; then echo -e "\033[31m pid not exists \033[0m" return 1 fi local pid=$(cat pid) if [[ -z $pid ]]; then echo -e "\033[31m pid is empty \033[0m" return 1 fi kill -15 $pid >/dev/null 2>&1 rm pid return 0 } function start_process() { cd $SCRIPT_DIR nohup $START_COMMAND >/dev/null 2>&1 & local pid=$! ps -aux | grep -v grep | grep $pid >/dev/null 2>&1 echo $pid > pid return 0 } function check_process() { cd $SCRIPT_DIR if [[ ! -f pid ]]; then echo -e "\033[31m pid not exists \033[0m" return 1 fi local pid=$(cat pid) if [[ -z $pid ]]; then echo -e "\033[31m pid is empty \033[0m" return 1 fi ps -aux | grep -v grep | grep $pid if [[ $? -ne 0 ]]; then echo -e "\033[31mProcess is not running\033[0m" return 1 fi echo -e "\033[32mProcess is running\033[0m" return 0 } usage=$(cat <<EOF -h/--help show help \n --restart restart service \n --kill close service \n --check check service \n EOF ) declare -a params while [[ $# -gt 0 ]]; do case $1 in -h|--help) echo -e $usage exit 0 ;; --restart) cd $SCRIPT_DIR kill_process start_process check_process cd $CURRENT_DIR shift ;; --kill) cd $SCRIPT_DIR kill_process check_process cd $CURRENT_DIR shift ;; --check) cd $SCRIPT_DIR check_process cd $CURRENT_DIR shift ;; *) echo "param $1" params+=($1) shift ;; esac done