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 }