TT Bigdata TT Bigdata
首页
  • 产品中心

    • 当前版本
    • 版本矩阵与下载
    • 免费开源大数据平台怎么选
  • 安装与使用

    • Ambari Plus 安装
      • 安装前准备
        • 实施总览
        • Step0—源码包下载与目录准备
        • Step1—系统源与基础工具准备
        • Step2—集群免密登录
        • Step3—主机名解析同步
        • Step4—Chrony 时间同步
        • Step5—Nginx 本地 Yum 文件服务
        • Step6—JDK 双环境准备
        • Step7—MySQL 驱动与本地仓库
        • Step8—MariaDB 初始化
        • Step9—AmbariServer 初始化
        • 必须 ambari plus 数据库初始化文件
      • 安装部署
        • 初始化集群
    • 组件安装
      • 组件安装总览
      • Solr 安装
      • Ranger 安装
      • Knox 安装
      • HDFS 安装
      • YARN 安装
      • MapReduce2 安装
      • Tez 安装
      • Hive 安装
      • Sqoop 安装
      • HBase 安装
      • Kafka 安装
      • Flink 安装
      • Spark 安装
      • Hue 安装
      • Livy 安装
      • Zeppelin 安装
      • DolphinScheduler 安装
      • Doris 安装
      • Celeborn 安装
      • Ozone 安装
      • Impala 安装
      • Trino 安装
      • Paimon 安装
      • Hudi 安装
      • Atlas 安装
      • Superset 安装
      • Alluxio 安装
    • 开启高可用
      • 开启高可用总览
      • HDFS 开启 HA
      • YARN 开启 HA
    • 权限与审计
      • 权限与审计总览
      • Kerberos 认证启用
      • LDAP 目录接入
    • Ambari Plus Monitor
      • IoTDB 安装与部署
      • 必须 ambari plus monitor 数据库初始化文件
      • Monitor 安装
      • 监控与告警使用
    • 常见问题
      • 安装使用常见问题
  • 发布与支持

    • 更新日志
    • 服务说明
    • 优惠政策
    • 合作共建
    • 蓝图愿景
    • 历史版本
      • 更新日志 · v3.0.1
      • 更新日志 · v2.2.3
      • 更新日志 · v2.2.2
      • 更新日志 · v2.2.1
      • 更新日志 · v2.2.0
      • 更新日志 · v2.1.0
      • 更新日志 · v2.0.0
      • 更新日志 · v1.0.7
      • 更新日志 · v1.0.6
      • 更新日志 · v1.0.5
      • 更新日志 · v1.0.4
      • 更新日志 · v1.0.3
      • 更新日志 · v1.0.2
      • 更新日志 · v1.0.1
      • 更新日志 · v1.0.0
  • 会员与访问

    • 专属内容解锁
  • Ambari 安装

    • 常规安装
      • 适用于Ambari3.0.0-kylin V10-aarch64
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step2—免密登录配置
        • Step3—安装JDK-Bisheng
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-kylin V10-x86_64
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step2—免密登录配置
        • Step3—安装JDK17与JDK1.8
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-ubuntu22.04
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step3—安装JDK17与JDK1.8
        • Step4—时间同步(Chrony)
        • Step5—Nginx安装
        • Step6—本地apt源
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-el7
        • Step0—源码包下载
        • Step3—安装JDK17(Ambari 3.0专用)
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-el8
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step3—安装JDK17与JDK1.8
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari2.8.0-el7
        • Step1—基础环境准备
        • Step2—免密登陆认证
        • Step3—安装JDK
        • Step4—时间同步(Chrony)
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web Ui 初始化安装
    • 一键部署
      • Ambari快速部署—3.0.0
        • 【Kylin V10 aarch64】强力卸载脚本
        • 【Kylin V10 aarch64】自动安装脚本
        • 【Kylin V10 x86_64】强力卸载脚本
        • 【Kylin V10 x86_64】自动安装脚本
        • 【Ubuntu22】强力卸载脚本
        • 【Ubuntu22】自动安装脚本
        • 【Rocky8.10】强力卸载脚本
        • 【Rocky8.10】自动安装脚本
        • 【Centos7.9】自动安装脚本
      • Ambari快速部署—2.8.0
        • 【Centos7.9】自动安装脚本
        • 【Centos7.9】强力卸载脚本
      • 数据库环境
        • PostgreSQL 快速安装脚本
      • JDK环境
        • 安装JDK1.8
        • 安装JDK 17
        • 安装JDK1.8-aarch64
        • 安装JDK 17-aarch64
      • MAVEN环境
        • 安装Maven3.8.4
        • 安装Maven3.9.9
      • GRADLE环境
        • 安装Gradle5.6.4
      • CONDA环境
        • 安装Miniconda2
        • 编译Ambari2.8.0——Miniconda3
      • R环境
        • 【Kylin V10 x86_64】安装R 4.4.2
        • 【Ubuntu22】安装R 4.4.2
        • 【Rocky8.10】安装R 4.4.2
        • 【CentOS7】安装R 4.4.2
  • 组件安装

    • 安装指导
    • 魔改分享
      • Phoenix-JDK17下编译的二进制包适用于Datagrip
        • Q: 高版本 DataGrip 无法使用 Phoenix 驱动
        • A: Phoenix - JDK17 制作&下载
    • 最小化安装(简单)
      • Zookeeper 安装
      • Hadoop 安装
      • Yarn安装
      • Hive 安装
      • Spark 安装
      • HBase 安装
      • Kafka 安装
      • Sqoop 安装
      • Flink 安装
      • DolphinScheduler 安装
      • Zeppelin 安装
      • Redis 安装
      • Doris安装
      • Celeborn安装
      • Ozone安装
      • Impala安装
      • Cloudbeaver 安装
      • Ambari Metrics安装
      • Solr安装
      • Ranger 安装
      • Trino安装
      • Paimon安装
      • Hudi安装
      • Atlas 安装
      • Superset 安装
      • Livy 安装
      • Alluxio 安装
      • Hue 安装
      • Knox 安装
    • 进阶安装技巧(需开启Kerberos)
      • Ambari Metrics 进阶安装技巧
      • Atlas 进阶安装技巧
    • 高可用安装(有难度)
      • Zookeeper
      • Hadoop-Namenode
      • Yarn-ResourceManager
      • Hive
      • Hbase
      • Kafka
      • DolphinScheduler
      • Redis
      • Doris
      • Celeborn
      • Ozone
      • Ranger
  • Kerberos 旧版专题

    • 实战 Kerberos
    • 自建 Kerberos
      • KDC服务初始化安装
        • KDC服务初始化安装(RHEL篇)
        • KDC服务初始化安装(Ubuntu篇)
      • 开启Kerberos认证
        • Ambari 中开启 Kerberos 认证流程详解
        • [不看会报错]-Atlas开启准备工作
        • [不看会报错]-Zeppelin开启准备工作
        • [不看会报错]-Impala开启准备工作
        • [不看会报错]-Trino开启准备工作
      • 关闭Kerberos认证
        • Ambari 中关闭 Kerberos 认证流程详解
    • FreeIPA 认证
      • FreeIPA服务端初始化
        • FreeIPA Server 安装指导
      • FreeIPA客户端初始化及Ambari开启IPA认证
        • [Step1]-FreeIPA Client 安装与入域实战
        • [Step2]-FreeIPA 初始化核心用户
        • [Step3]-Ambari 中开启 Kerberos 认证流程详解
        • [Step3-1]-krb5-conf template调整
      • 部分踩坑-问题发现
        • Ambari Server 启动失败:no valid keystore
        • FreeIPA Client 导致 Ambari 权限异常问题排查
      • 部分踩坑-完美解决
        • Ambari Server 启动失败:no valid keystore
      • 辅助测试
        • FreeIPA Client 调试安装速记
        • Ambari Server 证书调试安装速记
    • 其他优化技巧
      • Atlas-Ranger-StringUtils缺失
      • Atlas-Ranger-commons-compress缺失
    • 部分组件踩坑合集
      • Test Kerberos Client报错:Failed to kinit
      • KERBEROS SERVICE CHECK 报错
      • Ambari开启Kerberos认证加密类型错误
      • [开启Kerberos]-Solr启动失败处理
      • [开启Kerberos]-Kafka启动失败处理
      • [开启Kerberos]-Atlas启动-Hbase权限异常
      • [开启Kerberos]-Atlas启动-Solr权限异常
      • [开启Kerberos]-Atlas启动-Kafka权限异常
      • [开启Kerberos]-Hive服务检查异常处理
      • [开启Kerberos]-Trino启动-配置文件处理
      • [开启Kerberos]-Trino启动-缺失PEM证书处理
      • [开启Kerberos]-Trino启动-连接Hive失败
      • [关闭 Kerberos]-Kafka 注销异常
      • [关闭 Kerberos]-Hive 注销异常
      • Kerberos 客户端模板渲染异常处理(临时处理)
      • Kafka 启动兼容 Kerberos 源码级修改
      • Kerberos 客户端模板渲染异常处理(源码修改)
    • 实战技巧
      • Knox 接入 Trino web-ui 解决方案
      • [开启Kerberos]-Trino启动-配置模板
      • [Knox适配]-Trino-474-转发规则魔改
    • 其他技巧
      • Ambari Security 开启步骤
  • Ranger 旧版专题

    • 实战 Ranger
    • Ranger HA 旧发行版
      • 环境准备
        • [Step1] Haproxy 规划与环境安装
      • Kerberos准备
        • [Step2] 统一访问域名的 Kerberos 票据生成
        • [Step3] 调整 Kerberos Client 配置
      • 安装指导
        • [Step4] Ambari页面开启 Ranger Admin 高可用
        • [Step5] 对齐 Ranger HA 的凭证处理
    • Ranger HA ttr-release
      • [Step2] Ranger Admin HA 自动化安装
    • FreeIPA 与 LDAP
      • [Step1] Ambari 安装 Ranger 并配置 FreeIPA + LDAP
      • [Step2] 制作 Ranger Usersync 证书并应用组件
      • [Step3] 制作 Ranger Admin 证书并应用组件
      • [Step4]Ranger HDFS Repository 创建失败修复
      • [Step5]Ranger HBase Repository 创建失败修复
    • 踩坑汇总
      • 调用 Ranger API 返回 403 问题
      • Ranger Admin LDAP 认证报 Bad credentials 分析
    • 解决方案
      • Ranger Admin LDAP 认证报 Bad credentials 处理
      • Ranger HA 虚拟域名 Principal 缺失修复
      • Ranger Usersync 证书快速导入脚本(LDAPS)
      • Ranger Admin 证书快速导入脚本
      • Ranger HDFS Repository 快速处理
      • Ranger HBase / Yarn Repository 快速处理
  • 开发环境

    • Ambari-Env
      • 环境准备
      • 开始使用
    • 工具与镜像
      • Maven镜像加速
      • Gradle镜像加速
      • Node.js 多版本共存方案
      • Npm镜像加速
      • Bower镜像加速
      • R环境安装+一键安装脚本
      • PostgreSQL 快速安装
  • Ambari 编译

    • Ambari 源码编译
    • 前端开发
    • 后端开发
    • Ambari Web本地启动
  • Bigtop 编译

    • 官方组件编译
    • 扩展组件编译
    • 工具与镜像
      • Ivy配置私有镜像仓库
      • APT仓库增量更新
      • Temurin JDK 23快速安装
  • Ambari 深度专题

    • Ambari Server 原理
    • Ambari Metrics 解读
  • Bigtop 方法论

    • Bigtop 深度专题
  • 自定义集成

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 各组件代码
    • 通用代码模板
  • 报错解决

    • Ambari 报错
      • Ambari Views
        • MDEP-187 从根因到修复
        • Loading node labels问题解决
      • Ambari
        • phantomjs下载失败问题
        • 编译问题:GCC 安装与配置
        • bower CERT_HAS_EXPIRED 错误问题
        • Ambari-admin包出现bower install错误
        • Cannot run program "rpmbuild"
        • Python: No such file or directory
        • Yarn解压报错EOFException排查与解决
        • Rpm-maven-plugin与shebang兼容性报错
        • Rpm-maven-plugin 最佳实践
        • Bower install拉取失败解决
        • 缺少 python3 报错解决
        • Python(>=2.6) but is not installed
        • SSL_ERROR_SYSCALL 的修复方法
      • Ambari-infra
        • org.apache.commons.io does not exist
        • maven-compiler-plugin:3.3:compile
        • java.security.InvalidAlgorithmParameterException
        • ambari-infra-solr-plugin依赖报错解决方案
      • Ambari-metrics
        • psutil 缺失与 archive_util 导入错误
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
    • Bigtop 报错
      • Hadoop
        • /usr/bin/env: python3: No such file or directory 问题
        • error [email protected]: The engine "node" is incompatible with this module 错误
        • CMake 3.1 or higher is required. You are running version 2.8.12.2 错误
        • fuse is needed by hadoop_3_2_0-3.3.4-1.el7.x86_64 错误
        • Cyrus SASL/GSASL 缺失解决
        • Protobuf PROTOC LIBRARY NOTFOUND
        • EVP CIPHER CTX block size 报错
        • TIRPC_INCLUDE_DIRS NOTFOUND解决
        • 缺失 redhat-rpm-config 报错
      • Spark
        • evaluate,httr2,knitr 包不存在解决办法
        • Pandoc 缺失导致 SparkR 构建失败
      • Trino
        • Trino requires Temurin or Oracle JDK for development
        • GLIBC 与 GLIBCXX 版本过低
      • Hudi
        • javax.annotation.Nullable 缺失
        • 缺失 everit-json-schema 依赖
      • Paimon
        • 缺失 Jindo 依赖
      • Livy
        • apache-incubator-disclaimer-resource-bundle 缺失
      • Flink
        • .git can't be found during `prepare`
        • Angular CLI requires Node >=14.15
        • npm run ci-check 报错退出码 3
        • TypeScript 类型声明错误
      • Atlas
        • Atlas 集成 JanusGraph 启动时报 Solr6Index 实例化失败解决
      • Superset
        • urllib3 v2 only supports OpenSSL 1.1.1+
      • Jsvc
        • jsvc 依赖缺失导致 rpm 构建失败
      • Zookeeper
        • ZooKeeper 构建(缺少 hostname 命令)
        • cppunit-devel 依赖缺失解决方案
      • Hive
        • org.apache.logging.slf4j.Log4j.Marker is not public 解决方案
      • Sqoop
        • xmlto is needed by 解决方法
        • lsb_release、rsync 缺失导致构建中断
        • asciidoc 警告与 relnotes.py 语法不兼容分析
      • Cloudbeaver
        • SelectExpressionItem cannot be resolved 报错分析
      • Bigtop-select
        • bigtop-select 打包缺 compat 报错修复
        • bigtop-select 打包缺 control 文件报错修复
      • Knox
        • xmlsectool 依赖缺失问题解析
        • webhdfs-test 依赖收敛冲突问题处理
        • Invalid keystore format 问题处理
        • Knox is not allowed to impersonate admin
        • X-Forwarded-For 406 错误的原因与处理
      • Hue
        • Hue 访问 Hadoop 权限问题
        • Hue 访问 Yarn 权限问题
        • Hue 访问 Impala 时间格式问题
        • requests-kerberos 兼容性问题
        • libmariadb.so.3 缺失导致 syncdb 失败
        • 生产环境下解决方案——Hue/query_api.py
  • 系统适配

    • Kylin V10系列
      • 通用部分
        • not set for current OS
          • 解读-不支持操作系统解读
          • 解决-增加系统支持范围(一)
          • 解决-增加系统支持范围(二)
          • 解决-增加系统支持范围(三)
          • 解决-增加系统支持范围(四)
        • 解决-TLS1.3导致依赖下载失败终极办法
    • Rocky系列
      • 案例-Ambari重启失败
        • 解读-Ambari3.0.0重启失败问题
        • 解决-追加日志锚点
        • 解决-进一步分析与改造[一]
        • 解决-进一步分析与改造[二]
      • 案例-数据库连接问题
        • 解读-安装完毕后出现Unable to load version data from server
      • 案例-日志级别控制问题
        • 解读-Ambari3.0.0无法调整日志输出级别
        • 解决-临时处理日志级别不生效
        • 解决-源码级处理日志不生效
      • 案例-找不到snappy-devel
        • 解决-HDFS报snappy-devel包缺失现象
      • 案例-编译高级功能
        • 解读-开启Hadoop下ISAL-L和PMDK功能
        • 解决-ISAL-L和PMDK功能完整环境包
    • Ubuntu系列
      • 案例-首次编译环境处理
        • 解决-dpkg-buildpackage依赖缺失
        • 解决-devscripts依赖缺失
        • 首次编译-环境初始化
      • 案例-Bigtop适配Debian
        • 解读-bigtop-select支持deb
        • 解决-Step1-解除限制拥抱deb
        • 解决-Step2-补全代码结构
      • 案例-安装中遇到的问题
        • 解读-APT私有镜像验证失败剖析
        • 解决-快速处理APT私有镜像验证失败问题
      • 案例-编译高级功能
        • 解读-开启Hadoop下ISAL-L和PMDK功能
        • 解决-ISAL-L和PMDK功能完整环境包
    • Centos系列
    • OpenEuler系列
  • 监控与调优

    • Ambari-Metrics插件
    • Infinity插件
      • 准备工作
        • Ambari-Metrics插件失效原因
        • Infinity 插件选择与安装小技巧
        • Grafana9.3.2+Infinity2.3.1
          • Grafana快速安装Infinity插件
        • Grafana11.5.2+Infinity3.4.1
          • Grafana快速安装Infinity插件
      • 创建最简DEMO
        • Grafana9.3.2+Infinity2.3.1
          • 快速创建一个简单demo
          • Panel JSON 配置示例
        • Grafana11.5.2+Infinity3.4.1
          • 快速创建一个简单demo
          • Panel JSON 配置示例
    • 组件配置调优
      • HDFS
        • [0001]访问 HDFS Web UI Logs Unauthorized 失败
        • [0001]>>>>>>Hadoop管理员配置优化
      • RANGER
        • [0002]Ranger 审计日志时间与系统时间不一致调整
        • [0002]>>>>>日期统一规则调优
        • [0001]Resource lookup fail 线程池超时优化
        • [0001]>>>>>>线程池与超时参数调优
    • 组件调优指南
    • 1v1指导调优
  • BUG临时处理

    • 版本-v2.2.2-以前
      • [22213]Ambari 3.0.0 滚动重启只执行一台主机修复
      • [22213]解决办法
      • [22212]Ambari 3.0.0 左侧服务菜单滚动条缺失修复
      • [22212]解决办法
      • [22211]Atlas 缺失 __AtlasUserProfile
      • [22211]解决办法
      • [22210]Atlas Hook 无权限访问 Kafka Topic
      • [22210]解决办法
      • [22209]Ranger Kafka Lookup 缺少 JAAS 配置
      • [22209]解决办法
      • [22208]Atlas Hook 消费 Kafka 报错
      • [22208]解决办法
      • [22207]Hue 内访问 SparkSql 失败
      • [22207]解决办法
      • [22206]Ranger 调用 Knox Topologies 失败
      • [22206]解决办法
      • [22205]Ranger Admin 轮刷ZK 缺失 JAAS
      • [22205]解决办法
      • [22204]KNOX policymgr-ssl 启动告警
      • [22204]解决办法
      • [22203]Hue 服务启动后秒退
      • [22203]解决办法
      • [22202]Hue 启动失败: hadoop 用户不存在
      • [22202]解决办法
      • [22201]Hive 使用 Tez 引擎插入数据失败
      • [22201]解决办法
    • 版本-v2.1.0-以前
      • Sqlline 启动卡死问题处理
  • 实验室

    • VIEW插件
      • CAPACITY-SCHEDULER-VIEW
        • Ambari CAPACITY-SCHEDULER 插件安装详解
      • FILE-VIEW
        • Ambari FILE-VIEW 插件安装详解
    • JIRA速查
    • 虚拟环境思路
GitHub (opens new window)

JaneTTR

数据酿造智慧,每一滴都是沉淀!
首页
  • 产品中心

    • 当前版本
    • 版本矩阵与下载
    • 免费开源大数据平台怎么选
  • 安装与使用

    • Ambari Plus 安装
      • 安装前准备
        • 实施总览
        • Step0—源码包下载与目录准备
        • Step1—系统源与基础工具准备
        • Step2—集群免密登录
        • Step3—主机名解析同步
        • Step4—Chrony 时间同步
        • Step5—Nginx 本地 Yum 文件服务
        • Step6—JDK 双环境准备
        • Step7—MySQL 驱动与本地仓库
        • Step8—MariaDB 初始化
        • Step9—AmbariServer 初始化
        • 必须 ambari plus 数据库初始化文件
      • 安装部署
        • 初始化集群
    • 组件安装
      • 组件安装总览
      • Solr 安装
      • Ranger 安装
      • Knox 安装
      • HDFS 安装
      • YARN 安装
      • MapReduce2 安装
      • Tez 安装
      • Hive 安装
      • Sqoop 安装
      • HBase 安装
      • Kafka 安装
      • Flink 安装
      • Spark 安装
      • Hue 安装
      • Livy 安装
      • Zeppelin 安装
      • DolphinScheduler 安装
      • Doris 安装
      • Celeborn 安装
      • Ozone 安装
      • Impala 安装
      • Trino 安装
      • Paimon 安装
      • Hudi 安装
      • Atlas 安装
      • Superset 安装
      • Alluxio 安装
    • 开启高可用
      • 开启高可用总览
      • HDFS 开启 HA
      • YARN 开启 HA
    • 权限与审计
      • 权限与审计总览
      • Kerberos 认证启用
      • LDAP 目录接入
    • Ambari Plus Monitor
      • IoTDB 安装与部署
      • 必须 ambari plus monitor 数据库初始化文件
      • Monitor 安装
      • 监控与告警使用
    • 常见问题
      • 安装使用常见问题
  • 发布与支持

    • 更新日志
    • 服务说明
    • 优惠政策
    • 合作共建
    • 蓝图愿景
    • 历史版本
      • 更新日志 · v3.0.1
      • 更新日志 · v2.2.3
      • 更新日志 · v2.2.2
      • 更新日志 · v2.2.1
      • 更新日志 · v2.2.0
      • 更新日志 · v2.1.0
      • 更新日志 · v2.0.0
      • 更新日志 · v1.0.7
      • 更新日志 · v1.0.6
      • 更新日志 · v1.0.5
      • 更新日志 · v1.0.4
      • 更新日志 · v1.0.3
      • 更新日志 · v1.0.2
      • 更新日志 · v1.0.1
      • 更新日志 · v1.0.0
  • 会员与访问

    • 专属内容解锁
  • Ambari 安装

    • 常规安装
      • 适用于Ambari3.0.0-kylin V10-aarch64
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step2—免密登录配置
        • Step3—安装JDK-Bisheng
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-kylin V10-x86_64
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step2—免密登录配置
        • Step3—安装JDK17与JDK1.8
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-ubuntu22.04
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step3—安装JDK17与JDK1.8
        • Step4—时间同步(Chrony)
        • Step5—Nginx安装
        • Step6—本地apt源
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-el7
        • Step0—源码包下载
        • Step3—安装JDK17(Ambari 3.0专用)
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari3.0.0-el8
        • Step0—源码包下载
        • Step1—基础环境准备
        • Step3—安装JDK17与JDK1.8
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web UI 初始化安装
        • [快速安装]—脚本极速部署
      • 适用于Ambari2.8.0-el7
        • Step1—基础环境准备
        • Step2—免密登陆认证
        • Step3—安装JDK
        • Step4—时间同步(Chrony)
        • Step5—Nginx安装
        • Step6—本地yum源配置
        • Step7—Mariadb初始化
        • Step8—AmbariServer初始化
        • Step9—Ambari Web Ui 初始化安装
    • 一键部署
      • Ambari快速部署—3.0.0
        • 【Kylin V10 aarch64】强力卸载脚本
        • 【Kylin V10 aarch64】自动安装脚本
        • 【Kylin V10 x86_64】强力卸载脚本
        • 【Kylin V10 x86_64】自动安装脚本
        • 【Ubuntu22】强力卸载脚本
        • 【Ubuntu22】自动安装脚本
        • 【Rocky8.10】强力卸载脚本
        • 【Rocky8.10】自动安装脚本
        • 【Centos7.9】自动安装脚本
      • Ambari快速部署—2.8.0
        • 【Centos7.9】自动安装脚本
        • 【Centos7.9】强力卸载脚本
      • 数据库环境
        • PostgreSQL 快速安装脚本
      • JDK环境
        • 安装JDK1.8
        • 安装JDK 17
        • 安装JDK1.8-aarch64
        • 安装JDK 17-aarch64
      • MAVEN环境
        • 安装Maven3.8.4
        • 安装Maven3.9.9
      • GRADLE环境
        • 安装Gradle5.6.4
      • CONDA环境
        • 安装Miniconda2
        • 编译Ambari2.8.0——Miniconda3
      • R环境
        • 【Kylin V10 x86_64】安装R 4.4.2
        • 【Ubuntu22】安装R 4.4.2
        • 【Rocky8.10】安装R 4.4.2
        • 【CentOS7】安装R 4.4.2
  • 组件安装

    • 安装指导
    • 魔改分享
      • Phoenix-JDK17下编译的二进制包适用于Datagrip
        • Q: 高版本 DataGrip 无法使用 Phoenix 驱动
        • A: Phoenix - JDK17 制作&下载
    • 最小化安装(简单)
      • Zookeeper 安装
      • Hadoop 安装
      • Yarn安装
      • Hive 安装
      • Spark 安装
      • HBase 安装
      • Kafka 安装
      • Sqoop 安装
      • Flink 安装
      • DolphinScheduler 安装
      • Zeppelin 安装
      • Redis 安装
      • Doris安装
      • Celeborn安装
      • Ozone安装
      • Impala安装
      • Cloudbeaver 安装
      • Ambari Metrics安装
      • Solr安装
      • Ranger 安装
      • Trino安装
      • Paimon安装
      • Hudi安装
      • Atlas 安装
      • Superset 安装
      • Livy 安装
      • Alluxio 安装
      • Hue 安装
      • Knox 安装
    • 进阶安装技巧(需开启Kerberos)
      • Ambari Metrics 进阶安装技巧
      • Atlas 进阶安装技巧
    • 高可用安装(有难度)
      • Zookeeper
      • Hadoop-Namenode
      • Yarn-ResourceManager
      • Hive
      • Hbase
      • Kafka
      • DolphinScheduler
      • Redis
      • Doris
      • Celeborn
      • Ozone
      • Ranger
  • Kerberos 旧版专题

    • 实战 Kerberos
    • 自建 Kerberos
      • KDC服务初始化安装
        • KDC服务初始化安装(RHEL篇)
        • KDC服务初始化安装(Ubuntu篇)
      • 开启Kerberos认证
        • Ambari 中开启 Kerberos 认证流程详解
        • [不看会报错]-Atlas开启准备工作
        • [不看会报错]-Zeppelin开启准备工作
        • [不看会报错]-Impala开启准备工作
        • [不看会报错]-Trino开启准备工作
      • 关闭Kerberos认证
        • Ambari 中关闭 Kerberos 认证流程详解
    • FreeIPA 认证
      • FreeIPA服务端初始化
        • FreeIPA Server 安装指导
      • FreeIPA客户端初始化及Ambari开启IPA认证
        • [Step1]-FreeIPA Client 安装与入域实战
        • [Step2]-FreeIPA 初始化核心用户
        • [Step3]-Ambari 中开启 Kerberos 认证流程详解
        • [Step3-1]-krb5-conf template调整
      • 部分踩坑-问题发现
        • Ambari Server 启动失败:no valid keystore
        • FreeIPA Client 导致 Ambari 权限异常问题排查
      • 部分踩坑-完美解决
        • Ambari Server 启动失败:no valid keystore
      • 辅助测试
        • FreeIPA Client 调试安装速记
        • Ambari Server 证书调试安装速记
    • 其他优化技巧
      • Atlas-Ranger-StringUtils缺失
      • Atlas-Ranger-commons-compress缺失
    • 部分组件踩坑合集
      • Test Kerberos Client报错:Failed to kinit
      • KERBEROS SERVICE CHECK 报错
      • Ambari开启Kerberos认证加密类型错误
      • [开启Kerberos]-Solr启动失败处理
      • [开启Kerberos]-Kafka启动失败处理
      • [开启Kerberos]-Atlas启动-Hbase权限异常
      • [开启Kerberos]-Atlas启动-Solr权限异常
      • [开启Kerberos]-Atlas启动-Kafka权限异常
      • [开启Kerberos]-Hive服务检查异常处理
      • [开启Kerberos]-Trino启动-配置文件处理
      • [开启Kerberos]-Trino启动-缺失PEM证书处理
      • [开启Kerberos]-Trino启动-连接Hive失败
      • [关闭 Kerberos]-Kafka 注销异常
      • [关闭 Kerberos]-Hive 注销异常
      • Kerberos 客户端模板渲染异常处理(临时处理)
      • Kafka 启动兼容 Kerberos 源码级修改
      • Kerberos 客户端模板渲染异常处理(源码修改)
    • 实战技巧
      • Knox 接入 Trino web-ui 解决方案
      • [开启Kerberos]-Trino启动-配置模板
      • [Knox适配]-Trino-474-转发规则魔改
    • 其他技巧
      • Ambari Security 开启步骤
  • Ranger 旧版专题

    • 实战 Ranger
    • Ranger HA 旧发行版
      • 环境准备
        • [Step1] Haproxy 规划与环境安装
      • Kerberos准备
        • [Step2] 统一访问域名的 Kerberos 票据生成
        • [Step3] 调整 Kerberos Client 配置
      • 安装指导
        • [Step4] Ambari页面开启 Ranger Admin 高可用
        • [Step5] 对齐 Ranger HA 的凭证处理
    • Ranger HA ttr-release
      • [Step2] Ranger Admin HA 自动化安装
    • FreeIPA 与 LDAP
      • [Step1] Ambari 安装 Ranger 并配置 FreeIPA + LDAP
      • [Step2] 制作 Ranger Usersync 证书并应用组件
      • [Step3] 制作 Ranger Admin 证书并应用组件
      • [Step4]Ranger HDFS Repository 创建失败修复
      • [Step5]Ranger HBase Repository 创建失败修复
    • 踩坑汇总
      • 调用 Ranger API 返回 403 问题
      • Ranger Admin LDAP 认证报 Bad credentials 分析
    • 解决方案
      • Ranger Admin LDAP 认证报 Bad credentials 处理
      • Ranger HA 虚拟域名 Principal 缺失修复
      • Ranger Usersync 证书快速导入脚本(LDAPS)
      • Ranger Admin 证书快速导入脚本
      • Ranger HDFS Repository 快速处理
      • Ranger HBase / Yarn Repository 快速处理
  • 开发环境

    • Ambari-Env
      • 环境准备
      • 开始使用
    • 工具与镜像
      • Maven镜像加速
      • Gradle镜像加速
      • Node.js 多版本共存方案
      • Npm镜像加速
      • Bower镜像加速
      • R环境安装+一键安装脚本
      • PostgreSQL 快速安装
  • Ambari 编译

    • Ambari 源码编译
    • 前端开发
    • 后端开发
    • Ambari Web本地启动
  • Bigtop 编译

    • 官方组件编译
    • 扩展组件编译
    • 工具与镜像
      • Ivy配置私有镜像仓库
      • APT仓库增量更新
      • Temurin JDK 23快速安装
  • Ambari 深度专题

    • Ambari Server 原理
    • Ambari Metrics 解读
  • Bigtop 方法论

    • Bigtop 深度专题
  • 自定义集成

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 各组件代码
    • 通用代码模板
  • 报错解决

    • Ambari 报错
      • Ambari Views
        • MDEP-187 从根因到修复
        • Loading node labels问题解决
      • Ambari
        • phantomjs下载失败问题
        • 编译问题:GCC 安装与配置
        • bower CERT_HAS_EXPIRED 错误问题
        • Ambari-admin包出现bower install错误
        • Cannot run program "rpmbuild"
        • Python: No such file or directory
        • Yarn解压报错EOFException排查与解决
        • Rpm-maven-plugin与shebang兼容性报错
        • Rpm-maven-plugin 最佳实践
        • Bower install拉取失败解决
        • 缺少 python3 报错解决
        • Python(>=2.6) but is not installed
        • SSL_ERROR_SYSCALL 的修复方法
      • Ambari-infra
        • org.apache.commons.io does not exist
        • maven-compiler-plugin:3.3:compile
        • java.security.InvalidAlgorithmParameterException
        • ambari-infra-solr-plugin依赖报错解决方案
      • Ambari-metrics
        • psutil 缺失与 archive_util 导入错误
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
        • Ambari-Metrics Monitor 启动失败
    • Bigtop 报错
      • Hadoop
        • /usr/bin/env: python3: No such file or directory 问题
        • error [email protected]: The engine "node" is incompatible with this module 错误
        • CMake 3.1 or higher is required. You are running version 2.8.12.2 错误
        • fuse is needed by hadoop_3_2_0-3.3.4-1.el7.x86_64 错误
        • Cyrus SASL/GSASL 缺失解决
        • Protobuf PROTOC LIBRARY NOTFOUND
        • EVP CIPHER CTX block size 报错
        • TIRPC_INCLUDE_DIRS NOTFOUND解决
        • 缺失 redhat-rpm-config 报错
      • Spark
        • evaluate,httr2,knitr 包不存在解决办法
        • Pandoc 缺失导致 SparkR 构建失败
      • Trino
        • Trino requires Temurin or Oracle JDK for development
        • GLIBC 与 GLIBCXX 版本过低
      • Hudi
        • javax.annotation.Nullable 缺失
        • 缺失 everit-json-schema 依赖
      • Paimon
        • 缺失 Jindo 依赖
      • Livy
        • apache-incubator-disclaimer-resource-bundle 缺失
      • Flink
        • .git can't be found during `prepare`
        • Angular CLI requires Node >=14.15
        • npm run ci-check 报错退出码 3
        • TypeScript 类型声明错误
      • Atlas
        • Atlas 集成 JanusGraph 启动时报 Solr6Index 实例化失败解决
      • Superset
        • urllib3 v2 only supports OpenSSL 1.1.1+
      • Jsvc
        • jsvc 依赖缺失导致 rpm 构建失败
      • Zookeeper
        • ZooKeeper 构建(缺少 hostname 命令)
        • cppunit-devel 依赖缺失解决方案
      • Hive
        • org.apache.logging.slf4j.Log4j.Marker is not public 解决方案
      • Sqoop
        • xmlto is needed by 解决方法
        • lsb_release、rsync 缺失导致构建中断
        • asciidoc 警告与 relnotes.py 语法不兼容分析
      • Cloudbeaver
        • SelectExpressionItem cannot be resolved 报错分析
      • Bigtop-select
        • bigtop-select 打包缺 compat 报错修复
        • bigtop-select 打包缺 control 文件报错修复
      • Knox
        • xmlsectool 依赖缺失问题解析
        • webhdfs-test 依赖收敛冲突问题处理
        • Invalid keystore format 问题处理
        • Knox is not allowed to impersonate admin
        • X-Forwarded-For 406 错误的原因与处理
      • Hue
        • Hue 访问 Hadoop 权限问题
        • Hue 访问 Yarn 权限问题
        • Hue 访问 Impala 时间格式问题
        • requests-kerberos 兼容性问题
        • libmariadb.so.3 缺失导致 syncdb 失败
        • 生产环境下解决方案——Hue/query_api.py
  • 系统适配

    • Kylin V10系列
      • 通用部分
        • not set for current OS
          • 解读-不支持操作系统解读
          • 解决-增加系统支持范围(一)
          • 解决-增加系统支持范围(二)
          • 解决-增加系统支持范围(三)
          • 解决-增加系统支持范围(四)
        • 解决-TLS1.3导致依赖下载失败终极办法
    • Rocky系列
      • 案例-Ambari重启失败
        • 解读-Ambari3.0.0重启失败问题
        • 解决-追加日志锚点
        • 解决-进一步分析与改造[一]
        • 解决-进一步分析与改造[二]
      • 案例-数据库连接问题
        • 解读-安装完毕后出现Unable to load version data from server
      • 案例-日志级别控制问题
        • 解读-Ambari3.0.0无法调整日志输出级别
        • 解决-临时处理日志级别不生效
        • 解决-源码级处理日志不生效
      • 案例-找不到snappy-devel
        • 解决-HDFS报snappy-devel包缺失现象
      • 案例-编译高级功能
        • 解读-开启Hadoop下ISAL-L和PMDK功能
        • 解决-ISAL-L和PMDK功能完整环境包
    • Ubuntu系列
      • 案例-首次编译环境处理
        • 解决-dpkg-buildpackage依赖缺失
        • 解决-devscripts依赖缺失
        • 首次编译-环境初始化
      • 案例-Bigtop适配Debian
        • 解读-bigtop-select支持deb
        • 解决-Step1-解除限制拥抱deb
        • 解决-Step2-补全代码结构
      • 案例-安装中遇到的问题
        • 解读-APT私有镜像验证失败剖析
        • 解决-快速处理APT私有镜像验证失败问题
      • 案例-编译高级功能
        • 解读-开启Hadoop下ISAL-L和PMDK功能
        • 解决-ISAL-L和PMDK功能完整环境包
    • Centos系列
    • OpenEuler系列
  • 监控与调优

    • Ambari-Metrics插件
    • Infinity插件
      • 准备工作
        • Ambari-Metrics插件失效原因
        • Infinity 插件选择与安装小技巧
        • Grafana9.3.2+Infinity2.3.1
          • Grafana快速安装Infinity插件
        • Grafana11.5.2+Infinity3.4.1
          • Grafana快速安装Infinity插件
      • 创建最简DEMO
        • Grafana9.3.2+Infinity2.3.1
          • 快速创建一个简单demo
          • Panel JSON 配置示例
        • Grafana11.5.2+Infinity3.4.1
          • 快速创建一个简单demo
          • Panel JSON 配置示例
    • 组件配置调优
      • HDFS
        • [0001]访问 HDFS Web UI Logs Unauthorized 失败
        • [0001]>>>>>>Hadoop管理员配置优化
      • RANGER
        • [0002]Ranger 审计日志时间与系统时间不一致调整
        • [0002]>>>>>日期统一规则调优
        • [0001]Resource lookup fail 线程池超时优化
        • [0001]>>>>>>线程池与超时参数调优
    • 组件调优指南
    • 1v1指导调优
  • BUG临时处理

    • 版本-v2.2.2-以前
      • [22213]Ambari 3.0.0 滚动重启只执行一台主机修复
      • [22213]解决办法
      • [22212]Ambari 3.0.0 左侧服务菜单滚动条缺失修复
      • [22212]解决办法
      • [22211]Atlas 缺失 __AtlasUserProfile
      • [22211]解决办法
      • [22210]Atlas Hook 无权限访问 Kafka Topic
      • [22210]解决办法
      • [22209]Ranger Kafka Lookup 缺少 JAAS 配置
      • [22209]解决办法
      • [22208]Atlas Hook 消费 Kafka 报错
      • [22208]解决办法
      • [22207]Hue 内访问 SparkSql 失败
      • [22207]解决办法
      • [22206]Ranger 调用 Knox Topologies 失败
      • [22206]解决办法
      • [22205]Ranger Admin 轮刷ZK 缺失 JAAS
      • [22205]解决办法
      • [22204]KNOX policymgr-ssl 启动告警
      • [22204]解决办法
      • [22203]Hue 服务启动后秒退
      • [22203]解决办法
      • [22202]Hue 启动失败: hadoop 用户不存在
      • [22202]解决办法
      • [22201]Hive 使用 Tez 引擎插入数据失败
      • [22201]解决办法
    • 版本-v2.1.0-以前
      • Sqlline 启动卡死问题处理
  • 实验室

    • VIEW插件
      • CAPACITY-SCHEDULER-VIEW
        • Ambari CAPACITY-SCHEDULER 插件安装详解
      • FILE-VIEW
        • Ambari FILE-VIEW 插件安装详解
    • JIRA速查
    • 虚拟环境思路
GitHub (opens new window)
  • 产品中心

  • 安装与使用

    • Ambari Plus 安装

    • 组件安装

    • 开启高可用

    • 权限与审计

    • Ambari Plus Monitor

      • IoTDB 安装与部署
      • 必须 ambari plus monitor 数据库初始化文件
        • 必须 ambari plus monitor 数据库初始化文件
        • 1. 放置初始化文件
        • 2. 导入到 ambari 库
        • 3. 验证初始化结果
        • 4. 初始化 SQL
      • Monitor 安装
      • 监控与告警使用
    • 常见问题

  • 发布与支持

  • 会员与访问

目录

必须 ambari plus monitor 数据库初始化文件

必须ambari plus monitor 数据库初始化文件

Ambari Plus Monitor 会在元数据库里保存集群、主机、服务、组件、指标定义、告警规则、通知记录和同步任务等数据。安装 Monitor 服务前,必须先把这份初始化 SQL 导入到 Ambari Server 使用的同一个 ambari 库里。

必须

本文 SQL 要导入 Ambari 官方表所在的同一个库。本文示例库名是 ambari,不要单独创建 monitor、ambari_monitor 或其他库,否则 Monitor 安装后读不到平台已有的集群与租户上下文。

两类数据库不要混淆

本文初始化的是 Monitor 元数据库,也就是 MySQL / MariaDB 中的 ambari 库。IoTDB 的 root.monitor 用于保存时序指标,属于另一套存储。Ambari Plus 3.0.2 的 IoTDB 自建用户、角色授权和预创建数据库操作,请按 IoTDB 安装与部署 处理,不要把 IoTDB 授权语句放到 MySQL 中执行。

# 1. 放置初始化文件

把初始化文件放到 hadoop1.test.com 上,例如:

mkdir -p /data/modules/monitor
cd /data/modules/monitor
ls -lh Ambari-Plus-Monitor-DDL-MySQL-CREATE.sql
1
2
3

我习惯把所有安装前置 SQL 放在 /data/modules 下,这样后面排查或重装时不用到处找文件。

# 2. 导入到 ambari 库

本文示例环境使用 hadoop1.test.com 上的 MySQL / MariaDB,基础演示账号为 root / root。导入时连接 ambari 库:

mysql -uroot -p ambari < Ambari-Plus-Monitor-DDL-MySQL-CREATE.sql
1

注意

root / root 只适合教程环境快速跑通。生产环境建议创建专用数据库用户,并使用高复杂度密码和最小权限授权。

# 3. 验证初始化结果

导入后先看 Monitor 表数量,再抽查关键表和指标定义数据。

mysql -uroot -p -D ambari -N -e \
  "SELECT COUNT(*) FROM information_schema.tables \
   WHERE table_schema='ambari' AND table_name LIKE 'monitor\\_%';"

mysql -uroot -p -D ambari -N -e \
  "SHOW TABLES LIKE 'monitor_cluster'; \
   SHOW TABLES LIKE 'monitor_metric_definition'; \
   SELECT COUNT(*) FROM monitor_metric_definition;"
1
2
3
4
5
6
7
8

本文环境里可以看到 38 张 Monitor 相关表,monitor_metric_definition 里已经有指标定义数据。

Ambari Plus Monitor 元数据库初始化

# 4. 初始化 SQL

下面的 SQL 可以保存为 Ambari-Plus-Monitor-DDL-MySQL-CREATE.sql 后执行。它只负责 Monitor 元数据结构和基线数据,库名由你执行时连接的数据库决定。

展开查看 Ambari Plus Monitor 初始化 SQL


SET NAMES utf8mb4;

CREATE TABLE IF NOT EXISTS `monitor_cluster` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `cluster_name` VARCHAR(128) NOT NULL COMMENT '集群名称',
  `display_name` VARCHAR(128) DEFAULT NULL COMMENT '展示名称',
  `ambari_cluster_id` VARCHAR(128) DEFAULT NULL COMMENT 'Ambari 集群ID',
  `environment` VARCHAR(64) DEFAULT NULL COMMENT '环境标识,如 dev/prd',
  `version` VARCHAR(64) DEFAULT NULL COMMENT '集群版本',
  `security_type` VARCHAR(64) DEFAULT NULL COMMENT '安全模式',
  `description` TEXT COMMENT '描述信息',
  `health_score` INT NOT NULL DEFAULT 100 COMMENT '健康分',
  `health_status` VARCHAR(32) NOT NULL DEFAULT 'HEALTHY' COMMENT '健康状态',
  `total_hosts` INT NOT NULL DEFAULT 0 COMMENT '主机总数',
  `total_services` INT NOT NULL DEFAULT 0 COMMENT '服务总数',
  `total_components` INT NOT NULL DEFAULT 0 COMMENT '组件总数',
  `alert_count` INT NOT NULL DEFAULT 0 COMMENT '当前告警数',
  `tenant_id` BIGINT DEFAULT NULL COMMENT '租户ID',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `sync_time` DATETIME DEFAULT NULL COMMENT '最近一次同步时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_cluster_name` (`cluster_name`),
  KEY `idx_cluster_tenant` (`tenant_id`),
  KEY `idx_cluster_health` (`health_status`),
  KEY `idx_cluster_sync` (`sync_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '监控集群元数据表';

CREATE TABLE IF NOT EXISTS `monitor_host` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `host_name` VARCHAR(255) NOT NULL COMMENT '主机名',
  `ip_address` VARCHAR(64) DEFAULT NULL COMMENT 'IP地址',
  `cluster_id` BIGINT NOT NULL COMMENT '所属集群ID',
  `rack` VARCHAR(128) DEFAULT NULL COMMENT '机架',
  `os_type` VARCHAR(64) DEFAULT NULL COMMENT '操作系统类型',
  `cpu_arch` VARCHAR(64) DEFAULT NULL COMMENT 'CPU 架构',
  `cpu_cores` INT DEFAULT NULL COMMENT 'CPU 核数',
  `memory_gb` INT DEFAULT NULL COMMENT '内存大小(GB)',
  `disk_gb` BIGINT DEFAULT NULL COMMENT '磁盘大小(GB)',
  `agent_status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN' COMMENT 'Agent 状态',
  `agent_heartbeat_time` DATETIME DEFAULT NULL COMMENT 'Agent 最近心跳时间',
  `health_score` INT NOT NULL DEFAULT 100 COMMENT '健康分',
  `health_status` VARCHAR(32) NOT NULL DEFAULT 'HEALTHY' COMMENT '健康状态',
  `cpu_usage` DOUBLE DEFAULT NULL COMMENT 'CPU 使用率',
  `memory_usage` DOUBLE DEFAULT NULL COMMENT '内存使用率',
  `disk_usage` DOUBLE DEFAULT NULL COMMENT '磁盘使用率',
  `load1` DOUBLE DEFAULT NULL COMMENT '1分钟平均负载',
  `load5` DOUBLE DEFAULT NULL COMMENT '5分钟平均负载',
  `load15` DOUBLE DEFAULT NULL COMMENT '15分钟平均负载',
  `running_component_count` INT NOT NULL DEFAULT 0 COMMENT '运行中组件实例数',
  `alert_count` INT NOT NULL DEFAULT 0 COMMENT '当前告警数',
  `tenant_id` BIGINT DEFAULT NULL COMMENT '租户ID',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `sync_time` DATETIME DEFAULT NULL COMMENT '最近一次同步时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_host_cluster_name` (`cluster_id`, `host_name`),
  KEY `idx_host_name` (`host_name`),
  KEY `idx_host_cluster` (`cluster_id`),
  KEY `idx_host_health` (`health_status`),
  KEY `idx_host_agent` (`agent_status`),
  KEY `idx_host_sync` (`sync_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '监控主机元数据表';

CREATE TABLE IF NOT EXISTS `monitor_service` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `service_name` VARCHAR(128) NOT NULL COMMENT '服务名称',
  `display_name` VARCHAR(128) DEFAULT NULL COMMENT '展示名称',
  `cluster_id` BIGINT NOT NULL COMMENT '所属集群ID',
  `version` VARCHAR(64) DEFAULT NULL COMMENT '服务版本',
  `service_status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN' COMMENT '服务状态',
  `health_score` INT NOT NULL DEFAULT 100 COMMENT '健康分',
  `health_status` VARCHAR(32) NOT NULL DEFAULT 'HEALTHY' COMMENT '健康状态',
  `total_components` INT NOT NULL DEFAULT 0 COMMENT '组件总数',
  `running_components` INT NOT NULL DEFAULT 0 COMMENT '运行中组件数',
  `alert_count` INT NOT NULL DEFAULT 0 COMMENT '当前告警数',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `sync_time` DATETIME DEFAULT NULL COMMENT '最近一次同步时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_service_cluster_name` (`cluster_id`, `service_name`),
  KEY `idx_service_cluster` (`cluster_id`),
  KEY `idx_service_health` (`health_status`),
  KEY `idx_service_sync` (`sync_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '监控服务元数据表';

CREATE TABLE IF NOT EXISTS `monitor_component` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `component_name` VARCHAR(128) NOT NULL COMMENT '组件名称',
  `display_name` VARCHAR(128) DEFAULT NULL COMMENT '展示名称',
  `service_id` BIGINT NOT NULL COMMENT '所属服务ID',
  `cluster_id` BIGINT NOT NULL COMMENT '所属集群ID',
  `category` VARCHAR(64) DEFAULT NULL COMMENT '组件分类',
  `version` VARCHAR(64) DEFAULT NULL COMMENT '组件版本',
  `component_status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN' COMMENT '组件状态',
  `health_score` INT NOT NULL DEFAULT 100 COMMENT '健康分',
  `health_status` VARCHAR(32) NOT NULL DEFAULT 'HEALTHY' COMMENT '健康状态',
  `total_instances` INT NOT NULL DEFAULT 0 COMMENT '实例总数',
  `running_instances` INT NOT NULL DEFAULT 0 COMMENT '运行中实例数',
  `alert_count` INT NOT NULL DEFAULT 0 COMMENT '当前告警数',
  `dependencies` TEXT COMMENT '依赖信息(JSON)',
  `data_source_type` VARCHAR(64) DEFAULT NULL COMMENT '指标来源类型',
  `template_id` BIGINT DEFAULT NULL COMMENT '模板ID',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `sync_time` DATETIME DEFAULT NULL COMMENT '最近一次同步时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_component_service_name` (`service_id`, `component_name`),
  KEY `idx_component_name` (`component_name`),
  KEY `idx_component_cluster` (`cluster_id`),
  KEY `idx_component_category` (`category`),
  KEY `idx_component_health` (`health_status`),
  KEY `idx_component_status` (`component_status`),
  KEY `idx_component_sync` (`sync_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '监控组件元数据表';

CREATE TABLE IF NOT EXISTS `monitor_component_instance` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `component_id` BIGINT NOT NULL COMMENT '所属组件ID',
  `cluster_id` BIGINT NOT NULL COMMENT '所属集群ID',
  `host_id` BIGINT DEFAULT NULL COMMENT '所属主机ID',
  `host_name` VARCHAR(255) NOT NULL COMMENT '主机名',
  `instance_name` VARCHAR(255) DEFAULT NULL COMMENT '实例名称',
  `role` VARCHAR(128) DEFAULT NULL COMMENT '实例角色',
  `process_id` VARCHAR(64) DEFAULT NULL COMMENT '进程ID',
  `port` INT DEFAULT NULL COMMENT '端口',
  `status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN' COMMENT '实例状态',
  `health_score` INT NOT NULL DEFAULT 100 COMMENT '健康分',
  `health_status` VARCHAR(32) NOT NULL DEFAULT 'HEALTHY' COMMENT '健康状态',
  `heap_used_mb` BIGINT DEFAULT NULL COMMENT 'JVM 已用堆内存(MB)',
  `heap_max_mb` BIGINT DEFAULT NULL COMMENT 'JVM 最大堆内存(MB)',
  `cpu_usage` DOUBLE DEFAULT NULL COMMENT 'CPU 使用率',
  `alert_count` INT NOT NULL DEFAULT 0 COMMENT '当前告警数',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `sync_time` DATETIME DEFAULT NULL COMMENT '最近一次同步时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_instance_component_host` (`component_id`, `host_name`),
  KEY `idx_instance_host` (`host_id`),
  KEY `idx_instance_cluster` (`cluster_id`),
  KEY `idx_instance_name` (`instance_name`),
  KEY `idx_instance_status` (`status`),
  KEY `idx_instance_sync` (`sync_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '监控组件实例元数据表';

-- ============================================================
-- 统一服务快照表
-- ============================================================
CREATE TABLE IF NOT EXISTS `monitor_service_snapshot` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键 ID',
  `cluster_id` BIGINT NOT NULL COMMENT '集群 ID',
  `cluster_name` VARCHAR(128) NOT NULL COMMENT '集群名称',
  `service_id` BIGINT NOT NULL COMMENT '服务 ID',
  `service_name` VARCHAR(64) NOT NULL COMMENT '服务名称(HDFS/YARN/KAFKA/HIVE/HBASE/SPARK/FLINK)',
  `health_score` INT DEFAULT 100 COMMENT '健康分(0-100)',
  `risk_level` VARCHAR(16) DEFAULT 'UNKNOWN' COMMENT '风险等级(HIGH/MEDIUM/LOW/UNKNOWN)',
  `metrics_json` JSON DEFAULT NULL COMMENT '服务特有指标 JSON',
  `snapshot_time` DATETIME NOT NULL COMMENT '快照时间点',
  `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_service_snapshot_time` (`cluster_id`, `service_name`, `snapshot_time`),
  KEY `idx_cluster_service` (`cluster_id`, `service_name`),
  KEY `idx_snapshot_time` (`snapshot_time`),
  KEY `idx_cluster_service_time` (`cluster_id`, `service_name`, `snapshot_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='统一的服务快照表';

CREATE TABLE IF NOT EXISTS `monitor_alert_rule` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `rule_name` VARCHAR(128) NOT NULL COMMENT '规则名称',
  `display_name` VARCHAR(128) DEFAULT NULL COMMENT '展示名称',
  `rule_type` VARCHAR(64) NOT NULL COMMENT '规则类型',
  `rule_group_id` BIGINT DEFAULT NULL COMMENT '规则分组ID',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '组件名称',
  `metric_name` VARCHAR(255) DEFAULT NULL COMMENT '指标名称',
  `expression` TEXT COMMENT '规则表达式',
  `condition` VARCHAR(64) DEFAULT NULL COMMENT '比较条件',
  `threshold` DOUBLE DEFAULT NULL COMMENT '阈值',
  `duration` INT NOT NULL DEFAULT 0 COMMENT '持续时长(秒)',
  `severity` VARCHAR(16) NOT NULL DEFAULT 'P3' COMMENT '告警级别',
  `message_template` TEXT COMMENT '告警消息模板',
  `description` TEXT COMMENT '规则描述',
  `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
  `labels` TEXT COMMENT '标签(JSON)',
  `annotations` TEXT COMMENT '注解(JSON)',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_rule_enabled` (`enabled`),
  KEY `idx_rule_name` (`rule_name`),
  KEY `idx_rule_component_metric` (`component_name`, `metric_name`),
  KEY `idx_rule_severity` (`severity`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '监控告警规则表';

CREATE TABLE IF NOT EXISTS `monitor_alert_event` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `fingerprint` VARCHAR(255) NOT NULL COMMENT '告警指纹,用于去重',
  `rule_id` BIGINT DEFAULT NULL COMMENT '规则ID',
  `rule_name` VARCHAR(128) DEFAULT NULL COMMENT '规则名称',
  `severity` VARCHAR(16) NOT NULL DEFAULT 'P3' COMMENT '告警级别',
  `status` VARCHAR(32) NOT NULL DEFAULT 'FIRING' COMMENT '告警状态',
  `cluster_id` BIGINT DEFAULT NULL COMMENT '集群ID',
  `cluster_name` VARCHAR(128) DEFAULT NULL COMMENT '集群名称',
  `service_name` VARCHAR(128) DEFAULT NULL COMMENT '服务名称',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '组件名称',
  `host_name` VARCHAR(255) DEFAULT NULL COMMENT '主机名',
  `instance_name` VARCHAR(255) DEFAULT NULL COMMENT '实例名称',
  `event_source` VARCHAR(32) NOT NULL DEFAULT 'THRESHOLD_ENGINE' COMMENT '告警来源: THRESHOLD_ENGINE/AMBARI_OFFICIAL',
  `source_ref` VARCHAR(255) DEFAULT NULL COMMENT '来源侧稳定标识',
  `source_state` VARCHAR(32) DEFAULT NULL COMMENT '来源侧状态',
  `maintenance_state` VARCHAR(32) DEFAULT NULL COMMENT 'Ambari维护状态',
  `title` VARCHAR(255) DEFAULT NULL COMMENT '告警标题',
  `message` TEXT COMMENT '告警内容',
  `current_value` DOUBLE DEFAULT NULL COMMENT '当前值',
  `threshold` DOUBLE DEFAULT NULL COMMENT '阈值',
  `fired_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '触发时间',
  `resolved_time` DATETIME DEFAULT NULL COMMENT '恢复时间',
  `acknowledged_time` DATETIME DEFAULT NULL COMMENT '确认时间',
  `acknowledged_by` VARCHAR(128) DEFAULT NULL COMMENT '确认人',
  `labels` TEXT COMMENT '标签(JSON)',
  `annotations` TEXT COMMENT '注解(JSON)',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_event_fingerprint_status` (`fingerprint`, `status`),
  KEY `idx_event_status_severity` (`status`, `severity`),
  KEY `idx_event_cluster` (`cluster_name`),
  KEY `idx_event_service` (`service_name`),
  KEY `idx_event_component` (`component_name`),
  KEY `idx_event_host` (`host_name`),
  KEY `idx_event_source` (`event_source`, `source_ref`),
  KEY `idx_event_rule` (`rule_id`),
  KEY `idx_event_fired_time` (`fired_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '监控告警事件表';

CREATE TABLE IF NOT EXISTS `monitor_official_alert_snapshot` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `cluster_name` VARCHAR(128) NOT NULL COMMENT '集群名称',
  `ambari_alert_id` BIGINT DEFAULT NULL COMMENT 'Ambari Alert/id',
  `definition_id` BIGINT NOT NULL COMMENT 'Ambari Alert/definition_id',
  `definition_name` VARCHAR(255) DEFAULT NULL COMMENT 'Ambari告警定义名称',
  `label` VARCHAR(255) DEFAULT NULL COMMENT 'Ambari告警展示名称',
  `state` VARCHAR(32) NOT NULL COMMENT 'Ambari状态: OK/WARNING/CRITICAL/UNKNOWN',
  `service_name` VARCHAR(128) DEFAULT NULL COMMENT '服务名称',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '组件名称',
  `host_name` VARCHAR(255) NOT NULL DEFAULT '*' COMMENT '主机名,集群级告警为*',
  `instance_name` VARCHAR(255) NOT NULL DEFAULT '*' COMMENT '实例名,无实例为*',
  `alert_scope` VARCHAR(32) DEFAULT NULL COMMENT 'Ambari Alert/scope',
  `maintenance_state` VARCHAR(32) DEFAULT NULL COMMENT 'Ambari维护状态',
  `alert_text` TEXT COMMENT '告警正文',
  `original_timestamp` BIGINT DEFAULT NULL COMMENT 'Ambari原始触发时间戳',
  `latest_timestamp` BIGINT DEFAULT NULL COMMENT 'Ambari最新时间戳',
  `occurrences` INT DEFAULT NULL COMMENT 'Ambari occurrence次数',
  `raw_json` TEXT COMMENT '原始JSON',
  `sync_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '同步时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_official_alert_scope` (`cluster_name`, `definition_id`, `host_name`, `instance_name`),
  KEY `idx_official_alert_state` (`cluster_name`, `state`),
  KEY `idx_official_alert_service` (`cluster_name`, `service_name`, `component_name`),
  KEY `idx_official_alert_host` (`cluster_name`, `host_name`),
  KEY `idx_official_alert_sync` (`sync_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = 'Ambari内置健康告警快照表';

CREATE TABLE IF NOT EXISTS `monitor_health_snapshot` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `object_type` VARCHAR(32) NOT NULL COMMENT '对象类型(CLUSTER/HOST/COMPONENT/INSTANCE)',
  `object_id` BIGINT NOT NULL COMMENT '对象ID',
  `object_name` VARCHAR(255) NOT NULL COMMENT '对象名称',
  `cluster_id` BIGINT DEFAULT NULL COMMENT '所属集群ID',
  `health_score` INT NOT NULL DEFAULT 100 COMMENT '综合健康分',
  `health_status` VARCHAR(32) NOT NULL DEFAULT 'HEALTHY' COMMENT '健康状态',
  `availability_score` INT NOT NULL DEFAULT 0 COMMENT '可用性得分',
  `alert_score` INT NOT NULL DEFAULT 0 COMMENT '告警得分',
  `performance_score` INT NOT NULL DEFAULT 0 COMMENT '性能得分',
  `capacity_score` INT NOT NULL DEFAULT 0 COMMENT '容量得分',
  `dependency_score` INT NOT NULL DEFAULT 0 COMMENT '依赖得分',
  `stability_score` INT NOT NULL DEFAULT 0 COMMENT '稳定性得分',
  `alert_count` INT NOT NULL DEFAULT 0 COMMENT '告警数',
  `p1_count` INT NOT NULL DEFAULT 0 COMMENT 'P1 告警数',
  `p2_count` INT NOT NULL DEFAULT 0 COMMENT 'P2 告警数',
  `p3_count` INT NOT NULL DEFAULT 0 COMMENT 'P3 告警数',
  `p4_count` INT NOT NULL DEFAULT 0 COMMENT 'P4 告警数',
  `snapshot_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '快照时间',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_snapshot_object_time` (`object_type`, `object_id`, `snapshot_time`),
  KEY `idx_snapshot_cluster_time` (`cluster_id`, `snapshot_time`),
  KEY `idx_snapshot_status_time` (`health_status`, `snapshot_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '健康分快照历史表';

CREATE TABLE IF NOT EXISTS `monitor_agent_dynamic_config` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `agent_id` VARCHAR(255) NOT NULL COMMENT 'Agent 唯一标识,对应 monitor.agent.agent-id',
  `cluster_name` VARCHAR(128) DEFAULT NULL COMMENT '集群名称,仅用于展示和检索',
  `host_name` VARCHAR(255) DEFAULT NULL COMMENT '主机名称,仅用于展示和检索',
  `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用动态配置',
  `config_version` BIGINT NOT NULL DEFAULT 1 COMMENT '配置版本号,每次发布递增',
  `description` VARCHAR(512) DEFAULT NULL COMMENT '配置说明',
  `published_by` VARCHAR(128) DEFAULT NULL COMMENT '发布人',
  `published_time` DATETIME DEFAULT NULL COMMENT '发布时间',
  `config_content` LONGTEXT COMMENT '动态配置 JSON 内容',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_agent_dynamic_config_agent_id` (`agent_id`),
  KEY `idx_agent_dynamic_config_cluster` (`cluster_name`),
  KEY `idx_agent_dynamic_config_host` (`host_name`),
  KEY `idx_agent_dynamic_config_enabled` (`enabled`)
) DEFAULT CHARSET = utf8mb4 COMMENT = 'Agent 动态采集配置表';

-- ============================================================
-- 阈值管理核心表
-- 说明:
-- 1. 这 5 张表为阈值管理一期最小闭环
-- 2. 支撑指标定义、阈值策略、作用范围、生效快照、命中事件
-- 3. 原始时序仍保存在 IoTDB,这里只保存定义和结果
-- ============================================================

CREATE TABLE IF NOT EXISTS `monitor_metric_definition` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `metric_code` VARCHAR(300) NOT NULL COMMENT '正式查询指标编码,恒等于tt_ + metric_name',
  `metric_name` VARCHAR(255) NOT NULL COMMENT 'IoTDB稳定指标名,不带tt_前缀',
  `display_name` VARCHAR(255) DEFAULT NULL COMMENT '指标展示名称',
  `metric_group` VARCHAR(64) NOT NULL COMMENT '一级分组,如 host/hdfs/yarn',
  `priority` VARCHAR(8) DEFAULT 'P2' COMMENT '指标优先级: P0核心/P1重要/P2扩展',
  `sub_group` VARCHAR(64) DEFAULT NULL COMMENT '二级分组,如 cpu/memory/io',
  `unit` VARCHAR(64) DEFAULT NULL COMMENT '单位',
  `metric_type` VARCHAR(32) NOT NULL DEFAULT 'GAUGE' COMMENT 'GAUGE/COUNTER/STATE',
  `metric_kind` VARCHAR(32) NOT NULL DEFAULT 'COLLECTED' COMMENT '指标值来源形态:COLLECTED采集值/DERIVED加工值',
  `service_name` VARCHAR(128) DEFAULT NULL COMMENT '服务名,如HDFS/YARN/HBASE/host',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '组件名,如NAMENODE/DATANODE/host',
  `compute_type` VARCHAR(32) NOT NULL DEFAULT 'NONE' COMMENT '计算类型:NONE/REALTIME/SCHEDULED/OFFLINE',
  `source_profile` VARCHAR(64) NOT NULL DEFAULT 'CORE' COMMENT '来源画像:CORE/EXTENDED/FULL_DISCOVERY/DERIVED_PLATFORM/OFFLINE_ANALYZER',
  `ingest_status` VARCHAR(32) NOT NULL DEFAULT 'CANDIDATE' COMMENT '入库状态:ENABLED/CANDIDATE/DISABLED/REJECTED',
  `stability_status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN' COMMENT '稳定性:STABLE/UNSTABLE/UNKNOWN',
  `metadata_status` VARCHAR(32) NOT NULL DEFAULT 'UNKNOWN' COMMENT '指标元数据状态:VERIFIED/INFERRED/UNKNOWN',
  `metadata_source` VARCHAR(64) NOT NULL DEFAULT 'FALLBACK' COMMENT '指标元数据来源:BUILT_IN/STACK/COLLECTOR_LABEL/PATTERN/FALLBACK',
  `first_seen_time` DATETIME DEFAULT NULL COMMENT '首次发现时间',
  `last_seen_time` DATETIME DEFAULT NULL COMMENT '最近发现时间',
  `seen_count` BIGINT NOT NULL DEFAULT 0 COMMENT '累计发现次数',
  `sample_path` VARCHAR(1024) DEFAULT NULL COMMENT '发现时的IoTDB路径样例',
  `sample_labels` TEXT COMMENT '发现时的标签样例(JSON)',
  `depends_on_metrics` TEXT COMMENT 'DERIVED指标依赖的基础指标(JSON)',
  `compute_owner` VARCHAR(128) DEFAULT NULL COMMENT '计算指标所属服务或任务',
  `compute_interval_sec` INT DEFAULT NULL COMMENT '计算周期(秒)',
  `reject_reason` VARCHAR(512) DEFAULT NULL COMMENT '拒绝原因',
  `value_type` VARCHAR(32) NOT NULL DEFAULT 'NUMBER' COMMENT 'NUMBER/STRING/BOOLEAN/ENUM',
  `aggregation_mode` VARCHAR(32) NOT NULL DEFAULT 'AVG' COMMENT '默认聚合方式',
  `label_keys` TEXT COMMENT '标签键列表(JSON/TEXT)',
  `default_chart_type` VARCHAR(32) DEFAULT 'LINE' COMMENT '默认图表类型',
  `default_time_range` VARCHAR(32) DEFAULT '1h' COMMENT '默认时间范围',
  `display_order` INT NOT NULL DEFAULT 0 COMMENT '展示顺序',
  `enable_fixed_threshold` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否支持固定阈值',
  `enable_smart_threshold` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否支持智能阈值',
  `enable_alert` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否支持告警',
  `enable_health_score` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否参与健康分',
  `health_score_weight` INT DEFAULT 0 COMMENT '健康分权重',
  `description` TEXT COMMENT '描述',
  `extra_info` TEXT COMMENT '扩展配置(JSON)',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_metric_code` (`metric_code`),
  UNIQUE KEY `uk_metric_name` (`metric_name`),
  KEY `idx_metric_group` (`metric_group`, `sub_group`),
  KEY `idx_metric_kind` (`metric_kind`),
  KEY `idx_metric_ingest_status` (`ingest_status`, `source_profile`),
  KEY `idx_metric_compute_type` (`metric_kind`, `compute_type`),
  KEY `idx_metric_service` (`service_name`, `component_name`),
  KEY `idx_metric_last_seen` (`last_seen_time`),
  KEY `idx_metric_metadata` (`metadata_status`, `metadata_source`),
  KEY `idx_metric_alert` (`enable_alert`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '监控指标定义与入库策略表';

CREATE TABLE IF NOT EXISTS `monitor_threshold_policy` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `policy_code` VARCHAR(128) NOT NULL COMMENT '策略编码,唯一',
  `policy_name` VARCHAR(255) NOT NULL COMMENT '策略名称',
  `metric_code` VARCHAR(300) NOT NULL COMMENT '指标编码',
  `policy_source` VARCHAR(32) NOT NULL DEFAULT 'SYSTEM' COMMENT 'SYSTEM/CUSTOM/ALGORITHM',
  `threshold_mode` VARCHAR(32) NOT NULL DEFAULT 'FIXED_ONLY' COMMENT '阈值模式,当前默认 FIXED_ONLY',
  `merge_mode` VARCHAR(32) DEFAULT NULL COMMENT '融合模式,预留',
  `condition_operator` VARCHAR(32) NOT NULL COMMENT 'GT/GTE/LT/LTE/EQ/NE/BETWEEN/NOT_BETWEEN/IN/NOT_IN',
  `condition_value1` VARCHAR(255) DEFAULT NULL COMMENT '条件值1',
  `condition_value2` VARCHAR(255) DEFAULT NULL COMMENT '条件值2',
  `condition_value_type` VARCHAR(32) NOT NULL DEFAULT 'NUMBER' COMMENT 'NUMBER/STRING/BOOLEAN/ENUM/JSON',
  `condition_value_list` TEXT COMMENT '集合条件值(JSON/TEXT)',
  `severity` VARCHAR(16) NOT NULL DEFAULT 'WARNING' COMMENT 'WARNING/CRITICAL/INFO',
  `trigger_window_type` VARCHAR(32) NOT NULL DEFAULT 'CONSECUTIVE' COMMENT 'CONSECUTIVE/COUNT_IN_WINDOW/IMMEDIATE',
  `trigger_window_size` INT NOT NULL DEFAULT 1 COMMENT '触发窗口大小',
  `trigger_match_count` INT NOT NULL DEFAULT 1 COMMENT '窗口中命中次数',
  `recover_window_type` VARCHAR(32) NOT NULL DEFAULT 'CONSECUTIVE' COMMENT '恢复窗口类型',
  `recover_window_size` INT NOT NULL DEFAULT 1 COMMENT '恢复窗口大小',
  `recover_match_count` INT NOT NULL DEFAULT 1 COMMENT '恢复窗口命中次数',
  `priority` INT NOT NULL DEFAULT 100 COMMENT '优先级,越小越高',
  `version` INT NOT NULL DEFAULT 1 COMMENT '版本号',
  `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
  `effective_from` DATETIME DEFAULT NULL COMMENT '生效开始时间',
  `effective_to` DATETIME DEFAULT NULL COMMENT '生效结束时间',
  `description` TEXT COMMENT '描述',
  `extra_info` TEXT COMMENT '扩展配置(JSON)',
  `create_by` VARCHAR(128) DEFAULT NULL COMMENT '创建人',
  `update_by` VARCHAR(128) DEFAULT NULL COMMENT '修改人',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_threshold_policy_code` (`policy_code`),
  KEY `idx_threshold_metric` (`metric_code`),
  KEY `idx_threshold_enabled` (`enabled`, `policy_source`),
  KEY `idx_threshold_mode` (`threshold_mode`, `severity`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '阈值策略表';

CREATE TABLE IF NOT EXISTS `monitor_threshold_policy_scope` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `policy_id` BIGINT NOT NULL COMMENT '策略ID',
  `scope_type` VARCHAR(32) NOT NULL COMMENT 'GLOBAL/CLUSTER/HOST/SERVICE/COMPONENT/COMPONENT_INSTANCE',
  `scope_ref` VARCHAR(512) NOT NULL COMMENT '作用对象标识',
  `scope_name` VARCHAR(255) DEFAULT NULL COMMENT '作用对象名称',
  `scope_priority` INT NOT NULL DEFAULT 100 COMMENT '范围优先级,越小越高',
  `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_policy_scope` (`policy_id`, `scope_type`, `scope_ref`(255)),
  KEY `idx_scope_lookup` (`scope_type`, `scope_ref`(255), `enabled`),
  KEY `idx_scope_policy` (`policy_id`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '阈值策略作用范围表';

CREATE TABLE IF NOT EXISTS `monitor_threshold_snapshot` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `metric_code` VARCHAR(300) NOT NULL COMMENT '指标编码',
  `scope_type` VARCHAR(32) NOT NULL COMMENT '作用对象类型',
  `scope_ref` VARCHAR(512) NOT NULL COMMENT '作用对象标识',
  `scope_name` VARCHAR(255) DEFAULT NULL COMMENT '作用对象名称',
  `policy_id` BIGINT DEFAULT NULL COMMENT '命中的主策略ID',
  `policy_code` VARCHAR(128) DEFAULT NULL COMMENT '命中的主策略编码',
  `policy_version` INT DEFAULT NULL COMMENT '策略版本',
  `policy_source` VARCHAR(32) DEFAULT NULL COMMENT '策略来源',
  `threshold_mode` VARCHAR(32) NOT NULL DEFAULT 'FIXED_ONLY' COMMENT '生效模式',
  `merge_mode` VARCHAR(32) DEFAULT NULL COMMENT '融合模式',
  `fixed_upper` DOUBLE DEFAULT NULL COMMENT '固定上限',
  `fixed_lower` DOUBLE DEFAULT NULL COMMENT '固定下限',
  `smart_upper` DOUBLE DEFAULT NULL COMMENT '智能上限',
  `smart_lower` DOUBLE DEFAULT NULL COMMENT '智能下限',
  `effective_operator` VARCHAR(32) DEFAULT NULL COMMENT '最终生效操作符',
  `effective_value1` VARCHAR(255) DEFAULT NULL COMMENT '最终值1',
  `effective_value2` VARCHAR(255) DEFAULT NULL COMMENT '最终值2',
  `effective_upper` DOUBLE DEFAULT NULL COMMENT '最终上限',
  `effective_lower` DOUBLE DEFAULT NULL COMMENT '最终下限',
  `sample_count` INT NOT NULL DEFAULT 0 COMMENT '样本数',
  `window_start` DATETIME DEFAULT NULL COMMENT '计算窗口开始',
  `window_end` DATETIME DEFAULT NULL COMMENT '计算窗口结束',
  `calculated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '计算时间',
  `expire_at` DATETIME DEFAULT NULL COMMENT '过期时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_threshold_snapshot` (`metric_code`, `scope_type`, `scope_ref`(255)),
  KEY `idx_snapshot_metric_scope` (`metric_code`, `scope_type`, `scope_ref`(255)),
  KEY `idx_snapshot_policy` (`policy_id`, `policy_version`),
  KEY `idx_threshold_snapshot_coverage` (`policy_source`, `sample_count`),
  KEY `idx_snapshot_time` (`calculated_at`, `expire_at`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '当前生效阈值快照表';

CREATE TABLE IF NOT EXISTS `monitor_threshold_recommendation` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `recommendation_code` VARCHAR(128) NOT NULL COMMENT '推荐编码,唯一',
  `metric_code` VARCHAR(300) NOT NULL COMMENT '指标编码',
  `scope_type` VARCHAR(32) NOT NULL COMMENT '作用对象类型',
  `scope_ref` VARCHAR(512) NOT NULL COMMENT '作用对象标识',
  `scope_name` VARCHAR(255) DEFAULT NULL COMMENT '作用对象名称',
  `current_policy_id` BIGINT DEFAULT NULL COMMENT '当前生效策略ID',
  `current_policy_code` VARCHAR(128) DEFAULT NULL COMMENT '当前生效策略编码',
  `current_policy_source` VARCHAR(32) DEFAULT NULL COMMENT '当前生效策略来源',
  `recommended_operator` VARCHAR(32) NOT NULL COMMENT '推荐操作符',
  `recommended_value1` VARCHAR(255) DEFAULT NULL COMMENT '推荐值1',
  `recommended_value2` VARCHAR(255) DEFAULT NULL COMMENT '推荐值2',
  `recommended_upper` DOUBLE DEFAULT NULL COMMENT '推荐上限',
  `recommended_lower` DOUBLE DEFAULT NULL COMMENT '推荐下限',
  `algorithm_name` VARCHAR(128) DEFAULT NULL COMMENT '算法名称',
  `algorithm_version` VARCHAR(64) DEFAULT NULL COMMENT '算法版本',
  `sample_count` INT NOT NULL DEFAULT 0 COMMENT '样本数',
  `window_start` DATETIME DEFAULT NULL COMMENT '样本窗口开始',
  `window_end` DATETIME DEFAULT NULL COMMENT '样本窗口结束',
  `confidence` DOUBLE DEFAULT NULL COMMENT '置信度,0-1',
  `status` VARCHAR(32) NOT NULL DEFAULT 'PENDING' COMMENT 'PENDING/APPLIED/REJECTED/EXPIRED',
  `change_reason` VARCHAR(1024) DEFAULT NULL COMMENT '推荐阈值变化原因',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `review_by` VARCHAR(128) DEFAULT NULL COMMENT '审核人',
  `review_reason` VARCHAR(1024) DEFAULT NULL COMMENT '审核原因',
  `review_time` DATETIME DEFAULT NULL COMMENT '审核时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_threshold_recommendation_code` (`recommendation_code`),
  KEY `idx_recommendation_metric_scope` (`metric_code`, `scope_type`, `scope_ref`(255), `status`),
  KEY `idx_recommendation_policy` (`current_policy_id`, `current_policy_source`),
  KEY `idx_recommendation_window` (`window_start`, `window_end`),
  KEY `idx_recommendation_time` (`create_time`, `review_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '智能阈值推荐记录表';

CREATE TABLE IF NOT EXISTS `monitor_threshold_event` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `event_code` VARCHAR(128) NOT NULL COMMENT '事件编码,唯一',
  `metric_code` VARCHAR(300) NOT NULL COMMENT '指标编码',
  `scope_type` VARCHAR(32) NOT NULL COMMENT '作用对象类型',
  `scope_ref` VARCHAR(512) NOT NULL COMMENT '作用对象标识',
  `scope_name` VARCHAR(255) DEFAULT NULL COMMENT '作用对象名称',
  `cluster_name` VARCHAR(128) DEFAULT NULL COMMENT '事件所属集群名',
  `service_name` VARCHAR(128) DEFAULT NULL COMMENT '事件所属服务名',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '事件所属组件名',
  `instance_name` VARCHAR(255) DEFAULT NULL COMMENT '组件实例名',
  `host_name` VARCHAR(255) DEFAULT NULL COMMENT '事件关联主机名',
  `policy_id` BIGINT DEFAULT NULL COMMENT '命中的策略ID',
  `policy_code` VARCHAR(128) DEFAULT NULL COMMENT '命中的策略编码',
  `policy_version` INT DEFAULT NULL COMMENT '策略版本',
  `policy_source` VARCHAR(32) DEFAULT NULL COMMENT '策略来源',
  `event_level` VARCHAR(16) NOT NULL DEFAULT 'WARNING' COMMENT 'INFO/WARNING/CRITICAL',
  `status` VARCHAR(32) NOT NULL DEFAULT 'PENDING' COMMENT 'PENDING/FIRING/ACKED/SILENCED/RECOVERED/CLOSED',
  `match_direction` VARCHAR(16) DEFAULT NULL COMMENT 'UPPER/LOWER/IN/OUT/EQ/NE',
  `actual_value` VARCHAR(255) DEFAULT NULL COMMENT '实际值',
  `effective_operator` VARCHAR(32) DEFAULT NULL COMMENT '最终生效操作符',
  `effective_value1` VARCHAR(255) DEFAULT NULL COMMENT '最终值1',
  `effective_value2` VARCHAR(255) DEFAULT NULL COMMENT '最终值2',
  `effective_upper` DOUBLE DEFAULT NULL COMMENT '最终上限',
  `effective_lower` DOUBLE DEFAULT NULL COMMENT '最终下限',
  `sample_time` DATETIME DEFAULT NULL COMMENT '样本时间',
  `occurred_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '首次命中时间',
  `firing_at` DATETIME DEFAULT NULL COMMENT '正式触发时间',
  `acked_at` DATETIME DEFAULT NULL COMMENT '确认时间',
  `silenced_at` DATETIME DEFAULT NULL COMMENT '静默时间',
  `recovered_at` DATETIME DEFAULT NULL COMMENT '恢复时间',
  `closed_at` DATETIME DEFAULT NULL COMMENT '关闭时间',
  `suppressed` TINYINT(1) DEFAULT 0 COMMENT '是否被抑制',
  `suppression_type` VARCHAR(32) DEFAULT NULL COMMENT '抑制类型:MAINTENANCE_WINDOW/SILENCE_RULE',
  `suppression_reason` VARCHAR(512) DEFAULT NULL COMMENT '抑制原因描述',
  `suppressed_by_event_id` BIGINT DEFAULT NULL COMMENT '被哪个上游事件抑制',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_threshold_event_code` (`event_code`),
  KEY `idx_event_scope` (`scope_type`, `scope_ref`(255), `status`),
  KEY `idx_event_object` (`cluster_name`, `service_name`, `component_name`, `host_name`, `status`),
  KEY `idx_event_metric` (`metric_code`, `event_level`, `status`),
  KEY `idx_event_time` (`occurred_at`, `firing_at`, `recovered_at`),
  KEY `idx_event_suppressed` (`suppressed`, `suppression_type`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '阈值命中事件表';

CREATE TABLE IF NOT EXISTS `monitor_threshold_event_action` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `action_code` VARCHAR(128) NOT NULL COMMENT '处置动作编码,唯一',
  `event_id` BIGINT NOT NULL COMMENT '告警事件ID',
  `event_code` VARCHAR(128) NOT NULL COMMENT '告警事件编码',
  `action_type` VARCHAR(32) NOT NULL COMMENT 'ACK/CLOSE/SILENCE/MAINTENANCE/COMMENT',
  `action_status` VARCHAR(32) NOT NULL DEFAULT 'SUCCESS' COMMENT 'SUCCESS/FAILED/PENDING',
  `operator` VARCHAR(128) DEFAULT NULL COMMENT '操作人',
  `reason` VARCHAR(1024) DEFAULT NULL COMMENT '处置原因',
  `action_content` TEXT COMMENT '处置内容(JSON/TEXT)',
  `linked_silence_id` BIGINT DEFAULT NULL COMMENT '关联静默规则ID',
  `linked_window_id` BIGINT DEFAULT NULL COMMENT '关联维护窗口ID',
  `start_time` DATETIME DEFAULT NULL COMMENT '动作生效开始时间',
  `end_time` DATETIME DEFAULT NULL COMMENT '动作生效结束时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_threshold_event_action_code` (`action_code`),
  KEY `idx_action_event` (`event_id`, `action_type`, `create_time`),
  KEY `idx_action_event_code` (`event_code`, `action_type`, `create_time`),
  KEY `idx_action_operator` (`operator`, `create_time`),
  KEY `idx_action_linked_silence` (`linked_silence_id`),
  KEY `idx_action_linked_window` (`linked_window_id`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '告警事件处置动作流水表';

CREATE TABLE IF NOT EXISTS `monitor_threshold_audit_log` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `target_type` VARCHAR(64) NOT NULL COMMENT 'POLICY/SCOPE/SNAPSHOT/SILENCE/WINDOW',
  `target_id` BIGINT DEFAULT NULL COMMENT '目标ID',
  `target_code` VARCHAR(128) DEFAULT NULL COMMENT '目标编码',
  `operation_type` VARCHAR(64) NOT NULL COMMENT 'CREATE/UPDATE/DELETE/ENABLE/DISABLE/PUBLISH/ROLLBACK',
  `operator` VARCHAR(128) DEFAULT NULL COMMENT '操作人',
  `before_value` LONGTEXT COMMENT '变更前(JSON)',
  `after_value` LONGTEXT COMMENT '变更后(JSON)',
  `remark` VARCHAR(512) DEFAULT NULL COMMENT '备注',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_audit_target` (`target_type`, `target_id`),
  KEY `idx_audit_code` (`target_code`),
  KEY `idx_audit_time` (`create_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '阈值审计日志表';

CREATE TABLE IF NOT EXISTS `monitor_maintenance_window` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `window_code` VARCHAR(128) NOT NULL COMMENT '维护窗口编码',
  `window_name` VARCHAR(255) NOT NULL COMMENT '维护窗口名称',
  `scope_type` VARCHAR(32) NOT NULL COMMENT '作用对象类型',
  `scope_ref` VARCHAR(512) NOT NULL COMMENT '作用对象标识',
  `scope_name` VARCHAR(255) DEFAULT NULL COMMENT '作用对象名称',
  `start_time` DATETIME NOT NULL COMMENT '开始时间',
  `end_time` DATETIME NOT NULL COMMENT '结束时间',
  `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
  `description` TEXT COMMENT '描述',
  `create_by` VARCHAR(128) DEFAULT NULL COMMENT '创建人',
  `update_by` VARCHAR(128) DEFAULT NULL COMMENT '修改人',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_window_code` (`window_code`),
  KEY `idx_window_scope` (`scope_type`, `scope_ref`(255), `enabled`),
  KEY `idx_window_time` (`start_time`, `end_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '维护窗口表';

CREATE TABLE IF NOT EXISTS `monitor_silence_rule` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `silence_code` VARCHAR(128) NOT NULL COMMENT '静默规则编码',
  `silence_name` VARCHAR(255) NOT NULL COMMENT '静默规则名称',
  `metric_code` VARCHAR(300) DEFAULT NULL COMMENT '可选,静默某指标',
  `scope_type` VARCHAR(32) NOT NULL COMMENT '作用对象类型',
  `scope_ref` VARCHAR(512) NOT NULL COMMENT '作用对象标识',
  `scope_name` VARCHAR(255) DEFAULT NULL COMMENT '作用对象名称',
  `event_level` VARCHAR(16) DEFAULT NULL COMMENT '可选,静默某级别',
  `silence_mode` VARCHAR(32) NOT NULL DEFAULT 'SUPPRESS_NOTIFY' COMMENT 'SUPPRESS_NOTIFY/SUPPRESS_EVENT',
  `start_time` DATETIME NOT NULL COMMENT '开始时间',
  `end_time` DATETIME NOT NULL COMMENT '结束时间',
  `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
  `description` TEXT COMMENT '描述',
  `create_by` VARCHAR(128) DEFAULT NULL COMMENT '创建人',
  `update_by` VARCHAR(128) DEFAULT NULL COMMENT '修改人',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_silence_code` (`silence_code`),
  KEY `idx_silence_scope` (`scope_type`, `scope_ref`(255), `enabled`),
  KEY `idx_silence_metric` (`metric_code`, `event_level`),
  KEY `idx_silence_time` (`start_time`, `end_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '静默规则表';

CREATE TABLE IF NOT EXISTS `monitor_ha_lock` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `lock_name` VARCHAR(128) NOT NULL COMMENT '锁名称',
  `owner_id` VARCHAR(255) DEFAULT NULL COMMENT '当前持锁实例标识',
  `lock_token` VARCHAR(64) DEFAULT NULL COMMENT '当前租约 token',
  `lock_until` DATETIME NOT NULL COMMENT '锁过期时间',
  `last_heartbeat_time` DATETIME DEFAULT NULL COMMENT '最近一次续租时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_monitor_ha_lock_name` (`lock_name`),
  KEY `idx_monitor_ha_lock_until` (`lock_until`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '高可用租约锁表';

CREATE TABLE IF NOT EXISTS `monitor_metric_dedupe_key` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `dedupe_hash` CHAR(40) NOT NULL COMMENT '去重键哈希(SHA1)',
  `dedupe_key` VARCHAR(1024) NOT NULL COMMENT '去重键原文',
  `expire_time` DATETIME NOT NULL COMMENT '过期时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_metric_dedupe_hash` (`dedupe_hash`),
  KEY `idx_metric_dedupe_expire_time` (`expire_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '指标写入去重键表';

CREATE TABLE IF NOT EXISTS `monitor_metric_ingest_batch` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `component_name` VARCHAR(64) NOT NULL COMMENT '组件名称,例如 HDFS',
  `cluster_name` VARCHAR(128) NOT NULL COMMENT '集群名称',
  `source_job` VARCHAR(128) NOT NULL COMMENT '来源任务标识',
  `batch_id` VARCHAR(128) NOT NULL COMMENT '业务批次ID',
  `request_hash` VARCHAR(64) DEFAULT NULL COMMENT '请求摘要',
  `status` VARCHAR(32) NOT NULL DEFAULT 'PROCESSING' COMMENT 'PROCESSING/SUCCESS/FAILED/DUPLICATE',
  `accepted_count` INT NOT NULL DEFAULT 0 COMMENT '已接收指标数',
  `ignored_count` INT NOT NULL DEFAULT 0 COMMENT '已忽略指标数',
  `message` VARCHAR(512) DEFAULT NULL COMMENT '状态说明',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_metric_ingest_batch` (`component_name`, `cluster_name`, `source_job`, `batch_id`),
  KEY `idx_metric_ingest_batch_status` (`status`, `update_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '指标导入批次幂等表';

-- ============================================================
-- 智能分析与预测扩展表
-- ============================================================

CREATE TABLE IF NOT EXISTS `monitor_baseline` (
  `id`             BIGINT       NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `metric_name`    VARCHAR(128) NOT NULL COMMENT '指标名称',
  `cluster_name`   VARCHAR(128) DEFAULT NULL COMMENT '集群名称',
  `host_name`      VARCHAR(255) DEFAULT NULL COMMENT '主机名',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '组件名称',
  `instance_name`  VARCHAR(255) DEFAULT NULL COMMENT '实例名称',
  `time_slot_hour` TINYINT      NOT NULL COMMENT '时间槽(0~23小时)',
  `day_of_week`    TINYINT      NOT NULL COMMENT '星期几(1=周一…7=周日)',
  `mean_value`     DOUBLE       DEFAULT NULL COMMENT '均值',
  `stddev`         DOUBLE       DEFAULT NULL COMMENT '标准差',
  `upper_bound`    DOUBLE       DEFAULT NULL COMMENT '基线上限(mean+2σ)',
  `lower_bound`    DOUBLE       DEFAULT NULL COMMENT '基线下限(mean-2σ)',
  `sample_count`   INT          DEFAULT NULL COMMENT '样本量',
  `computed_at`    DATETIME     DEFAULT NULL COMMENT '计算时间',
  `create_time`    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time`    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_baseline_metric_host` (`metric_name`, `host_name`),
  KEY `idx_baseline_metric_slot` (`metric_name`, `time_slot_hour`, `day_of_week`),
  KEY `idx_baseline_cluster`     (`cluster_name`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '动态基线表';

CREATE TABLE IF NOT EXISTS `monitor_anomaly_event` (
  `id`               BIGINT       NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `metric_name`      VARCHAR(128) NOT NULL COMMENT '指标名称',
  `cluster_name`     VARCHAR(128) DEFAULT NULL COMMENT '集群名称',
  `host_name`        VARCHAR(255) DEFAULT NULL COMMENT '主机名',
  `component_name`   VARCHAR(128) DEFAULT NULL COMMENT '组件名称',
  `instance_name`    VARCHAR(255) DEFAULT NULL COMMENT '实例名称',
  `current_value`    DOUBLE       DEFAULT NULL COMMENT '异常发生时的实际值',
  `expected_value`   DOUBLE       DEFAULT NULL COMMENT '基线预期均值',
  `baseline_upper`   DOUBLE       DEFAULT NULL COMMENT '基线上限',
  `baseline_lower`   DOUBLE       DEFAULT NULL COMMENT '基线下限',
  `anomaly_score`    DOUBLE       DEFAULT NULL COMMENT '异常分数(0~1)',
  `detection_method` VARCHAR(32)  DEFAULT NULL COMMENT '检测方法(ZSCORE/IQR/BASELINE_DEVIATION)',
  `status`           VARCHAR(16)  NOT NULL DEFAULT 'ACTIVE' COMMENT '状态(ACTIVE/RESOLVED)',
  `severity`         VARCHAR(16)  DEFAULT 'WARNING' COMMENT '严重级别(INFO/WARNING/CRITICAL)',
  `fingerprint`      VARCHAR(255) NOT NULL COMMENT '去重指纹',
  `detected_at`      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '检测时间',
  `resolved_at`      DATETIME     DEFAULT NULL COMMENT '恢复时间',
  `create_time`      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time`      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_anomaly_fingerprint_status` (`fingerprint`, `status`),
  KEY `idx_anomaly_metric_host`        (`metric_name`, `host_name`),
  KEY `idx_anomaly_cluster`            (`cluster_name`),
  KEY `idx_anomaly_detected_at`        (`detected_at`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '异常检测事件表';

CREATE TABLE IF NOT EXISTS `monitor_capacity_forecast` (
  `id`                        BIGINT       NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `metric_name`               VARCHAR(128) NOT NULL COMMENT '预测指标',
  `cluster_name`              VARCHAR(128) DEFAULT NULL COMMENT '集群名称',
  `host_name`                 VARCHAR(255) DEFAULT NULL COMMENT '主机名',
  `dimension`                 VARCHAR(255) DEFAULT NULL COMMENT '维度(如挂载点)',
  `current_value`             DOUBLE       DEFAULT NULL COMMENT '当前值',
  `capacity_max`              DOUBLE       DEFAULT NULL COMMENT '容量上限',
  `usage_percent`             DOUBLE       DEFAULT NULL COMMENT '当前使用率%',
  `growth_rate_per_hour`      DOUBLE       DEFAULT NULL COMMENT '增长速率(单位/小时)',
  `r2_score`                  DOUBLE       DEFAULT NULL COMMENT '线性回归R²拟合优度',
  `predicted_exhaustion_time` DATETIME     DEFAULT NULL COMMENT '预计耗尽时间',
  `days_remaining`            DOUBLE       DEFAULT NULL COMMENT '距耗尽剩余天数',
  `severity`                  VARCHAR(16)  DEFAULT 'INFO' COMMENT '预测级别(INFO/WARNING/CRITICAL)',
  `sample_count`              INT          DEFAULT NULL COMMENT '参与回归的样本数',
  `forecasted_at`             DATETIME     DEFAULT NULL COMMENT '预测计算时间',
  `create_time`               DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time`               DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_forecast_metric_host`   (`metric_name`, `host_name`),
  KEY `idx_forecast_cluster`       (`cluster_name`),
  KEY `idx_forecast_severity`      (`severity`),
  KEY `idx_forecast_days`          (`days_remaining`),
  KEY `idx_forecast_forecasted_at` (`forecasted_at`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '容量预测表';

-- =====================================================
-- 通知渠道配置表
-- =====================================================
CREATE TABLE IF NOT EXISTS `monitor_notification_channel` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `channel_code` VARCHAR(64) NOT NULL COMMENT '渠道编码',
  `channel_name` VARCHAR(128) NOT NULL COMMENT '渠道名称',
  `channel_type` VARCHAR(32) NOT NULL COMMENT '渠道类型: IN_APP/WECHAT/DINGTALK/FEISHU/EMAIL/WEBHOOK',
  `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
  `config_json` TEXT NOT NULL COMMENT '渠道配置(JSON格式)',
  `description` VARCHAR(512) DEFAULT NULL COMMENT '描述',
  `sort_order` INT DEFAULT 0 COMMENT '排序',
  `create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人',
  `update_by` VARCHAR(64) DEFAULT NULL COMMENT '修改人',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_channel_code` (`channel_code`),
  KEY `idx_channel_type` (`channel_type`, `enabled`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '通知渠道配置表';

-- =====================================================
-- 通知路由表:定义什么告警发给谁、通过哪些渠道发送
-- =====================================================
CREATE TABLE IF NOT EXISTS `monitor_notification_route` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `route_code` VARCHAR(64) NOT NULL COMMENT '路由编码',
  `route_name` VARCHAR(128) NOT NULL COMMENT '路由名称',
  `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
  `cluster_name` VARCHAR(128) DEFAULT NULL COMMENT '集群过滤,空或*表示全部集群',
  `event_type` VARCHAR(32) NOT NULL DEFAULT 'THRESHOLD' COMMENT '事件类型: THRESHOLD/ALERT/ALL',
  `event_source_filter` VARCHAR(128) DEFAULT NULL COMMENT '告警来源过滤,逗号分隔,空或ALL表示全部来源',
  `severity_filter` VARCHAR(128) DEFAULT NULL COMMENT '级别过滤,逗号分隔,空或ALL表示全部级别',
  `service_name` VARCHAR(128) DEFAULT NULL COMMENT '服务过滤,空或*表示全部服务',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '组件过滤,空或*表示全部组件',
  `scope_type` VARCHAR(32) DEFAULT NULL COMMENT '作用域类型过滤,空或*表示全部作用域',
  `route_priority` INT NOT NULL DEFAULT 100 COMMENT '路由优先级,数字越小越先匹配',
  `channel_codes` TEXT COMMENT '渠道编码JSON数组,空时使用默认站内信',
  `description` VARCHAR(512) DEFAULT NULL COMMENT '说明',
  `create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人',
  `update_by` VARCHAR(64) DEFAULT NULL COMMENT '修改人',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_notification_route_code` (`route_code`),
  KEY `idx_notification_route_match` (`enabled`, `event_type`, `route_priority`),
  KEY `idx_notification_route_cluster` (`cluster_name`, `enabled`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '通知路由表';

-- =====================================================
-- 通知路由接收主体表:定义路由命中的通知对象
-- =====================================================
CREATE TABLE IF NOT EXISTS `monitor_notification_route_subject` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `route_id` BIGINT NOT NULL COMMENT '路由ID',
  `subject_type` VARCHAR(32) NOT NULL COMMENT '主体类型: CLUSTER_ADMIN/AMBARI_ROLE/TENANT_ROLE/LDAP_GROUP/USER/DUTY_GROUP/SERVICE_OWNER/ALL_USERS',
  `subject_ref` VARCHAR(128) DEFAULT NULL COMMENT '主体标识',
  `subject_name` VARCHAR(128) DEFAULT NULL COMMENT '主体展示名称',
  `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_route_subject_route` (`route_id`, `enabled`),
  KEY `idx_route_subject_ref` (`subject_type`, `subject_ref`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '通知路由接收主体表';

-- =====================================================
-- 通知静态值班组表:一期不做排班算法,只维护成员集合
-- =====================================================
CREATE TABLE IF NOT EXISTS `monitor_notification_duty_group` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `group_code` VARCHAR(64) NOT NULL COMMENT '值班组编码',
  `group_name` VARCHAR(128) NOT NULL COMMENT '值班组名称',
  `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
  `members_json` TEXT COMMENT '成员用户名JSON数组',
  `description` VARCHAR(512) DEFAULT NULL COMMENT '说明',
  `create_by` VARCHAR(64) DEFAULT NULL COMMENT '创建人',
  `update_by` VARCHAR(64) DEFAULT NULL COMMENT '修改人',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_duty_group_code` (`group_code`),
  KEY `idx_duty_group_enabled` (`enabled`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '通知静态值班组表';

-- =====================================================
-- 通知发送历史表
-- =====================================================
CREATE TABLE IF NOT EXISTS `monitor_notification_history` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `alert_event_id` BIGINT DEFAULT NULL COMMENT '告警事件ID',
  `event_id` BIGINT DEFAULT NULL COMMENT '旧版关联事件ID',
  `event_code` VARCHAR(64) DEFAULT NULL COMMENT '旧版事件编码',
  `event_type` VARCHAR(32) DEFAULT NULL COMMENT '旧版事件类型: ALERT/THRESHOLD',
  `channel_id` BIGINT NOT NULL COMMENT '渠道ID',
  `channel_type` VARCHAR(32) NOT NULL COMMENT '渠道类型',
  `channel_code` VARCHAR(64) DEFAULT NULL COMMENT '旧版渠道编码',
  `channel_name` VARCHAR(128) DEFAULT NULL COMMENT '渠道名称',
  `route_id` BIGINT DEFAULT NULL COMMENT '通知路由ID',
  `route_code` VARCHAR(64) DEFAULT NULL COMMENT '通知路由编码',
  `route_name` VARCHAR(128) DEFAULT NULL COMMENT '通知路由名称',
  `subject_type` VARCHAR(32) DEFAULT NULL COMMENT '接收主体类型',
  `subject_ref` VARCHAR(128) DEFAULT NULL COMMENT '接收主体标识',
  `subject_name` VARCHAR(128) DEFAULT NULL COMMENT '接收主体名称',
  `receiver_user` VARCHAR(128) DEFAULT NULL COMMENT '指定接收人',
  `alert_title` VARCHAR(255) DEFAULT NULL COMMENT '告警标题',
  `alert_summary` TEXT COMMENT '告警摘要',
  `alert_severity` VARCHAR(32) DEFAULT NULL COMMENT '告警级别',
  `cluster_name` VARCHAR(128) DEFAULT NULL COMMENT '集群名称',
  `service_name` VARCHAR(128) DEFAULT NULL COMMENT '服务名称',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '组件名称',
  `instance_name` VARCHAR(255) DEFAULT NULL COMMENT '实例名称',
  `status` VARCHAR(16) NOT NULL COMMENT '发送状态: SUCCESS/FAILED',
  `send_time` DATETIME DEFAULT NULL COMMENT '发送时间',
  `error_message` TEXT COMMENT '错误信息',
  `request_time` DATETIME DEFAULT NULL COMMENT '旧版请求时间',
  `response_time` DATETIME DEFAULT NULL COMMENT '旧版响应时间',
  `response_time_ms` BIGINT DEFAULT NULL COMMENT '响应耗时(毫秒)',
  `cost_ms` INT DEFAULT NULL COMMENT '旧版耗时(毫秒)',
  `request_content` TEXT COMMENT '请求内容',
  `response_content` TEXT COMMENT '响应内容',
  `retry_count` INT DEFAULT 0 COMMENT '重试次数',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_event` (`event_id`, `event_type`),
  KEY `idx_alert_event` (`alert_event_id`),
  KEY `idx_channel` (`channel_id`, `request_time`),
  KEY `idx_status` (`status`, `request_time`),
  KEY `idx_history_cluster_status` (`cluster_name`, `status`, `send_time`),
  KEY `idx_history_route_subject` (`route_code`, `subject_type`, `subject_ref`),
  KEY `idx_history_send_time` (`send_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '通知发送历史表';

-- =====================================================
-- 通知投递表
-- =====================================================
CREATE TABLE IF NOT EXISTS `monitor_notification_delivery` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `delivery_code` VARCHAR(64) NOT NULL COMMENT '投递编码',
  `notification_id` BIGINT DEFAULT NULL COMMENT '站内信ID',
  `event_type` VARCHAR(32) NOT NULL COMMENT '事件类型: ALERT/THRESHOLD/TEST',
  `event_id` BIGINT DEFAULT NULL COMMENT '事件ID',
  `event_code` VARCHAR(64) DEFAULT NULL COMMENT '事件编码',
  `route_id` BIGINT DEFAULT NULL COMMENT '路由ID',
  `route_code` VARCHAR(64) DEFAULT NULL COMMENT '路由编码',
  `route_name` VARCHAR(128) DEFAULT NULL COMMENT '路由名称',
  `channel_id` BIGINT DEFAULT NULL COMMENT '渠道ID',
  `channel_code` VARCHAR(64) DEFAULT NULL COMMENT '渠道编码',
  `subject_type` VARCHAR(32) DEFAULT NULL COMMENT '接收主体类型',
  `subject_ref` VARCHAR(128) DEFAULT NULL COMMENT '接收主体标识',
  `subject_name` VARCHAR(128) DEFAULT NULL COMMENT '接收主体名称',
  `receiver_user` VARCHAR(128) DEFAULT NULL COMMENT '指定接收人',
  `delivery_status` VARCHAR(16) NOT NULL DEFAULT 'PENDING' COMMENT '投递状态: PENDING/SUCCESS/FAILED/SKIPPED',
  `error_message` TEXT COMMENT '错误信息',
  `read_status` VARCHAR(16) NOT NULL DEFAULT 'UNREAD' COMMENT '读取状态: UNREAD/READ',
  `read_time` DATETIME DEFAULT NULL COMMENT '读取时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_delivery_code` (`delivery_code`),
  KEY `idx_delivery_event` (`event_type`, `event_id`, `event_code`),
  KEY `idx_delivery_route_subject` (`route_code`, `subject_type`, `subject_ref`),
  KEY `idx_delivery_receiver` (`receiver_user`, `read_status`, `create_time`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '通知投递表';

-- =====================================================
-- 站内通知表
-- =====================================================
CREATE TABLE IF NOT EXISTS `monitor_in_app_notification` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `notification_code` VARCHAR(64) NOT NULL COMMENT '站内通知编码',
  `event_type` VARCHAR(32) NOT NULL COMMENT '事件类型: ALERT/THRESHOLD/TEST',
  `event_id` BIGINT DEFAULT NULL COMMENT '关联事件ID',
  `event_code` VARCHAR(64) DEFAULT NULL COMMENT '关联事件编码',
  `channel_id` BIGINT DEFAULT NULL COMMENT '来源通知渠道ID',
  `channel_code` VARCHAR(64) DEFAULT NULL COMMENT '来源通知渠道编码',
  `route_id` BIGINT DEFAULT NULL COMMENT '通知路由ID',
  `route_code` VARCHAR(64) DEFAULT NULL COMMENT '通知路由编码',
  `route_name` VARCHAR(128) DEFAULT NULL COMMENT '通知路由名称',
  `cluster_name` VARCHAR(128) DEFAULT NULL COMMENT '集群名称',
  `service_name` VARCHAR(128) DEFAULT NULL COMMENT '服务名称',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '组件名称',
  `instance_name` VARCHAR(255) DEFAULT NULL COMMENT '实例名称',
  `scope_type` VARCHAR(32) DEFAULT NULL COMMENT '作用域类型',
  `scope_ref` VARCHAR(255) DEFAULT NULL COMMENT '作用域标识',
  `scope_name` VARCHAR(255) DEFAULT NULL COMMENT '作用域名称',
  `severity` VARCHAR(32) DEFAULT NULL COMMENT '告警级别',
  `title` VARCHAR(255) NOT NULL COMMENT '标题',
  `content` TEXT COMMENT '内容',
  `receiver_scope` VARCHAR(32) NOT NULL DEFAULT 'ADMIN' COMMENT '接收范围: ADMIN/ALL/USER/SUBJECT',
  `receiver_user` VARCHAR(128) DEFAULT NULL COMMENT '指定接收人',
  `subject_type` VARCHAR(32) DEFAULT NULL COMMENT '接收主体类型',
  `subject_ref` VARCHAR(128) DEFAULT NULL COMMENT '接收主体标识',
  `subject_name` VARCHAR(128) DEFAULT NULL COMMENT '接收主体名称',
  `read_status` VARCHAR(16) NOT NULL DEFAULT 'UNREAD' COMMENT '读取状态: UNREAD/READ',
  `read_time` DATETIME DEFAULT NULL COMMENT '读取时间',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_in_app_code` (`notification_code`),
  KEY `idx_in_app_event` (`event_type`, `event_id`),
  KEY `idx_in_app_code` (`event_code`),
  KEY `idx_in_app_cluster_status` (`cluster_name`, `read_status`, `create_time`),
  KEY `idx_in_app_receiver` (`receiver_scope`, `receiver_user`, `read_status`),
  KEY `idx_in_app_subject` (`subject_type`, `subject_ref`, `read_status`)
) DEFAULT CHARSET = utf8mb4 COMMENT = '站内通知表';

-- 初始化默认通知渠道。
-- 这是通知模块基础元数据,不属于指标/阈值 seed。
INSERT INTO `monitor_notification_channel` (`channel_code`, `channel_name`, `channel_type`, `enabled`, `config_json`, `description`, `sort_order`)
VALUES
('default-in-app', '默认站内信', 'IN_APP', 1, '{"template":"default"}', '消息中心内置站内信通道,不支持删除', 0),
('default-wechat', '默认企业微信', 'WECHAT', 0, '{"webhookUrl":"","msgType":"markdown","mentionedMobileList":[]}', '默认企业微信通知渠道', 1),
('default-dingtalk', '默认钉钉', 'DINGTALK', 0, '{"webhookUrl":"","secret":"","msgType":"markdown","atMobiles":[],"atUserIds":[],"atAll":false}', '默认钉钉通知渠道', 2),
('default-feishu', '默认飞书', 'FEISHU', 0, '{"webhookUrl":"","secret":"","msgType":"post","atAll":false}', '默认飞书通知渠道', 3),
('default-email', '默认邮件', 'EMAIL', 0, '{"host":"","port":587,"username":"","password":"","from":"","to":""}', '默认邮件通知渠道', 4),
('default-webhook', '默认Webhook', 'WEBHOOK', 0, '{"url":""}', '默认Webhook通知渠道', 5)
ON DUPLICATE KEY UPDATE
  `channel_name` = VALUES(`channel_name`),
  `channel_type` = VALUES(`channel_type`),
  `config_json` = CASE
    WHEN `channel_code` = 'default-in-app' THEN VALUES(`config_json`)
    ELSE `config_json`
  END,
  `description` = VALUES(`description`),
  `sort_order` = VALUES(`sort_order`);

-- 初始化默认静态值班组。
-- 默认路由仍走集群管理员;值班组提供开箱可选的接收主体,后续可在页面替换成员。
INSERT INTO `monitor_notification_duty_group` (`group_code`, `group_name`, `enabled`, `members_json`, `description`)
VALUES
('platform-alert-duty', '平台告警值班组', 1, '["admin"]', '默认静态值班组,可在通知配置中调整成员')
ON DUPLICATE KEY UPDATE
  `group_name` = VALUES(`group_name`),
  `enabled` = VALUES(`enabled`),
  `members_json` = CASE
    WHEN `members_json` IS NULL OR `members_json` = '' OR `members_json` = '[]' THEN VALUES(`members_json`)
    ELSE `members_json`
  END,
  `description` = VALUES(`description`);

-- 初始化默认通知路由。
-- 默认只通知集群管理员,不做全员广播;外部渠道可后续在路由中显式追加。
INSERT INTO `monitor_notification_route` (`route_code`, `route_name`, `enabled`, `cluster_name`, `event_type`, `event_source_filter`, `severity_filter`, `service_name`, `component_name`, `scope_type`, `route_priority`, `channel_codes`, `description`)
VALUES
('default-critical-alert-route', '严重阈值告警通知集群管理员', 1, '*', 'THRESHOLD', 'THRESHOLD_ENGINE', 'CRITICAL', '*', '*', '*', 10, '["default-in-app"]', '严重阈值告警默认写入集群管理员站内信'),
('default-warning-alert-route', '警告阈值告警通知集群管理员', 1, '*', 'THRESHOLD', 'THRESHOLD_ENGINE', 'WARNING', '*', '*', '*', 20, '["default-in-app"]', '警告阈值告警默认写入集群管理员站内信'),
('default-official-critical-alert-route', '严重内置健康告警通知集群管理员', 1, '*', 'ALERT', 'AMBARI_OFFICIAL', 'CRITICAL', '*', '*', '*', 30, '["default-in-app"]', '严重内置健康告警默认写入集群管理员站内信'),
('default-official-warning-alert-route', '警告内置健康告警通知集群管理员', 1, '*', 'ALERT', 'AMBARI_OFFICIAL', 'WARNING', '*', '*', '*', 40, '["default-in-app"]', '警告内置健康告警默认写入集群管理员站内信')
ON DUPLICATE KEY UPDATE
  `route_name` = VALUES(`route_name`),
  `enabled` = VALUES(`enabled`),
  `event_type` = VALUES(`event_type`),
  `event_source_filter` = VALUES(`event_source_filter`),
  `severity_filter` = VALUES(`severity_filter`),
  `route_priority` = VALUES(`route_priority`),
  `channel_codes` = VALUES(`channel_codes`),
  `description` = VALUES(`description`);

INSERT INTO `monitor_notification_route_subject` (`route_id`, `subject_type`, `subject_ref`, `subject_name`, `enabled`)
SELECT r.id, 'CLUSTER_ADMIN', 'CLUSTER.ADMINISTRATOR', '集群管理员', 1
FROM `monitor_notification_route` r
WHERE r.route_code IN (
    'default-critical-alert-route',
    'default-warning-alert-route',
    'default-official-critical-alert-route',
    'default-official-warning-alert-route'
  )
  AND NOT EXISTS (
    SELECT 1 FROM `monitor_notification_route_subject` s
    WHERE s.route_id = r.id AND s.subject_type = 'CLUSTER_ADMIN' AND s.subject_ref = 'CLUSTER.ADMINISTRATOR'
  );

-- =====================================================
-- P0 指标定义 seed
-- 说明:
-- 1. 本段只初始化 monitor_metric_definition,不初始化 monitor_threshold_policy。
-- 2. 平台默认阈值策略由 PlatformDefaultThresholdPolicyGenerator 在 platform-api 启动后按指标定义生成。
-- 3. 自定义覆盖默认为空;调优建议只使用 recommendation 链路,不在 SQL 中写阈值策略。
-- =====================================================
INSERT INTO `monitor_metric_definition` (
  `metric_code`, `metric_name`, `metric_group`, `priority`, `sub_group`, `unit`, `metric_type`,
  `metric_kind`, `service_name`, `component_name`, `compute_type`, `source_profile`, `ingest_status`,
  `stability_status`, `value_type`, `aggregation_mode`, `default_chart_type`, `display_order`,
  `enable_fixed_threshold`, `enable_smart_threshold`, `enable_alert`, `enable_health_score`,
  `health_score_weight`, `description`, `extra_info`
)
VALUES
('tt_cpu_usage_percent', 'cpu_usage_percent', 'host', 'P0', 'cpu', '%', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 101, 1, 1, 1, 1, 8, '主机 CPU 使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_cpu_iowait', 'cpu_iowait', 'host', 'P0', 'cpu', '%', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 102, 1, 1, 1, 1, 6, '主机 CPU iowait 占比', '{"seedVersion":"3.0.1-P0"}'),
('tt_load_per_cpu', 'load_per_cpu', 'host', 'P0', 'cpu', '', 'GAUGE', 'DERIVED', 'host', 'host', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 103, 1, 1, 1, 1, 6, '主机单核平均负载', '{"seedVersion":"3.0.1-P0"}'),
('tt_mem_usage_percent', 'mem_usage_percent', 'host', 'P0', 'memory', '%', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 111, 1, 1, 1, 1, 8, '主机内存使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_swap_usage_percent', 'swap_usage_percent', 'host', 'P0', 'memory', '%', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 112, 1, 1, 1, 1, 5, '主机 swap 使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_disk_usage_percent', 'disk_usage_percent', 'host', 'P0', 'disk', '%', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 121, 1, 1, 1, 1, 10, '主机磁盘使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_net_error_packets_per_sec', 'net_error_packets_per_sec', 'host', 'P0', 'network', '个/s', 'GAUGE', 'DERIVED', 'host', 'host', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'UNKNOWN', 'NUMBER', 'SUM', 'LINE', 126, 1, 1, 1, 1, 6, '主机网络错误包速率', '{"seedVersion":"3.0.1-P0"}'),
('tt_net_drop_packets_per_sec', 'net_drop_packets_per_sec', 'host', 'P0', 'network', '个/s', 'GAUGE', 'DERIVED', 'host', 'host', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'UNKNOWN', 'NUMBER', 'SUM', 'LINE', 127, 1, 1, 1, 1, 6, '主机网络丢包速率', '{"seedVersion":"3.0.1-P0"}'),
('tt_process_count', 'process_count', 'host', 'P0', 'process', '个', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'UNKNOWN', 'NUMBER', 'AVG', 'LINE', 129, 1, 1, 1, 1, 4, '主机进程数', '{"seedVersion":"3.0.1-P0"}'),
('tt_thread_count', 'thread_count', 'host', 'P0', 'process', '个', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'UNKNOWN', 'NUMBER', 'AVG', 'LINE', 130, 1, 1, 1, 1, 4, '主机线程数', '{"seedVersion":"3.0.1-P0"}'),
('tt_fd_usage_percent', 'fd_usage_percent', 'host', 'P0', 'process', '%', 'GAUGE', 'COLLECTED', 'host', 'host', 'NONE', 'CORE', 'CANDIDATE', 'UNKNOWN', 'NUMBER', 'AVG', 'LINE', 131, 1, 1, 1, 1, 5, '进程文件句柄使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_jvm_heap_usage_percent', 'jvm_heap_usage_percent', 'jvm', 'P0', 'heap', '%', 'GAUGE', 'COLLECTED', NULL, NULL, 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 201, 1, 1, 1, 1, 8, '组件 JVM Heap 使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_jvm_gc_collection_time_ms', 'jvm_gc_collection_time_ms', 'jvm', 'P0', 'gc', 'ms', 'GAUGE', 'COLLECTED', NULL, NULL, 'NONE', 'CORE', 'CANDIDATE', 'UNKNOWN', 'NUMBER', 'AVG', 'LINE', 202, 1, 1, 1, 1, 5, '组件 JVM GC 耗时', '{"seedVersion":"3.0.1-P0"}'),
('tt_hdfs_namenode_in_safe_mode', 'hdfs_namenode_in_safe_mode', 'hdfs', 'P0', 'availability', '', 'STATE', 'COLLECTED', 'HDFS', 'NAMENODE', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 301, 1, 0, 1, 1, 10, 'HDFS NameNode 安全模式状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_hdfs_datanode_bp_service_alive', 'hdfs_datanode_bp_service_alive', 'hdfs', 'P0', 'availability', '', 'STATE', 'COLLECTED', 'HDFS', 'DATANODE', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 302, 1, 0, 1, 1, 10, 'HDFS DataNode BP 服务可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_hdfs_zkfc_health_monitor_up', 'hdfs_zkfc_health_monitor_up', 'hdfs', 'P0', 'ha', '', 'STATE', 'COLLECTED', 'HDFS', 'ZKFC', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 303, 1, 0, 1, 1, 8, 'HDFS ZKFC 健康监控可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_yarn_resourcemanager_up', 'yarn_resourcemanager_up', 'yarn', 'P0', 'availability', '', 'STATE', 'COLLECTED', 'YARN', 'RESOURCEMANAGER', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 401, 1, 0, 1, 1, 10, 'YARN ResourceManager 可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_yarn_resourcemanager_memory_used_percent', 'yarn_resourcemanager_memory_used_percent', 'yarn', 'P0', 'capacity', '%', 'GAUGE', 'COLLECTED', 'YARN', 'RESOURCEMANAGER', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 402, 1, 1, 1, 1, 7, 'YARN ResourceManager 内存使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_yarn_nodemanager_up', 'yarn_nodemanager_up', 'yarn', 'P0', 'availability', '', 'STATE', 'COLLECTED', 'YARN', 'NODEMANAGER', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 403, 1, 0, 1, 1, 10, 'YARN NodeManager 可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_yarn_nodemanager_memory_used_percent', 'yarn_nodemanager_memory_used_percent', 'yarn', 'P0', 'capacity', '%', 'GAUGE', 'COLLECTED', 'YARN', 'NODEMANAGER', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 404, 1, 1, 1, 1, 7, 'YARN NodeManager 内存使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_kafka_broker_up', 'kafka_broker_up', 'kafka', 'P0', 'availability', '', 'STATE', 'COLLECTED', 'KAFKA', 'KAFKA_BROKER', 'NONE', 'CORE', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 501, 1, 0, 1, 1, 10, 'Kafka Broker 可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_kafka_disk_used_percent', 'kafka_disk_used_percent', 'kafka', 'P0', 'capacity', '%', 'GAUGE', 'DERIVED', 'KAFKA', 'KAFKA_BROKER', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'AVG', 'LINE', 502, 1, 1, 1, 1, 9, 'Kafka Broker 磁盘使用率', '{"seedVersion":"3.0.1-P0"}'),
('tt_kafka_cluster_under_replicated_partitions', 'kafka_cluster_under_replicated_partitions', 'kafka', 'P0', 'replica', '个', 'GAUGE', 'DERIVED', 'KAFKA', 'KAFKA_BROKER', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'MAX', 'LINE', 503, 1, 1, 1, 1, 10, 'Kafka 未完全复制分区数', '{"seedVersion":"3.0.1-P0"}'),
('tt_kafka_cluster_offline_partitions', 'kafka_cluster_offline_partitions', 'kafka', 'P0', 'replica', '个', 'GAUGE', 'DERIVED', 'KAFKA', 'KAFKA_BROKER', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'MAX', 'LINE', 504, 1, 0, 1, 1, 10, 'Kafka 离线分区数', '{"seedVersion":"3.0.1-P0"}'),
('tt_ambari_plus_monitor_platform_api_up', 'ambari_plus_monitor_platform_api_up', 'ambari-plus-monitor', 'P0', 'self', '', 'STATE', 'DERIVED', 'AMBARI_PLUS_MONITOR', 'MONITOR_PLATFORM_API', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 601, 1, 0, 1, 1, 10, 'Monitor Platform API 可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_ambari_plus_monitor_ingester_up', 'ambari_plus_monitor_ingester_up', 'ambari-plus-monitor', 'P0', 'self', '', 'STATE', 'DERIVED', 'AMBARI_PLUS_MONITOR', 'MONITOR_INGESTER', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 602, 1, 0, 1, 1, 10, 'Monitor Ingester 可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_ambari_plus_monitor_rule_engine_up', 'ambari_plus_monitor_rule_engine_up', 'ambari-plus-monitor', 'P0', 'self', '', 'STATE', 'DERIVED', 'AMBARI_PLUS_MONITOR', 'MONITOR_RULE_ENGINE', 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'LAST', 'LINE', 603, 1, 0, 1, 1, 10, 'Monitor Rule Engine 可用状态', '{"seedVersion":"3.0.1-P0"}'),
('tt_ambari_plus_monitor_notification_failure_count', 'ambari_plus_monitor_notification_failure_count', 'ambari-plus-monitor', 'P0', 'self', '次', 'GAUGE', 'DERIVED', 'AMBARI_PLUS_MONITOR', NULL, 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'SUM', 'LINE', 604, 1, 1, 1, 1, 8, 'Monitor 通知失败数', '{"seedVersion":"3.0.1-P0"}'),
('tt_ambari_plus_monitor_agent_failed_batch_count', 'ambari_plus_monitor_agent_failed_batch_count', 'ambari-plus-monitor', 'P0', 'self', '次', 'GAUGE', 'DERIVED', 'AMBARI_PLUS_MONITOR', NULL, 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'SUM', 'LINE', 605, 1, 1, 1, 1, 8, 'Monitor Agent 失败批次数', '{"seedVersion":"3.0.1-P0"}'),
('tt_ambari_plus_monitor_ingester_failed_metric_count', 'ambari_plus_monitor_ingester_failed_metric_count', 'ambari-plus-monitor', 'P0', 'self', '条', 'GAUGE', 'DERIVED', 'AMBARI_PLUS_MONITOR', NULL, 'REALTIME', 'DERIVED_PLATFORM', 'CANDIDATE', 'STABLE', 'NUMBER', 'SUM', 'LINE', 606, 1, 1, 1, 1, 8, 'Monitor Ingester 写入失败指标数', '{"seedVersion":"3.0.1-P0"}')
ON DUPLICATE KEY UPDATE
  `metric_group` = VALUES(`metric_group`),
  `priority` = VALUES(`priority`),
  `sub_group` = VALUES(`sub_group`),
  `unit` = VALUES(`unit`),
  `metric_type` = VALUES(`metric_type`),
  `metric_kind` = VALUES(`metric_kind`),
  `service_name` = VALUES(`service_name`),
  `component_name` = VALUES(`component_name`),
  `source_profile` = VALUES(`source_profile`),
  `stability_status` = VALUES(`stability_status`),
  `enable_fixed_threshold` = VALUES(`enable_fixed_threshold`),
  `enable_smart_threshold` = VALUES(`enable_smart_threshold`),
  `enable_alert` = VALUES(`enable_alert`),
  `enable_health_score` = VALUES(`enable_health_score`),
  `health_score_weight` = VALUES(`health_score_weight`),
  `description` = VALUES(`description`),
  `extra_info` = VALUES(`extra_info`);

UPDATE `monitor_metric_definition`
SET `display_name` = `description`,
    `metadata_status` = 'VERIFIED',
    `metadata_source` = 'BUILT_IN'
WHERE `extra_info` LIKE '%"seedVersion":"3.0.1-P0"%';

-- 平台默认阈值策略不在初始化 SQL 中写死;由 PlatformDefaultThresholdPolicyGenerator 根据当前启用指标动态生成。

-- =====================================================
-- HA 切换事件表
-- =====================================================
CREATE TABLE IF NOT EXISTS `monitor_ha_failover_event` (
  `id`               BIGINT       NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `cluster_id`       BIGINT       NOT NULL COMMENT '集群ID',
  `service_name`     VARCHAR(64)  NOT NULL COMMENT '服务名称(HDFS/YARN/HBASE等)',
  `component_name`   VARCHAR(64)  NOT NULL COMMENT '组件名称(NAMENODE/RESOURCEMANAGER等)',
  `instance_name`    VARCHAR(128) NOT NULL COMMENT '实例名称(nn1/nn2/rm1/rm2等)',
  `host_name`        VARCHAR(255) NOT NULL COMMENT '主机名称',
  `previous_state`   VARCHAR(32)  DEFAULT NULL COMMENT '切换前状态(active/standby/unknown)',
  `current_state`    VARCHAR(32)  NOT NULL COMMENT '切换后状态(active/standby/unknown)',
  `event_type`       VARCHAR(32)  NOT NULL COMMENT '事件类型(FAILOVER/SWITCH/UNKNOWN)',
  `failover_reason`  VARCHAR(128) DEFAULT NULL COMMENT '切换原因(MANUAL/AUTO_CRASH/AUTO_NETWORK等)',
  `start_time`       DATETIME     NOT NULL COMMENT '切换开始时间',
  `end_time`         DATETIME     DEFAULT NULL COMMENT '切换结束时间',
  `duration_ms`      BIGINT       DEFAULT NULL COMMENT '切换耗时(毫秒)',
  `success`          TINYINT      DEFAULT 1 COMMENT '是否成功(1成功/0失败)',
  `failure_reason`   VARCHAR(512) DEFAULT NULL COMMENT '失败信息',
  `zkfc_involved`    TINYINT      DEFAULT 1 COMMENT '是否ZKFC参与(1是/0否)',
  `journal_node_sync_status` VARCHAR(32) DEFAULT NULL COMMENT 'JN同步状态(HDFS)',
  `last_tx_id_before` BIGINT      DEFAULT NULL COMMENT '切换前最后事务ID(HDFS)',
  `last_tx_id_after`  BIGINT      DEFAULT NULL COMMENT '切换后事务ID(HDFS)',
  `extra_info`       TEXT         DEFAULT NULL COMMENT '扩展信息(JSON)',
  `create_time`      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time`      DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_ha_cluster_service`   (`cluster_id`, `service_name`),
  KEY `idx_ha_instance`          (`instance_name`, `host_name`),
  KEY `idx_ha_start_time`        (`start_time`),
  KEY `idx_ha_event_type`        (`event_type`, `failover_reason`)
) DEFAULT CHARSET = utf8mb4 COMMENT = 'HA切换事件记录表';

-- ============================================================
-- HDFS 离线分析快照表
-- ============================================================
CREATE TABLE IF NOT EXISTS `monitor_hdfs_directory_snapshot` (
    `id`              BIGINT      NOT NULL AUTO_INCREMENT COMMENT '主键',
    `cluster_name`    VARCHAR(128) NOT NULL               COMMENT '集群名称',
    `path`            VARCHAR(512) NOT NULL               COMMENT '目录绝对路径',
    `owner`           VARCHAR(128)                        COMMENT '目录所有者',
    `group_name`      VARCHAR(128)                        COMMENT '目录所属组',
    `file_count`      BIGINT       DEFAULT 0              COMMENT '目录下文件总数(递归)',
    `directory_count` BIGINT       DEFAULT 0              COMMENT '目录下子目录总数(递归)',
    `total_bytes`     BIGINT       DEFAULT 0              COMMENT '目录总大小(字节,不含副本)',
    `space_consumed`  BIGINT       DEFAULT 0              COMMENT '实际消耗存储(字节,含副本)',
    `quota`           BIGINT       DEFAULT -1             COMMENT '文件数配额(-1 表示无限制)',
    `space_quota`     BIGINT       DEFAULT -1             COMMENT '空间配额(字节,-1 表示无限制)',
    `prev_total_bytes` BIGINT                             COMMENT '上次扫描时的目录大小(用于计算增量)',
    `prev_analyzed_at` DATETIME                           COMMENT '上次扫描时间',
    `analyzed_at`     DATETIME     NOT NULL               COMMENT '本次扫描时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_cluster_path`       (`cluster_name`, `path`),
    KEY `idx_cluster_bytes_desc`       (`cluster_name`, `total_bytes` DESC),
    KEY `idx_cluster_files_desc`       (`cluster_name`, `file_count` DESC),
    KEY `idx_cluster_analyzed`         (`cluster_name`, `analyzed_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  COMMENT='HDFS 目录容量快照,由平台定时通过 WebHDFS 分析并 UPSERT 更新';

CREATE TABLE IF NOT EXISTS `monitor_hdfs_trash_snapshot` (
    `id`               BIGINT      NOT NULL AUTO_INCREMENT COMMENT '主键',
    `cluster_name`     VARCHAR(128) NOT NULL               COMMENT '集群名称',
    `username`         VARCHAR(128) NOT NULL               COMMENT 'HDFS 用户名',
    `trash_size_bytes` BIGINT       DEFAULT 0              COMMENT '回收站总大小(字节)',
    `file_count`       BIGINT       DEFAULT 0              COMMENT '回收站文件数',
    `oldest_item_ms`   BIGINT                              COMMENT '最旧条目时间戳(毫秒),NULL 表示回收站为空',
    `analyzed_at`      DATETIME     NOT NULL               COMMENT '本次扫描时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_cluster_user`        (`cluster_name`, `username`),
    KEY `idx_cluster_size_desc`         (`cluster_name`, `trash_size_bytes` DESC),
    KEY `idx_cluster_analyzed`          (`cluster_name`, `analyzed_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  COMMENT='HDFS 回收站快照,由平台定时通过 WebHDFS 分析并 UPSERT 更新';

CREATE TABLE IF NOT EXISTS `monitor_hdfs_offline_analysis_record` (
    `id`             BIGINT       NOT NULL AUTO_INCREMENT COMMENT '主键',
    `cluster_name`   VARCHAR(128) NOT NULL                COMMENT '集群名称',
    `record_type`    VARCHAR(64)  NOT NULL                COMMENT '明细类型:高风险文件、死节点影响、快照、小文件或慢RPC等',
    `record_key`     VARCHAR(512) NOT NULL                COMMENT '业务唯一键原文,例如文件路径、目录路径、hostName或sizeRange',
    `record_hash`    CHAR(40)     NOT NULL                COMMENT 'recordType + recordKey 的 SHA1,用于幂等写入',
    `path`           VARCHAR(1024)                        COMMENT '文件或目录路径',
    `host_name`      VARCHAR(255)                         COMMENT '主机名',
    `owner`          VARCHAR(128)                         COMMENT '所有者',
    `risk_level`     VARCHAR(32)                          COMMENT '风险等级',
    `numeric_value`  DOUBLE                               COMMENT '排序用数值,例如文件大小、目录大小、延迟或数量',
    `payload_json`   MEDIUMTEXT                           COMMENT '原始业务 payload,JSON 字符串',
    `source_job`     VARCHAR(128)                         COMMENT '来源任务,例如 fsimage-analyzer',
    `batch_id`       VARCHAR(128)                         COMMENT '导入批次 ID',
    `analyzed_at`    DATETIME     NOT NULL                COMMENT '分析时间',
    `create_time`    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time`    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_hdfs_offline_record` (`cluster_name`, `record_type`, `record_hash`),
    KEY `idx_hdfs_offline_latest`       (`cluster_name`, `record_type`, `analyzed_at`),
    KEY `idx_hdfs_offline_numeric`      (`cluster_name`, `record_type`, `numeric_value`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
  COMMENT='HDFS fsimage/fsck/慢RPC离线分析明细,由外部分析任务幂等导入';

-- ============================================================
-- 日志与诊断元数据表
-- ============================================================
CREATE TABLE IF NOT EXISTS `monitor_log_source_policy` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `source_code` VARCHAR(128) NOT NULL COMMENT '日志源编码,唯一',
  `cluster_name` VARCHAR(128) DEFAULT NULL COMMENT '集群名,NULL表示默认模板',
  `service_name` VARCHAR(128) NOT NULL COMMENT '服务名',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '组件名',
  `log_class` VARCHAR(32) NOT NULL COMMENT '日志类别',
  `log_type` VARCHAR(128) NOT NULL COMMENT '日志类型',
  `path_pattern` VARCHAR(1024) NOT NULL COMMENT '日志路径模式',
  `parser_type` VARCHAR(64) NOT NULL COMMENT '解析器类型',
  `enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
  `policy_source` VARCHAR(32) NOT NULL DEFAULT 'STACK_DEFAULT' COMMENT '策略来源',
  `collect_level_min` VARCHAR(16) DEFAULT NULL COMMENT '最小采集级别',
  `noise_policy` VARCHAR(32) NOT NULL DEFAULT 'KEEP' COMMENT '噪声策略',
  `sample_rate` DOUBLE DEFAULT NULL COMMENT '采样率',
  `retention_tier` VARCHAR(32) NOT NULL DEFAULT 'hot' COMMENT '保留层级',
  `retention_days` INT DEFAULT NULL COMMENT '保留天数',
  `include_patterns` TEXT COMMENT '包含规则(JSON)',
  `exclude_patterns` TEXT COMMENT '排除规则(JSON)',
  `sensitive_policy` TEXT COMMENT '脱敏策略(JSON)',
  `parser_config` TEXT COMMENT '解析器配置(JSON)',
  `stack_service` VARCHAR(128) DEFAULT NULL COMMENT '对应stack service',
  `stack_config_type` VARCHAR(128) DEFAULT NULL COMMENT '对应stack config type',
  `stack_property_name` VARCHAR(256) DEFAULT NULL COMMENT '对应stack property',
  `temp_expire_at` DATETIME DEFAULT NULL COMMENT '临时诊断过期时间',
  `description` TEXT COMMENT '说明',
  `create_by` VARCHAR(128) DEFAULT NULL COMMENT '创建人',
  `update_by` VARCHAR(128) DEFAULT NULL COMMENT '修改人',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_log_source_code` (`source_code`),
  KEY `idx_log_src_cluster_svc` (`cluster_name`, `service_name`, `component_name`),
  KEY `idx_log_src_type` (`log_class`, `log_type`, `enabled`),
  KEY `idx_log_src_policy` (`policy_source`, `noise_policy`, `retention_tier`),
  KEY `idx_log_src_temp` (`policy_source`, `temp_expire_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志源采集策略表';

CREATE TABLE IF NOT EXISTS `monitor_log_event_fingerprint` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `fingerprint` VARCHAR(128) NOT NULL COMMENT '事件指纹',
  `cluster_name` VARCHAR(128) NOT NULL COMMENT '集群名',
  `service_name` VARCHAR(128) NOT NULL COMMENT '服务名',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '组件名',
  `host_name` VARCHAR(255) DEFAULT NULL COMMENT '最近出现主机',
  `log_class` VARCHAR(32) NOT NULL COMMENT '日志类别',
  `log_type` VARCHAR(128) NOT NULL COMMENT '日志类型',
  `level` VARCHAR(16) DEFAULT NULL COMMENT '最高日志级别',
  `exception_class` VARCHAR(255) DEFAULT NULL COMMENT '异常类',
  `stack_hash` VARCHAR(128) DEFAULT NULL COMMENT '堆栈哈希',
  `message_template` VARCHAR(2048) NOT NULL COMMENT '归一化日志模板',
  `example_log_id` VARCHAR(256) DEFAULT NULL COMMENT 'Solr样例日志ID',
  `first_seen_at` DATETIME NOT NULL COMMENT '首次出现时间',
  `last_seen_at` DATETIME NOT NULL COMMENT '最近出现时间',
  `count_5m` BIGINT NOT NULL DEFAULT 0 COMMENT '最近5分钟次数',
  `count_1h` BIGINT NOT NULL DEFAULT 0 COMMENT '最近1小时次数',
  `count_24h` BIGINT NOT NULL DEFAULT 0 COMMENT '最近24小时次数',
  `affected_hosts` TEXT COMMENT '影响主机(JSON数组)',
  `affected_components` TEXT COMMENT '影响组件(JSON数组)',
  `severity_score` DOUBLE DEFAULT NULL COMMENT '严重度分',
  `state` VARCHAR(32) NOT NULL DEFAULT 'NEW' COMMENT '指纹状态',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_log_fingerprint` (`cluster_name`, `fingerprint`),
  KEY `idx_log_fp_service` (`cluster_name`, `service_name`, `component_name`, `state`),
  KEY `idx_log_fp_time` (`last_seen_at`, `first_seen_at`),
  KEY `idx_log_fp_level` (`level`, `severity_score`),
  KEY `idx_log_fp_stack` (`stack_hash`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志事件指纹表';

CREATE TABLE IF NOT EXISTS `monitor_log_signal_window` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `window_code` VARCHAR(128) NOT NULL COMMENT '窗口编码,唯一',
  `cluster_name` VARCHAR(128) NOT NULL COMMENT '集群名',
  `scope_type` VARCHAR(32) NOT NULL COMMENT '作用域类型',
  `scope_ref` VARCHAR(512) NOT NULL COMMENT '作用域引用',
  `service_name` VARCHAR(128) DEFAULT NULL COMMENT '服务名',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '组件名',
  `host_name` VARCHAR(255) DEFAULT NULL COMMENT '主机名',
  `window_size` VARCHAR(16) NOT NULL COMMENT '窗口大小',
  `window_start` DATETIME NOT NULL COMMENT '窗口开始',
  `window_end` DATETIME NOT NULL COMMENT '窗口结束',
  `error_count` BIGINT NOT NULL DEFAULT 0 COMMENT 'ERROR数',
  `warn_count` BIGINT NOT NULL DEFAULT 0 COMMENT 'WARN数',
  `fatal_count` BIGINT NOT NULL DEFAULT 0 COMMENT 'FATAL数',
  `audit_denied_count` BIGINT NOT NULL DEFAULT 0 COMMENT '审计拒绝数',
  `auth_failed_count` BIGINT NOT NULL DEFAULT 0 COMMENT '认证失败数',
  `access_4xx_count` BIGINT NOT NULL DEFAULT 0 COMMENT 'HTTP 4xx数',
  `access_5xx_count` BIGINT NOT NULL DEFAULT 0 COMMENT 'HTTP 5xx数',
  `slow_request_count` BIGINT NOT NULL DEFAULT 0 COMMENT '慢请求数',
  `request_p95_ms` BIGINT DEFAULT NULL COMMENT '请求P95耗时',
  `unique_fingerprint_count` BIGINT NOT NULL DEFAULT 0 COMMENT '独立指纹数',
  `top_fingerprints_json` TEXT COMMENT 'Top指纹(JSON)',
  `baseline_deviation` DOUBLE DEFAULT NULL COMMENT '基线偏移',
  `stability_score` DOUBLE DEFAULT NULL COMMENT '稳定性分',
  `parser_error_count` BIGINT NOT NULL DEFAULT 0 COMMENT '解析失败数',
  `sample_count` BIGINT NOT NULL DEFAULT 0 COMMENT '样本数',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_log_signal_window` (`window_code`),
  KEY `idx_log_signal_scope` (`cluster_name`, `scope_type`, `scope_ref`(255), `window_size`),
  KEY `idx_log_signal_object` (`cluster_name`, `service_name`, `component_name`, `host_name`, `window_start`),
  KEY `idx_log_signal_time` (`window_start`, `window_end`),
  KEY `idx_log_signal_score` (`stability_score`, `baseline_deviation`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志时间窗信号表';

CREATE TABLE IF NOT EXISTS `monitor_log_diagnosis_case` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `case_code` VARCHAR(128) NOT NULL COMMENT '诊断案例编码',
  `cluster_name` VARCHAR(128) NOT NULL COMMENT '集群名',
  `scope_type` VARCHAR(32) NOT NULL COMMENT '作用域类型',
  `scope_ref` VARCHAR(512) NOT NULL COMMENT '作用域引用',
  `service_name` VARCHAR(128) DEFAULT NULL COMMENT '服务名',
  `component_name` VARCHAR(128) DEFAULT NULL COMMENT '组件名',
  `host_name` VARCHAR(255) DEFAULT NULL COMMENT '主机名',
  `title` VARCHAR(255) NOT NULL COMMENT '诊断标题',
  `severity` VARCHAR(16) NOT NULL DEFAULT 'WARNING' COMMENT '严重等级',
  `status` VARCHAR(32) NOT NULL DEFAULT 'OPEN' COMMENT '案例状态',
  `engine_type` VARCHAR(32) NOT NULL DEFAULT 'RULE' COMMENT '诊断引擎',
  `model_version` VARCHAR(128) DEFAULT NULL COMMENT '模型或规则版本',
  `summary` TEXT COMMENT '诊断摘要',
  `impact` TEXT COMMENT '影响面说明',
  `evidence_refs_json` TEXT COMMENT '证据引用(JSON)',
  `suspected_causes_json` TEXT COMMENT '疑似原因(JSON)',
  `recommendations_json` TEXT COMMENT '建议(JSON)',
  `confidence` DOUBLE DEFAULT NULL COMMENT '置信度',
  `started_at` DATETIME NOT NULL COMMENT '诊断窗口开始',
  `ended_at` DATETIME DEFAULT NULL COMMENT '诊断窗口结束',
  `acked_by` VARCHAR(128) DEFAULT NULL COMMENT '确认人',
  `acked_at` DATETIME DEFAULT NULL COMMENT '确认时间',
  `resolved_by` VARCHAR(128) DEFAULT NULL COMMENT '解决人',
  `resolved_at` DATETIME DEFAULT NULL COMMENT '解决时间',
  `extra_info` TEXT COMMENT '扩展信息(JSON)',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_log_case_code` (`case_code`),
  KEY `idx_log_case_scope` (`cluster_name`, `scope_type`, `scope_ref`(255), `status`),
  KEY `idx_log_case_object` (`cluster_name`, `service_name`, `component_name`, `host_name`, `status`),
  KEY `idx_log_case_time` (`started_at`, `ended_at`, `create_time`),
  KEY `idx_log_case_engine` (`engine_type`, `severity`, `confidence`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志诊断案例表';

CREATE TABLE IF NOT EXISTS `monitor_log_ai_feedback` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `feedback_code` VARCHAR(128) NOT NULL COMMENT '反馈编码',
  `case_id` BIGINT NOT NULL COMMENT '诊断案例ID',
  `case_code` VARCHAR(128) NOT NULL COMMENT '诊断案例编码',
  `operator_name` VARCHAR(128) DEFAULT NULL COMMENT '操作人',
  `action` VARCHAR(32) NOT NULL COMMENT '反馈动作',
  `feedback` TEXT COMMENT '反馈内容',
  `resolved` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否解决',
  `resolved_at` DATETIME DEFAULT NULL COMMENT '解决时间',
  `recommendation_index` INT DEFAULT NULL COMMENT '建议序号',
  `before_value` TEXT COMMENT '反馈前(JSON)',
  `after_value` TEXT COMMENT '反馈后(JSON)',
  `notes` TEXT COMMENT '备注',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_log_feedback_code` (`feedback_code`),
  KEY `idx_log_feedback_case` (`case_id`, `action`, `create_time`),
  KEY `idx_log_feedback_case_code` (`case_code`, `action`, `create_time`),
  KEY `idx_log_feedback_operator` (`operator_name`, `create_time`),
  KEY `idx_log_feedback_resolved` (`resolved`, `resolved_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志AI诊断反馈表';

CREATE TABLE IF NOT EXISTS `monitor_log_operation_audit` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `audit_code` VARCHAR(128) NOT NULL COMMENT '审计编码',
  `cluster_name` VARCHAR(128) NOT NULL COMMENT '集群名',
  `operation_type` VARCHAR(32) NOT NULL COMMENT '操作类型',
  `target_type` VARCHAR(64) DEFAULT NULL COMMENT '目标类型',
  `target_ref` VARCHAR(512) DEFAULT NULL COMMENT '目标引用',
  `operator_name` VARCHAR(128) DEFAULT NULL COMMENT '操作人',
  `operator_roles` TEXT COMMENT '操作人角色快照',
  `sensitive_flag` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否敏感日志操作',
  `allowed_flag` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否允许',
  `denied_reason` TEXT COMMENT '拒绝原因',
  `time_range_from` DATETIME DEFAULT NULL COMMENT '查询开始时间',
  `time_range_to` DATETIME DEFAULT NULL COMMENT '查询结束时间',
  `request_summary` TEXT COMMENT '脱敏请求摘要',
  `backend_status` VARCHAR(64) DEFAULT NULL COMMENT '后端状态',
  `data_ready` TINYINT(1) DEFAULT NULL COMMENT '是否返回真实数据',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_log_audit_code` (`audit_code`),
  KEY `idx_log_audit_cluster_time` (`cluster_name`, `create_time`),
  KEY `idx_log_audit_operator` (`operator_name`, `create_time`),
  KEY `idx_log_audit_operation` (`operation_type`, `create_time`),
  KEY `idx_log_audit_sensitive` (`sensitive_flag`, `allowed_flag`, `create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志诊断操作审计表';

-- 初始化日志源默认模板。
-- 只写入 stack 默认策略,不写集群覆盖;集群级差异由后续策略服务生成。
INSERT INTO `monitor_log_source_policy`
(`source_code`, `cluster_name`, `service_name`, `component_name`, `log_class`, `log_type`, `path_pattern`, `parser_type`, `enabled`, `policy_source`, `collect_level_min`, `noise_policy`, `sample_rate`, `retention_tier`, `retention_days`, `stack_service`, `description`)
VALUES
('default.hdfs.namenode.app', NULL, 'HDFS', 'NAMENODE', 'APP', 'hdfs_namenode_app', '/var/log/hadoop/hdfs/hadoop-hdfs-namenode-*.log', 'LOG4J_STANDARD', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'HDFS', 'HDFS NameNode WARN/ERROR and lifecycle logs'),
('default.hdfs.datanode.app', NULL, 'HDFS', 'DATANODE', 'APP', 'hdfs_datanode_app', '/var/log/hadoop/hdfs/hadoop-hdfs*-datanode-*.log', 'LOG4J_STANDARD', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'HDFS', 'HDFS DataNode WARN/ERROR and data pipeline logs'),
('default.hdfs.secondarynamenode.app', NULL, 'HDFS', 'SECONDARY_NAMENODE', 'APP', 'hdfs_secondarynamenode_app', '/var/log/hadoop/hdfs/hadoop-hdfs-secondarynamenode-*.log', 'LOG4J_STANDARD', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'HDFS', 'HDFS SecondaryNameNode WARN/ERROR and checkpoint logs'),
('default.hdfs.journalnode.app', NULL, 'HDFS', 'JOURNALNODE', 'APP', 'hdfs_journalnode_app', '/var/log/hadoop/hdfs/hadoop-hdfs-journalnode-*.log', 'LOG4J_STANDARD', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'HDFS', 'HDFS JournalNode WARN/ERROR and quorum logs'),
('default.hdfs.audit', NULL, 'HDFS', 'NAMENODE', 'AUDIT', 'hdfs_audit', '/var/log/hadoop/hdfs/hdfs-audit.log', 'AUDIT_KV', 1, 'STACK_DEFAULT', 'INFO', 'AGGREGATE', NULL, 'audit', 30, 'HDFS', 'HDFS audit logs, deny kept and success aggregated'),
('default.hdfs.security', NULL, 'HDFS', 'HDFS', 'SECURITY', 'hdfs_security_auth', '/var/log/hadoop/hdfs/SecurityAuth.audit', 'AUDIT_KV', 1, 'STACK_DEFAULT', 'INFO', 'AGGREGATE', NULL, 'audit', 30, 'HDFS', 'HDFS SecurityAuth logs, auth failures kept and success aggregated'),
('default.atlas.audit', NULL, 'ATLAS', 'ATLAS_SERVER', 'AUDIT', 'atlas_audit', '/var/log/atlas/audit.log', 'PIPE_AUDIT', 1, 'STACK_DEFAULT', 'INFO', 'AGGREGATE', NULL, 'audit', 30, 'ATLAS', 'Atlas audit logs, non-2xx kept and health checks aggregated'),
('default.ranger.access', NULL, 'RANGER', 'RANGER_ADMIN', 'ACCESS', 'ranger_access', '/var/log/ranger/admin/access-*.log', 'APACHE_ACCESS', 1, 'STACK_DEFAULT', 'INFO', 'AGGREGATE', NULL, 'short', 3, 'RANGER', 'Ranger access logs, 4xx/5xx kept and 304 aggregated'),
('default.ranger.admin.app', NULL, 'RANGER', 'RANGER_ADMIN', 'APP', 'ranger_admin', '/var/log/ranger/admin/ranger-admin-*-ranger.log', 'LOG4J_STANDARD', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'RANGER', 'Ranger Admin WARN/ERROR and authentication lifecycle logs'),
('default.ranger.usersync', NULL, 'RANGER', 'RANGER_USERSYNC', 'SECURITY', 'ranger_usersync', '/var/log/ranger/usersync/usersync-*-ranger.log', 'RANGER_SYNC_LOG', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'RANGER', 'Ranger Usersync WARN/ERROR identity sync logs'),
('default.ranger.tagsync', NULL, 'RANGER', 'RANGER_TAGSYNC', 'SECURITY', 'ranger_tagsync', '/var/log/ranger/tagsync/tagsync.log', 'RANGER_SYNC_LOG', 1, 'STACK_DEFAULT', 'WARN', 'AGGREGATE', NULL, 'short', 7, 'RANGER', 'Ranger Tagsync WARN/ERROR tag sync logs, repeated Kafka failures aggregated'),
('default.livy.server.app', NULL, 'LIVY', 'LIVY_SERVER', 'APP', 'livy_server', '/var/log/livy/livy-livy-server.out', 'LOG4J_STANDARD', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'LIVY', 'Livy Server WARN/ERROR logs'),
('default.livy.request', NULL, 'LIVY', 'LIVY_SERVER', 'REQUEST', 'livy_request', '/var/log/livy/*.request.log', 'LOCALIZED_ACCESS', 1, 'STACK_DEFAULT', 'INFO', 'AGGREGATE', NULL, 'short', 3, 'LIVY', 'Livy request logs, localized month access logs with 4xx/5xx kept and 2xx aggregated'),
('default.hive.server.app', NULL, 'HIVE', 'HIVE_SERVER', 'APP', 'hive_server', '/var/log/hive/hiveserver2.log', 'LOG4J_STANDARD', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'HIVE', 'HiveServer2 app WARN/ERROR logs'),
('default.hive.server.stderr', NULL, 'HIVE', 'HIVE_SERVER', 'JVM', 'hive_server2_stderr', '/var/log/hive/hive-server2.err', 'STACKTRACE_CONTINUATION', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'HIVE', 'HiveServer2 stderr and Java stack traces'),
('default.hive.metastore.app', NULL, 'HIVE', 'HIVE_METASTORE', 'APP', 'hive_metastore', '/var/log/hive/hivemetastore.log', 'LOG4J_STANDARD', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'HIVE', 'Hive Metastore WARN/ERROR logs'),
('default.knox.gateway.audit', NULL, 'KNOX', 'KNOX_GATEWAY', 'AUDIT', 'knox_gateway_audit', '/var/log/knox/gateway-audit.log', 'PIPE_AUDIT', 1, 'STACK_DEFAULT', 'INFO', 'AGGREGATE', NULL, 'audit', 30, 'KNOX', 'Knox gateway audit logs'),
('default.trino.http_request', NULL, 'TRINO', NULL, 'REQUEST', 'trino_http_request', '/var/log/trino/http-request.log', 'TRINO_HTTP_REQUEST', 1, 'STACK_DEFAULT', 'INFO', 'AGGREGATE', NULL, 'short', 3, 'TRINO', 'Trino HTTP request logs, 4xx/5xx/slow requests kept and health checks aggregated'),
('default.trino.server.app', NULL, 'TRINO', NULL, 'APP', 'trino_server', '/var/log/trino/server.log', 'TRINO_SERVER_LOG', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'TRINO', 'Trino server WARN/ERROR logs and worker communication failures'),
('default.trino.launcher.app', NULL, 'TRINO', NULL, 'APP', 'trino_launcher', '/var/log/trino/launcher.log', 'TRINO_SERVER_LOG', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'short', 7, 'TRINO', 'Trino launcher startup WARN/ERROR logs'),
('default.trino.stdout', NULL, 'TRINO', NULL, 'JVM', 'trino_stdout', '/var/log/trino/trino_*.out', 'STACKTRACE_CONTINUATION', 1, 'STACK_DEFAULT', 'ERROR', 'KEEP', NULL, 'short', 7, 'TRINO', 'Trino stdout crash, OOM and exception traces'),
('default.monitor.platform_api.app', NULL, 'AMBARI_PLUS_MONITOR', 'MONITOR_PLATFORM_API', 'MONITOR', 'monitor_platform_api_app', '/var/log/ambari-plus/monitor/platform-api/platform-api.log', 'SPRING_BOOT', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'AMBARI_PLUS_MONITOR', 'Monitor Platform API WARN/ERROR, Solr, AI diagnosis and scheduling failures'),
('default.monitor.agent', NULL, 'AMBARI_PLUS_MONITOR', 'MONITOR_AGENT', 'MONITOR', 'monitor_agent_app', '/var/log/ambari-plus/monitor/agent/agent.log', 'SPRING_BOOT', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'AMBARI_PLUS_MONITOR', 'Monitor Agent collection and push WARN/ERROR logs'),
('default.monitor.ingester.app', NULL, 'AMBARI_PLUS_MONITOR', 'MONITOR_INGESTER', 'MONITOR', 'monitor_ingester_app', '/var/log/ambari-plus/monitor/ingester/ingester.log', 'SPRING_BOOT', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'AMBARI_PLUS_MONITOR', 'Monitor Ingester ingest, queue and IoTDB write WARN/ERROR logs'),
('default.monitor.rule_engine.app', NULL, 'AMBARI_PLUS_MONITOR', 'MONITOR_RULE_ENGINE', 'MONITOR', 'monitor_rule_engine_app', '/var/log/ambari-plus/monitor/rule-engine/rule-engine.log', 'SPRING_BOOT', 1, 'STACK_DEFAULT', 'WARN', 'KEEP', NULL, 'hot', 15, 'AMBARI_PLUS_MONITOR', 'Monitor Rule Engine alert, threshold and health score WARN/ERROR logs'),
('default.monitor.platform_api.jvm_out', NULL, 'AMBARI_PLUS_MONITOR', 'MONITOR_PLATFORM_API', 'JVM', 'monitor_platform_api_jvm_out', '/var/log/ambari-plus/monitor/platform-api.jvm.out', 'STACKTRACE_CONTINUATION', 1, 'STACK_DEFAULT', 'ERROR', 'KEEP', NULL, 'short', 7, 'AMBARI_PLUS_MONITOR', 'Monitor Platform API JVM stdout crash, OOM and exception traces'),
('default.monitor.agent.jvm_out', NULL, 'AMBARI_PLUS_MONITOR', 'MONITOR_AGENT', 'JVM', 'monitor_agent_jvm_out', '/var/log/ambari-plus/monitor/agent.jvm.out', 'STACKTRACE_CONTINUATION', 1, 'STACK_DEFAULT', 'ERROR', 'KEEP', NULL, 'short', 7, 'AMBARI_PLUS_MONITOR', 'Monitor Agent JVM stdout crash, OOM and exception traces'),
('default.monitor.ingester.jvm_out', NULL, 'AMBARI_PLUS_MONITOR', 'MONITOR_INGESTER', 'JVM', 'monitor_ingester_jvm_out', '/var/log/ambari-plus/monitor/ingester.jvm.out', 'STACKTRACE_CONTINUATION', 1, 'STACK_DEFAULT', 'ERROR', 'KEEP', NULL, 'short', 7, 'AMBARI_PLUS_MONITOR', 'Monitor Ingester JVM stdout crash, OOM and exception traces'),
('default.monitor.rule_engine.jvm_out', NULL, 'AMBARI_PLUS_MONITOR', 'MONITOR_RULE_ENGINE', 'JVM', 'monitor_rule_engine_jvm_out', '/var/log/ambari-plus/monitor/rule-engine.jvm.out', 'STACKTRACE_CONTINUATION', 1, 'STACK_DEFAULT', 'ERROR', 'KEEP', NULL, 'short', 7, 'AMBARI_PLUS_MONITOR', 'Monitor Rule Engine JVM stdout crash, OOM and exception traces')
ON DUPLICATE KEY UPDATE
  `parser_type` = VALUES(`parser_type`),
  `collect_level_min` = VALUES(`collect_level_min`),
  `noise_policy` = VALUES(`noise_policy`),
  `retention_tier` = VALUES(`retention_tier`),
  `retention_days` = VALUES(`retention_days`),
  `description` = VALUES(`description`),
  `update_time` = CURRENT_TIMESTAMP;


完成这一步后,再回到 Ambari Plus 页面安装 AMBARI_PLUS_MONITOR 服务。

#Ambari Plus Monitor#MySQL#MariaDB#初始化
IoTDB 安装与部署
Monitor 安装

← IoTDB 安装与部署 Monitor 安装→

最近更新
01
当前版本 2026/07
07-24
02
免费开源大数据平台怎么选 选型
07-05
03
更新日志 · v3.0.1 历史版本
06-05
更多文章>
Theme by Vdoing | Copyright © 2017-2026 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式