This is an automated email from the ASF dual-hosted git repository.

zhongxjian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-kubernetes.git


The following commit(s) were added to refs/heads/master by this push:
     new 60641992 [horus] Removal of horus infrastructure (#450)
60641992 is described below

commit 60641992583799152efe230d15a843fddb30cc13
Author: mfordjody <[email protected]>
AuthorDate: Sat Oct 12 21:12:57 2024 +0800

    [horus] Removal of horus infrastructure (#450)
---
 app/horus/base/config/config.go          |  91 ------------
 app/horus/base/config/parse.go           |  44 ------
 app/horus/base/db/db.go                  | 244 -------------------------------
 app/horus/base/db/db_test.go             |  51 -------
 app/horus/base/db/table.sql              |  51 -------
 app/horus/cmd/main.go                    | 193 ------------------------
 app/horus/core/alerter/dingtalk.go       |  71 ---------
 app/horus/core/alerter/dingtalk_test.go  |  31 ----
 app/horus/core/alerter/slack.go          |  43 ------
 app/horus/core/alerter/slack_test.go     |  30 ----
 app/horus/core/horuser/horuser.go        |  71 ---------
 app/horus/core/horuser/metrics.go        | 196 -------------------------
 app/horus/core/horuser/node_cordon.go    |  58 --------
 app/horus/core/horuser/node_downtime.go  | 191 ------------------------
 app/horus/core/horuser/node_drain.go     |  66 ---------
 app/horus/core/horuser/node_modular.go   | 135 -----------------
 app/horus/core/horuser/node_recovery.go  | 183 -----------------------
 app/horus/core/horuser/node_restart.go   | 117 ---------------
 app/horus/core/horuser/node_uncordon.go  |  53 -------
 app/horus/core/horuser/pod_evict.go      |  56 -------
 app/horus/core/horuser/pod_remove.go     |  86 -----------
 app/horus/core/horuser/pod_stagnation.go | 129 ----------------
 app/horus/core/horuser/query.go          |  56 -------
 app/horus/core/horuser/restart.sh        |  29 ----
 app/horus/core/ticker/ticker.go          |  34 -----
 manifests/horus/horus.yaml               | 107 --------------
 26 files changed, 2416 deletions(-)

diff --git a/app/horus/base/config/config.go b/app/horus/base/config/config.go
deleted file mode 100644
index fd553966..00000000
--- a/app/horus/base/config/config.go
+++ /dev/null
@@ -1,91 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package config
-
-type Config struct {
-       Address              string                 `yaml:"address"`
-       KubeTimeSecond       int64                  `yaml:"kubeTimeSecond"`
-       Mysql                *MysqlConfiguration    `yaml:"mysql"`
-       DingTalk             *DingTalkConfiguration `yaml:"dingTalk"`
-       Slack                *SlackConfiguration    `yaml:"slack"`
-       KubeMultiple         map[string]string      `yaml:"kubeMultiple"`
-       PromMultiple         map[string]string      `yaml:"promMultiple"`
-       NodeRecovery         *RecoveryConfiguration `yaml:"nodeRecovery"`
-       CustomModular        *ModularConfiguration  `yaml:"customModular"`
-       NodeDownTime         *DowntimeConfiguration `yaml:"nodeDownTime"`
-       PodStagnationCleaner *CleanerConfiguration  
`yaml:"podStagnationCleaner"`
-}
-
-type MysqlConfiguration struct {
-       Name    string `yaml:"name"`
-       Address string `yaml:"address"`
-       Debug   bool   `yaml:"debug"`
-}
-
-type DingTalkConfiguration struct {
-       WebhookUrl string   `yaml:"webhookUrl"`
-       Title      string   `yaml:"title"`
-       AtMobiles  []string `yaml:"atMobiles"`
-}
-
-type SlackConfiguration struct {
-       WebhookUrl string `yaml:"webhookUrl"`
-       Title      string `yaml:"title"`
-}
-
-type RecoveryConfiguration struct {
-       DayNumber           int                    `yaml:"dayNumber"`
-       IntervalSecond      int                    `yaml:"intervalSecond"`
-       PromQueryTimeSecond int64                  `yaml:"promQueryTimeSecond"`
-       DingTalk            *DingTalkConfiguration `yaml:"dingTalk"`
-       Slack               *SlackConfiguration    `yaml:"slack"`
-}
-
-type ModularConfiguration struct {
-       Enabled             bool                   `yaml:"enabled"`
-       DailyLimit          map[string]int         `yaml:"dailyLimit"`
-       AbnormalityQL       map[string]string      `yaml:"abnormalityQL"`
-       RecoveryQL          map[string]string      `yaml:"recoveryQL"`
-       IntervalSecond      int                    `yaml:"intervalSecond"`
-       PromQueryTimeSecond int64                  `yaml:"promQueryTimeSecond"`
-       KubeMultiple        map[string]string      `yaml:"kubeMultiple"`
-       DingTalk            *DingTalkConfiguration `yaml:"dingTalk"`
-       Slack               *SlackConfiguration    `yaml:"slack"`
-}
-
-type DowntimeConfiguration struct {
-       Enabled              bool                   `yaml:"enabled"`
-       IntervalSecond       int                    `yaml:"intervalSecond"`
-       PromQueryTimeSecond  int64                  `yaml:"promQueryTimeSecond"`
-       KubeMultiple         map[string]string      `yaml:"kubeMultiple"`
-       AbnormalityQL        []string               `yaml:"abnormalityQL"`
-       AbnormalInfoSystemQL string                 
`yaml:"abnormalInfoSystemQL"`
-       AbnormalRecoveryQL   []string               `yaml:"abnormalRecoveryQL"`
-       AllSystemUser        string                 `yaml:"allSystemUser"`
-       AllSystemPassword    string                 `yaml:"allSystemPassword"`
-       DingTalk             *DingTalkConfiguration `yaml:"dingTalk"`
-       Slack                *SlackConfiguration    `yaml:"slack"`
-}
-
-type CleanerConfiguration struct {
-       Enabled        bool                   `yaml:"enabled"`
-       IntervalSecond int                    `yaml:"intervalSecond"`
-       DoubleSecond   int                    `yaml:"doubleSecond"`
-       LabelSelector  string                 `yaml:"labelSelector"`
-       FieldSelector  string                 `yaml:"fieldSelector"`
-       KubeMultiple   map[string]string      `yaml:"kubeMultiple"`
-       DingTalk       *DingTalkConfiguration `yaml:"dingTalk"`
-}
diff --git a/app/horus/base/config/parse.go b/app/horus/base/config/parse.go
deleted file mode 100644
index 8e65762d..00000000
--- a/app/horus/base/config/parse.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package config
-
-import (
-       "fmt"
-       "gopkg.in/yaml.v2"
-       "os"
-)
-
-func Load(in string) (*Config, error) {
-       cfg := &Config{}
-       err := yaml.Unmarshal([]byte(in), cfg)
-       if err != nil {
-               return nil, err
-       }
-       return cfg, err
-}
-
-func LoadFile(name string) (*Config, error) {
-       bytes, err := os.ReadFile(name)
-       if err != nil {
-               return nil, err
-       }
-       cfg, err := Load(string(bytes))
-       if err != nil {
-               fmt.Printf("parsing yaml file err:%v", err)
-               return nil, err
-       }
-       return cfg, err
-}
diff --git a/app/horus/base/db/db.go b/app/horus/base/db/db.go
deleted file mode 100644
index 0408b0ac..00000000
--- a/app/horus/base/db/db.go
+++ /dev/null
@@ -1,244 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package db
-
-import (
-       "fmt"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/config"
-       _ "github.com/go-sql-driver/mysql"
-       "time"
-       "xorm.io/xorm"
-       xlog "xorm.io/xorm/log"
-)
-
-type NodeDataInfo struct {
-       Id                   int64     `json:"id"`
-       NodeName             string    `json:"node_name" xorm:"node_name"`
-       NodeIP               string    `json:"node_ip" xorm:"node_ip"`
-       Sn                   string    `json:"sn"`
-       ClusterName          string    `json:"cluster_name" xorm:"cluster_name"`
-       ModuleName           string    `json:"module_name" xorm:"module_name"`
-       Reason               string    `json:"reason"`
-       Restart              int       `json:"restart"`
-       Repair               int       `json:"repair"`
-       RepairTicketUrl      string    `json:"repair_ticket_url" 
xorm:"repair_ticket_url"`
-       FirstDate            string    `json:"first_date" xorm:"first_date"`
-       CreateTime           time.Time `json:"create_time" xorm:"create_time 
created"`
-       UpdateTime           time.Time `json:"update_time" xorm:"update_time 
updated"`
-       RecoveryMark         int64     `json:"recovery_mark" 
xorm:"recovery_mark"`
-       RecoveryQL           string    `json:"recovery_ql" xorm:"recovery_ql"`
-       DownTimeRecoveryMark int64     `json:"downtime_recovery_mark" 
xorm:"downtime_recovery_mark"`
-       DownTimeRecoveryQL   []string  `json:"downtime_recovery_ql" 
xorm:"downtime_recovery_ql"`
-}
-
-type PodDataInfo struct {
-       Id          int64     `json:"id"`
-       PodName     string    `json:"pod_name" xorm:"pod_name"`
-       PodIP       string    `json:"pod_ip" xorm:"pod_ip"`
-       Sn          string    `json:"sn"`
-       NodeName    string    `json:"node_name" xorm:"node_name"`
-       ClusterName string    `json:"cluster_name" xorm:"cluster_name"`
-       ModuleName  string    `json:"module_name" xorm:"module_name"`
-       Reason      string    `json:"reason"`
-       FirstDate   string    `json:"first_date" xorm:"first_date"`
-       CreateTime  time.Time `json:"create_time" xorm:"create_time created"`
-       UpdateTime  time.Time `json:"update_time" xorm:"update_time updated"`
-}
-
-var (
-       db *xorm.Engine
-)
-
-func InitDataBase(mc *config.MysqlConfiguration) error {
-       data, err := xorm.NewEngine("mysql", mc.Address)
-       if err != nil {
-               fmt.Printf("Unable to connect to mysql server:\n  addr:%s\n  
err:%v\n", mc.Address, err)
-       }
-       data.Logger().SetLevel(xlog.LOG_INFO)
-       data.ShowSQL(mc.Debug)
-       db = data
-       return nil
-}
-
-func (n *NodeDataInfo) Add() (int64, error) {
-       row, err := db.Insert(n)
-       return row, err
-}
-
-func (n *NodeDataInfo) Get() (*NodeDataInfo, error) {
-       exist, err := db.Get(n)
-       if err != nil {
-               return nil, err
-       }
-       if !exist {
-               return nil, nil
-       }
-       return n, nil
-}
-
-func (n *NodeDataInfo) Update() (bool, error) {
-       firstDate := time.Now().Format("2006-01-02 15:04:05")
-       n.FirstDate = firstDate
-
-       row, err := db.Where(fmt.Sprintf("id=%d", n.Id)).Update(n)
-       if err != nil {
-               return false, err
-       }
-       if row > 0 {
-               return true, nil
-       }
-       return false, nil
-}
-
-func (n *NodeDataInfo) Check() (bool, error) {
-       exist, err := db.Exist(n)
-       return exist, err
-}
-
-func (n *NodeDataInfo) AddOrGet() (int64, error) {
-       exist, _ := n.Check()
-       if exist {
-               return n.Id, nil
-       }
-       row, err := n.Add()
-       return row, err
-}
-
-func (n *NodeDataInfo) RecoveryMarker() (bool, error) {
-       n.RecoveryMark = 1
-       return n.Update()
-}
-
-func (n *NodeDataInfo) DownTimeRecoveryMarker() (bool, error) {
-       n.DownTimeRecoveryMark = 1
-       return n.Update()
-}
-
-func (n *NodeDataInfo) RestartMarker() (bool, error) {
-       n.Restart = 1
-       return n.Update()
-}
-
-func GetNode() ([]NodeDataInfo, error) {
-       var ndi []NodeDataInfo
-       session := db.Where(fmt.Sprintf("id>%d", 0))
-       err := session.Find(&ndi)
-       return ndi, err
-}
-
-func GetNodeByName(nodeName, moduleName string) (*NodeDataInfo, error) {
-       ndi := NodeDataInfo{
-               NodeName:   nodeName,
-               ModuleName: moduleName,
-       }
-       return ndi.Get()
-}
-
-func GetRecoveryNodeDataInfoDate(day int) ([]NodeDataInfo, error) {
-       var ndi []NodeDataInfo
-       session := db.Where(fmt.Sprintf("recovery_mark = 0 AND first_date > 
DATE_SUB(CURDATE(), INTERVAL %d DAY)", day))
-       err := session.Find(&ndi)
-       return ndi, err
-}
-
-func GetDownTimeRecoveryNodeDataInfoDate(day int) ([]NodeDataInfo, error) {
-       var ndi []NodeDataInfo
-       session := db.Where(fmt.Sprintf("downtime_recovery_mark = 0 AND 
first_date > DATE_SUB(CURDATE(), INTERVAL %d DAY)", day))
-       err := session.Find(&ndi)
-       return ndi, err
-}
-
-func GetRestartNodeDataInfoDate() ([]NodeDataInfo, error) {
-       var ndi []NodeDataInfo
-       session := db.Where("restart = 0 and repair = 0 and module_name = ?", 
"nodeDown")
-       err := session.Find(&ndi)
-       return ndi, err
-}
-
-func GetDailyLimitNodeDataInfoDate(day, module, cluster string) 
([]NodeDataInfo, error) {
-       var ndi []NodeDataInfo
-       session := db.Where("DATE(first_date) = ? AND module_name = ? AND 
cluster_name = ?", day, module, cluster)
-       err := session.Find(&ndi)
-       return ndi, err
-}
-
-func (p *PodDataInfo) Add() (int64, error) {
-       row, err := db.Insert(p)
-       return row, err
-}
-
-func (p *PodDataInfo) Get() (*PodDataInfo, error) {
-       exist, err := db.Get(p)
-       if err != nil {
-               return nil, err
-       }
-       if !exist {
-               return nil, nil
-       }
-       return p, nil
-}
-
-func (p *PodDataInfo) Update() (bool, error) {
-       firstDate := time.Now().Format("2006-01-02 15:04:05")
-       p.FirstDate = firstDate
-
-       row, err := db.Where(fmt.Sprintf("id=%d", p.Id)).Update(p)
-       if err != nil {
-               return false, err
-       }
-       if row > 0 {
-               return true, nil
-       }
-       return false, nil
-}
-
-func (p *PodDataInfo) Check() (bool, error) {
-       exist, err := db.Exist(p)
-       return exist, err
-}
-
-func (p *PodDataInfo) AddOrGet() (int64, error) {
-       exist, _ := p.Check()
-       if exist {
-               return p.Id, nil
-       }
-       row, err := p.Add()
-       return row, err
-}
-
-func GetPod() ([]PodDataInfo, error) {
-       var pdi []PodDataInfo
-       session := db.Where(fmt.Sprintf("id>%d", 0))
-       err := session.Find(&pdi)
-       return pdi, err
-}
-
-func GetPodByName(podName, moduleName string) (*PodDataInfo, error) {
-       pdi := PodDataInfo{
-               PodName:    podName,
-               ModuleName: moduleName,
-       }
-       return pdi.Get()
-}
-
-func GetLimitPodDataInfo(limit, offset int, orderColumn, where string, args 
...interface{}) ([]PodDataInfo, error) {
-       var pdi []PodDataInfo
-       err := db.Where(where, args...).Limit(limit, 
offset).Desc(orderColumn).Find(pdi)
-       if err != nil {
-               return nil, err
-       }
-       return pdi, nil
-}
diff --git a/app/horus/base/db/db_test.go b/app/horus/base/db/db_test.go
deleted file mode 100644
index 3fcf9220..00000000
--- a/app/horus/base/db/db_test.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package db_test
-
-import (
-       "github.com/apache/dubbo-kubernetes/app/horus/base/config"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/db"
-       "testing"
-       "time"
-)
-
-func TestDataBase(t *testing.T) {
-       mc := &config.MysqlConfiguration{
-               Address: 
"root:root@tcp(127.0.0.1:3306)/horus?charset=utf8&parseTime=True",
-               Debug:   true,
-       }
-
-       err := db.InitDataBase(mc)
-       if err != nil {
-               t.Fatalf("Failed to initialize database: %v", err)
-               return
-       }
-
-       today := time.Now().Format("2006-01-02 15:04:05")
-       data := db.NodeDataInfo{
-               NodeName:    "db-test",
-               NodeIP:      "1.1.1.1",
-               Sn:          "123",
-               ClusterName: "beijing01",
-               ModuleName:  "model",
-               Reason:      "time wrong",
-               Restart:     0,
-               Repair:      0,
-               FirstDate:   today,
-       }
-       id, err := data.Add()
-       t.Logf("test.add id:%v err:%v", id, err)
-}
diff --git a/app/horus/base/db/table.sql b/app/horus/base/db/table.sql
deleted file mode 100644
index bd61301b..00000000
--- a/app/horus/base/db/table.sql
+++ /dev/null
@@ -1,51 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-CREATE TABLE `node_data_info` (
-     `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
-     `node_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci 
NOT NULL COMMENT '节点名',
-     `node_ip` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci 
NOT NULL COMMENT '节点IP',
-     `sn` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT 
NULL COMMENT '序列号',
-     `cluster_name` varchar(255) CHARACTER SET utf8mb3 COLLATE 
utf8mb3_general_ci NULL DEFAULT NULL COMMENT '集群名',
-     `module_name` varchar(255) CHARACTER SET utf8mb3 COLLATE 
utf8mb3_general_ci NOT NULL COMMENT '模块名',
-     `reason` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci 
NULL DEFAULT NULL COMMENT '维护原因',
-     `restart` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '重启标志',
-     `repair` int(10) UNSIGNED NULL DEFAULT NULL COMMENT '修复标志',
-     `repair_ticket_url` varchar(255) CHARACTER SET utf8mb3 COLLATE 
utf8mb3_general_ci NULL DEFAULT NULL COMMENT '修复单跳转 URL',
-     `first_date` datetime(0) NULL DEFAULT NULL COMMENT '最早开始维护时间',
-     `create_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT 
'创建时间',
-     `update_time` datetime(0) NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE 
CURRENT_TIMESTAMP(0) COMMENT '更新时间',
-     PRIMARY KEY (`id`) USING BTREE,
-     UNIQUE INDEX `idx_unique_node_module` (`node_name`, `module_name`) USING 
BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=3 CHARACTER SET=utf8mb3 
COLLATE=utf8mb3_general_ci ROW_FORMAT=Dynamic;
-
-CREATE TABLE `pod_data_info` (
-     `id` int unsigned NOT NULL AUTO_INCREMENT,
-     `pod_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci 
NOT NULL COMMENT 'Pod 名',
-     `pod_ip` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci 
DEFAULT NULL COMMENT 'PodIP',
-     `sn` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT 
NULL COMMENT '序列号',
-     `node_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci 
NOT NULL COMMENT '节点名',
-     `cluster_name` varchar(255) CHARACTER SET utf8mb3 COLLATE 
utf8mb3_general_ci DEFAULT NULL COMMENT '集群名',
-     `module_name` varchar(255) CHARACTER SET utf8mb3 COLLATE 
utf8mb3_general_ci NOT NULL COMMENT '模块名',
-     `reason` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci 
DEFAULT NULL COMMENT '维护原因',
-     `restart` int DEFAULT NULL COMMENT '重启标志',
-     `repair` int DEFAULT NULL COMMENT '修复标志',
-     `repair_ticket_url` varchar(255) CHARACTER SET utf8mb3 COLLATE 
utf8mb3_general_ci DEFAULT NULL COMMENT '修复单跳转 URL',
-     `first_date` datetime DEFAULT NULL COMMENT '最早开始维护时间',
-     `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-     `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP COMMENT '更新时间',
-     PRIMARY KEY (`id`) USING BTREE,
-     UNIQUE KEY `idxUniqueName` (`pod_name`, `module_name`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
\ No newline at end of file
diff --git a/app/horus/cmd/main.go b/app/horus/cmd/main.go
deleted file mode 100644
index 997044c5..00000000
--- a/app/horus/cmd/main.go
+++ /dev/null
@@ -1,193 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package main
-
-import (
-       "context"
-       "flag"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/config"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/db"
-       "github.com/apache/dubbo-kubernetes/app/horus/core/horuser"
-       "github.com/apache/dubbo-kubernetes/app/horus/core/ticker"
-       "github.com/prometheus/client_golang/prometheus"
-       "github.com/prometheus/client_golang/prometheus/promhttp"
-       "k8s.io/klog"
-       "net/http"
-       "os"
-       "os/signal"
-       "sync"
-       "syscall"
-)
-
-var (
-       address    string
-       configFile string
-)
-
-func main() {
-       flag.StringVar(&configFile, "configFile", 
"../../manifests/horus/horus.yaml", "horus config file")
-       flag.StringVar(&address, "address", "0.0.0.0:38089", "horus address")
-       klog.InitFlags(flag.CommandLine)
-       flag.Parse()
-
-       c, err := config.LoadFile(configFile)
-       if err != nil {
-               klog.Errorf("load config file failed err:%+v", err)
-               return
-       } else {
-               klog.Infof("load config file success.")
-       }
-
-       err = db.InitDataBase(c.Mysql)
-       if err != nil {
-               klog.Errorf("horus db initial failed err:%v", err)
-               return
-       } else {
-               klog.Infof("horus db initial success.")
-       }
-       horus := horuser.NewHoruser(c)
-       prometheus.MustRegister(horus)
-       group, stopChan := setupStopChanWithContext()
-       ctx, cancel := context.WithCancel(context.Background())
-       group.Add(func() error {
-               for {
-                       select {
-                       case <-stopChan:
-                               cancel()
-                               return nil
-                       case <-ctx.Done():
-                               return nil
-                       }
-               }
-       })
-       group.Add(func() error {
-               http.Handle("/metrics", promhttp.Handler())
-               srv := http.Server{Addr: c.Address}
-               err := srv.ListenAndServe()
-               if err != nil {
-                       klog.Errorf("horus metrics err:%v", err)
-                       return err
-               }
-               return nil
-       })
-       group.Add(func() error {
-               klog.Info("horus ticker manager start success.")
-               err := ticker.Manager(ctx)
-               if err != nil {
-                       klog.Errorf("horus ticker manager start failed err:%v", 
err)
-                       return err
-               }
-               return nil
-       })
-       group.Add(func() error {
-               if c.CustomModular.Enabled {
-                       klog.Info("horus node recovery manager start success.")
-                       err := horus.RecoveryManager(ctx)
-                       if err != nil {
-                               klog.Errorf("horus node recovery manager start 
failed err:%v", err)
-                               return err
-                       }
-               }
-               return nil
-       })
-       group.Add(func() error {
-               if c.CustomModular.Enabled {
-                       klog.Info("horus node customize modular manager start 
success.")
-                       err := horus.CustomizeModularManager(ctx)
-                       if err != nil {
-                               klog.Errorf("horus node customize modular 
manager start failed err:%v", err)
-                               return err
-                       }
-               }
-               return nil
-       })
-       group.Add(func() error {
-               if c.NodeDownTime.Enabled {
-                       klog.Info("horus node downtime manager start success.")
-                       err := horus.DownTimeManager(ctx)
-                       if err != nil {
-                               klog.Errorf("horus node downtime manager start 
failed err:%v", err)
-                               return err
-                       }
-               }
-               return nil
-       })
-       group.Add(func() error {
-               if c.NodeDownTime.Enabled {
-                       klog.Info("horus node downtime restart manager start 
success.")
-                       err := horus.DowntimeRestartManager(ctx)
-                       if err != nil {
-                               klog.Errorf("horus node downtime restart 
manager start failed err:%v", err)
-                               return err
-                       }
-               }
-               return nil
-       })
-       group.Add(func() error {
-               if c.NodeDownTime.Enabled {
-                       klog.Info("horus node downtime recovery manager start 
success.")
-                       err := horus.DownTimeRecoveryManager(ctx)
-                       if err != nil {
-                               klog.Errorf("horus node downtime recovery 
manager start failed err:%v", err)
-                               return err
-                       }
-               }
-               return nil
-       })
-       group.Add(func() error {
-               if c.PodStagnationCleaner.Enabled {
-                       klog.Info("horus pod stagnation clean manager start 
success.")
-                       err := horus.PodStagnationCleanManager(ctx)
-                       if err != nil {
-                               klog.Errorf("horus pod stagnation clean manager 
start failed err:%v", err)
-                               return err
-                       }
-               }
-               return nil
-       })
-       group.Wait()
-}
-
-type WaitGroup struct {
-       wg sync.WaitGroup
-}
-
-func (g *WaitGroup) Add(f func() error) {
-       g.wg.Add(1)
-       go func() {
-               defer g.wg.Done()
-               _ = f()
-       }()
-}
-
-func (g *WaitGroup) Wait() {
-       g.wg.Wait()
-}
-
-func setupStopChanWithContext() (*WaitGroup, <-chan struct{}) {
-       stopChan := make(chan struct{})
-       SignalChan := make(chan os.Signal, 1)
-       signal.Notify(SignalChan, syscall.SIGTERM, syscall.SIGQUIT)
-       g := &WaitGroup{}
-       g.Add(func() error {
-               select {
-               case <-SignalChan:
-                       close(SignalChan)
-               }
-               return nil
-       })
-       return g, stopChan
-}
diff --git a/app/horus/core/alerter/dingtalk.go 
b/app/horus/core/alerter/dingtalk.go
deleted file mode 100644
index 2a13d531..00000000
--- a/app/horus/core/alerter/dingtalk.go
+++ /dev/null
@@ -1,71 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package alerter
-
-import (
-       "bytes"
-       "encoding/json"
-       "fmt"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/config"
-       "k8s.io/klog/v2"
-       "net/http"
-)
-
-type T struct {
-       At struct {
-               AtMobiles []string `json:"atMobiles"`
-               AtUserIds []string `json:"atUserIds"`
-               IsAtAll   bool     `json:"isAtAll"`
-       } `json:"at"`
-       Text struct {
-               Content string `json:"content"`
-       } `json:"text"`
-       Msgtype string `json:"msgtype"`
-}
-
-type content struct {
-       Content string `json:"content"`
-}
-
-type at struct {
-       AtMobiles []string `json:"atMobiles"`
-}
-
-type Message struct {
-       MsgType string  `json:"msgtype"`
-       Text    content `json:"text"`
-       At      at      `json:"at"`
-}
-
-func DingTalkSend(dk *config.DingTalkConfiguration, msg string) {
-       dtm := Message{MsgType: "text"}
-       dtm.Text.Content = fmt.Sprint(dk.Title, msg)
-       dtm.At.AtMobiles = dk.AtMobiles
-       bs, err := json.Marshal(dtm)
-       if err != nil {
-               klog.Errorf("dingTalk json marshal err:%v\n dtm:%v\n", err, dtm)
-               return
-       }
-       res, err := http.Post(dk.WebhookUrl, "application/json", 
bytes.NewBuffer(bs))
-       if err != nil {
-               klog.Errorf("send dingTalk err:%v\n msg:%v\n", err, msg)
-       }
-       if res != nil && res.StatusCode != 200 {
-               klog.Errorf("send dingTalk status code err:%v\n code:%v\n 
msg:%v\n", err, res.StatusCode, msg)
-               return
-       }
-       klog.Infof("send dingTalk success code:%v\n msg:%v\n", res.StatusCode, 
msg)
-}
diff --git a/app/horus/core/alerter/dingtalk_test.go 
b/app/horus/core/alerter/dingtalk_test.go
deleted file mode 100644
index 698cdfcf..00000000
--- a/app/horus/core/alerter/dingtalk_test.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package alerter_test
-
-import (
-       "github.com/apache/dubbo-kubernetes/app/horus/base/config"
-       "github.com/apache/dubbo-kubernetes/app/horus/core/alerter"
-       "testing"
-)
-
-func TestDingTalkSend(t *testing.T) {
-       im := &config.DingTalkConfiguration{
-               WebhookUrl: 
"https://oapi.dingtalk.com/robot/send?access_token=aa2f3f74d7a2504653ca89b7a673707ba1d04b6d9d320c3572e5464d2f81471x";,
-               Title:      "",
-               AtMobiles:  nil,
-       }
-       alerter.DingTalkSend(im, "test")
-}
diff --git a/app/horus/core/alerter/slack.go b/app/horus/core/alerter/slack.go
deleted file mode 100644
index 0a2db187..00000000
--- a/app/horus/core/alerter/slack.go
+++ /dev/null
@@ -1,43 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package alerter
-
-import (
-       "bytes"
-       "encoding/json"
-       "fmt"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/config"
-       "k8s.io/klog/v2"
-       "net/http"
-)
-
-type Text struct {
-       Text string `json:"text"`
-}
-
-func SlackSend(sk *config.SlackConfiguration, channel string) {
-       skm := Text{Text: "text"}
-       skm.Text = fmt.Sprintf("%s"+"%v", sk.Title, channel)
-       bs, err := json.Marshal(skm)
-       if err != nil {
-               klog.Errorf("slack json marshal err:%v\n skm:%v\n", err, skm)
-       }
-       res, err := http.Post(sk.WebhookUrl, "application/json", 
bytes.NewBuffer(bs))
-       if res.StatusCode != 200 {
-               klog.Errorf("send slack status code err:%v\n code:%v\n 
channel:%v\n", err, res.StatusCode, channel)
-               return
-       }
-}
diff --git a/app/horus/core/alerter/slack_test.go 
b/app/horus/core/alerter/slack_test.go
deleted file mode 100644
index 8e8378be..00000000
--- a/app/horus/core/alerter/slack_test.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package alerter_test
-
-import (
-       "github.com/apache/dubbo-kubernetes/app/horus/base/config"
-       "github.com/apache/dubbo-kubernetes/app/horus/core/alerter"
-       "testing"
-)
-
-func TestSlackSend(t *testing.T) {
-       im := &config.SlackConfiguration{
-               WebhookUrl: 
"https://hooks.slack.com/services/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";,
-               Title:      "",
-       }
-       alerter.SlackSend(im, "test")
-}
diff --git a/app/horus/core/horuser/horuser.go 
b/app/horus/core/horuser/horuser.go
deleted file mode 100644
index 9a45fc87..00000000
--- a/app/horus/core/horuser/horuser.go
+++ /dev/null
@@ -1,71 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       "context"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/config"
-       clientset "k8s.io/client-go/kubernetes"
-       "k8s.io/client-go/rest"
-       "k8s.io/client-go/tools/clientcmd"
-       "k8s.io/klog/v2"
-       "time"
-)
-
-type Horuser struct {
-       cc            *config.Config
-       kubeClientMap map[string]*clientset.Clientset
-}
-
-func NewHoruser(c *config.Config) *Horuser {
-       hr := &Horuser{
-               cc:            c,
-               kubeClientMap: map[string]*clientset.Clientset{},
-       }
-       i := 1
-       n := len(c.KubeMultiple)
-       for clusterName, km := range c.KubeMultiple {
-               kcfg, err := k8sBuildConfig(km)
-               if err != nil {
-                       klog.Errorf("NewHoruser k8sBuildConfig err:%v\n 
name:%v\n", err, clusterName)
-               }
-               km := clientset.NewForConfigOrDie(kcfg)
-               hr.kubeClientMap[clusterName] = km
-               klog.Info("NewHoruser k8sBuildConfig success.")
-               klog.Infof("[KubeMultipleCluster:%v\n] Count:[%d/%d]", 
clusterName, n, i)
-               i++
-       }
-       return hr
-}
-
-func k8sBuildConfig(kubeconfig string) (*rest.Config, error) {
-       if kubeconfig != "" {
-               cfg, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
-               if err != nil {
-                       return nil, err
-               }
-               return cfg, err
-       }
-       cfg, err := rest.InClusterConfig()
-       if err != nil {
-               return nil, err
-       }
-       return cfg, err
-}
-
-func (h *Horuser) GetK8sContext() (context.Context, context.CancelFunc) {
-       return context.WithTimeout(context.Background(), 
time.Duration(h.cc.KubeTimeSecond)*time.Second)
-}
diff --git a/app/horus/core/horuser/metrics.go 
b/app/horus/core/horuser/metrics.go
deleted file mode 100644
index 977cd2d9..00000000
--- a/app/horus/core/horuser/metrics.go
+++ /dev/null
@@ -1,196 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       "fmt"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/db"
-       "github.com/prometheus/client_golang/prometheus"
-       "k8s.io/klog/v2"
-       "strings"
-)
-
-var (
-       FeatureInfo = prometheus.NewDesc(
-               "horus_feature_info",
-               "Indicates the enabled status of specific features in different 
clusters, with each feature represented by its name, enabled state, and 
associated cluster name.",
-               []string{
-                       "feature",
-                       "enabled",
-                       "cluster_name",
-               },
-               nil)
-
-       MultipleInfo = prometheus.NewDesc(
-               "horus_multiple_info",
-               "Tracks the Prometheus multiple addresses associated with 
different clusters, providing visibility into the Prometheus endpoints used by 
each cluster.",
-               []string{
-                       "cluster_name",
-                       "prometheus_multiple_address",
-               },
-               nil)
-
-       NodeInfo = prometheus.NewDesc(
-               "horus_node_info",
-               "Provides detailed information about the nodes within a 
cluster, including node identity, operational state, maintenance details, and 
recovery status.",
-               []string{
-                       "node_name",
-                       "node_ip",
-                       "sn",
-                       "cluster_name",
-                       "module_name",
-                       "reason",
-                       "restart",
-                       "repair",
-                       "repair_ticket_url",
-                       "first_date",
-                       "create_time",
-                       "update_time",
-                       "recovery_ql",
-                       "recovery_mark",
-               },
-               nil)
-
-       PodStagnativeInfo = prometheus.NewDesc(
-               "pod_stagnative_info",
-               "pod_stagnative_info",
-               []string{
-                       "pod_name",
-                       "pod_ip",
-                       "node_name",
-                       "cluster_name",
-                       "module_name",
-                       "reason",
-                       "first_date",
-                       "create_time",
-                       "update_time",
-               },
-               nil)
-)
-
-func (h *Horuser) Collect(ch chan<- prometheus.Metric) {
-       kFunc := func(m map[string]string) string {
-               s := []string{}
-               for k := range m {
-                       s = append(s, k)
-               }
-               return strings.Join(s, ",")
-       }
-       info := map[string]string{}
-       buttons := map[bool]string{true: "Open", false: "Close"}
-
-       modularKey := fmt.Sprintf("custom modular,%s", 
buttons[h.cc.CustomModular.Enabled])
-       info[modularKey] = kFunc(h.cc.CustomModular.KubeMultiple)
-       downtimeKey := fmt.Sprintf("node downtime,%s", 
buttons[h.cc.NodeDownTime.Enabled])
-       info[downtimeKey] = kFunc(h.cc.NodeDownTime.KubeMultiple)
-
-       nodeFunc := func() {
-               nodes, err := db.GetNode()
-               if err != nil {
-                       klog.Errorf("horus metrics collect db get node err:%v", 
err)
-                       return
-               }
-               if len(nodes) == 0 {
-                       klog.Infof("horus metrics collect db zero err:%v", err)
-                       return
-               }
-               for _, v := range nodes {
-                       v := v
-                       ct := v.CreateTime.Local().Format("2006-01-02 15:04:05")
-                       ut := v.UpdateTime.Local().Format("2006-01-02 15:04:05")
-                       p := prometheus.MustNewConstMetric(NodeInfo,
-                               prometheus.GaugeValue, 1,
-                               v.NodeName,
-                               v.NodeIP,
-                               v.Sn,
-                               v.ClusterName,
-                               v.ModuleName,
-                               v.Reason,
-                               fmt.Sprintf("%d", v.Restart),
-                               fmt.Sprintf("%d", v.Repair),
-                               v.RepairTicketUrl,
-                               v.FirstDate,
-                               ct,
-                               ut,
-                               v.RecoveryQL,
-                               fmt.Sprintf("%d", v.RecoveryMark),
-                       )
-                       ch <- p
-               }
-       }
-       nodeFunc()
-
-       podFunc := func() {
-               pods, err := db.GetPod()
-               if err != nil {
-                       klog.Errorf("horus metrics collect db get pod err:%v", 
err)
-                       return
-               }
-               klog.Info("horus metrics collect db get pod success.")
-               if len(pods) == 0 {
-                       klog.Errorf("horus metrics collect db zero err:%v", err)
-                       return
-               }
-               for _, v := range pods {
-                       v := v
-                       ct := v.CreateTime.Local().Format("2006-01-02 15:04:05")
-                       ut := v.UpdateTime.Local().Format("2006-01-02 15:04:05")
-                       p := prometheus.MustNewConstMetric(PodStagnativeInfo,
-                               prometheus.GaugeValue, 1,
-                               v.PodName,
-                               v.PodIP,
-                               v.NodeName,
-                               v.ClusterName,
-                               v.ModuleName,
-                               v.Reason,
-                               v.FirstDate,
-                               ct,
-                               ut,
-                       )
-                       ch <- p
-               }
-       }
-       podFunc()
-
-       for k, clusterName := range info {
-               s := strings.Split(k, ",")
-               feature, enabled := s[0], s[1]
-               p := prometheus.MustNewConstMetric(
-                       FeatureInfo,
-                       prometheus.GaugeValue, 1,
-                       feature,
-                       enabled,
-                       clusterName,
-               )
-               ch <- p
-       }
-
-       for clusterName, address := range h.cc.PromMultiple {
-               p := prometheus.MustNewConstMetric(
-                       MultipleInfo,
-                       prometheus.GaugeValue, 1,
-                       clusterName,
-                       address,
-               )
-               ch <- p
-       }
-}
-
-func (h *Horuser) Describe(ch chan<- *prometheus.Desc) {
-       ch <- FeatureInfo
-       ch <- MultipleInfo
-       ch <- NodeInfo
-}
diff --git a/app/horus/core/horuser/node_cordon.go 
b/app/horus/core/horuser/node_cordon.go
deleted file mode 100644
index 212de172..00000000
--- a/app/horus/core/horuser/node_cordon.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-       "k8s.io/klog/v2"
-)
-
-func (h *Horuser) Cordon(nodeName, clusterName, moduleName string) (err error) 
{
-       kubeClient := h.kubeClientMap[clusterName]
-       if kubeClient == nil {
-               klog.Error("node Cordon kubeClient by clusterName empty.")
-               klog.Infof("nodeName:%v\n,clusterName:%v\n", nodeName, 
clusterName)
-               return err
-       }
-
-       ctxFirst, cancelFirst := h.GetK8sContext()
-       defer cancelFirst()
-       node, err := kubeClient.CoreV1().Nodes().Get(ctxFirst, nodeName, 
v1.GetOptions{})
-       if err != nil {
-               klog.Errorf("node Cordon get err:%v", err)
-               klog.Infof("nodeName:%v\n clusterName:%v\n", nodeName, 
clusterName)
-               return err
-       }
-       annotations := node.Annotations
-       if annotations == nil {
-               annotations = map[string]string{}
-       }
-       annotations["dubbo.io/disable-by"] = "horus"
-
-       node.Spec.Unschedulable = true
-
-       ctxSecond, cancelSecond := h.GetK8sContext()
-       defer cancelSecond()
-       node, err = kubeClient.CoreV1().Nodes().Update(ctxSecond, node, 
v1.UpdateOptions{})
-       if err != nil {
-               klog.Errorf("node Cordon update err:%v", err)
-               klog.Infof("nodeName:%v\n clusterName:%v\n", nodeName, 
clusterName)
-       } else {
-               klog.Info("node Cordon success.")
-               klog.Infof("nodeName:%v\n clusterName:%v\n", nodeName, 
clusterName)
-       }
-       return err
-}
diff --git a/app/horus/core/horuser/node_downtime.go 
b/app/horus/core/horuser/node_downtime.go
deleted file mode 100644
index 6572243e..00000000
--- a/app/horus/core/horuser/node_downtime.go
+++ /dev/null
@@ -1,191 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       "context"
-       "fmt"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/db"
-       "github.com/apache/dubbo-kubernetes/app/horus/core/alerter"
-       metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-       "k8s.io/apimachinery/pkg/util/wait"
-       "k8s.io/klog"
-       "strings"
-       "sync"
-       "time"
-)
-
-const (
-       NODE_DOWN        = "nodeDown"
-       NODE_DOWN_REASON = "downtime"
-)
-
-func (h *Horuser) DownTimeManager(ctx context.Context) error {
-       go wait.UntilWithContext(ctx, h.DownTimeCheck, 
time.Duration(h.cc.NodeDownTime.IntervalSecond)*time.Second)
-       <-ctx.Done()
-       return nil
-}
-
-func (h *Horuser) DownTimeCheck(ctx context.Context) {
-       var wg sync.WaitGroup
-
-       for clusterName, addr := range h.cc.PromMultiple {
-               clusterName := clusterName
-               if _, exist := h.cc.NodeDownTime.KubeMultiple[clusterName]; 
!exist {
-                       klog.Info("DownTimeCheck config disable.")
-                       klog.Infof("clusterName:%v\n", clusterName)
-                       continue
-               }
-               addr := addr
-               wg.Add(1)
-               go func() {
-                       defer wg.Done()
-                       h.DownTimeNodes(clusterName, addr)
-               }()
-       }
-       wg.Wait()
-}
-
-func (h *Horuser) DownTimeNodes(clusterName, addr string) {
-       kubeClient := h.kubeClientMap[clusterName]
-       if kubeClient == nil {
-               klog.Errorf("DownTimeNodes kubeClient by clusterName empty.")
-               return
-       }
-       ctxFirst, cancelFirst := h.GetK8sContext()
-       defer cancelFirst()
-
-       klog.Info("DownTimeNodes Query Start.")
-       klog.Infof("clusterName:%v\n", clusterName)
-
-       nodeDownTimeRes := make(map[string]int)
-       aq := len(h.cc.NodeDownTime.AbnormalityQL)
-
-       for _, ql := range h.cc.NodeDownTime.AbnormalityQL {
-               ql := ql
-               res, err := h.InstantQuery(addr, ql, clusterName, 
h.cc.NodeDownTime.PromQueryTimeSecond)
-               if err != nil {
-                       klog.Errorf("downtimeNodes InstantQuery err:%v", err)
-                       klog.Infof("clusterName:%v\n", clusterName)
-                       continue
-               }
-
-               for _, v := range res {
-                       v := v
-                       nodeName := string(v.Metric["node"])
-                       if nodeName == "" {
-                               klog.Error("downtimeNodes InstantQuery nodeName 
empty.")
-                               klog.Infof("clusterName:%v\n metric:%v\n", 
clusterName, v.Metric)
-                               continue
-                       }
-                       nodeDownTimeRes[nodeName]++
-
-               }
-       }
-
-       WithDownNodeIPs := make(map[string]string)
-
-       for node, count := range nodeDownTimeRes {
-               if count < aq {
-                       klog.Error("downtimeNodes not reach threshold.")
-                       klog.Infof("clusterName:%v nodeName:%v threshold:%v 
count:%v", clusterName, node, aq, count)
-                       continue
-               }
-               abnormalInfoSystemQL := 
fmt.Sprintf(h.cc.NodeDownTime.AbnormalInfoSystemQL, node)
-
-               res, err := h.InstantQuery(addr, abnormalInfoSystemQL, 
clusterName, h.cc.NodeDownTime.PromQueryTimeSecond)
-               if len(res) == 0 {
-                       klog.Errorf("no results returned for query:%s", 
abnormalInfoSystemQL)
-                       continue
-               }
-               if err != nil {
-                       klog.Errorf("downtimeNodes InstantQuery NodeName To IPs 
empty err:%v", err)
-                       klog.Infof("clusterName:%v\n AbnormalInfoSystemQL:%v, 
err:%v", clusterName, abnormalInfoSystemQL, err)
-                       continue
-               }
-               instanceIP := ""
-               for _, v := range res {
-                       instanceIP += string(v.Metric["instance"])
-               }
-               WithDownNodeIPs[node] = instanceIP
-       }
-
-       msg := fmt.Sprintf("\n【%s】\n【集群:%v】\n【已达到宕机临界点:%v】", 
h.cc.NodeDownTime.DingTalk.Title, clusterName, len(WithDownNodeIPs))
-
-       newfound := 0
-
-       for nodeName, _ := range WithDownNodeIPs {
-               firstDate := time.Now().Format("2006-01-02")
-               err := h.Cordon(nodeName, clusterName, NODE_DOWN)
-               if err != nil {
-                       klog.Errorf("Cordon node err:%v", err)
-                       return
-               }
-               klog.Info("Cordon node success.")
-
-               klog.Infof("clusterName:%v\n nodeName:%v\n", clusterName, 
nodeName)
-
-               node, err := kubeClient.CoreV1().Nodes().Get(ctxFirst, 
nodeName, metav1.GetOptions{})
-               nodeIP, err := func() (string, error) {
-                       for _, address := range node.Status.Addresses {
-                               if address.Type == "InternalIP" {
-                                       return address.Address, nil
-                               }
-                       }
-                       return "", nil
-               }()
-
-               abnormalRecoveryQL := []string{}
-               for _, ql := range h.cc.NodeDownTime.AbnormalRecoveryQL {
-                       count := strings.Count(ql, "%s")
-
-                       p := make([]interface{}, count)
-                       for i := 0; i < count; i++ {
-                               p[i] = nodeName
-                       }
-
-                       query := fmt.Sprintf(ql, p...)
-                       abnormalRecoveryQL = append(abnormalRecoveryQL, query)
-               }
-
-               write := db.NodeDataInfo{
-                       NodeName:           nodeName,
-                       NodeIP:             nodeIP,
-                       ClusterName:        clusterName,
-                       ModuleName:         NODE_DOWN,
-                       DownTimeRecoveryQL: abnormalRecoveryQL,
-               }
-               exist, _ := write.Check()
-               if exist {
-                       continue
-               }
-               newfound++
-               if newfound > 0 {
-                       klog.Infof("DownTimeNodes get 
WithDownNodeIPs【集群:%v】【节点:%v】【IP:%v】", clusterName, nodeName, nodeIP)
-                       alerter.DingTalkSend(h.cc.NodeDownTime.DingTalk, msg)
-               }
-               msg += fmt.Sprintf("node:%v ip:%v", nodeName, nodeIP)
-               write.Reason = NODE_DOWN_REASON
-               write.FirstDate = firstDate
-               _, err = write.Add()
-               if err != nil {
-                       klog.Errorf("DownTimeNodes abnormal cordonNode AddOrGet 
err:%v", err)
-                       klog.Infof("clusterName:%v nodeName:%v", clusterName, 
nodeName)
-               }
-               klog.Info("DownTimeNodes abnormal cordonNode AddOrGet success.")
-               klog.Infof("clusterName:%v nodeName:%v", clusterName, nodeName)
-       }
-}
diff --git a/app/horus/core/horuser/node_drain.go 
b/app/horus/core/horuser/node_drain.go
deleted file mode 100644
index b1dcab2c..00000000
--- a/app/horus/core/horuser/node_drain.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       "fmt"
-       v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-       "k8s.io/klog/v2"
-)
-
-func (h *Horuser) Drain(nodeName, clusterName string) (err error) {
-       kubeClient := h.kubeClientMap[clusterName]
-       if kubeClient == nil {
-               klog.Error("node Drain kubeClient by clusterName empty.")
-               klog.Infof("nodeName:%v\n,clusterName:%v\n", nodeName, 
clusterName)
-               return err
-       }
-
-       ctxFirst, cancelFirst := h.GetK8sContext()
-       defer cancelFirst()
-       listOpts := v1.ListOptions{FieldSelector: 
fmt.Sprintf("spec.nodeName=%s", nodeName)}
-       pod, err := kubeClient.CoreV1().Pods("").List(ctxFirst, listOpts)
-       if err != nil {
-               klog.Errorf("node Drain err:%v", err)
-               klog.Infof("nodeName:%v\n clusterName:%v\n", nodeName, 
clusterName)
-               return err
-       }
-       if len(pod.Items) == 0 {
-               klog.Error("Unable to find pod on node..")
-               klog.Infof("nodeName:%v,clusterName:%v\n", nodeName, 
clusterName)
-       }
-       count := len(pod.Items)
-       for items, pods := range pod.Items {
-               ds := false
-               for _, owner := range pods.OwnerReferences {
-                       if owner.Kind == "DaemonSet" {
-                               ds = true
-                               break
-                       }
-               }
-               if ds {
-                       continue
-               }
-               klog.Errorf("node Drain evict pod result items:%d count:%v 
nodeName:%v\n clusterName:%v\n podName:%v\n podNamespace:%v\n", items+1, count, 
nodeName, clusterName, pods.Name, pods.Namespace)
-
-               err = h.Evict(pods.Name, pods.Namespace, clusterName)
-               if err != nil {
-                       klog.Errorf("node Drain evict pod err:%v items:%d 
count:%v nodeName:%v\n clusterName:%v\n podName:%v\n podNamespace:%v\n", err, 
items+1, count, nodeName, clusterName, pods.Name, pods.Namespace)
-                       return err
-               }
-       }
-       return nil
-}
diff --git a/app/horus/core/horuser/node_modular.go 
b/app/horus/core/horuser/node_modular.go
deleted file mode 100644
index 162fbfc7..00000000
--- a/app/horus/core/horuser/node_modular.go
+++ /dev/null
@@ -1,135 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       "context"
-       "fmt"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/db"
-       "github.com/apache/dubbo-kubernetes/app/horus/core/alerter"
-       "k8s.io/apimachinery/pkg/util/wait"
-       "k8s.io/klog/v2"
-       "sync"
-       "time"
-)
-
-func (h *Horuser) CustomizeModularManager(ctx context.Context) error {
-       go wait.UntilWithContext(ctx, h.CustomizeModular, 
time.Duration(h.cc.CustomModular.IntervalSecond)*time.Second)
-       <-ctx.Done()
-       return nil
-}
-
-func (h *Horuser) CustomizeModular(ctx context.Context) {
-       var wg sync.WaitGroup
-       for clusterName, addr := range h.cc.PromMultiple {
-               if _, exists := h.cc.CustomModular.KubeMultiple[clusterName]; 
!exists {
-                       klog.Info("CustomizeModular config disable.")
-                       klog.Infof("clusterName: %v\n", clusterName)
-                       continue
-               }
-               wg.Add(1)
-               go func(clusterName, addr string) {
-                       defer wg.Done()
-                       h.CustomizeModularOnCluster(clusterName, addr)
-               }(clusterName, addr)
-       }
-       wg.Wait()
-}
-
-func (h *Horuser) CustomizeModularOnCluster(clusterName, addr string) {
-       klog.Infof("CustomizeModularOnCluster Start clusterName:%v", 
clusterName)
-       for moduleName, abnormalityQL := range h.cc.CustomModular.AbnormalityQL 
{
-               ql := abnormalityQL
-               vecs, err := h.InstantQuery(addr, ql, clusterName, 
h.cc.CustomModular.PromQueryTimeSecond)
-               if err != nil {
-                       klog.Errorf("CustomizeModularOnCluster InstantQuery 
err:%v", err)
-                       klog.Infof("clusterName:%v abnormalityQL: %v", 
clusterName, ql)
-                       return
-               }
-               count := len(vecs)
-               for index, vec := range vecs {
-                       vec := vec
-                       labelMap := vec.Metric
-                       nodeName := string(labelMap["node"])
-                       if nodeName == "" {
-                               klog.Warningf("CustomizeModularOnCluster 
empty.")
-                               klog.Infof("clusterName:%v moduleName:%v 
index:%d", clusterName, moduleName, index)
-                               continue
-                       }
-                       ip := string(labelMap["instance"])
-                       value := vec.Value.String()
-                       klog.Infof("CustomizeModularOnCluster Query result 
clusterName:%v moduleName:%v %d nodeName:%v value:%v count:%v",
-                               clusterName, moduleName, index+1, nodeName, 
value, count)
-                       h.CustomizeModularNodes(clusterName, moduleName, 
nodeName, ip)
-               }
-       }
-}
-
-func (h *Horuser) CustomizeModularNodes(clusterName, moduleName, nodeName, ip 
string) {
-       today := time.Now().Format("2006-01-02")
-
-       recoveryQL := fmt.Sprintf(h.cc.CustomModular.RecoveryQL[moduleName], 
nodeName)
-       data, err := db.GetDailyLimitNodeDataInfoDate(today, moduleName, 
clusterName)
-       if err != nil {
-               klog.Errorf("CustomizeModularNodes 
GetDailyLimitNodeDataInfoDate err:%v", err)
-               return
-       }
-       err = h.Cordon(nodeName, clusterName, moduleName)
-
-       write := db.NodeDataInfo{
-               NodeName:    nodeName,
-               NodeIP:      ip,
-               ClusterName: clusterName,
-               ModuleName:  moduleName,
-               Reason:      moduleName,
-               FirstDate:   today,
-               RecoveryQL:  recoveryQL,
-       }
-
-       pass, _ := write.Check()
-       if pass {
-               klog.Infof("CustomizeModularNodes already existing 
clusterName:%v\n nodeName:%v\n moduleName:%v\n", clusterName, nodeName, 
moduleName)
-               return
-       }
-
-       _, err = write.AddOrGet()
-       if err != nil {
-               klog.Errorf("CustomizeModularNodes AddOrGet err:%v", err)
-               klog.Infof("moduleName:%v nodeName:%v\n", moduleName, 
write.NodeName)
-       }
-
-       res := "Success"
-       if err != nil {
-               res = fmt.Sprintf("result failed:%v", err)
-               klog.Errorf("Cordon failed:%v", res)
-       }
-       msg := fmt.Sprintf("\n【集群:%v】\n【发现 %s 达到禁止调度条件】\n【禁止调度节点:%v】\n 【处理结果: 
%v】\n 【今日操作次数:%v】\n",
-               clusterName, moduleName, nodeName, res, len(data)+1)
-       alerter.DingTalkSend(h.cc.CustomModular.DingTalk, msg)
-       alerter.SlackSend(h.cc.CustomModular.Slack, msg)
-
-       dailyLimit := h.cc.CustomModular.DailyLimit[moduleName]
-       if len(data) > dailyLimit {
-               msg := fmt.Sprintf("\n【日期:%v】\n【集群:%v\n】\n【今日 Cordon 节点数: 
%v】\n【已达到今日上限: %v】\n【节点:%v】",
-                       data, clusterName, len(data), dailyLimit, nodeName)
-               alerter.DingTalkSend(h.cc.CustomModular.DingTalk, msg)
-               alerter.SlackSend(h.cc.CustomModular.Slack, msg)
-               return
-       }
-
-       klog.Infof("CustomizeModularNodes AddOrGet success.")
-       klog.Infof("moduleName:%v nodeName:%v\n", moduleName, write.NodeName)
-}
diff --git a/app/horus/core/horuser/node_recovery.go 
b/app/horus/core/horuser/node_recovery.go
deleted file mode 100644
index 5343f0e0..00000000
--- a/app/horus/core/horuser/node_recovery.go
+++ /dev/null
@@ -1,183 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       "context"
-       "fmt"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/db"
-       "github.com/apache/dubbo-kubernetes/app/horus/core/alerter"
-       "github.com/gammazero/workerpool"
-       "k8s.io/apimachinery/pkg/util/wait"
-       "k8s.io/klog/v2"
-       "time"
-)
-
-func (h *Horuser) RecoveryManager(ctx context.Context) error {
-       go wait.UntilWithContext(ctx, h.recoveryCheck, 
time.Duration(h.cc.NodeRecovery.IntervalSecond)*time.Second)
-       <-ctx.Done()
-       return nil
-}
-
-func (h *Horuser) DownTimeRecoveryManager(ctx context.Context) error {
-       go wait.UntilWithContext(ctx, h.downTimeRecoveryCheck, 
time.Duration(h.cc.NodeRecovery.IntervalSecond)*time.Second)
-       <-ctx.Done()
-       return nil
-}
-
-func (h *Horuser) recoveryCheck(ctx context.Context) {
-       data, err := db.GetRecoveryNodeDataInfoDate(h.cc.NodeRecovery.DayNumber)
-       if err != nil {
-               klog.Errorf("recovery check GetRecoveryNodeDataInfoDate 
err:%v", err)
-               return
-       }
-       if len(data) == 0 {
-               klog.Info("recovery check GetRecoveryNodeDataInfoDate zero.")
-               return
-       }
-       wp := workerpool.New(50)
-       for _, d := range data {
-               d := d
-               wp.Submit(func() {
-                       h.recoveryNodes(d)
-
-               })
-
-       }
-       wp.StopWait()
-}
-
-func (h *Horuser) downTimeRecoveryCheck(ctx context.Context) {
-       data, err := 
db.GetDownTimeRecoveryNodeDataInfoDate(h.cc.NodeRecovery.DayNumber)
-       if err != nil {
-               klog.Errorf("recovery check GetDownTimeRecoveryNodeDataInfoDate 
err:%v", err)
-               return
-       }
-       if len(data) == 0 {
-               klog.Info("recovery check GetDownTimeRecoveryNodeDataInfoDate 
zero.")
-               return
-       }
-       wp := workerpool.New(50)
-       for _, d := range data {
-               d := d
-               wp.Submit(func() {
-                       h.downTimeRecoveryNodes(d)
-               })
-       }
-       wp.StopWait()
-}
-
-func (h *Horuser) recoveryNodes(n db.NodeDataInfo) {
-       promAddr := h.cc.PromMultiple[n.ClusterName]
-       if promAddr == "" {
-               klog.Error("recoveryNodes promAddr by clusterName empty.")
-               klog.Infof("clusterName:%v nodeName:%v", n.ClusterName, 
n.NodeName)
-               return
-       }
-       vecs, err := h.InstantQuery(promAddr, n.RecoveryQL, n.ClusterName, 
h.cc.NodeRecovery.PromQueryTimeSecond)
-       if err != nil {
-               klog.Errorf("recoveryNodes InstantQuery err:%v", err)
-               klog.Infof("recoveryQL:%v", n.RecoveryQL)
-               return
-       }
-       if len(vecs) != 1 {
-               klog.Infof("Expected 1 result, but got:%d", len(vecs))
-               return
-       }
-       if err != nil {
-               klog.Errorf("recoveryNodes InstantQuery err:%v", err)
-               klog.Infof("recoveryQL:%v", n.RecoveryQL)
-               return
-       }
-       klog.Info("recoveryNodes InstantQuery success.")
-
-       err = h.UnCordon(n.NodeName, n.ClusterName)
-       res := "Success"
-       if err != nil {
-               res = fmt.Sprintf("result failed:%v", err)
-       }
-       msg := fmt.Sprintf("\n【集群: %v】\n【封锁节点恢复调度】\n【已恢复调度节点: 
%v】\n【处理结果:%v】\n【日期: %v】\n", n.ClusterName, n.NodeName, res, n.CreateTime)
-       alerter.DingTalkSend(h.cc.NodeRecovery.DingTalk, msg)
-       alerter.SlackSend(h.cc.CustomModular.Slack, msg)
-
-       success, err := n.RecoveryMarker()
-       if err != nil {
-               klog.Errorf("RecoveryMarker result failed err:%v", err)
-               return
-       }
-       klog.Infof("RecoveryMarker result success:%v", success)
-}
-
-func (h *Horuser) downTimeRecoveryNodes(n db.NodeDataInfo) {
-       promAddr := h.cc.PromMultiple[n.ClusterName]
-       if promAddr == "" {
-               klog.Error("downTimeRecoveryNodes promAddr by clusterName 
empty.")
-               klog.Infof("clusterName:%v nodeName:%v", n.ClusterName, 
n.NodeName)
-               return
-       }
-       rq := len(h.cc.NodeDownTime.AbnormalRecoveryQL)
-       counter := 0
-       for _, ql := range n.DownTimeRecoveryQL {
-               vecs, err := h.InstantQuery(promAddr, ql, n.ClusterName, 
h.cc.NodeRecovery.PromQueryTimeSecond)
-               if err != nil {
-                       klog.Errorf("downTimeRecoveryNodes InstantQuery err: 
%v", err)
-                       klog.Infof("DownTimeRecoveryQL: %v", ql)
-                       continue
-               }
-               if len(vecs) == 0 {
-                       klog.Infof("No results for query: %v", ql)
-                       continue
-               } else {
-                       klog.Infof("Query successful for: %v", ql)
-                       counter++
-                       klog.Infof("Counter: %v", counter)
-               }
-
-               if counter != rq {
-                       klog.Infof("Expected %d results, but got: %d", rq, 
counter)
-                       continue
-               }
-
-               if counter > rq {
-                       klog.Error("downTimeRecoveryNodes did not reach 
threshold.")
-                       continue
-               }
-
-               if counter == rq {
-                       klog.Info("Reaching the downtime recovery threshold.")
-                       err = h.UnCordon(n.NodeName, n.ClusterName)
-                       res := "Success"
-                       if err != nil {
-                               res = fmt.Sprintf("result failed: %v", err)
-                       }
-
-                       msg := fmt.Sprintf("\n【集群: %v】\n【封锁宕机节点恢复调度】\n【已恢复调度节点: 
%v】\n【处理结果:%v】\n【日期: %v】\n",
-                               n.ClusterName, n.NodeName, res, n.CreateTime)
-
-                       alerter.DingTalkSend(h.cc.NodeDownTime.DingTalk, msg)
-                       alerter.SlackSend(h.cc.NodeDownTime.Slack, msg)
-
-                       success, err := n.DownTimeRecoveryMarker()
-                       if err != nil {
-                               klog.Errorf("DownTimeRecoveryMarker result 
failed: %v", err)
-                               return
-                       }
-                       klog.Infof("DownTimeRecoveryMarker result success: %v", 
success)
-
-                       klog.Info("recoveryNodes InstantQuery success.")
-               }
-       }
-}
diff --git a/app/horus/core/horuser/node_restart.go 
b/app/horus/core/horuser/node_restart.go
deleted file mode 100644
index 5c81ed96..00000000
--- a/app/horus/core/horuser/node_restart.go
+++ /dev/null
@@ -1,117 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       "context"
-       "fmt"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/db"
-       "github.com/apache/dubbo-kubernetes/app/horus/core/alerter"
-       "github.com/gammazero/workerpool"
-       "k8s.io/apimachinery/pkg/util/wait"
-       "k8s.io/klog/v2"
-       "os/exec"
-       "strings"
-       "time"
-)
-
-func (h *Horuser) DowntimeRestartManager(ctx context.Context) error {
-       go wait.UntilWithContext(ctx, h.RestartOrRepair, 
time.Duration(h.cc.NodeDownTime.IntervalSecond)*time.Second)
-       <-ctx.Done()
-       return nil
-}
-
-func (h *Horuser) RestartOrRepair(ctx context.Context) {
-       nodes, err := db.GetRestartNodeDataInfoDate()
-       if err != nil {
-               klog.Errorf("RestartOrRepair GetRestartNodeDataInfoDate 
err:%v", err)
-               return
-       }
-       if len(nodes) == 0 {
-               klog.Info("RestartOrRepair to zero.")
-       }
-       klog.Infof("RestartOrRepair Count:%v", len(nodes))
-       wp := workerpool.New(10)
-       for _, n := range nodes {
-               n := n
-               wp.Submit(func() {
-                       h.TryRestart(n)
-               })
-       }
-}
-
-func (h *Horuser) TryRestart(node db.NodeDataInfo) {
-       err := h.Drain(node.NodeName, node.ClusterName)
-       if err != nil {
-               klog.Errorf("Drain node err:%v", err)
-               return
-       }
-       klog.Info("Drain node success.")
-       klog.Infof("clusterName:%v\n nodeName:%v\n", node.ClusterName, 
node.NodeName)
-
-       success, err := node.RestartMarker()
-       if err != nil {
-               klog.Errorf("Error getting RestartMarker for nodeName:%v: 
err:%v", node.NodeName, err)
-               return
-       }
-       klog.Infof("RestartMarker result success:%v", success)
-
-       if success {
-               msg := 
fmt.Sprintf("\n【宕机节点等待腾空后重启】\n【节点:%v】\n【日期:%v】\n【集群:%v】\n", node.NodeName, 
node.FirstDate, node.ClusterName)
-               alerter.DingTalkSend(h.cc.NodeDownTime.DingTalk, msg)
-
-               cmd := exec.Command("/bin/bash", "core/horuser/restart.sh", 
node.NodeIP, h.cc.NodeDownTime.AllSystemUser, 
h.cc.NodeDownTime.AllSystemPassword)
-               output, err := cmd.CombinedOutput()
-               if err != nil {
-                       klog.Errorf("Failed restart for Output:%v node:%v: 
err:%v", string(output), node.NodeName, err)
-                       return
-               }
-               klog.Infof("Successfully restarted node %v.", node.NodeName)
-
-               rq := len(h.cc.NodeDownTime.AbnormalRecoveryQL)
-               ql := strings.Join(h.cc.NodeDownTime.AbnormalRecoveryQL, " or ")
-               vecs, err := 
h.InstantQuery(h.cc.PromMultiple[node.ClusterName], ql, node.ClusterName, 
h.cc.NodeDownTime.PromQueryTimeSecond)
-               if err != nil {
-                       klog.Errorf("Failed to query Prometheus for recovery 
threshold after restart: %v", err)
-                       return
-               }
-
-               if len(vecs) == rq {
-                       klog.Infof("Node %v has reached recovery threshold 
after restart.", node.NodeName)
-
-                       err = h.UnCordon(node.NodeName, node.ClusterName)
-                       if err != nil {
-                               klog.Errorf("Uncordon node failed after 
restart: %v", err)
-                               return
-                       }
-
-                       msg = fmt.Sprintf("\n【集群: %v】\n【宕机节点已恢复】\n【恢复节点: 
%v】\n【处理结果:成功】\n【日期: %v】\n", node.ClusterName, node.NodeName, node.FirstDate)
-                       alerter.DingTalkSend(h.cc.NodeDownTime.DingTalk, msg)
-                       alerter.SlackSend(h.cc.NodeDownTime.Slack, msg)
-
-               } else {
-                       klog.Infof("Node %v has not reached recovery threshold 
after restart.", node.NodeName)
-               }
-
-       } else {
-               klog.Infof("RestartMarker did not success for node %v", 
node.NodeName)
-       }
-
-       if node.Restart > 2 {
-               klog.Error("The node has already been rebooted more than 
twice.")
-               return
-       }
-}
diff --git a/app/horus/core/horuser/node_uncordon.go 
b/app/horus/core/horuser/node_uncordon.go
deleted file mode 100644
index b6f9cc17..00000000
--- a/app/horus/core/horuser/node_uncordon.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-       "k8s.io/klog/v2"
-)
-
-func (h *Horuser) UnCordon(nodeName, clusterName string) (err error) {
-       kubeClient := h.kubeClientMap[clusterName]
-       if kubeClient == nil {
-               klog.Error("node UnCordon kubeClient by clusterName empty.")
-               klog.Infof("nodeName:%v\n,clusterName:%v\n", nodeName, 
clusterName)
-               return err
-       }
-
-       ctxFirst, cancelFirst := h.GetK8sContext()
-       defer cancelFirst()
-       node, err := kubeClient.CoreV1().Nodes().Get(ctxFirst, nodeName, 
v1.GetOptions{})
-       if err != nil {
-               klog.Errorf("node UnCordon get err:%v", err)
-               klog.Infof("nodeName:%v\n clusterName:%v\n", nodeName, 
clusterName)
-               return err
-       }
-
-       node.Spec.Unschedulable = false
-
-       ctxSecond, cancelSecond := h.GetK8sContext()
-       defer cancelSecond()
-       node, err = kubeClient.CoreV1().Nodes().Update(ctxSecond, node, 
v1.UpdateOptions{})
-       if err != nil {
-               klog.Errorf("node UnCordon update err:%v", err)
-               klog.Infof("nodeName:%v\n clusterName:%v\n", nodeName, 
clusterName)
-               return err
-       }
-       klog.Info("node UnCordon success.")
-       klog.Infof("nodeName:%v\n clusterName:%v\n", nodeName, clusterName)
-       return nil
-}
diff --git a/app/horus/core/horuser/pod_evict.go 
b/app/horus/core/horuser/pod_evict.go
deleted file mode 100644
index 573d227e..00000000
--- a/app/horus/core/horuser/pod_evict.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-       "k8s.io/klog/v2"
-)
-
-func (h *Horuser) Evict(podName, podNamespace, clusterName string) (err error) 
{
-       kubeClient := h.kubeClientMap[clusterName]
-       if kubeClient == nil {
-               klog.Error("pod Evict kubeClient by clusterName empty.")
-               klog.Infof("podName:%v\n podNamespace:%v\n clusterName:%v\n", 
podName, podNamespace, clusterName)
-               return err
-       }
-
-       ctxFirst, cancelFirst := h.GetK8sContext()
-       defer cancelFirst()
-       _, err = kubeClient.CoreV1().Pods(podNamespace).Get(ctxFirst, podName, 
v1.GetOptions{})
-       if err != nil {
-               klog.Errorf("pod Evict get err:%v", err)
-               klog.Infof("clusterName:%v\n podName:%v\n podNamespace:%v\n", 
clusterName, podName, podNamespace)
-               return err
-       }
-       ctxSecond, cancelSecond := h.GetK8sContext()
-       defer cancelSecond()
-       var gracePeriodSeconds int64 = -1
-       propagationPolicy := v1.DeletePropagationBackground
-       err = kubeClient.CoreV1().Pods(podNamespace).Delete(ctxSecond, podName, 
v1.DeleteOptions{
-               GracePeriodSeconds: &gracePeriodSeconds,
-               PropagationPolicy:  &propagationPolicy,
-       })
-       if err != nil {
-               klog.Errorf("pod Evict delete failed err:%v", err)
-               klog.Infof("clusterName:%v\n podName:%v\n podNamespace:%v\n", 
clusterName, podName, podNamespace)
-               return err
-       }
-       klog.Info("pod Evict delete success.")
-       klog.Infof("clusterName:%v\n podName:%v\n podNamespace:%v\n", 
clusterName, podName, podNamespace)
-       return nil
-
-}
diff --git a/app/horus/core/horuser/pod_remove.go 
b/app/horus/core/horuser/pod_remove.go
deleted file mode 100644
index 91251bb2..00000000
--- a/app/horus/core/horuser/pod_remove.go
+++ /dev/null
@@ -1,86 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       "context"
-       "encoding/json"
-       corev1 "k8s.io/api/core/v1"
-       v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
-       "k8s.io/apimachinery/pkg/types"
-       "k8s.io/klog/v2"
-)
-
-type RemoveJsonValue struct {
-       Op   string `json:"op"`
-       Path string `json:"path"`
-}
-
-func (h *Horuser) Finalizer(clusterName, podName, podNamespace string) error {
-       kubeClient := h.kubeClientMap[clusterName]
-       if kubeClient == nil {
-               klog.Error("Finalizer kubeClient by clusterName empty.")
-               klog.Infof("clusterName:%v\n podName:%v\n", clusterName, 
podName)
-               return nil
-       }
-       finalizer := RemoveJsonValue{
-               Op:   "remove",
-               Path: "/metadata/finalizers",
-       }
-       var payload []interface{}
-       payload = append(payload, finalizer)
-       data, _ := json.Marshal(payload)
-       ctx, cancel := h.GetK8sContext()
-       defer cancel()
-       _, err := kubeClient.CoreV1().Pods(podNamespace).Patch(ctx, podName, 
types.JSONPatchType, data, v1.PatchOptions{})
-       return err
-}
-
-func (h *Horuser) Terminating(clusterName string, oldPod *corev1.Pod) bool {
-       kubeClient := h.kubeClientMap[clusterName]
-       if kubeClient == nil {
-               return false
-       }
-       newPod, _ := 
kubeClient.CoreV1().Pods(oldPod.Namespace).Get(context.Background(), 
oldPod.Name, v1.GetOptions{})
-       if newPod == nil {
-               return false
-       }
-       if newPod.UID != oldPod.UID {
-               return false
-       }
-       if newPod.DeletionTimestamp.IsZero() {
-               return false
-       }
-       return true
-}
-
-func (h *Horuser) Retrieve(clusterName, fieldSelector string) ([]corev1.Pod, 
error) {
-       kubeClient := h.kubeClientMap[clusterName]
-       if kubeClient == nil {
-               klog.Error("Retrieve kubeClient by clusterName empty.")
-               klog.Infof("clusterName:%v\n", clusterName)
-               return nil, nil
-       }
-       ctx, cancel := h.GetK8sContext()
-       defer cancel()
-       list := v1.ListOptions{FieldSelector: fieldSelector}
-       pods, err := kubeClient.CoreV1().Pods("").List(ctx, list)
-       if err != nil {
-               klog.Errorf("Retrieve list pod err:%v", err)
-               klog.Infof("clusterName:%v\n fieldSelector:%v", clusterName, 
fieldSelector)
-       }
-       return pods.Items, err
-}
diff --git a/app/horus/core/horuser/pod_stagnation.go 
b/app/horus/core/horuser/pod_stagnation.go
deleted file mode 100644
index 0f648c16..00000000
--- a/app/horus/core/horuser/pod_stagnation.go
+++ /dev/null
@@ -1,129 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       "context"
-       "fmt"
-       "github.com/apache/dubbo-kubernetes/app/horus/base/db"
-       "github.com/apache/dubbo-kubernetes/app/horus/core/alerter"
-       "github.com/gammazero/workerpool"
-       corev1 "k8s.io/api/core/v1"
-       "k8s.io/apimachinery/pkg/util/wait"
-       "k8s.io/klog/v2"
-       "sync"
-       "time"
-)
-
-const (
-       ModuleName = "podStagnationCleaner"
-       Reason     = "StagnationCleanup"
-)
-
-func (h *Horuser) PodStagnationCleanManager(ctx context.Context) error {
-       go wait.UntilWithContext(ctx, h.PodStagnationClean, 
time.Duration(h.cc.PodStagnationCleaner.IntervalSecond)*time.Second)
-       <-ctx.Done()
-       return nil
-}
-
-func (h *Horuser) PodStagnationClean(ctx context.Context) {
-       var wg sync.WaitGroup
-       for cn := range h.cc.PodStagnationCleaner.KubeMultiple {
-               cn := cn
-               wg.Add(1)
-               go func() {
-                       defer wg.Done()
-                       h.PodsOnCluster(cn)
-               }()
-       }
-       wg.Wait()
-}
-
-func (h *Horuser) PodsOnCluster(clusterName string) {
-       pods, err := h.Retrieve(clusterName, 
h.cc.PodStagnationCleaner.FieldSelector)
-       if err != nil {
-               klog.Errorf("Failed to retrieve pods on err:%v", err)
-               klog.Infof("clusterName:%v\n", clusterName)
-               return
-       }
-       count := len(pods)
-       if count == 0 {
-               klog.Infof("PodsOnCluster no abnomal clusterName:%v\n", 
clusterName)
-               return
-       }
-       wp := workerpool.New(10)
-       for index, pod := range pods {
-               pod := pod
-               if pod.Status.Phase == corev1.PodRunning {
-                       continue
-               }
-               msg := 
fmt.Sprintf("\n【集群:%v】\n【停滞:%d/%d】\n【PodName:%v】\n【Namespace:%v】\n【Phase:%v】\n【节点:%v】\n",
 clusterName, index+1, count, pod.Name, pod.Namespace, pod.Status.Phase, 
pod.Spec.NodeName)
-               klog.Infof(msg)
-
-               wp.Submit(func() {
-                       h.PodSingle(pod, clusterName)
-               })
-       }
-       wp.StopWait()
-}
-
-func (h *Horuser) PodSingle(pod corev1.Pod, clusterName string) {
-       var err error
-       if !pod.DeletionTimestamp.IsZero() {
-               if len(pod.Finalizers) > 0 {
-                       
time.Sleep(time.Duration(h.cc.PodStagnationCleaner.DoubleSecond) * time.Second)
-                       if !h.Terminating(clusterName, &pod) {
-                               klog.Infof("Pod %s is still terminating 
skipping.", pod.Name)
-                               return
-                       }
-                       err := h.Finalizer(clusterName, pod.Name, pod.Namespace)
-                       if err != nil {
-                               klog.Errorf("Failed to patch finalizer for pod 
%s: %v", pod.Name, err)
-                               return
-                       }
-                       klog.Infof("Successfully patched finalizer for pod %s", 
pod.Name)
-               }
-               return
-       }
-
-       if len(pod.Finalizers) == 0 && pod.Name != "" {
-               err := h.Evict(pod.Name, pod.Namespace, clusterName)
-               if err != nil {
-                       klog.Errorf("Failed to evict pod %s err:%v", pod.Name, 
err)
-                       return
-               }
-               klog.Infof("Evicted pod %s successfully", pod.Name)
-       }
-       res := "Success"
-       if err != nil {
-               res = fmt.Sprintf("result failed:%v", err)
-       }
-       today := time.Now().Format("2006-01-02")
-       msg := fmt.Sprintf("\n【集群:%v】\n【Pod:%v】\n【Namespace:%v】\n【清除 
finalizer:%v】\n", clusterName, pod.Name, pod.Namespace, res)
-       alerter.DingTalkSend(h.cc.PodStagnationCleaner.DingTalk, msg)
-       write := db.PodDataInfo{
-               PodName:     pod.Name,
-               PodIP:       pod.Status.PodIP,
-               NodeName:    pod.Spec.NodeName,
-               ClusterName: clusterName,
-               ModuleName:  ModuleName,
-               Reason:      Reason,
-               FirstDate:   today,
-       }
-       _, err = write.AddOrGet()
-       klog.Errorf("write AddOrGet err:%v", err)
-       return
-}
diff --git a/app/horus/core/horuser/query.go b/app/horus/core/horuser/query.go
deleted file mode 100644
index 3147cdd6..00000000
--- a/app/horus/core/horuser/query.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package horuser
-
-import (
-       "context"
-       apiV1 "github.com/prometheus/client_golang/api"
-       prometheusV1 "github.com/prometheus/client_golang/api/prometheus/v1"
-       "github.com/prometheus/common/model"
-       "k8s.io/klog/v2"
-       "time"
-)
-
-func (h *Horuser) InstantQuery(address, ql, clusterName string, 
timeWindowsSecond int64) (model.Vector, error) {
-       client, err := apiV1.NewClient(apiV1.Config{Address: address})
-       if err != nil {
-               klog.Errorf("InstantQuery creating NewClient err:%v", err)
-               return nil, err
-       }
-       promClient := h.cc.PromMultiple[clusterName]
-       if promClient == "" && address == "" {
-               klog.Error("PromMultiple empty.")
-               klog.Infof("clusterName:%v\n ql:%v", clusterName, ql)
-               return nil, err
-       }
-
-       apiV1 := prometheusV1.NewAPI(client)
-       ctx, cancel := context.WithTimeout(context.Background(), 
time.Duration(timeWindowsSecond)*time.Second)
-       defer cancel()
-
-       result, _, err := apiV1.Query(ctx, ql, time.Now())
-       if err != nil {
-               klog.Errorf("prometheus Query error:%v url:%+v ql:%v", err, 
address, ql)
-               return nil, err
-       }
-
-       vector, has := result.(model.Vector)
-       if !has {
-               klog.Errorf("prometheus Query result vector error %+v", result)
-               return nil, err
-       }
-       return vector, nil
-}
diff --git a/app/horus/core/horuser/restart.sh 
b/app/horus/core/horuser/restart.sh
deleted file mode 100644
index 1523b68d..00000000
--- a/app/horus/core/horuser/restart.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env bash
-
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-host_computer=$1
-host_username=$2
-host_password=$3
-
-if [ $# -lt 3 ]; then
-  echo "ERROR: The expected value is parameter 3, but there are only $#: input 
parameters."
-  exit 1
-fi
-
-for i in $host_computer; do
-    sshpass -p "$host_password" ssh "$host_username"@$i -o 
"StrictHostKeyChecking=no" "echo $host_password | sudo -S reboot"
-done
diff --git a/app/horus/core/ticker/ticker.go b/app/horus/core/ticker/ticker.go
deleted file mode 100644
index eb90edfb..00000000
--- a/app/horus/core/ticker/ticker.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package ticker
-
-import (
-       "context"
-       "k8s.io/apimachinery/pkg/util/wait"
-       "k8s.io/klog/v2"
-       "time"
-)
-
-func Manager(ctx context.Context) error {
-       go wait.UntilWithContext(ctx, tickerFunc, 30*time.Second)
-       <-ctx.Done()
-       klog.Infof("ticker Manager exit receive quit signal")
-       return nil
-}
-
-func tickerFunc(ctx context.Context) {
-       klog.V(2).Infof("tickerFunc Running")
-}
diff --git a/manifests/horus/horus.yaml b/manifests/horus/horus.yaml
deleted file mode 100644
index c6f48eef..00000000
--- a/manifests/horus/horus.yaml
+++ /dev/null
@@ -1,107 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements.  See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-address: 0.0.0.0:38089
-kubeTimeSecond: 5
-
-mysql:
-  name: horus
-  address: "root:root@tcp(127.0.0.1:3306)/horus?charset=utf8&parseTime=True"
-  debug: false
-
-kubeMultiple:
-  cluster: config.1
-
-promMultiple:
-  cluster: http://192.168.15.133:31974
-
-nodeRecovery:
-  dayNumber: 1
-  intervalSecond: 15
-  promQueryTimeSecond: 60
-  dingTalk:
-    webhookUrl: 
"https://oapi.dingtalk.com/robot/send?access_token=37f8891e60e524013275cc01efafdb5976b81ef7269ce271b769bcd025826c12";
-    title: "自定义通知"
-    atMobiles:
-      - 15000000000
-  slack:
-    webhookUrl: 
"https://hooks.slack.com/services/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";
-    title: "自定义通知"
-
-customModular:
-  enabled: false
-  dailyLimit:
-    node_cpu: 1
-  abnormalityQL:
-    node_cpu: |-
-      100 - (avg by (node) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 
100) > 15
-  recoveryQL:
-    node_cpu: |-
-      100 - (avg by (node) 
(rate(node_cpu_seconds_total{mode="idle",node="%s"}[5m])) * 100) < 10
-  intervalSecond: 15
-  promQueryTimeSecond: 60
-  kubeMultiple:
-    cluster: config.1
-  dingTalk:
-    webhookUrl: 
"https://oapi.dingtalk.com/robot/send?access_token=37f8891e60e524013275cc01efafdb5976b81ef7269ce271b769bcd025826c12";
-    title: "自定义通知"
-    atMobiles:
-      - 15000000000
-  slack:
-    webhookUrl: 
"https://hooks.slack.com/services/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";
-    title: "自定义通知"
-
-nodeDownTime:
-  enabled: true
-  intervalSecond: 15
-  promQueryTimeSecond: 60
-  abnormalityQL:
-    - 100 - (avg by (node) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 
100) > 15
-    - node_filesystem_avail_bytes{mountpoint="/"} / 
node_filesystem_size_bytes{mountpoint="/"} * 100 < 16
-    #    - avg(node_memory_MemFree_bytes) by (node) < 20
-  abnormalInfoSystemQL:
-    node_os_info{node="%s"}
-  allSystemUser: "zxj"
-  allSystemPassword: "1"
-  abnormalRecoveryQL:
-    - 100 - (avg by (node) 
(rate(node_cpu_seconds_total{mode="idle",node="%s"}[5m])) * 100) < 15
-    - node_filesystem_avail_bytes{mountpoint="/",node="%s"} / 
node_filesystem_size_bytes{mountpoint="/",node="%s"} * 100 > 15
-    #    - (avg by (node) (node_memory_MemFree_bytes{node="%s"} / 
node_memory_MemTotal_bytes{node="%s"} )) * 100 > 50
-  kubeMultiple:
-    cluster: config.1
-  dingTalk:
-    webhookUrl: 
"https://oapi.dingtalk.com/robot/send?access_token=37f8891e60e524013275cc01efafdb5976b81ef7269ce271b769bcd025826c12";
-    title: "自定义通知"
-    atMobiles:
-      - 15000000000
-  slack:
-    webhookUrl: 
"https://hooks.slack.com/services/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";
-    title: "自定义通知"
-
-podStagnationCleaner:
-  enabled: false
-  intervalSecond: 15
-  doubleSecond: 60
-  fieldSelector: "status.phase!=Running"
-  kubeMultiple:
-    cluster: config.1
-  dingTalk:
-    webhookUrl: 
"https://oapi.dingtalk.com/robot/send?access_token=37f8891e60e524013275cc01efafdb5976b81ef7269ce271b769bcd025826c12";
-    title: "自定义通知"
-    atMobiles:
-      - 15000000000
-  slack:
-    webhookUrl: 
"https://hooks.slack.com/services/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";
-    title: "自定义通知"
\ No newline at end of file


Reply via email to