• 【prometheus+grafana】快速入门搭建-服务监控各插件及企业微信告警


    目录

    1. 安装qywechat_webhook插件通知企业微信

    1.1. 新建目录/opt/prometheus/qywechathook/conf

    1.2. 新建编辑wx.js文件

    1.3. 运行启动容器

    1.4. 查看容器启动情况

    1.5 企业微信通知地址为:

    2. 安装altermanager

    2.1. 下载altermanager

    2.2. 解压altermanager

    2.3. 编辑altermanager.yml

    2.4. 检查配置文件

    2.5. 启动altermanager

    2.5.1方式1-命令后台启动altermanager

    2.5.2. 启动方式2-脚本启动altermanager

    2.6. 访问地址验证

    3. 源码方式安装node_exporter

    3.1. 下载node_exporter

    3.2. 解压node_exporter

    3.3. 后台启动node_exporter

    3.3.1启动方式1:命令方式

    3.3.2. 启动方式2:脚本方式启动node_exporter

    3.4. 验证访问

    4. 源码包方式安装prometheus

    4.1. 下载prometheus

    4.2. 解压prometheus源码包

    4.3.添加rules.yml文件

    4.4. 编辑prometheus.yml

    4.5. 校验prometheus.yml

    4.6. 后台启动prometheus

    4.6.1启动方式1:命令启动

    4.6.2. 启动方式2:脚本启动prometheus

    4.7. 验证访问

    5. 源码包方式安装grafana

    5.1. 下载grafana

    5.2. 解压grafana

    5.3. 进入bin目录,后台启动grafana

    5.3.1启动方式1:进入bin目录,命令启动

    5.3.2. 启动方式2:脚本方式启动grafana

    5.4. 登录grafana

    5.5. 添加数据源

    5.6. 搜索grafana的仪表盘模板

    5.7. 在自建的grafana导入模板ID

    5.8. 查看自建的grafana监控仪表盘

     6.告警效果-通知企业微信机器人


    1. 安装qywechat_webhook插件通知企业微信

    1.1. 新建目录/opt/prometheus/qywechathook/conf

    mkdir -p /opt/prometheus/qywechathook/conf

    1.2. 新建编辑wx.js文件

    1. exports.template = function(body) {
    2. //企业微信群机器人API,https://work.weixin.qq.com/help?person_id=1&doc_id=13376#markdown%E7%B1%BB%E5%9E%8B
    3. //prometheus alert manager webhook : https://prometheus.io/docs/alerting/configuration/#webhook_config
    4. var alerts = body.alerts;
    5. var content = alerts.map(
    6. alert => {
    7. return [`# Name:${alert.labels.alertname}`, "## Labels:"]
    8. .concat(Object.entries(alert.labels).map(label => `<font color="comment">${label[0]}:</font>${label[1]}`))
    9. .concat("## Annotations:")
    10. .concat(Object.entries(alert.annotations).map(annotation => `<font color="comment">${annotation[0]}:</font>${annotation[1]}`))
    11. .join("\n")
    12. }
    13. ).concat(`<font color="comment">Status:</font><font color="${body.status === 'firing' ? 'warning' : 'info'}">${body.status}</font>`).join("\n\n")
    14. return {
    15. msgtype: "markdown",
    16. markdown: {
    17. content: content
    18. }
    19. }
    20. }

    1.3. 运行启动容器

    1. docker run -d --name qywechat-webhook-adapter \
    2. --restart always -p 9081:80 \
    3. -v /opt/prometheus/qywechathook/conf/wx.js:/app/prometheusalert/wx.js \
    4. guyongquan/webhook-adapter \
    5. --adapter=/app/prometheusalert/wx.js=/wx=替换成自己企业微信机器人地址

    1.4. 查看容器启动情况

    docker ps -a

    1.5 企业微信通知地址为:

    1. #容器启动后,下面这个地址在后面安装altermanager插件里面的配置文件altermanager.yml会用到
    2. http://127.0.0.1:8091/adapter/wx

    2. 安装altermanager

    2.1. 下载altermanager

    下载地址:Download | Prometheus

    2.2. 解压altermanager

    tar -xf alertmanager-0.26.0.linux-amd64.tar.gz

    2.3. 编辑altermanager.yml

    1. route:
    2. group_by: ['alertname']
    3. group_wait: 30s
    4. group_interval: 1m
    5. repeat_interval: 1m
    6. receiver: 'qywechat.webhook'
    7. receivers:
    8. - name: 'web.hook'
    9. webhook_configs:
    10. - url: 'http://127.0.0.1:5001/'
    11. - name: 'qywechat.webhook'
    12. webhook_configs:
    13. - url: 'http://127.0.0.1:8091/adapter/wx'
    14. send_resolved: true
    15. inhibit_rules:
    16. - source_match:
    17. severity: 'critical'
    18. target_match:
    19. severity: 'warning'
    20. equal: ['alertname', 'dev', 'instance

    2.4. 检查配置文件

    ./amtool check-config alertmanager.yml

    2.5. 启动altermanager

    2.5.1方式1-命令后台启动altermanager

    nohup ./alertmanager --cluster.listen-address= --config.file=alertmanager.yml > /dev/null 2>&1 &

    2.5.2. 启动方式2-脚本启动altermanager

    1. #!/bin/sh
    2. # 时间:2023年9月24日10:37:24
    3. # 开发者: AL
    4. # 管理启停prometheus脚本
    5. # 检查参数个数
    6. PORT=9093
    7. NAME="altermanager"
    8. START_TIMEOUT=30
    9. #健康检查方法
    10. fun_health_check() {
    11. exptime=0
    12. echo "正在启动"
    13. while true
    14. do
    15. pid=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1`
    16. echo "检查端口${PORT}的pid 是 ${pid}"
    17. if [ -z $pid ];then
    18. sleep 1
    19. ((exptime++))
    20. echo -n -e "启动已经用时: ${exptime}s..."
    21. else
    22. break
    23. fi
    24. if [ $exptime -gt ${START_TIMEOUT} ]; then
    25. echo '启动失败'
    26. exit 1
    27. fi
    28. done
    29. echo "恭喜,启动${NAME} ${PORT}成功"
    30. }
    31. #启动命令
    32. fun_start_cmd() {
    33. nohup ./alertmanager --cluster.listen-address= --config.file=alertmanager.yml > /dev/null 2>&1 &
    34. }
    35. ID=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1`
    36. echo "开始查找-端口${PORT}的pid 是 ${ID}"
    37. if [ $# -eq 0 ]; then
    38. echo "请输入控制参数,可选【start,stop,restart】"
    39. elif [ "$1" = "start" ]; then
    40. echo "启动${NAME}"
    41. if [ ! -z $ID ];then
    42. echo "${PORT}端口已经占用,启动失败,请输入参数【restart】"
    43. else
    44. fun_start_cmd
    45. fun_health_check
    46. fi
    47. elif [ "$1" = "stop" ]; then
    48. echo "停止${NAME}"
    49. if [ -z $ID ];then
    50. echo "${PORT}端口未启用"
    51. else
    52. kill -9 $ID
    53. echo "${PORT}端口的进程已关闭"
    54. fi
    55. elif [ "$1" = "restart" ]; then
    56. echo "重启${NAME}"
    57. if [ ! -z $ID ];then
    58. kill -9 $ID
    59. else
    60. fun_start_cmd
    61. fun_health_check
    62. fi
    63. else
    64. echo "请输入控制参数,可选【start,stop,restart】 "
    65. fi

    2.6. 访问地址验证

    http://10.217.108.101:9093/#/alerts

    3. 源码方式安装node_exporter

    3.1. 下载node_exporter

    下载地址:Download | Prometheus

    3.2. 解压node_exporter

    在linux上解压node_exporter

    tar -xf node_exporter-1.6.1.linux-amd64.tar.gz

    3.3. 后台启动node_exporter

    3.3.1启动方式1:命令方式

    nohup ./node_exporter --web.listen-address=":9100" > /dev/null 2>&1 &

    3.3.2. 启动方式2:脚本方式启动node_exporter

    1. #!/bin/sh
    2. # 时间:2023年9月24日09:44:06
    3. # 开发者: AL
    4. # 管理启停node_exporter脚本
    5. # 检查参数个数
    6. PORT=9100
    7. NAME="node_exporter"
    8. START_TIMEOUT=30
    9. #健康检查方法
    10. fun_health_check() {
    11. exptime=0
    12. echo "正在启动"
    13. while true
    14. do
    15. pid=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1`
    16. echo "检查端口${PORT}的pid 是 ${pid}"
    17. if [ -z $pid ];then
    18. sleep 1
    19. ((exptime++))
    20. echo -n -e "启动已经用时: ${exptime}s..."
    21. else
    22. break
    23. fi
    24. if [ $exptime -gt ${START_TIMEOUT} ]; then
    25. echo '启动失败'
    26. exit 1
    27. fi
    28. done
    29. echo "恭喜,启动${NAME} ${PORT}成功"
    30. }
    31. #启动命令
    32. fun_start_cmd() {
    33. nohup ./node_exporter --web.listen-address=":${PORT}" > /dev/null 2>&1 &
    34. }
    35. ID=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1`
    36. echo "开始查找-端口${PORT}的pid 是 ${ID}"
    37. if [ $# -eq 0 ]; then
    38. echo "请输入控制参数,可选【start,stop,restart】"
    39. elif [ "$1" = "start" ]; then
    40. echo "启动${NAME}"
    41. if [ ! -z $ID ];then
    42. echo "${PORT}端口已经占用,启动失败,请输入参数【restart】"
    43. else
    44. fun_start_cmd
    45. fun_health_check
    46. fi
    47. elif [ "$1" = "stop" ]; then
    48. echo "停止${NAME}"
    49. if [ -z $ID ];then
    50. echo "${PORT}端口未启用"
    51. else
    52. kill -9 $ID
    53. echo "${PORT}端口的进程已关闭"
    54. fi
    55. elif [ "$1" = "restart" ]; then
    56. echo "重启${NAME}"
    57. if [ ! -z $ID ];then
    58. kill -9 $ID
    59. else
    60. fun_start_cmd
    61. fun_health_check
    62. fi
    63. else
    64. echo "请输入控制参数,可选【start,stop,restart】 "
    65. fi

    3.4. 验证访问

    http://ip:端口/mertics

    4. 源码包方式安装prometheus

    4.1. 下载prometheus

    下载地址:Download | Prometheus

    4.2. 解压prometheus源码包

    解压源码包到linux,opt目录下,/opt/prometheus/prometheus2.47

    tar -xf prometheus-2.47.0.linux-amd64.tar.gz

    4.3.添加rules.yml文件

    在promethues安装目录(跟prometheus.yml)同级目录新建rule文件夹,并在rule文件加新建rules.yml

    1. groups:
    2. - name: alertmanager_pod.rules #告警规则组名,注意这和Altermanager中的组不是一个概念
    3. rules:
    4. - alert: Pod_all_cpu_usage #告警名称,对应标签alertname
    5. expr: (sum by(name)(rate(container_cpu_usage_seconds_total{image!=""}[5m]))*100) > 10 #告警表达式
    6. for: 1s #持续时长,表示上面的表达式满足且超过两分钟才会触发告警
    7. labels: #对告警附加的标签
    8. severity: critical
    9. service: pods
    10. project: myserver
    11. annotations: #告警通知中的注释内容,可用于描述告警具体信息
    12. description: 容器 {{ $labels.name }} CPU 资源利用率大于 10% , (current value is {{ $value }})
    13. summary: Dev CPU 负载告警
    14. - alert: Pod_all_memory_usage
    15. expr: sort_desc(avg by(name)(irate(container_memory_usage_bytes{name!=""}[5m]))*100) > 10 #内存大于10%
    16. #expr: sort_desc(avg by(name)(irate(node_memory_MemFree_bytes {name!=""}[5m]))) > 2*1024*1024*1024 #内存大于2G
    17. for: 10s
    18. labels:
    19. severity: critical
    20. type: pods
    21. #project: myserver
    22. annotations:
    23. description: 容器 {{ $labels.name }} Memory 资源利用率大于 2G , (current value is {{ $value }})
    24. summary: Dev Memory 负载告警
    25. - alert: Pod_all_network_receive_usage
    26. #expr: sum by (name)(irate(container_network_receive_bytes_total{container_name="POD"}[1m])) > 50*1024*1024
    27. expr: sum by (name)(irate(container_network_receive_bytes_total{container_name="POD"}[1m])) > 0
    28. for: 2m
    29. labels:
    30. #severity: critical
    31. project: myserver
    32. annotations:
    33. description: 容器 {{ $labels.name }} network_receive 资源利用率大于 50M , (current value is {{ $value }})
    34. - alert: node内存可用大小
    35. expr: node_memory_MemFree_bytes < 524288000 #内存小于500
    36. for: 30s
    37. labels:
    38. type: nodes
    39. annotations:
    40. description: node节点可用内存小于500M

    4.4. 编辑prometheus.yml

    4.5. 校验prometheus.yml

    ./promtool check config prometheus.yml

    4.6. 后台启动prometheus

    4.6.1启动方式1:命令启动

    nohup ./prometheus --storage.tsdb.retention.time=7d --config.file=prometheus.yml --web.enable-admin-api > prometheus.log 2>&1 &

    4.6.2. 启动方式2:脚本启动prometheus

    1. #!/bin/sh
    2. # 时间:2023年9月24日10:37:24
    3. # 开发者: AL
    4. # 管理启停prometheus脚本
    5. # 检查参数个数
    6. PORT=9090
    7. NAME="prometheus"
    8. START_TIMEOUT=30
    9. #健康检查方法
    10. fun_health_check() {
    11. exptime=0
    12. echo "正在启动"
    13. while true
    14. do
    15. pid=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1`
    16. echo "检查端口${PORT}的pid 是 ${pid}"
    17. if [ -z $pid ];then
    18. sleep 1
    19. ((exptime++))
    20. echo -n -e "启动已经用时: ${exptime}s..."
    21. else
    22. break
    23. fi
    24. if [ $exptime -gt ${START_TIMEOUT} ]; then
    25. echo '启动失败'
    26. exit 1
    27. fi
    28. done
    29. echo "恭喜,启动${NAME} ${PORT}成功"
    30. }
    31. #启动命令
    32. fun_start_cmd() {
    33. nohup ./prometheus --storage.tsdb.retention.time=7d --config.file=prometheus.yml --web.enable-admin-api > prometheus.log 2>&1 &
    34. }
    35. ID=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1`
    36. echo "开始查找-端口${PORT}的pid 是 ${ID}"
    37. if [ $# -eq 0 ]; then
    38. echo "请输入控制参数,可选【start,stop,restart】"
    39. elif [ "$1" = "start" ]; then
    40. echo "启动${NAME}"
    41. if [ ! -z $ID ];then
    42. echo "${PORT}端口已经占用,启动失败,请输入参数【restart】"
    43. else
    44. fun_start_cmd
    45. fun_health_check
    46. fi
    47. elif [ "$1" = "stop" ]; then
    48. echo "停止${NAME}"
    49. if [ -z $ID ];then
    50. echo "${PORT}端口未启用"
    51. else
    52. kill -9 $ID
    53. echo "${PORT}端口的进程已关闭"
    54. fi
    55. elif [ "$1" = "restart" ]; then
    56. echo "重启${NAME}"
    57. if [ ! -z $ID ];then
    58. kill -9 $ID
    59. else
    60. fun_start_cmd
    61. fun_health_check
    62. fi
    63. else
    64. echo "请输入控制参数,可选【start,stop,restart】 "
    65. fi

    4.7. 验证访问

    http://10.217.108.101:9090/

    5. 源码包方式安装grafana

    5.1. 下载grafana

    下载地址:Download Grafana | Grafana Labs

    5.2. 解压grafana

    tar -xf grafana-enterprise-10.1.2.linux-amd64.tar.gz

    5.3. 进入bin目录,后台启动grafana

    5.3.1启动方式1:进入bin目录,命令启动

    nohup ./grafana-server > grafana.log 2>&1 &

    5.3.2. 启动方式2:脚本方式启动grafana

    1. #!/bin/sh
    2. # 时间:2023年9月24日15:19:51
    3. # 开发者: AL
    4. # 管理启停grafana脚本
    5. # 检查参数个数
    6. PORT=3000
    7. NAME="grafana"
    8. START_TIMEOUT=30
    9. #健康检查方法
    10. fun_health_check() {
    11. exptime=0
    12. echo "正在启动"
    13. while true
    14. do
    15. pid=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1`
    16. echo "检查端口${PORT}的pid 是 ${pid}"
    17. if [ -z $pid ];then
    18. sleep 1
    19. ((exptime++))
    20. echo -n -e "启动已经用时: ${exptime}s..."
    21. else
    22. break
    23. fi
    24. if [ $exptime -gt ${START_TIMEOUT} ]; then
    25. echo '启动失败'
    26. exit 1
    27. fi
    28. done
    29. echo "恭喜,启动${NAME} ${PORT}成功"
    30. }
    31. #启动命令
    32. fun_start_cmd() {
    33. nohup ./grafana-server > grafana.log 2>&1 &
    34. }
    35. ID=`netstat -antup | grep "${PORT}" | awk '{print $7}' | awk -F "/" '{print $1}' | head -n 1`
    36. echo "开始查找-端口${PORT}的pid 是 ${ID}"
    37. if [ $# -eq 0 ]; then
    38. echo "请输入控制参数,可选【start,stop,restart】"
    39. elif [ "$1" = "start" ]; then
    40. echo "启动${NAME}"
    41. if [ ! -z $ID ];then
    42. echo "${PORT}端口已经占用,启动失败,请输入参数【restart】"
    43. else
    44. fun_start_cmd
    45. fun_health_check
    46. fi
    47. elif [ "$1" = "stop" ]; then
    48. echo "停止${NAME}"
    49. if [ -z $ID ];then
    50. echo "${PORT}端口未启用"
    51. else
    52. kill -9 $ID
    53. echo "${PORT}端口的进程已关闭"
    54. fi
    55. elif [ "$1" = "restart" ]; then
    56. echo "重启${NAME}"
    57. if [ ! -z $ID ];then
    58. kill -9 $ID
    59. else
    60. fun_start_cmd
    61. fun_health_check
    62. fi
    63. else
    64. echo "请输入控制参数,可选【start,stop,restart】 "
    65. fi

    5.4. 登录grafana

    http://10.217.108.101:3000/

    5.5. 添加数据源

    最后记得往下滚动保存

    5.6. 搜索grafana的仪表盘模板

    grafana的仪表盘模板地址:Dashboards | Grafana Labs

    复制仪表盘模板ID

    5.7. 在自建的grafana导入模板ID

    5.8. 查看自建的grafana监控仪表盘

     6.告警效果-通知企业微信机器人

  • 相关阅读:
    【canvas】-- H5新增标签canvas的简单用法
    Vue——使用内置组件Keep-alive
    PostgreSQL 逻辑复制模块(二)
    [原创][开源]C# Winform DPI自适应方案,SunnyUI三步搞定
    高频面试(JavaScript高级)
    vue3+Cesium 遇到的问题及解决办法(持续更新)
    算法 - 路径总和
    好用合并工具安利!需要的来关注一下
    C++核心编程--多态篇
    微博超话签到Js脚本
  • 原文地址:https://blog.csdn.net/skybboy/article/details/133245150