【数据库监控系列】Prometheus+Alertmanager+Grafana容器化部署

news/2024/4/27 18:00:11/文章来源:https://blog.csdn.net/Sebastien23/article/details/137086974

【数据库监控系列】Prometheus+Alertmanager+Grafana容器化部署

  • 快速安装docker环境
  • 被监控端部署exporter
    • 配置Redis exporter
    • 配置MySQL exporter
  • 部署Prometheus和Grafana
    • Prometheus配置文件
    • Alertmanager配置文件
    • rule_files告警规则文件
    • docker-compose部署文件
    • 常见报错信息
  • 配置Grafana仪表盘
    • 添加数据源
    • 创建仪表盘

快速安装docker环境

🐬 参考:https://blog.csdn.net/Sebastien23/article/details/137086778

被监控端部署exporter

🐬参考:https://gottdeskrieges.blog.csdn.net/article/details/136403810

配置Redis exporter

在被监控端部署exporter:

# 仅主机网络模式部署
docker run -d --name redis_exporter --restart unless-stopped --network host oliver006/redis_exporter 

检查是否采集到数据:

curl -X GET http://localhost:9121/metrics > redis.metrics
cat redis.metrics | grep redis_up

配置MySQL exporter

在数据库中创建监控用户:

CREATE USER 'exporter'@'%' IDENTIFIED BY 'Monpass_XXX' WITH MAX_USER_CONNECTIONS 3;
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';

在被监控端部署exporter:

# 容器化部署
mkdir -vp /opt/mysqld-exporter/cat > /opt/mysqld-exporter/config.my-cnf << EOF
[client]
host=127.0.0.1
user=exporter
password=Monpass_XXX
EOFcd /opt && chown -R polkitd mysqld-exporter/docker run -d --network host --name mysqld_exporter_1 --restart unless-stopped \
-v /opt/mysqld-exporter/config.my-cnf:/etc/mysql/config.my-cnf \
prom/mysqld-exporter --config.my-cnf=/etc/mysql/config.my-cnf \
--web.listen-address=:9104 \
--no-collect.info_schema.query_response_time \
--no-collect.info_schema.innodb_cmp \
--no-collect.info_schema.innodb_cmpmem \
--collect.info_schema.processlist --collect.binlog_sizedocker ps -a

检查是否采集到数据:

curl -X GET http://localhost:9104/metrics > mysqld.metrics
cat mysqld.metrics | grep mysql_up

部署Prometheus和Grafana

创建安装目录及相关文件:

mkdir -vp /opt/docker-compose/prometheus/data/
mkdir -vp /opt/docker-compose/prometheus/conf/
mkdir -vp /opt/docker-compose/prometheus/conf/rules/#mkdir -vp /opt/docker-compose/grafana/data/
#mkdir -vp /opt/docker-compose/grafana/conf/touch /opt/docker-compose/prometheus/conf/prometheus.yml
touch /opt/docker-compose/prometheus/conf/alertmanager.yml#告警规则文件
touch /opt/docker-compose/prometheus/conf/rules/redis_alerts.yml
touch /opt/docker-compose/prometheus/conf/rules/mysql_alerts.ymltouch /opt/docker-compose/docker-compose.ymlcd /opt/ && chown -R polkitd docker-compose/ 

Prometheus配置文件

配置文件prometheus.yml

#vi /opt/docker-compose/prometheus/conf/prometheus.ymlglobal:scrape_interval:     15s # Default is every 1 minute.evaluation_interval: 15s # The default is every 1 minute.scrape_timeout:      10s # scrape_timeout is set to the global default (10s).# Alertmanager configuration
alerting:alertmanagers:- static_configs:- targets: ['<ALERTMANAGER_IP>:9093']# - alertmanager:9093# load alerting rule files
rule_files:- "rules/*.yml"- "rules/*.yaml"scrape_configs:- job_name: 'prometheus'static_configs:- targets: ['<PROMETHEUS_SERVER_IP>:9090']- job_name: 'redis_exporter'static_configs:- targets: ['<REDIS_EXPORTER_IP>:9121']- job_name: 'mysql_exporter'scrape_interval: 8sstatic_configs:- targets: ['<MYSQL_EXPORTER_IP>:9104']

:根据实际情况修改尖括号中的IP地址。

Alertmanager配置文件

配置文件alertmanager.yml

#vi /opt/docker-compose/prometheus/conf/alertmanager.ymlglobal:resolve_timeout: 5m                       # 处理超时时间,默认为5minsmtp_smarthost: 'smtp.qq.com:465'         # 邮箱smtp服务器代理smtp_from: '123456789@qq.com'             # 发送邮箱名称smtp_auth_username: '123456789@qq.com'    # 发邮件的邮箱用户名smtp_auth_password: 'xxxxxx'              # 邮箱密码或授权码smtp_require_tls: false                   # 不进行tls验证# 自定义html模板,发邮件的时候用自定义的模板内容
templates:- 'template/*.tmpl'# 定义路由树信息,这个路由可以接收到所有的告警
route:group_by: ['alertname'] # 报警分组依据group_wait: 10s         # 最初即第一次等待多久时间发送一组警报的通知group_interval: 60s     # 在发送新警报前的等待时间repeat_interval: 1h     # 发送重复警报的周期。对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝receiver: 'email'       # 发送警报的接收者的名称,下面的receivers.name# 定义警报接收者信息
receivers:- name: 'email'                            # 路由中对应的receiver名称email_configs:                           # 邮箱配置- to: '987654321@qq.com'                 # 接收警报的email配置#html: '{{ template "test.html" . }}'  # 设定邮箱的内容模板

:根据实际情况修改邮箱地址和授权码。

rule_files告警规则文件

Redis实例宕机告警规则:

#vi /opt/docker-compose/prometheus/conf/rules/redis_alerts.ymlgroups:
- name: redis_alert_rulesrules:- alert: redis_down     # name of an alerting rule# alert triggering condition defined using PromSQL expression. Here params must be metrics scraped by redis exporter.expr: up{job="redis_exporter"} == 0for: 1mlabels:severity: "Critical"# alert info that will sent to alertmanagerannotations:summary: "Instance {{ $labels.instance }} down"description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes. Current value: {{ $value }}"

MySQL实例宕机告警规则:

#vi /opt/docker-compose/prometheus/conf/rules/mysql_alerts.ymlgroups:
- name: mysql_alert_rulesrules:- alert: mysql_down# alert triggering condition defined using PromSQL expression. Here params must be metrics scraped by mysql exporter.expr: up{job="mysql_exporter"} == 0for: 1mlabels:severity: "Critical"annotations:summary: "Instance {{ $labels.instance }} down"description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes. Current value: {{ $value }}"

docker-compose部署文件

编写docker compose文件,用于部署prometheus、alertmanager和grafana。

#vi /opt/docker-compose/docker-compose.ymlversion: '3'services:prometheus:image: prom/prometheusnetwork_mode: hostcontainer_name: prometheus_1restart: unless-stopped# if you are running as root then set it to 0, else find the right id with the id -u commanduser: '0'#ports:#  - '9090:9090'environment:TZ: "Asia/Shanghai"#command: ["/etc/prometheus/prometheus.yml"]volumes:- ./prometheus/data/:/prometheus/- ./prometheus/conf/rules/:/etc/prometheus/rules/- ./prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.ymlalertmanager:image: prom/alertmanagernetwork_mode: hostcontainer_name: alertmanager_1restart: unless-stopped# if you are running as root then set it to 0, else find the right id with the id -u commanduser: '0'#ports:#  - '9093:9093'environment:TZ: "Asia/Shanghai"volumes:- ./prometheus/conf/alertmanager.yml:/etc/alertmanager/alertmanager.ymlgrafana:image: grafana/grafananetwork_mode: hostcontainer_name: grafana_1restart: unless-stopped# if you are running as root then set it to 0, else find the right id with the id -u commanduser: '0'  #ports:#  - '3000:3000'environment:- TZ="Asia/Shanghai"#- GF_INSTALL_PLUGINS="grafana-simple-json-datasource"volumes:- 'grafana_storage:/var/lib/grafana'# DECLARE DOCKER VOLUME FOR GRAFANA_STORAGE      
volumes:grafana_storage: {}

运行容器并检查:

# 启动容器
cd /opt/docker-compose/ && docker-compose up -d# 停止容器
cd /opt/docker-compose/ && docker-compose stop

部署后检查:

  • 访问http://<Prometheus_SERVER_IP>:9090,检查Prometheus是否部署成功。
  • 访问http://<Alertmanager_SERVER_IP>:9093,检查AlertManager是否部署成功。
  • 访问http://<Grafana_SERVER_IP>:3000,检查Grafana是否部署成功,默认用户名和密码都是admin,登录后需要修改密码。

常见报错信息

  1. Docker-compose文件中,如果没有user: '0',可能会收到下面的报错:
caller=query_logger.go:86 level=error component=activeQueryTracker msg="Error opening query log file" 
file=/prometheus/queries.active err="open /prometheus/queries.active: permission denied
  1. Grafana容器的环境变量赋值只能用等号,如果用冒号会收到如下报错(怀疑跟镜像或docker-compose的版本有关):
environment:- TZ: "Asia/Shanghai"- GF_INSTALL_PLUGINS: "grafana-clock-panel,grafana-simple-json-datasource"
...# 运行容器时报错
panic: interface conversion: interface {} is map[string]interface {}, not string
  1. 如果docker-compose文件中配置了往Grafana容器中安装某些插件(例如grafana-clock-panel),可能会导致grafana容器不断重启。检查容器日志会看到如下报错:
$ docker logs -fn grafana_1
...
Error: ✗ Plugin not found (Grafana v8.3.3 linux-amd64)

配置Grafana仪表盘

添加数据源

在添加数据源中选择Prometheus,在HTTP下的URL栏中粘贴http://<Prometheus_SERVER_IP>:9090并保存。

创建仪表盘

在新建仪表盘(New dashboard)中点击右侧的导入仪表盘(Create --> Import),输入并搜索仪表盘编号,在显示的仪表盘选项(Options)中选择数据源为Prometheus,最后点击导入即可。

  • 推荐的REDIS仪表盘:763, 11835
  • 推荐的MySQL仪表盘:7362

关于自定义仪表盘,以后将补充文章专门介绍。

References
【1】https://gottdeskrieges.blog.csdn.net/article/details/113645177
【2】https://prometheus.io/docs/prometheus/latest/installation/
【3】https://blog.csdn.net/qq_36306519/article/details/128255913
【4】https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/
【5】https://blog.csdn.net/weixin_45697293/article/details/119353915
【6】https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/
【7】https://grafana.com/grafana/dashboards
【8】https://grafana.com/docs/grafana/latest/dashboards/build-dashboards/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1026489.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python学习14:python中的表达式

python中的表达式 1.表达式是什么呢&#xff1f; 表达式就是一个具有明确结果的代码语句&#xff0c;如11、type(‘字符串’)、3*5等 在定义变量的时候&#xff0c;如age108,等号右侧的就是表达式&#xff0c;也就是有具体的结果&#xff0c;将结果赋值给了等号左侧的变量 2.…

Linux 系统基础操作命令

当前市面上常见的系统&#xff1a;Windows、Linux、Mac OS、Android、IOS…… Linux 不太适合日常使用&#xff0c;但是非常适合用于开发。因此作为一个程序猿来说&#xff0c;Linux 都是务必要掌握的。 Linux 介绍 Linux 发行版 目前市面上比较知名的发行版有&#xff1a;R…

DNS隧道攻击

什么是DNS隧道&#xff1f; DNS隧道是一种网络通信技术&#xff0c;它利用DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议来建立隐蔽的通信通道。在正常情况下&#xff0c;DNS协议主要用于将域名解析为IP地址&#xff0c;但攻击者可以通过构造特殊的…

总结 | vue3项目初始化(附相应链接)

如何运行 vue 项目&#xff1a;vscode运行vue项目_vscode启动vue项目命令-CSDN博客 vue3项目搭建 目录管理 git管理&#xff1a;vue3项目搭建并git管理_git 新建vue3项目-CSDN博客 目录调整&#xff1a;vue3项目 - 目录调整-CSDN博客 vscode中快速生成vue3模板&#xff1a…

实现能效升级 | 基于ACM32 MCU的冰箱压缩机变频方案

概述 冰箱制冷系统中最重要的部件是压缩机。它从吸气管吸入低温低压的制冷剂气体&#xff0c;通过电机运转带动活塞对其进行压缩后&#xff0c;向排气管排出高温高压的制冷剂气体&#xff0c;为整个制冷循环提供源动力。这样就实现了压缩→冷凝→膨胀→蒸发 ( 吸热 ) 的制冷循环…

并查集|1971. 寻找图中是否存在路径、684.冗余连接、685.冗余连接II

目录 并查集基础 1971. 寻找图中是否存在路径 684.冗余连接 685.冗余连接II 并查集基础 并查集主要有三个功能。 寻找根节点&#xff0c;函数&#xff1a;find(int u)&#xff0c;也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合&#xff0c;函数&#xf…

项目中自动引入神器 - unplugin-auto-import/unplugin-vue-components

前端 项目中 自动引入 神器 前言 在开发中&#xff0c;我们总喜欢站在巨人的肩膀上开发&#xff0c;比如用一些 框架&#xff1a;vue,react, 组件库&#xff1a;element&#xff0c;ant。 工具函数&#xff1a;axios&#xff0c;lodash 现在是模块化时代&#xff0c;我们…

新手入门C语言之联合体和枚举

在上一篇文章中&#xff0c;我们了解到在C语言中&#xff0c;自定义类型有三种&#xff0c;这里我们介绍后两种&#xff0c;联合体和枚举。 一.联合体 1.联合体的声明 像结构体一样&#xff0c;联合体也是由一个或多个成员构成&#xff0c;这些成员的类型可以是不一样的&…

Go——结构体

Go语言中没有类的概念&#xff0c;也不支持类的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。 一. 类型别名和自定义类型 1.1 自定义类型 在Go语言中有一些基本的数据类型&#xff0c;如string&#xff0c;整型&#xff0c;…

手机网页关键词视频爬虫采集软件可导出视频分享链接|视频无水印批量下载工具

全新音视频批量下载工具&#xff0c;为您解放视频管理烦恼&#xff01; 现如今&#xff0c;音上涌现出大量精彩的视频内容&#xff0c;但是要想高效地获取、管理和分享这些视频却是一件颇具挑战的事情。针对这一难题&#xff0c;我们自主研发了全新的音视频批量下载工具&#x…

数学建模体育建模和经济建模国防科大版

目录 6.体育中的数学建模 7.经济学问题中的数学建模 7.1.实物交换模型 7.2.边际效应 7.3.最佳消费选择模型 6.体育中的数学建模 体育科学的研究中&#xff0c;也有大量的数学建模问题&#xff0c;例如&#xff1a;棒球的最佳击球点问题、滑板滑雪赛道的设计、越野自行车比…

各种需要使用的方法-->vue/微信小程序/layui

各种需要使用的方法-->vue/微信小程序/layui 1、vue里样式不起作用的方法&#xff0c;可以通过deep穿透的方式2、 js获取本周、上周、本月、上月日期3、ArrayBuffer Blob 格式转换ArrayBuffer与Blob的区别ArrayBuffer转BlobBlob转ArrayBuffer需要借助fileReader对象 4、使用…

STM32使用滴答定时器实现delayms

在STM32上使用SysTick实现jiffies&#xff08;时间戳&#xff09;并且实现delay_ms 代码实现&#xff1a; volatile uint32_t jiffies 0; // 用于记录系统运行的jiffies数 void SysTick_Handler(void) {/* 每次SysTick中断&#xff0c;jiffies增加 */jiffies; }uint32_t tick…

如何利用生成式人工智能挑选合适的候选人?

在当今激烈的商业竞争中&#xff0c;招聘合适的人才是构建企业成功的基石。筛选和面试候选人是一个复杂且精细的过程&#xff0c;它不仅关系到职位的有效填补&#xff0c;更影响到企业的长期发展和团队建设。 选择合适候选人的重要性 选择合适的候选人就像寻找一片沙滩上的珍…

曲线生成 | 图解Reeds-Shepp曲线生成原理(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 什么是Reeds-Shepp曲线&#xff1f;2 Reeds-Shepp曲线的运动模式3 Reeds-Shepp曲线算法原理3.1 坐标变换3.2 时间翻转(time-flip)3.3 反射变换(reflect)3.4 后向变换(backwards) 4 仿真实现4.1 ROS C实现4.2 Python实现4.3 Matlab实现 0 专栏介绍 &#x1f5…

MP4如何把视频转MOV格式? MP4视频转MOV格式的技巧

在现代的数字媒体时代&#xff0c;视频格式转换成为了许多用户必须掌握的技能。特别是将MP4视频转换为MOV格式&#xff0c;这对于需要在Apple设备上播放或编辑视频的用户来说尤为重要。本文将详细介绍如何将MP4视频转换为MOV格式&#xff0c;帮助读者轻松应对不同设备和平台的需…

编程语言|C语言——C语言基本数据类型

前言 针对不同的数据&#xff0c;采取不同的存储方式和进行不同的处理。随着处理对象的复杂化&#xff0c;数据类型也要变得更丰富。数据类型的丰富程度直接反映了程序设计语言处理数据的能力。 C语言很重要的一个特点是它的数据类型十分丰富。因此&#xff0c;C语言程序数据处…

【Nuxt3】modules目录和nuxt3模块的简单介绍

简言 记录下nuxt3项目中module的用法 modules目录 使用 modules/ 目录在应用程序中自动注册本地模块。 这是一个很好的地方&#xff0c;可以放置您在构建应用程序时开发的任何本地nuxt模块。 nuxt模块相当于npm包&#xff0c;可以发布到npm社区中 在modules/ 目录下的本地模…

二叉树|654.最大二叉树

力扣题目地址 class Solution { public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {TreeNode* node new TreeNode(0);if (nums.size() 1) {node->val nums[0];return node;}// 找到数组中最大的值和对应的下标int maxValue 0;int maxValueIn…

Kubernetes生产集群部署指南

部署生产就绪的Kubernetes集群需要考虑到管理、负载均衡、安全、存储等很多细节&#xff0c;本文给出了一个生产就绪Kubernetes集群的完整部署流程&#xff0c;可以作为生产部署的有效参考。原文: Deploying a Production Kubernetes Cluster in 2023 — A Complete Guide Grow…