cmd/doris-debug/main.go (100 lines of code) (raw):
// 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 (
"flag"
"fmt"
v1 "github.com/apache/doris-operator/api/doris/v1"
"github.com/apache/doris-operator/pkg/common/utils/resource"
"github.com/spf13/viper"
"net/http"
"os"
"strconv"
)
var (
componentType string
dorisRootPath string
)
func main() {
flagParse()
envParse()
if !kickOffDebug() {
return
}
fmt.Println("start component " + componentType + "for debugging.....")
listenPort := readConfigListenPort()
//registerMockApiHealth()
if err := http.ListenAndServe(":"+listenPort, nil); err != nil {
fmt.Println("listenAndServe failed," + err.Error())
os.Exit(1)
}
}
func envParse() {
dorisRootPath, _ = os.LookupEnv(resource.DORIS_ROOT_KEY)
if dorisRootPath == "" {
dorisRootPath = "/opt/apache-doris"
}
}
func flagParse() {
flag.StringVar(&componentType, "component", "fe", "the debug component short name.")
flag.Parse()
}
func readConfigListenPort() string {
configFileName := dorisRootPath + "/" + componentType + "/conf/" + componentType + ".conf"
_, err := os.Stat(configFileName)
if err != nil {
fmt.Println("the config file is not exist, stat error", err.Error())
os.Exit(1)
}
file, _ := os.Open(configFileName)
viper.SetConfigType("properties")
viper.ReadConfig(file)
var listenPort string
if componentType == "fe" {
configQueryPort := viper.GetString(resource.QUERY_PORT)
if configQueryPort == "" {
listenPort = strconv.Itoa(int(resource.GetDefaultPort(resource.QUERY_PORT)))
}
} else if componentType == "be" {
configHeartbeatPort := viper.GetString(resource.HEARTBEAT_SERVICE_PORT)
fmt.Println("component be" + configHeartbeatPort)
if configHeartbeatPort == "" {
listenPort = strconv.Itoa(int(resource.GetDefaultPort(resource.HEARTBEAT_SERVICE_PORT)))
}
}
fmt.Println("component listen port " + listenPort)
return listenPort
}
func registerMockApiHealth() {
if componentType == "fe" {
http.HandleFunc("/api/health", mockFEHealth)
return
}
http.HandleFunc("/api/health", mockBEHealth)
}
func kickOffDebug() bool {
annotationFileName := resource.POD_INFO_PATH + "/annotations"
if _, err := os.Stat(annotationFileName); os.IsNotExist(err) {
fmt.Println(annotationFileName + "is not exists.")
return false
}
file, err := os.Open(annotationFileName)
if err != nil {
fmt.Println(annotationFileName + "can't open" + err.Error())
}
viper.Reset()
viper.SetConfigType("properties")
viper.ReadConfig(file)
value := viper.GetString(v1.AnnotationDebugKey)
fmt.Println("the annotations value:" + value)
if value == "\""+v1.AnnotationDebugValue+"\"" {
return true
}
fmt.Println("the value not equal!", value, v1.AnnotationDebugValue)
return false
}
func mockFEHealth(w http.ResponseWriter, r *http.Request) {
//{"msg":"success","code":0,"data":{"online_backend_num":3,"total_backend_num":3},"count":0}
w.WriteHeader(http.StatusOK)
w.Write([]byte("{\"msg\":\"success\",\"code\":0,\"data\":{\"online_backend_num\":3,\"total_backend_num\":3},\"count\":0}"))
}
func mockBEHealth(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("{\"status\": \"OK\",\"msg\": \"To Be Added\"}"))
}