系统监控异常告警2.0版本之nacos服务监控

背景:

昨天写了一篇关于系统监控异常告警2.0版本,他是基于你的SpringBoot项目开启了CG相关的配置。但是,有两种情况还需要考虑。

  1. 那我没有开启相关配置怎么办?
  2. 虽开启了配置,服务没有触发GC,但nacos的健康实例数少了,总实例数也少了,怎么办?
  3. 如果我想通过nacos服务,每次都登录上去看吗,这不扯嘛。。

思路:

  1. 既然登录nacos能看,那我能调用它的api吧。

2. 能调用api,那返回json结果就有我需要的信息。

3. 那就解析json报文,获取我们想要的信息。

4. 设置告警阈值(服务数少的,总实例数,监控实例数不一致的)。

5. 日志记录必不可少,邮件通知必不可少。

开干:

1、前置工作

为什么不使用java写?可以但不推荐,为了监控nacos,我再安装个JDK,配置下,定制服务修改了,改源码,打包编译上传,浪费时间。

有侵入吗?Linux脚本,无侵入,仅修改nacos配置,任意服务器均可用(网络得通啊)。

安全吗?对,这点很重要,毕竟有敏感信息啊,脚本调试可用后,可通过

shc -v -r -f ss.sh进行加密处理,如果没用过,没事看我的啊,shc源码安装

2、安装jq

服务器需要安装jq工具来解析 JSON,这是常用的工具,如果安装过,可忽略。

安装命令 (CentOS/RHEL): sudo yum install jq 安装命令 (Ubuntu/Debian): sudo apt-get install jq 安装命令 (Mac): brew install jq

3、编写脚本

checkout_nacos_health.sh

#!/bin/bash # ================= 配置区域 ================= # Nacos 地址 NACOS_HOST="10.71.180.155" NACOS_PORT="8520" # 登录 Nacos 的账号密码(?本次不用,直接用ACCESS_TOKEN) NACOS_USER="nacos" NACOS_PASSWORD="********" # 要监控的命名空间 ID NAMESPACE_ID="prd" # 日志文件配置 LOG_DIR="/home/mdm/logs" # 日志存放目录 LOG_FILE="${LOG_DIR}/nacos_check.log" # 日志文件路径 # 邮件配置(多人空格分开) RECIPIENTS="*****@qq.com" SENDER_NAME="Nacos监控机器人" # ================= 脚本逻辑 ================= # 0. 初始化日志目录 if [ ! -d "$LOG_DIR" ]; then mkdir -p "$LOG_DIR" fi # 定义一个日志输出函数,同时输出到屏幕和日志文件 # 使用追加模式 >> 写入日志 function log() { local msg="[$(date '+%Y-%m-%d %H:%M:%S')] $1" echo "$msg" echo "$msg" >> "$LOG_FILE" } log "==========================================" log "开始 Nacos 服务健康检查" log "命名空间: ${NAMESPACE_ID}" log "==========================================" # 1. 获取 Access Token log "[1/3] 正在获取 Access Token..." #TOKEN_RESP=$(curl -s -X POST "http://${NACOS_HOST}:${NACOS_PORT}/nacos/v1/auth/login" -d "username=${NACOS_USER}&password=${NACOS_PASSWORD}") #ACCESS_TOKEN=$(echo $TOKEN_RESP | jq -r '.accessToken') ACCESS_TOKEN="eyJhbGciOiJIUzM4NCJ9.eyJzdWIiOiJuYWNvcyIsImV4cCI6MTc2ODU0MTc0N30.RFO80FEn0GoSSf5b_7URzqa2mWGHl5qToslviSSmCZeFMAJFIsZWJjTm1-Rn57Q8" if [ "$ACCESS_TOKEN" == "null" ] || [ -z "$ACCESS_TOKEN" ]; then log "错误: 无法获取 Access Token。响应: $TOKEN_RESP" exit 1 fi log "Token 获取成功: ${ACCESS_TOKEN:0:10}..." # 2. 循环获取所有服务列表 log "[2/3] 正在获取服务列表并分析..." PAGE_NO=1 PAGE_SIZE=100 UNHEALTHY_SERVICES="" HAS_ERROR=0 while true; do API_URL="http://${NACOS_HOST}:${NACOS_PORT}/nacos/v1/ns/catalog/services?accessToken=${ACCESS_TOKEN}&hasIpCount=true&withInstances=false&pageNo=${PAGE_NO}&pageSize=${PAGE_SIZE}&serviceNameParam=&groupNameParam=&namespaceId=${NAMESPACE_ID}" JSON_RESP=$(curl -s -X GET "$API_URL") SERVICE_LIST=$(echo "$JSON_RESP" | jq -c '.serviceList[]') # 如果当前页没有数据,跳出循环 if [ -z "$SERVICE_LIST" ]; then break fi # 遍历当前页服务 while IFS= read -r service; do NAME=$(echo "$service" | jq -r '.name') GROUP=$(echo "$service" | jq -r '.groupName') IP_COUNT=$(echo "$service" | jq -r '.ipCount') HEALTHY_COUNT=$(echo "$service" | jq -r '.healthyInstanceCount') IP_COUNT=${IP_COUNT:-0} HEALTHY_COUNT=${HEALTHY_COUNT:-0} # 判断逻辑 # 提取字段 NAME=$(echo "$service" | jq -r '.name') GROUP=$(echo "$service" | jq -r '.groupName') IP_COUNT=$(echo "$service" | jq -r '.ipCount') HEALTHY_COUNT=$(echo "$service" | jq -r '.healthyInstanceCount') IP_COUNT=${IP_COUNT:-0} HEALTHY_COUNT=${HEALTHY_COUNT:-0} # 初始化异常原因变量 ERROR_REASON="" # 1. 状态一致性检查:只要健康数 < 总数,肯定有问题 if [ "$HEALTHY_COUNT" -lt "$IP_COUNT" ]; then ERROR_REASON="存在宕机/不健康实例 (总数:${IP_COUNT} > 健康:${HEALTHY_COUNT})" fi # 2. 通用数量阈值检查:除了 sw-tenant,健康数不能少于 6 # 注意:这里加了 [ "$NAME" != "sw-tenant" ] 避免重复判定 if [ "$NAME" != "sunway-tenant" ] && [ "$HEALTHY_COUNT" -lt 6 ]; then ERROR_REASON="${ERROR_REASON} 健康实例数过少 (< 6)" fi # 3. 特定服务检查:如果是 sw-tenant,健康数不能少于 2 if [ "$NAME" == "sw-tenant" ] && [ "$HEALTHY_COUNT" -lt 2 ]; then ERROR_REASON="${ERROR_REASON} sw-tenant 健康数过低 (< 2)" fi # --- 判断是否需要告警 --- # 如果 ERROR_REASON 不为空,说明触发了上述任意条件 if [ -n "$ERROR_REASON" ]; then ERR_MSG="[异常] 服务: ${GROUP} :: ${NAME} | 总实例: ${IP_COUNT} | 健康实例: ${HEALTHY_COUNT} | 原因: ${ERROR_REASON}" log "$ERR_MSG" # 构造邮件内容 (修正了原脚本中可能存在的特殊字符 > 问题) UNHEALTHY_SERVICES="${UNHEALTHY_SERVICES}服务组: ${GROUP}\n服务名: ${NAME}\n总实例数: ${IP_COUNT}\n健康实例数: ${HEALTHY_COUNT}\n异常原因: ${ERROR_REASON}\n----------------------------------------\n" HAS_ERROR=1 fi done <<< "$SERVICE_LIST" # 判断翻页 COUNT=$(echo "$JSON_RESP" | jq '.count') if [ $((PAGE_NO * PAGE_SIZE)) -ge $COUNT ]; then break fi PAGE_NO=$((PAGE_NO + 1)) done # 3. 发送邮件与结束 log "[3/3] 检查完成。" if [ $HAS_ERROR -eq 1 ]; then log "发现异常服务,正在发送告警邮件..." SUBJECT="[Nacos 告警] 命名空间 ${NAMESPACE_ID} 中检测到服务实例异常" CONTENT="检测时间: $(date '+%Y-%m-%d %H:%M:%S')\n\n以下服务存在不健康实例,请及时处理:\n\n${UNHEALTHY_SERVICES}\n详情请登录 Nacos 控制台查看。" # 发送邮件 (这里假设系统 mail 命令可用) #echo -e "$CONTENT" | mail -s "$SUBJECT" -a "From: ${SENDER_NAME}" "$RECIPIENTS" echo -e "$CONTENT" | from="${SENDER_NAME}" mail -s "$SUBJECT" "$RECIPIENTS" if [ $? -eq 0 ]; then log "邮件发送成功。" else log "邮件发送失败。" fi else log "所有服务状态正常,无需发送邮件。" fi log "=========================================="

注意:这块需要根据服务进行调整

3、设置定时任务,略

4、查看执行结果

5、查看邮件告警

其他:

该脚本的可塑性较高,灵活配置,根据实际需要进行改造即可。

也可结合系统监控异常告警2.0版本,进行改造优化,实现整体监控,这里就不多说了,大家自己整吧。

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

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

相关文章

Python全栈项目--智能客服机器人的设计与实现

项目概述 随着人工智能技术的快速发展&#xff0c;智能客服机器人已经成为企业提升服务效率、降低运营成本的重要工具。本文将详细介绍如何使用Python技术栈从零开始构建一个功能完善的智能客服机器人系统&#xff0c;涵盖前端界面、后端服务、自然语言处理以及数据存储等各个…

导师推荐!专科生必备8款AI论文网站测评

导师推荐&#xff01;专科生必备8款AI论文网站测评 为什么需要这份AI论文网站测评&#xff1f; 随着人工智能技术的快速发展&#xff0c;越来越多的专科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的论文辅助平台&#xff0c;如何选择真正适合自己的…

ACPI!ACPIBuildProcessRunMethodPhaseRunMethod函数对_SB总线_INT方法的调用

ACPI!ACPIBuildProcessRunMethodPhaseRunMethod函数对_SB总线_INT方法的调用//// Call the function//status (buildFunction)( buildRequest ); 调用下一步&#xff1a;0: kd> g Breakpoint 5 hit eax00000004 ebx00000004 ecx89906e40 edx00000001 esi89906e30 edi80b…

大模型增强之道:RAG技术详解与应用实践

本文系统解读了《A Survey on Knowledge-Oriented Retrieval-Augmented Generation》论文&#xff0c;详细介绍了RAG&#xff08;检索增强生成&#xff09;技术如何解决传统语言模型无法动态访问外部知识的局限。文章全面解析了RAG的核心组件、关键步骤&#xff08;用户意图理解…

ACPI!ACPIBuildProcessRunMethodPhaseCheckSta函数对_SB总线的状态的确定

ACPI!ACPIBuildProcessRunMethodPhaseCheckSta函数对_SB总线的状态的确定 0: kd> kc# 00 ACPI!ACPIGet 01 ACPI!ACPIBuildProcessRunMethodPhaseCheckSta 02 ACPI!ACPIBuildProcessGenericList 03 ACPI!ACPIBuildDeviceDpc 04 nt!KiRetireDpcList 05 nt!KiDispatchInterrupt…

Java毕设项目:基于SpringBoot+Vue的中青年人员招聘平台(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

无人机螺距设计要点与技术解析

无人机螺距设计的核心&#xff0c;是在拉力、效率和飞行速度之间找到最佳平衡。你需要先明确无人机的用途&#xff0c;然后针对性地选择桨叶尺寸与螺距&#xff0c;有时还需考虑采用变桨距等高级技术。螺旋桨核心参数与设计选择首先是桨叶的关键参数&#xff1a;直径&#xff1…

表驱动法:告别 if-else(案例:查月份天数、成绩分级)

把「输入→输出」的对应关系做成一张 “表”&#xff08;数组 / 哈希表都行&#xff09;&#xff0c;不用写一堆条件判断&#xff0c;直接拿输入当索引去表里查结果#include<stdio.h>#define MONTH_COUNT 12 #define GRADE_COUNT 11int is_leap_year(int year); int get_…

协同过滤算法 基于django框架和python的 在线音乐推荐系统的设计与实现

目录 协同过滤算法在在线音乐推荐系统中的设计与实现 关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 协同过滤算法在在线音乐推荐系统中的设计与实现 基于Django框架和Python的在…

小程序 django基于django的助农商城销售系统

目录基于Django的助农商城销售系统摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于Django的助农商城销售系统摘要 助农商城销售系统基于Django框架开发&#xff0c;旨在通过…

【iManus】勾股定理的多种经典证明方法

勾股定理的多种经典证明方法 文章目录 勾股定理的多种经典证明方法引言勾股定理的基本表述经典证明方法1. 欧几里得几何法&#xff08;Euclids Proof&#xff09;证明原理证明步骤适用场景直观程度 2. 代数法&#xff08;Algebraic Proof&#xff09;证明原理证明步骤适用场景直…

小程序 基于django的大学生支教管理系统设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着教育信息化的快速发展&#xff0c;大学生支教活动的管理效率亟待提升。传统的支教管理多依赖人工操作&#xff0c…

探索 5KW 混合储能系统:从架构到功率板的技术之旅

5KW 混合储能系统48V电池500V光伏220V逆变&#xff08;AD格式&#xff09;&#xff08;功率板&#xff09; 光伏逆变器资料不带程序 在能源领域的发展浪潮中&#xff0c;混合储能系统逐渐崭露头角&#xff0c;今天咱们就来深入探讨一款 5KW 的混合储能系统&#xff0c;它融合了…

【毕业设计】基于SpringBoot+Vue的中青年人员招聘平台(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

CANopen 转 Modbus TCP 工业数据采集网关:PLC 与工控机实时数据同步方案

项目背景某自动化生产线企业的车间控制系统中&#xff0c;核心控制单元采用 CANopen 协议的 PLC&#xff08;如巴赫曼 PLC&#xff09;&#xff0c;负责控制输送带、机械手、传感器等设备的协同运行&#xff0c;实时采集设备运行状态数据&#xff08;如电机转速、气缸位置、物料…

视频融合平台EasyCVR构建智慧林业一体化监测防护体系

林业作为生态安全的核心屏障&#xff0c;其管护工作面临林区范围广袤、地形复杂、人力巡检效率低下、火情病虫害等风险突发性强等诸多难题。在这样的背景下&#xff0c;视频融合平台EasyCVR智能监控技术成为推动林业现代化管理的关键技术支撑&#xff0c;正在智慧林业建设中发挥…

从CC-Link IE FB转ProfiNet:一条网关线串起德系日系变频“朋友圈”

一、项目背景 华东某大型电子厂房&#xff0c;全年恒温恒湿需求刚性&#xff0c;中央空调一次回风系统配置 6 台 45 kW 离心风机&#xff0c;原由三菱 Q03UDE CPU 通过 CC-Link IE Field Basic 网络直接控制三菱 FR-A800 变频器。2024 年工厂扩产&#xff0c;新增 3 条贴片线&a…

视频汇聚平台EasyCVR如何运用全域轨迹跟踪技术构建主动式安防新体系?

在安防监控领域&#xff0c;单纯“看得见”已远不能满足日益复杂的安全管理需求。当事件发生时&#xff0c;我们更迫切需要知道&#xff1a;“目标从哪来&#xff1f;到哪去&#xff1f;”这正是轨迹跟踪技术的核心价值。本文将深度解析视频融合平台EasyCVR如何凭借其强大的轨迹…

【课程设计/毕业设计】基于SpringBoot+Vue的中青年人员招聘平台SpringBoot+Vue的人才招聘平台系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Django模板变量操作全指南

一、定义变量 在 Django 模板中,你可以使用不同的方法来定义变量。这些方法可以帮助你在模板中存储和展示数据。下面我将结合详细的代码描述几种定义变量的方法。 1.直接赋值 这是最简单的定义变量的方法。你可以在模板中使用"="符号来直接给变量赋值。 <!-- 模…