diff --git a/.dockerignore b/.dockerignore
index f403fee1..88a3489c 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -1,5 +1,4 @@
.idea
-.git
doc
example
logo
@@ -7,4 +6,4 @@ tests
.gitignore
build.sh
build.bat
-README.MD
\ No newline at end of file
+README.MD
diff --git a/Dockerfile b/Dockerfile
index b906b51a..323de733 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,7 +2,9 @@ FROM golang:1.16-alpine3.12 as builder
WORKDIR $GOPATH/src/github.com/feiyu563/PrometheusAlert
-RUN apk update && apk upgrade && apk add --no-cache gcc g++ sqlite-libs
+RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
+ apk update && apk upgrade && \
+ apk add --no-cache gcc g++ sqlite-libs make git
ENV GO111MODULE on
@@ -10,15 +12,22 @@ ENV GOPROXY https://goproxy.io
COPY . $GOPATH/src/github.com/feiyu563/PrometheusAlert
-RUN go mod vendor && go build
+RUN make build
# -----------------------------------------------------------------------------
-
FROM alpine:3.12
LABEL maintainer="jikun.zhang"
-RUN apk update && apk upgrade && apk add --no-cache sqlite-libs
+RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
+ apk add tzdata && \
+ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
+ echo "Asia/Shanghai" > /etc/timezone && \
+ apk del tzdata && \
+ apk update && apk upgrade && apk add --no-cache sqlite-libs curl
+
+HEALTHCHECK --start-period=10s --interval=20s --timeout=3s --retries=3 \
+ CMD curl -fs http://localhost:8080/health || exit 1
WORKDIR /app
@@ -38,4 +47,4 @@ COPY views views
#ENTRYPOINT [ "/app/PrometheusAlert" ]
-CMD if [ ! -f /app/db/PrometheusAlertDB.db ];then cp /opt/PrometheusAlertDB.db /app/db/PrometheusAlertDB.db;echo 'init ok!';else echo 'pass!';fi && /app/PrometheusAlert
\ No newline at end of file
+CMD if [ ! -f /app/db/PrometheusAlertDB.db ];then cp /opt/PrometheusAlertDB.db /app/db/PrometheusAlertDB.db;echo 'init ok!';else echo 'pass!';fi && /app/PrometheusAlert
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..86556aff
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,56 @@
+pkgs = $(shell go list ./... | grep -v vendor/)
+
+DOCKER_IMAGE_NAME ?= feiyu563/prometheus-alert
+
+BRANCH ?= $(shell git rev-parse --abbrev-ref HEAD)
+BUILDDATE ?= $(shell date -I'seconds')
+BUILDUSER ?= $(shell whoami)@$(shell hostname)
+REVISION ?= $(shell git rev-parse HEAD)
+TAG_VERSION ?= $(shell git describe --tags --abbrev=0)
+
+VERSION_LDFLAGS := \
+ -X main.Version=$(TAG_VERSION) \
+ -X main.Revision=$(REVISION) \
+ -X main.BuildUser=$(BUILDUSER) \
+ -X main.BuildDate=$(BUILDDATE)
+
+all: format vet test build
+
+.PHONY: format
+format:
+ @echo ">> formatting code"
+ go fmt $(pkgs)
+
+.PHONY: vet
+vet:
+ @echo ">> vetting code"
+ go vet $(pkgs)
+
+.PHONY: test
+test:
+ @echo ">> running short tests"
+ go test -short $(pkgs)
+
+.PHONY: build
+build:
+ @echo ">> building code"
+ go mod vendor
+ GO11MODULE=on GO111MODULE=on GOPROXY=https://goproxy.io \
+ go build -ldflags "$(VERSION_LDFLAGS)" -o PrometheusAlert
+
+.PHONY: docker
+docker:
+ @echo ">> building docker image"
+ docker build -t "$(DOCKER_IMAGE_NAME):$(TAG_VERSION)" .
+ docker tag "$(DOCKER_IMAGE_NAME):$(TAG_VERSION)" "$(DOCKER_IMAGE_NAME):latest"
+
+.PHONY: docker-push
+docker-push:
+ @echo ">> pushing docker image"
+ docker push "$(DOCKER_IMAGE_NAME):$(TAG_VERSION)"
+ docker push "$(DOCKER_IMAGE_NAME):latest"
+
+.PHONY: docker-test
+docker-test:
+ @echo ">> testing docker image and PrometheusAlert's health"
+ cmd/test_image.sh "$(DOCKER_IMAGE_NAME):$(TAG_VERSION)" 8080
diff --git a/README.MD b/README.MD
index af644ae9..dd0532d5 100644
--- a/README.MD
+++ b/README.MD
@@ -29,6 +29,46 @@ PrometheusAlert是开源的运维告警中心消息转发系统,支持主流
+
+## 构建
+
+应用信息和构建相关的命令都写入了Makefile,请确保安装`make`, `git`, `go`命令。如有特定需要,请自行修改Makefile。
+
+```bash
+# 默认
+make
+
+# 只运行构建
+make build
+
+# 运行 go fmt
+make format
+
+# 运行 go vet
+make vet
+
+# 构建镜像
+make docker
+
+# 推送镜像
+make docker-push
+
+# 运行镜像测试
+make docker-test
+
+
+# 运行
+copy conf/app-example.conf conf/app.conf
+./PrometheusAlert
+# 测试应用健康
+curl http://localhost:8080/health
+```
+
+
+
+
+
+
## 启动
```
diff --git a/cmd/test_image.sh b/cmd/test_image.sh
new file mode 100755
index 00000000..fe7157ae
--- /dev/null
+++ b/cmd/test_image.sh
@@ -0,0 +1,37 @@
+#!/bin/bash
+ set -eo pipefail
+
+docker_image=$1
+port=$2
+
+container_id=''
+
+wait_start() {
+ for _ in {1..10}; do
+ if /usr/bin/curl -s -m 5 -f "http://localhost:${port}/health"; then
+ docker_cleanup
+ exit 0
+ else
+ sleep 1
+ fi
+ done
+
+ exit 1
+}
+
+docker_start() {
+ container_id=$(docker run --rm -d -p "${port}":"${port}" "${docker_image}")
+}
+
+docker_cleanup() {
+ echo ">> cleaning up container"
+ docker kill "${container_id}"
+}
+
+if [[ "$#" -ne 2 ]] ; then
+ echo "Usage: $0 feiyu563/prometheus-alert 8080" >&2
+ exit 1
+fi
+
+docker_start
+wait_start
diff --git a/controllers/default.go b/controllers/default.go
index 9143b502..4610d0eb 100644
--- a/controllers/default.go
+++ b/controllers/default.go
@@ -3,12 +3,13 @@ package controllers
import (
"PrometheusAlert/models"
"bytes"
+ "encoding/json"
"strconv"
- "time"
"text/template"
+ "time"
+
"github.com/astaxie/beego"
"github.com/astaxie/beego/logs"
- "encoding/json"
)
//取到tpl路径
@@ -25,6 +26,11 @@ func (c *MainController) Get() {
c.Data["IsLogin"] = checkAccount(c.Ctx)
}
+// Health returns Hello 200
+func (c *MainController) Health() {
+ c.Ctx.WriteString("Hello!\n")
+}
+
//test page
func (c *MainController) Test() {
if !checkAccount(c.Ctx) {
@@ -145,13 +151,13 @@ func (c *MainController) MarkdownTest() {
buf := new(bytes.Buffer)
tpl, err := template.New("").Funcs(funcMap).Parse(TplContent)
if err != nil {
- resp=err.Error()
+ resp = err.Error()
} else {
- err=tpl.Execute(buf, p_json)
- if err!=nil {
- resp=err.Error()
+ err = tpl.Execute(buf, p_json)
+ if err != nil {
+ resp = err.Error()
} else {
- resp=buf.String()
+ resp = buf.String()
}
}
c.Data["json"] = resp
diff --git a/controllers/graylog3.go b/controllers/graylog3.go
index 049443f4..369e25b2 100644
--- a/controllers/graylog3.go
+++ b/controllers/graylog3.go
@@ -20,13 +20,13 @@ type Graylog3 struct {
Backlogs []Backlog `json:"backlog"`
}
type AlertEvent struct {
- Source string `json:"source`
+ Source string `json:"source"`
}
type Backlog struct {
Timestamp string `json:"timestamp"` //开始时间
Index string `json:"index"` //索引
Message string `json:"message"`
- Fields G3Field `json:"fields`
+ Fields G3Field `json:"fields"`
}
type G3Field struct {
Gl2RemoteIp string `json:"gl2_remote_ip"`
diff --git a/controllers/huawei.go b/controllers/huawei.go
index e02ac832..f3b8184d 100644
--- a/controllers/huawei.go
+++ b/controllers/huawei.go
@@ -34,7 +34,7 @@ func PostHWmessage(Messages string, PhoneNumbers, logsign string) string {
digestBase64 := base64.StdEncoding.EncodeToString([]byte(digest))
xheader := `"UsernameToken Username="` + hwappkey + `",PasswordDigest="` + digestBase64 + `",Nonce="` + nonce + `",Created="` + now + `"`
//生成form数据
- FormData:=strings.NewReader(url.Values{"from": {sender}, "to": {PhoneNumbers}, "templateId": {hwtplid}, "templateParas": {"[\"" + Messages + "\"]"}, "signature": {hwsign}, "statusCallback": {""}, "extend": {logsign}}.Encode())
+ FormData := strings.NewReader(url.Values{"from": {sender}, "to": {PhoneNumbers}, "templateId": {hwtplid}, "templateParas": {"[\"" + Messages + "\"]"}, "signature": {hwsign}, "statusCallback": {""}, "extend": {logsign}}.Encode())
var tr *http.Transport
if proxyUrl := beego.AppConfig.String("proxy"); proxyUrl != "" {
proxy := func(_ *http.Request) (*url.URL, error) {
diff --git a/controllers/prometheus.go b/controllers/prometheus.go
index edc2d362..f0d20e4b 100644
--- a/controllers/prometheus.go
+++ b/controllers/prometheus.go
@@ -38,7 +38,7 @@ type Annotations struct {
Email string `json:"email"` //2020年7月4日 10:15:20 增加多个email告警支持
Groupid string `json:"groupid"` //2021年2月2日 17:28:23 增加多个如流告警支持
AtSomeOne string `json:"at"` //2021年6月23日 14:02:21 增加@某人支持
- Rr string `json:"rr"` //2021年9月14日 14:48:08 增加随机轮询参数支持
+ Rr string `json:"rr"` //2021年9月14日 14:48:08 增加随机轮询参数支持
}
type Alerts struct {
Status string
diff --git a/controllers/prometheusalert.go b/controllers/prometheusalert.go
index 7ef2060c..371c2d01 100644
--- a/controllers/prometheusalert.go
+++ b/controllers/prometheusalert.go
@@ -5,10 +5,10 @@ import (
"PrometheusAlert/models"
"bytes"
"encoding/json"
- "strings"
- "text/template"
"github.com/astaxie/beego"
"github.com/astaxie/beego/logs"
+ "strings"
+ "text/template"
)
type PrometheusAlertController struct {
@@ -119,7 +119,7 @@ func (c *PrometheusAlertController) PrometheusAlert() {
P_groupid = beego.AppConfig.String("BDRL_ID")
}
P_atsomeone := c.Input().Get("at")
- P_rr:=c.Input().Get("rr")
+ P_rr := c.Input().Get("rr")
//get tpl
message := ""
funcMap := template.FuncMap{
@@ -140,7 +140,7 @@ func (c *PrometheusAlertController) PrometheusAlert() {
message = err.Error()
} else {
tpl.Execute(buf, p_json)
- message = SendMessagePrometheusAlert(buf.String(), P_type, P_ddurl, P_wxurl, P_fsurl, P_webhookurl, P_phone, P_email, P_touser, P_toparty, P_totag, P_groupid, P_atsomeone,P_rr,logsign)
+ message = SendMessagePrometheusAlert(buf.String(), P_type, P_ddurl, P_wxurl, P_fsurl, P_webhookurl, P_phone, P_email, P_touser, P_toparty, P_totag, P_groupid, P_atsomeone, P_rr, logsign)
}
} else {
message = "接口参数缺失!"
@@ -150,7 +150,7 @@ func (c *PrometheusAlertController) PrometheusAlert() {
c.ServeJSON()
}
-func SendMessagePrometheusAlert(message, ptype, pddurl, pwxurl, pfsurl, pwebhookurl, pphone, email, ptouser, ptoparty, ptotag, pgroupid, patsomeone,prr, logsign string) string {
+func SendMessagePrometheusAlert(message, ptype, pddurl, pwxurl, pfsurl, pwebhookurl, pphone, email, ptouser, ptoparty, ptotag, pgroupid, patsomeone, prr, logsign string) string {
Title := beego.AppConfig.String("title")
ret := ""
model.AlertsFromCounter.WithLabelValues("PrometheusAlert", message, "", "", "").Add(1)
@@ -158,7 +158,7 @@ func SendMessagePrometheusAlert(message, ptype, pddurl, pwxurl, pfsurl, pwebhook
//微信渠道
case "wx":
Wxurl := strings.Split(pwxurl, ",")
- if prr=="true" {
+ if prr == "true" {
ret += PostToWeiXin(message, DoBalance(Wxurl), patsomeone, logsign)
} else {
for _, url := range Wxurl {
@@ -169,7 +169,7 @@ func SendMessagePrometheusAlert(message, ptype, pddurl, pwxurl, pfsurl, pwebhook
//钉钉渠道
case "dd":
Ddurl := strings.Split(pddurl, ",")
- if prr=="true" {
+ if prr == "true" {
ret += PostToDingDing(Title+"告警消息", message, DoBalance(Ddurl), patsomeone, logsign)
} else {
for _, url := range Ddurl {
@@ -180,7 +180,7 @@ func SendMessagePrometheusAlert(message, ptype, pddurl, pwxurl, pfsurl, pwebhook
//飞书渠道
case "fs":
Fsurl := strings.Split(pfsurl, ",")
- if prr=="true" {
+ if prr == "true" {
ret += PostToFS(Title+"告警消息", message, DoBalance(Fsurl), patsomeone, logsign)
} else {
for _, url := range Fsurl {
@@ -191,7 +191,7 @@ func SendMessagePrometheusAlert(message, ptype, pddurl, pwxurl, pfsurl, pwebhook
//Webhook渠道
case "webhook":
Fwebhookurl := strings.Split(pwebhookurl, ",")
- if prr=="true" {
+ if prr == "true" {
ret += PostToWebhook(message, DoBalance(Fwebhookurl), logsign)
} else {
for _, url := range Fwebhookurl {
diff --git a/controllers/public.go b/controllers/public.go
index 9f7b2b93..8e7777cd 100644
--- a/controllers/public.go
+++ b/controllers/public.go
@@ -2,13 +2,13 @@ package controllers
import (
"bufio"
+ "github.com/astaxie/beego"
+ "github.com/astaxie/beego/logs"
+ "math/rand"
"os"
"strconv"
"strings"
"time"
- "math/rand"
- "github.com/astaxie/beego"
- "github.com/astaxie/beego/logs"
)
//转换时间戳到时间字符串
@@ -109,11 +109,11 @@ func GetUserPhone(neednum int) string {
// 随机返回
func DoBalance(instances []string) string {
if len(instances) == 0 {
- logs.Error( "no instances for rand")
+ logs.Error("no instances for rand")
return ""
}
lens := len(instances)
index := rand.Intn(lens)
inst := instances[index]
return inst
-}
\ No newline at end of file
+}
diff --git a/controllers/ronglianyun.go b/controllers/ronglianyun.go
index a75220f4..99af56c7 100644
--- a/controllers/ronglianyun.go
+++ b/controllers/ronglianyun.go
@@ -7,12 +7,13 @@ import (
"encoding/base64"
"encoding/json"
"fmt"
- "github.com/astaxie/beego"
- "github.com/astaxie/beego/logs"
"io/ioutil"
"net/http"
"strings"
"time"
+
+ "github.com/astaxie/beego"
+ "github.com/astaxie/beego/logs"
)
//定义语音请求body结构体
@@ -93,6 +94,9 @@ func PostRLYphonecall(CallMessage, PhoneNumber, logsign string) string {
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", encodeAuth)
resp, err := client.Do(req)
+ if err != nil {
+ logs.Error(logsign, "[rlyphonecall]", err.Error())
+ }
defer resp.Body.Close()
if body, err = ioutil.ReadAll(resp.Body); err != nil {
diff --git a/controllers/zabbix.go b/controllers/zabbix.go
index 2962348b..47f42c50 100644
--- a/controllers/zabbix.go
+++ b/controllers/zabbix.go
@@ -35,74 +35,74 @@ func SendMessageZabbix(message ZabbixMessage, logsign string) string {
switch message.ZabbixType {
//微信渠道
case "wx":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=beego.AppConfig.String("wxurl")
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = beego.AppConfig.String("wxurl")
}
- ret = PostToWeiXin(message.ZabbixMessage, message.ZabbixTarget, "",logsign)
+ ret = PostToWeiXin(message.ZabbixMessage, message.ZabbixTarget, "", logsign)
//钉钉渠道
case "dd":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=beego.AppConfig.String("ddurl")
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = beego.AppConfig.String("ddurl")
}
- ret = PostToDingDing("Zabbix告警消息", message.ZabbixMessage, message.ZabbixTarget, "",logsign)
+ ret = PostToDingDing("Zabbix告警消息", message.ZabbixMessage, message.ZabbixTarget, "", logsign)
//飞书渠道
case "fs":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=beego.AppConfig.String("fsurl")
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = beego.AppConfig.String("fsurl")
}
- ret = PostToFS("Zabbix告警消息", message.ZabbixMessage, message.ZabbixTarget, "",logsign)
+ ret = PostToFS("Zabbix告警消息", message.ZabbixMessage, message.ZabbixTarget, "", logsign)
//腾讯云短信
case "txdx":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=GetUserPhone(1)
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = GetUserPhone(1)
}
ret = PostTXmessage(message.ZabbixMessage, message.ZabbixTarget, logsign)
//华为云短信
case "hwdx":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=GetUserPhone(1)
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = GetUserPhone(1)
}
ret = ret + PostHWmessage(message.ZabbixMessage, message.ZabbixTarget, logsign)
//百度云短信
case "bddx":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=GetUserPhone(1)
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = GetUserPhone(1)
}
ret = ret + PostBDYmessage(message.ZabbixMessage, message.ZabbixTarget, logsign)
//阿里云短信
case "alydx":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=GetUserPhone(1)
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = GetUserPhone(1)
}
ret = ret + PostALYmessage(message.ZabbixMessage, message.ZabbixTarget, logsign)
//腾讯云电话
case "txdh":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=GetUserPhone(1)
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = GetUserPhone(1)
}
ret = PostTXphonecall(message.ZabbixMessage, message.ZabbixTarget, logsign)
//阿里云电话
case "alydh":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=GetUserPhone(1)
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = GetUserPhone(1)
}
ret = ret + PostALYphonecall(message.ZabbixMessage, message.ZabbixTarget, logsign)
//容联云电话
case "rlydh":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=GetUserPhone(1)
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = GetUserPhone(1)
}
ret = ret + PostRLYphonecall(message.ZabbixMessage, message.ZabbixTarget, logsign)
//7mo短信
case "7moordx":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=GetUserPhone(1)
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = GetUserPhone(1)
}
ret = ret + Post7MOORmessage(message.ZabbixMessage, message.ZabbixTarget, logsign)
//7mo电话
case "7moordh":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=GetUserPhone(1)
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = GetUserPhone(1)
}
ret = ret + Post7MOORphonecall(message.ZabbixMessage, message.ZabbixTarget, logsign)
//telegram
@@ -110,11 +110,11 @@ func SendMessageZabbix(message ZabbixMessage, logsign string) string {
ret = ret + SendTG(message.ZabbixMessage, logsign)
//workwechat
case "workwechat":
- ret = ret + SendWorkWechat(beego.AppConfig.String("WorkWechat_ToUser"),beego.AppConfig.String("WorkWechat_ToParty"), beego.AppConfig.String("WorkWechat_ToTag"),message.ZabbixMessage, logsign)
+ ret = ret + SendWorkWechat(beego.AppConfig.String("WorkWechat_ToUser"), beego.AppConfig.String("WorkWechat_ToParty"), beego.AppConfig.String("WorkWechat_ToTag"), message.ZabbixMessage, logsign)
//百度Hi(如流)
case "rl":
- if message.ZabbixTarget=="" {
- message.ZabbixTarget=beego.AppConfig.String("BDRL_URL")
+ if message.ZabbixTarget == "" {
+ message.ZabbixTarget = beego.AppConfig.String("BDRL_URL")
}
ret = PostToRuLiu(beego.AppConfig.String("BDRL_ID"), message.ZabbixMessage, message.ZabbixTarget, logsign)
//异常参数
diff --git a/example/helm/prometheusalert/templates/deployment.yaml b/example/helm/prometheusalert/templates/deployment.yaml
index 534aceb9..af294a5d 100644
--- a/example/helm/prometheusalert/templates/deployment.yaml
+++ b/example/helm/prometheusalert/templates/deployment.yaml
@@ -36,12 +36,22 @@ spec:
subPath: user.csv
livenessProbe:
httpGet:
- path: /
+ path: /health
port: http
+ failureThreshold: 3
+ initialDelaySeconds: 10
+ periodSeconds: 20
+ successThreshold: 1
+ timeoutSeconds: 3
readinessProbe:
httpGet:
- path: /
+ path: /health
port: http
+ failureThreshold: 3
+ initialDelaySeconds: 10
+ periodSeconds: 20
+ successThreshold: 1
+ timeoutSeconds: 3
resources:
{{ toYaml .Values.resources | indent 12 }}
{{- with .Values.nodeSelector }}
@@ -64,4 +74,4 @@ spec:
- key: app.conf
path: app.conf
- key: user.csv
- path: user.csv
\ No newline at end of file
+ path: user.csv
diff --git a/main.go b/main.go
index 72fc76b5..3fb418c4 100644
--- a/main.go
+++ b/main.go
@@ -4,6 +4,10 @@ import (
"PrometheusAlert/model"
"PrometheusAlert/models"
_ "PrometheusAlert/routers"
+ "os"
+ "path"
+ "runtime"
+
"github.com/astaxie/beego"
"github.com/astaxie/beego/logs"
"github.com/astaxie/beego/orm"
@@ -11,8 +15,15 @@ import (
_ "github.com/lib/pq"
_ "github.com/mattn/go-sqlite3"
"github.com/prometheus/client_golang/prometheus/promhttp"
- "os"
- "path"
+)
+
+// Infos are set at build time use ldflags.
+var (
+ Version string
+ Revision string
+ BuildUser string
+ BuildDate string
+ GoVersion = runtime.Version()
)
func IsExist(path string) bool {
@@ -66,7 +77,13 @@ func main() {
logpath := beego.AppConfig.String("logpath")
logs.SetLogger(logtype, `{"filename":"`+logpath+`"}`)
}
- logs.Info("[main] 当前版本(Version)4.6.1")
+ // 输出应用信息
+ logs.Info("[main] 构建的Go版本: ", GoVersion)
+ logs.Info("[main] 应用当前版本: ", Version)
+ logs.Info("[main] 应用当前提交: ", Revision)
+ logs.Info("[main] 应用构建时间: ", BuildDate)
+ logs.Info("[main] 应用构建用户: ", BuildUser)
+
model.MetricsInit()
beego.Handler("/metrics", promhttp.Handler())
beego.Run()
diff --git a/routers/router.go b/routers/router.go
index 86435c3d..fd1d0a2e 100644
--- a/routers/router.go
+++ b/routers/router.go
@@ -19,6 +19,8 @@ func init() {
beego.Router("/template/del", &controllers.MainController{}, "get:TemplateDel")
beego.Router("/alerttest", &controllers.MainController{}, "post:AlertTest")
beego.Router("/markdowntest", &controllers.MainController{}, "get,post:MarkdownTest")
+ // health
+ beego.Router("/health", &controllers.MainController{}, "get:Health")
//prometheus
beego.Router("/prometheus/alert", &controllers.PrometheusController{}, "post:PrometheusAlert")
diff --git a/tests/default_test.go b/tests/default_test.go
index 2fa07eea..2a494e9d 100644
--- a/tests/default_test.go
+++ b/tests/default_test.go
@@ -13,14 +13,14 @@ import (
)
func init() {
- _, file, _, _ := runtime.Caller(1)
+ _, file, _, _ := runtime.Caller(0)
apppath, _ := filepath.Abs(filepath.Dir(filepath.Join(file, ".."+string(filepath.Separator))))
beego.TestBeegoInit(apppath)
}
// TestBeego is a sample to run an endpoint test
func TestBeego(t *testing.T) {
- r, _ := http.NewRequest("GET", "/", nil)
+ r, _ := http.NewRequest("GET", "/health", nil)
w := httptest.NewRecorder()
beego.BeeApp.Handlers.ServeHTTP(w, r)