diff --git a/client/src/views/ChangeLogView.vue b/client/src/views/ChangeLogView.vue
index 3c39d73..1cca4e3 100644
--- a/client/src/views/ChangeLogView.vue
+++ b/client/src/views/ChangeLogView.vue
@@ -68,14 +68,6 @@
-
-
- 占位
-
-
-
- 占位
-
diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml
index 44af2d4..a2f544a 100644
--- a/docker-compose.prod.yml
+++ b/docker-compose.prod.yml
@@ -56,6 +56,7 @@ services:
volumes:
- ./configs:/app/configs:ro
- ./config.docker.json:/app/config.json:ro
+ - ./internal/deploy/config.yaml:/app/internal/deploy/config.yaml:ro
ports:
- "8080:8080"
healthcheck:
diff --git a/docs/alerting/database-design.md b/docs/alerting/database-design.md
index 7b2ff1b..bdf9105 100644
--- a/docs/alerting/database-design.md
+++ b/docs/alerting/database-design.md
@@ -157,7 +157,7 @@ erDiagram
timestamp report_at
timestamp resolved_at
varchar health_state
- varchar correlation_id
+ varchar alert_issue_ids
}
alert_issues {
diff --git a/docs/service_manager/model/schema.sql b/docs/service_manager/model/schema.sql
index 0f8d2ef..8f62f20 100644
--- a/docs/service_manager/model/schema.sql
+++ b/docs/service_manager/model/schema.sql
@@ -37,7 +37,7 @@ CREATE TABLE IF NOT EXISTS service_states (
report_at TIMESTAMP,
resolved_at TIMESTAMP,
health_state VARCHAR(50),
- correlation_id VARCHAR(255),
+ alert_issue_ids VARCHAR(255),
PRIMARY KEY (service, version),
FOREIGN KEY (service) REFERENCES services(name) ON DELETE CASCADE
);
diff --git a/go.mod b/go.mod
index a499363..c837d62 100644
--- a/go.mod
+++ b/go.mod
@@ -3,7 +3,8 @@ module github.com/qiniu/zeroops
go 1.24
require (
- github.com/gin-gonic/gin v1.10.1
+ github.com/fox-gonic/fox v0.0.8
+ github.com/gin-gonic/gin v1.11.0
github.com/google/uuid v1.6.0
github.com/jackc/pgx/v5 v5.5.5
github.com/lib/pq v1.10.9
@@ -15,24 +16,24 @@ require (
)
require (
- github.com/bytedance/sonic v1.13.3 // indirect
- github.com/bytedance/sonic/loader v0.2.4 // indirect
+ github.com/bytedance/sonic v1.14.0 // indirect
+ github.com/bytedance/sonic/loader v0.3.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
- github.com/cloudwego/base64x v0.1.5 // indirect
+ github.com/cloudwego/base64x v0.1.6 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
github.com/gin-contrib/cors v1.7.6 // indirect
github.com/gin-contrib/sse v1.1.0 // indirect
- github.com/gin-gonic/gin v1.10.1 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.27.0 // indirect
github.com/goccy/go-json v0.10.5 // indirect
+ github.com/goccy/go-yaml v1.18.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/json-iterator/go v1.1.12 // indirect
- github.com/klauspost/cpuid/v2 v2.2.10 // indirect
+ github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
@@ -43,14 +44,19 @@ require (
github.com/natefinch/lumberjack v2.0.0+incompatible // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
+ github.com/quic-go/qpack v0.5.1 // indirect
+ github.com/quic-go/quic-go v0.54.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.3.0 // indirect
+ go.uber.org/mock v0.5.0 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
- golang.org/x/arch v0.18.0 // indirect
+ golang.org/x/arch v0.20.0 // indirect
golang.org/x/crypto v0.41.0 // indirect
+ golang.org/x/mod v0.26.0 // indirect
golang.org/x/net v0.43.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.28.0 // indirect
- google.golang.org/protobuf v1.36.8 // indirect
+ golang.org/x/tools v0.35.0 // indirect
+ google.golang.org/protobuf v1.36.9 // indirect
)
diff --git a/go.sum b/go.sum
index 2c92f4d..0c16fb7 100644
--- a/go.sum
+++ b/go.sum
@@ -6,16 +6,14 @@ github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0=
-github.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=
-github.com/bytedance/sonic v1.13.3/go.mod h1:o68xyaF9u2gvVBuGHPlUVCy+ZfmNNO5ETf1+KgkJhz4=
-github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU=
-github.com/bytedance/sonic/loader v0.2.4 h1:ZWCw4stuXUsn1/+zQDqeE7JKP+QO47tz7QCNan80NzY=
-github.com/bytedance/sonic/loader v0.2.4/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
+github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
+github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
+github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
+github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
-github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
-github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
-github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
+github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
+github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -24,16 +22,16 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
-github.com/fox-gonic/fox v0.0.6 h1:Otz6bTpiboGfCoAp4bTDZOTxI6PQw1uEID/VZRlklws=
-github.com/fox-gonic/fox v0.0.6/go.mod h1:l1C0zu5H44YV60tEq6rbNRvv0z14hnlpsl8lMlzqpFg=
+github.com/fox-gonic/fox v0.0.8 h1:yg2VoCFbfBgnSXgC6PODoA+Nf5V5MzpJg7hZC+d27b8=
+github.com/fox-gonic/fox v0.0.8/go.mod h1:53l0D/V0ohvtRBCXOYELAnQSgnX4jm551Gi4ssaAjIM=
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/gin-contrib/cors v1.7.6 h1:3gQ8GMzs1Ylpf70y8bMw4fVpycXIeX1ZemuSQIsnQQY=
github.com/gin-contrib/cors v1.7.6/go.mod h1:Ulcl+xN4jel9t1Ry8vqph23a60FwH9xVLd+3ykmTjOk=
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM=
-github.com/gin-gonic/gin v1.10.1 h1:T0ujvqyCSqRopADpgPgiTT63DUQVSfojyME59Ei63pQ=
-github.com/gin-gonic/gin v1.10.1/go.mod h1:4PMNQiOhvDRa013RKVbsiNwoyezlm2rm0uX/T7kzp5Y=
+github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk=
+github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
@@ -44,6 +42,8 @@ github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHO
github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
+github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
+github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
@@ -62,10 +62,8 @@ github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2E
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
-github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
-github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
-github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
+github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
+github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -108,6 +106,10 @@ github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9Z
github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
+github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI=
+github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg=
+github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg=
+github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY=
github.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8=
github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
@@ -129,12 +131,16 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA=
github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4=
+go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU=
+go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
-golang.org/x/arch v0.18.0 h1:WN9poc33zL4AzGxqf8VtpKUnGvMi8O9lhNyBMF/85qc=
-golang.org/x/arch v0.18.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
+golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c=
+golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
+golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
+golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
@@ -148,8 +154,10 @@ golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
-google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
-google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
+golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
+golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
+google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw=
+google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
@@ -160,4 +168,3 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
diff --git a/internal/alerting/README.md b/internal/alerting/README.md
index af756db..97facd4 100644
--- a/internal/alerting/README.md
+++ b/internal/alerting/README.md
@@ -181,7 +181,6 @@ docker exec -i zeroops-postgres-1 psql -U postgres -d zeroops -c \
```bash
# 方式 A:通过 docker 容器执行(推荐 dev,本仓文档默认使用名为 zeroops-postgres-1 的容器)
cat scripts/sql/alert_rules_bootstrap.sql | docker exec -i zeroops-postgres-1 psql -U postgres -d zeroops
-
# 方式 B:本机已安装 psql 客户端
psql -U postgres -d zeroops -f scripts/sql/alert_rules_bootstrap.sql
```
diff --git a/internal/alerting/service/healthcheck/common_test.go b/internal/alerting/service/healthcheck/common_test.go
new file mode 100644
index 0000000..cf6bfae
--- /dev/null
+++ b/internal/alerting/service/healthcheck/common_test.go
@@ -0,0 +1,14 @@
+package healthcheck
+
+import (
+ "fmt"
+ "math"
+ "testing"
+)
+
+func TestCommon(t *testing.T) {
+ baseTh := 97.0
+
+ newThreshold := baseTh - math.Ceil(baseTh*0.01)
+ fmt.Println(newThreshold)
+}
diff --git a/internal/alerting/service/healthcheck/scheduler.go b/internal/alerting/service/healthcheck/scheduler.go
index 7fc603d..48ae498 100644
--- a/internal/alerting/service/healthcheck/scheduler.go
+++ b/internal/alerting/service/healthcheck/scheduler.go
@@ -357,7 +357,7 @@ func runPrometheusAnomalyDetection(ctx context.Context, deps PrometheusDeps) err
log.Debug().Str("alert_name", q.AlertName).Str("service", service).Str("version", version).Msg("no exact meta threshold found; skip")
continue
}
- newThreshold := baseTh * 0.99
+ newThreshold := baseTh - math.Ceil(baseTh*0.01)
// fetch all metas for this service (across versions)
metas, ferr := fetchMetasForService(ctx, deps.DB, q.AlertName, service)
diff --git a/internal/alerting/service/receiver/auth.go b/internal/alerting/service/receiver/auth.go
index f275894..587e0a0 100644
--- a/internal/alerting/service/receiver/auth.go
+++ b/internal/alerting/service/receiver/auth.go
@@ -1,67 +1,11 @@
package receiver
import (
- "net/http"
- "os"
-
"github.com/gin-gonic/gin"
)
-var (
- cfgBasicUser string
- cfgBasicPass string
- cfgBearer string
-)
-
-// ConfigureAuth sets credentials for webhook auth (config-driven). Empty values disable that auth type.
-func ConfigureAuth(user, pass, bearer string) {
- cfgBasicUser = user
- cfgBasicPass = pass
- cfgBearer = bearer
-}
-
-func authEnabled() bool {
- // prefer config
- if cfgBasicUser != "" || cfgBasicPass != "" || cfgBearer != "" {
- return true
- }
- // fallback to env for backward compatibility
- return os.Getenv("ALERT_WEBHOOK_BASIC_USER") != "" ||
- os.Getenv("ALERT_WEBHOOK_BASIC_PASS") != "" ||
- os.Getenv("ALERT_WEBHOOK_BEARER") != ""
-}
+// ConfigureAuth is a no-op; authentication disabled at source.
+func ConfigureAuth(user, pass, bearer string) {}
// AuthMiddleware returns false if unauthorized and writes a 401 response.
-func AuthMiddleware(c *gin.Context) bool {
- if !authEnabled() {
- return true
- }
-
- // prefer config
- user := cfgBasicUser
- pass := cfgBasicPass
- bearer := cfgBearer
- // fallback to env if not set in config
- if user == "" && pass == "" && bearer == "" {
- user = os.Getenv("ALERT_WEBHOOK_BASIC_USER")
- pass = os.Getenv("ALERT_WEBHOOK_BASIC_PASS")
- bearer = os.Getenv("ALERT_WEBHOOK_BEARER")
- }
-
- if user != "" || pass != "" {
- u, p, ok := c.Request.BasicAuth()
- if !ok || u != user || p != pass {
- c.JSON(http.StatusUnauthorized, map[string]any{"ok": false, "error": "unauthorized"})
- return false
- }
- return true
- }
-
- if bearer != "" {
- if c.GetHeader("Authorization") != "Bearer "+bearer {
- c.JSON(http.StatusUnauthorized, map[string]any{"ok": false, "error": "unauthorized"})
- return false
- }
- }
- return true
-}
+func AuthMiddleware(c *gin.Context) bool { return true }
diff --git a/internal/service_manager/api/deploy_api.go b/internal/service_manager/api/deploy_api.go
index f31dae1..8be100d 100644
--- a/internal/service_manager/api/deploy_api.go
+++ b/internal/service_manager/api/deploy_api.go
@@ -4,14 +4,14 @@ import (
"net/http"
"strconv"
- "github.com/fox-gonic/fox"
+ "github.com/gin-gonic/gin"
"github.com/qiniu/zeroops/internal/service_manager/model"
"github.com/qiniu/zeroops/internal/service_manager/service"
"github.com/rs/zerolog/log"
)
// setupDeployRouters 设置部署管理相关路由
-func (api *Api) setupDeployRouters(router *fox.Engine) {
+func (api *Api) setupDeployRouters(router *gin.Engine) {
// 部署任务基本操作
router.POST("/v1/deployments", api.CreateDeployment)
router.GET("/v1/deployments", api.GetDeployments)
@@ -28,7 +28,7 @@ func (api *Api) setupDeployRouters(router *fox.Engine) {
// ===== 部署任务基本操作 =====
// CreateDeployment 创建发布任务(POST /v1/deployments)
-func (api *Api) CreateDeployment(c *fox.Context) {
+func (api *Api) CreateDeployment(c *gin.Context) {
ctx := c.Request.Context()
var req model.CreateDeploymentRequest
@@ -79,7 +79,7 @@ func (api *Api) CreateDeployment(c *fox.Context) {
}
// GetDeploymentByServiceAndVersion 获取发布任务详情(GET /v1/deployments/:service/:version)
-func (api *Api) GetDeploymentByServiceAndVersion(c *fox.Context) {
+func (api *Api) GetDeploymentByServiceAndVersion(c *gin.Context) {
ctx := c.Request.Context()
serviceName := c.Param("service")
versionName := c.Param("version")
@@ -113,7 +113,7 @@ func (api *Api) GetDeploymentByServiceAndVersion(c *fox.Context) {
}
// GetDeployments 获取发布任务列表(GET /v1/deployments)
-func (api *Api) GetDeployments(c *fox.Context) {
+func (api *Api) GetDeployments(c *gin.Context) {
ctx := c.Request.Context()
query := &model.DeploymentQuery{
@@ -144,7 +144,7 @@ func (api *Api) GetDeployments(c *fox.Context) {
}
// UpdateDeployment 修改发布任务(POST /v1/deployments/:service/:version)
-func (api *Api) UpdateDeployment(c *fox.Context) {
+func (api *Api) UpdateDeployment(c *gin.Context) {
ctx := c.Request.Context()
serviceName := c.Param("service")
versionName := c.Param("version")
@@ -196,7 +196,7 @@ func (api *Api) UpdateDeployment(c *fox.Context) {
}
// DeleteDeployment 删除发布任务(DELETE /v1/deployments/:service/:version)
-func (api *Api) DeleteDeployment(c *fox.Context) {
+func (api *Api) DeleteDeployment(c *gin.Context) {
ctx := c.Request.Context()
serviceName := c.Param("service")
versionName := c.Param("version")
@@ -241,7 +241,7 @@ func (api *Api) DeleteDeployment(c *fox.Context) {
// ===== 部署任务控制操作 =====
// PauseDeployment 暂停发布任务(POST /v1/deployments/:service/:version/pause)
-func (api *Api) PauseDeployment(c *fox.Context) {
+func (api *Api) PauseDeployment(c *gin.Context) {
ctx := c.Request.Context()
serviceName := c.Param("service")
versionName := c.Param("version")
@@ -284,7 +284,7 @@ func (api *Api) PauseDeployment(c *fox.Context) {
}
// ContinueDeployment 继续发布任务(POST /v1/deployments/:service/:version/continue)
-func (api *Api) ContinueDeployment(c *fox.Context) {
+func (api *Api) ContinueDeployment(c *gin.Context) {
ctx := c.Request.Context()
serviceName := c.Param("service")
versionName := c.Param("version")
@@ -327,7 +327,7 @@ func (api *Api) ContinueDeployment(c *fox.Context) {
}
// RollbackDeployment 回滚发布任务(POST /v1/deployments/:service/:version/rollback)
-func (api *Api) RollbackDeployment(c *fox.Context) {
+func (api *Api) RollbackDeployment(c *gin.Context) {
ctx := c.Request.Context()
serviceName := c.Param("service")
versionName := c.Param("version")
diff --git a/internal/service_manager/database/info_repo.go b/internal/service_manager/database/info_repo.go
index 0eb9e42..151d49c 100644
--- a/internal/service_manager/database/info_repo.go
+++ b/internal/service_manager/database/info_repo.go
@@ -155,7 +155,7 @@ func (d *Database) CreateServiceInstance(ctx context.Context, instance *model.Se
// GetServiceState 获取服务状态
func (d *Database) GetServiceState(ctx context.Context, serviceName string) (*model.ServiceState, error) {
- query := `SELECT service, version, report_at, resolved_at, health_state, correlation_id
+ query := `SELECT service, version, report_at, resolved_at, health_state, alert_issue_ids
FROM service_states WHERE service = $1 ORDER BY report_at DESC LIMIT 1`
row := d.QueryRowContext(ctx, query, serviceName)
diff --git a/internal/service_manager/model/service_state.go b/internal/service_manager/model/service_state.go
index cf737aa..7544511 100644
--- a/internal/service_manager/model/service_state.go
+++ b/internal/service_manager/model/service_state.go
@@ -4,10 +4,10 @@ import "time"
// ServiceState 服务状态信息
type ServiceState struct {
- Service string `json:"service" db:"service"` // varchar(255) - 联合PK
- Version string `json:"version" db:"version"` // varchar(255) - 联合PK
- ReportAt time.Time `json:"reportAt" db:"report_at"` // time - 报告时间
- ResolvedAt *time.Time `json:"resolvedAt" db:"resolved_at"` // time - 解决时间
- HealthState HealthState `json:"healthState" db:"health_state"` // 健康状态
- CorrelationID string `json:"correlationId" db:"correlation_id"` // varchar - 关联ID
+ Service string `json:"service" db:"service"` // varchar(255) - 联合PK
+ Version string `json:"version" db:"version"` // varchar(255) - 联合PK
+ ReportAt time.Time `json:"reportAt" db:"report_at"` // time - 报告时间
+ ResolvedAt *time.Time `json:"resolvedAt" db:"resolved_at"` // time - 解决时间
+ HealthState HealthState `json:"healthState" db:"health_state"` // 健康状态
+ CorrelationID string `json:"alertIssueIds" db:"alert_issue_ids"` // varchar - 关联ID
}