环境准备

下载软件包

wget https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/Packages/grafana-9.1.0-1.x86_64.rpm
wget https://ftp.postgresql.org/pub/source/v10.5/postgresql-10.5.tar.gz

部署Grafana

安装Grafana软件包

yum -y install grafana-9.1.0-1.x86_64.rpm

Grafana配置文件设置

vi /usr/share/grafana/conf/defaults.ini
http_port = 3000 #Grafana访问端口

启动Grafana服务并设置为开机自启

systemctl enable grafana-server.service --now

设置Grafana初始化登录设置

浏览器访问Grafana,端口为自己修改的配置文件的端口,本文未作修改默认端口3000,初始账号和密码均为admin :
1676441589555
重设密码,这里设置的为admin123,设置完成后点击Submit提交:
image-1676441845677
到这里Grafana环境和初始化设置完成。

安装postgres数据库

创建postgres用户、组并对其用户授权密码

useradd postgres
groupadd postgres
passwd postgres

解压postgresql软件包

tar -xf postgresql-10.5.tar.gz -C /usr/local/

安装postgresl所需依赖包

yum -y install -y readline-devel systemtap-sdt-devel.x86_64 zlib zlib-devel openssl-devel pam-devel libxml2 libxml2-devel libxslt libxslt-devel libxslt libxslt-devel gcc make

预编译

cd /usr/local/postgresql-10.5
./configure --prefix=/usr/local/postgresql

编译安装

make && make install

授权预编译指定安装postgresql目录为postgres用户、组访问权限

chown -R postgres:postgres /usr/local/postgresql

初始化postgres数据库

su postgres
/usr/local/postgresql/bin/initdb -D /usr/local/postgresql/data

修改postgresql配置文件

vi /usr/local/postgresql/data/postgresql.conf
image-1676513766420
vi /usr/local/postgresql/data/pg_hba.conf #在末尾添加如下一行
image-1676513853954

启动postgresql数据库

/usr/local/postgresql/bin/pg_ctl -D /usr/local/postgresql/data -l logfile start

查看是否启动并登录验证

ss -tuanpl | grep 5432
/usr/local/postgresql/bin/psql -U postgres -d postgres

准备数据源(这里以CPU、磁盘、内存三个作为演示)

创建库

create database control

切换库

\c control

创建表

create table cpu_load(ip varchar(15),load_1m numeric(5,2),load_5m numeric(5,2),load_15m numeric(5,2),create_time timestamp default current_timestamp);
create table free_info(ip varchar(15),free_size varchar(4),free_use numeric(8,2),free_avail numeric(8,2),create_time timestamp default current_timestamp);
create table disk_info(ip varchar(15),disk_size varchar(8),disk_avail varchar(8),disk_percentage numeric(4,2),create_time timestamp default current_timestamp);

将数据插入数据库

这里将采用脚本获取数据,其他数据类型仅供参考:
vi /root/heack.sh

#!/bin/bash
ip_address=$(ip address show | awk 'NR==9' | awk '{print $2}' | awk -F/ '{print $1}')
uptime_info(){
  uptime_1m=$(uptime | awk -Fload\ average\: '{print $2}' | awk -F, '{print $1}')
  uptime_5m=$(uptime | awk -Fload\ average\: '{print $2}' | awk -F, '{print $2}')
  uptime_15m=$(uptime | awk -Fload\ average\: '{print $2}' | awk -F, '{print $3}')
  /usr/local/postgresql/bin/psql -U postgres -p 5432 -d control -c "insert into cpu_load values('$ip_address','$uptime_1m','$uptime_5m','$uptime_15m');"  > /dev/null
}

free_info(){
  free_sized=$(free -h --si | awk '{print $2}' | awk 'NR==2')
  fr_U=$(free -h --si | grep "Mem" | awk '{print $3}' | grep -o '[a-Z]')
  fr_A=$(free -h --si | grep "Mem" | awk '{print $7}' | grep -o '[a-Z]')
  if [[ $fr_U == 'M' && $fr_A == 'M' ]];then
    free_use=$(free -h --si | awk '{print $3}' | awk 'NR==2' | awk -FM '{print $1}')
    free_available=$(free -h --si | awk '{print $7}' | awk 'NR==2' | awk -FM '{print $1}')
    free_us=$(awk 'BEGIN{printf "%.3f\n",'$free_use/1024'}')
    free_avail=$(awk 'BEGIN{printf "%.3f\n",'$free_available/1024'}')
    /usr/local/postgresql/bin/psql -U postgres -p 5432 -d control -c "insert into free_info values('$ip_address','$free_sized','$free_us','$free_avail');" > /dev/null
  elif [[ $fr_U == 'G' && $fr_A == 'M' ]];then
    free_use=$(free -h --si | awk '{print $3}' | awk 'NR==2' | awk -FG '{print $1}')
    free_available=$(free -h --si | awk '{print $7}' | awk 'NR==2' | awk -FM '{print $1}')
    free_avail=$(awk 'BEGIN{printf "%.3f\n",'$free_available/1024'}')
    /usr/local/postgresql/bin/psql -U postgres -p 5432 -d control -c "insert into free_info values('$ip_address','$free_sized','$free_use','$free_avail');" > /dev/null
  elif [[ $fr_U == 'M' && $fr_A == 'G' ]];then
    free_use=$(free -h --si | awk '{print $3}' | awk 'NR==2' | awk -FM '{print $1}')
    free_us=$(awk 'BEGIN{printf "%.3f\n",'$free_use/1024'}')
    free_available=$(free -h --si | awk '{print $7}' | awk 'NR==2' | awk -FG '{print $1}')
    /usr/local/postgresql/bin/psql -U postgres -p 5432 -d control -c "insert into free_info values('$ip_address','$free_sized','$free_us','$free_available');" > /dev/null
  elif [[ $fr_U == 'G' && $fr_A == 'G' ]];then
    free_use=$(free -h --si | awk '{print $3}' | awk 'NR==2' | awk -FG '{print $1}')
    free_available=$(free -h --si | awk '{print $7}' | awk 'NR==2' | awk -FG '{print $1}')
    /usr/local/postgresql/bin/psql -U postgres -p 5432 -d control -c "insert into free_info values('$ip_address','$free_sized','$free_use','$free_available');" > /dev/null
fi
}

disk_info(){
disk_size_T=$(df -h | grep '/dev/mapper/centos-root' | awk '{print $2}' | grep -o 'T')
disk_size_G=$(df -h | grep '/dev/mapper/centos-root' | awk '{print $2}' | grep -o 'G')
disk_size_M=$(df -h | grep '/dev/mapper/centos-root' | awk '{print $2}' | grep -o 'M')
disk_avail_T=$(df -h | grep '/dev/mapper/centos-root' | awk '{print $4}'  | grep -o 'T')
disk_avail_G=$(df -h | grep '/dev/mapper/centos-root' | awk '{print $4}'  | grep -o 'G')
disk_avail_M=$(df -h | grep '/dev/mapper/centos-root' | awk '{print $4}'  | grep -o 'M')
if [[ $disk_size_T == T && $disk_avail_T == T ]];then
  disk_sized=$(df -h | grep /dev/mapper/centos-root | awk  '{print $2}' | awk -FT '{print $1}')
  disk_sizeing=$(awk 'BEGIN{printf "%.3f\n",'$disk_sized*1024'}')
  disk_availabled=$(df -h | grep /dev/mapper/centos-root | awk  '{print $4}' | awk -FT '{print $1}')
  disk_availing=$(awk 'BEGIN{printf "%.3f\n",'$disk_availabled*1024'}')
  disk_usaged=$(df -h | grep /dev/mapper/centos-root | awk  '{print $5}' | awk -F% '{print $1}')
  /usr/local/postgresql/bin/psql -U postgres -p 5432 -d control -c "insert into disk_info values('$ip_address','$disk_sizeing','$disk_availing','$disk_usaged');" > /dev/null
elif [[ $disk_size_T == T && $disk_avail_G == G ]];then
  disk_sized=$(df -h | grep /dev/mapper/centos-root | awk  '{print $2}' | awk -FT '{print $1}')
  disk_sizeing=$(awk 'BEGIN{printf "%.3f\n",'$disk_sized*1024'}')
  disk_availabled=$(df -h | grep /dev/mapper/centos-root | awk  '{print $4}' | awk -FG '{print $1}')
  disk_usaged=$(df -h | grep /dev/mapper/centos-root | awk  '{print $5}' | awk -F% '{print $1}')
  /usr/local/postgresql/bin/psql -U postgres -p 5432 -d control -c "insert into disk_info values('$ip_address','$disk_sizeing','$disk_availabled','$disk_usaged');" > /dev/null
elif [[ $disk_size_T == T && $disk_avail_M == M ]];then
  disk_sized=$(df -h | grep /dev/mapper/centos-root | awk  '{print $2}' | awk -FT '{print $1}')
  disk_sizeing=$(awk 'BEGIN{printf "%.3f\n",'$disk_sized*1024'}')
  disk_availabled=$(df -h | grep /dev/mapper/centos-root | awk  '{print $4}' | awk -FM '{print $1}')
  disk_availing=$(awk 'BEGIN{printf "%.3f\n",'$disk_availabled/1024'}')
  disk_usaged=$(df -h | grep /dev/mapper/centos-root | awk  '{print $5}' | awk -F% '{print $1}')
  /usr/local/postgresql/bin/psql -U postgres -p 5432 -d control -c "insert into disk_info values('$ip_address','$disk_sizeing','$disk_availing','$disk_usaged');" > /dev/null
elif [[ $disk_size_G == G && $disk_avail_G == G ]];then
  disk_sized=$(df -h | grep /dev/mapper/centos-root | awk  '{print $2}' | awk -FG '{print $1}')
  disk_availabled=$(df -h | grep /dev/mapper/centos-root | awk  '{print $4}' | awk -FG '{print $1}')
  disk_usaged=$(df -h | grep /dev/mapper/centos-root | awk  '{print $5}' | awk -F% '{print $1}')
  /usr/local/postgresql/bin/psql -U postgres -p 5432 -d control -c "insert into disk_info values('$ip_address','$disk_sized','$disk_availabled','$disk_usaged');" > /dev/null
elif [[ $disk_size_G == G && $disk_avail_M == M ]];then
  disk_sized=$(df -h | grep /dev/mapper/centos-root | awk  '{print $2}' | awk -FG '{print $1}')
  disk_availabled=$(df -h | grep /dev/mapper/centos-root | awk  '{print $4}' | awk -FG '{print $1}')
  disk_avail=$(awk 'BEGIN{printf "%.3f\n",'$disk_availabled/1024'}')
  disk_usaged=$(df -h | grep /dev/mapper/centos-root | awk  '{print $5}' | awk -F% '{print $1}')
  /usr/local/postgresql/bin/psql -U postgres -p 5432 -d control -c "insert into disk_info values('$ip_address','$disk_sized','$disk_avail','$disk_usaged');" > /dev/null
elif [[ $disk_size_M == M && $disk_avail_M == M ]];then
  disk_sized=$(df -h | grep /dev/mapper/centos-root | awk  '{print $2}' | awk -FG '{print $1}')
  disk_sizeing=$(awk 'BEGIN{printf "%.3f\n",'$disk_sized/1024'}')
  disk_availabled=$(df -h | grep /dev/mapper/centos-root | awk  '{print $4}' | awk -FG '{print $1}')
  disk_avail=$(awk 'BEGIN{printf "%.3f\n",'$disk_availabled/1024'}')
  disk_usaged=$(df -h | grep /dev/mapper/centos-root | awk  '{print $5}' | awk -F% '{print $1}')
  /usr/local/postgresql/bin/psql -U postgres -p 5432 -d control -c "insert into disk_info values('$ip_address','$disk_sizeing','$disk_avail','$disk_usaged');" > /dev/null
fi
}

 uptime_info
 free_info
 disk_info

执行脚本,多获取一些数据

这里采用计划任务中执行
crontal -e

*/1 * * * * /root/heack.sh

登录Grafana设置连接数据库

点击下图位置选择连接数据源类型

如果你的数据源是MYSQL这里就选择MYSQL,如果数据源为PostgreSQL就先则PostgreSQL
image-1676511448953
image-1676511530577

填写连接数据库信息

image-1676511840631

点击保存并测试

提示如下Database Connection OK 表示数据库连接成功
image-1676514004024

创建Doshboard

点击create doshboard

image-1676514722504

点击设置

image-1676514959780

点击Variables,添加环境变量

image-1676515025022

如下设置varibles创建写法

Name为显示在varilbes中的变量名;Type为数据获取类型;Hide选择lable为显示在doshboard中的菜单索引和当作调用变量使用,选择varibles只当作变量在doshboard中进行调用;Data source 选择数据源,这里选择上面创建的数据源;Query为写sql脚本匹配数据。设置完成后点击update。
image-1676516895324
可以看到在Varibes界面看到Name的名称
image-1676516923214
点击返回Doshboard主界面可以看到上方显示的lable标签名称以及匹配到的数据源
image-1676517160056

添加图表

点击上方图表标识进行创建

image-1676517297623

匹配数CPU监控据导出图形模型

选择sql编辑模式,图形选择Time series折线图
image-1676527342322
编写sql进行匹配
image-1676527403226

对图形进行美化设置

image-1676528697213
image-1676529517182
image-1676531573645
image-1676531648765
image-1676531745963
image-1676531815400

这是磁盘和内存显示图形

可对比上面cpu绘图方式进行调试,磁盘显示、内存使用可使用仪表板自己进行研究