安裝
helm upgrade --install skywalking ./skywalking-v1 --namespace skywalking --create-namespace
查看安裝結果
kubectl get pod -n skywalking
NAME READY STATUS RESTARTS AGE
elasticsearch-6c4ccbf99f-ng6sk 1/1 Running 0 18m
oap-f945bcff7-wvvs5 1/1 Running 3 (18m ago) 18m
plugin-app-6c75f789-nthdb 1/1 Terminating 0 18m
plugin-app-f97cd4998-dq8dz 1/1 Running 0 10s
skywalking-ui-8b9f8fcb-f6r8f 1/1 Running 0 18m
go webhooks 轉發到釘群或者微信群
我現在讓他執行腳本因為這樣可以根據你們自己自定義吧,這是公開解決方案
package mainimport ("bytes""encoding/json""fmt""io/ioutil""net/http""net/url""time""github.com/gin-gonic/gin"
)type AlarmData struct {ScopeId int `json:"scopeId"`Scope string `json:"scope"`Name string `json:"name"`Id0 string `json:"id0"`Id1 string `json:"id1"`RuleName string `json:"ruleName"`AlarmMessage string `json:"alarmMessage"`Tags []string `json:"tags"`StartTime int64 `json:"startTime"`
}// 配置常量
const (DIALOG_ID = "xx"TOKEN = "xx"POST_URL = "xx"VERSION = "0.22.0"SILENCE = "yes"
)func sendMessage(text string) (string, error) {form := url.Values{}form.Add("dialog_id", DIALOG_ID)form.Add("silence", SILENCE)form.Add("text", text)req, err := http.NewRequest("POST", POST_URL, bytes.NewBufferString(form.Encode()))if err != nil {return "", err}req.Header.Set("Content-Type", "application/x-www-form-urlencoded")req.Header.Set("version", VERSION)req.Header.Set("token", TOKEN)client := &http.Client{}resp, err := client.Do(req)if err != nil {return "", err}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {return "", err}return string(body), nil
}func main() {r := gin.Default()r.POST("/notify", func(c *gin.Context) {bodyBytes, err := ioutil.ReadAll(c.Request.Body)if err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": "讀取請求體失敗"})return}var alarms []AlarmDataif err := json.Unmarshal(bodyBytes, &alarms); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": "JSON 格式錯誤"})return}for _, alarm := range alarms {// 構建消息文本message := fmt.Sprintf(`[報警信息]
告警名稱: %s
規則名稱: %s
報警內容: %s
作用域: %s (%d)
對象名稱: %s
對象ID0: %s
對象ID1: %s
標簽: %v
開始時間: %s`,alarm.Name,alarm.RuleName,alarm.AlarmMessage,alarm.Scope,alarm.ScopeId,alarm.Name,alarm.Id0,alarm.Id1,alarm.Tags,time.UnixMilli(alarm.StartTime).Format("2006-01-02 15:04:05"),)// 發送消息result, err := sendMessage(message)if err != nil {fmt.Println("發送失敗:", err)} else {fmt.Println("發送成功,響應:", result)}// 本地日志打印fmt.Println("---- Alarm ----")fmt.Println(message)}c.JSON(http.StatusOK, gin.H{"message": "報警數據已處理"})})r.Run(":8080")
}
報警配置
# 示例告警規則
rules:# 唯一的規則名,必須以 `_rule` 結尾service_resp_time_rule:metrics-name: service_resp_timeop: ">"threshold: 1000period: 10count: 3silence-period: 5message: 服務 {name} 的響應時間在過去10分鐘中有3分鐘超過了1000毫秒。service_sla_rule:metrics-name: service_slaop: "<"threshold: 8000period: 10count: 2silence-period: 3message: 服務 {name} 的成功率在過去10分鐘中有2分鐘低于80%。service_resp_time_percentile_rule:metrics-name: service_percentileop: ">"threshold: 1000,1000,1000,1000,1000period: 10count: 3silence-period: 5message: 服務 {name} 在過去10分鐘中有3分鐘觸發了百分位響應時間告警,p50、p75、p90、p95、p99 超過1000毫秒。service_instance_resp_time_rule:metrics-name: service_instance_resp_timeop: ">"threshold: 1000period: 10count: 2silence-period: 5message: 服務實例 {name} 的響應時間在過去10分鐘中有2分鐘超過了1000毫秒。database_access_resp_time_rule:metrics-name: database_access_resp_timethreshold: 1000op: ">"period: 10count: 2message: 數據庫訪問 {name} 的響應時間在過去10分鐘中有2分鐘超過了1000毫秒。endpoint_relation_resp_time_rule:metrics-name: endpoint_relation_resp_timethreshold: 1000op: ">"period: 10count: 2message: 端點關系 {name} 的響應時間在過去10分鐘中有2分鐘超過了1000毫秒。# 激活端點相關的指標告警會比服務和實例的告警消耗更多內存。
# 因為端點數量通常遠遠多于服務和實例。
#
# endpoint_avg_rule:
# metrics-name: endpoint_avg
# op: ">"
# threshold: 1000
# period: 10
# count: 2
# silence-period: 5
# message: 端點 {name} 的平均響應時間在過去10分鐘中有2分鐘超過了1000毫秒。webhooks:
# - http://127.0.0.1/notify/
- 'http://10.20.8.188:8080/debug'
# - http://127.0.0.1/go-wechat/
部署go服務器
服務器在我git上,你們不需要打包,我也懶得去打包,所有你們直接下載到pod里面運行就行
package mainimport ("github.com/gin-gonic/gin"_ "github.com/apache/skywalking-go""net/http""time"
)func main() {// 創建一個 Gin 路由實例r := gin.Default()// 立即響應的接口r.GET("/immediate", func(c *gin.Context) {// 返回立即響應的消息c.JSON(http.StatusOK, gin.H{"message": "This is an immediate response",})})// 延遲響應的接口r.GET("/delayed", func(c *gin.Context) {// 模擬延遲,等待 5 秒time.Sleep(5 * time.Second)// 延遲之后的響應c.JSON(http.StatusOK, gin.H{"message": "This response is delayed by 5 seconds",})})// 啟動 HTTP 服務,監聽在 8080 端口r.Run(":8080")
}
#!/bin/bash
go build -toolexec=/Users/mac-512/script/testpro/apache-skywalking-go-0.5.0-bin/bin/skywalking-go-agent-0.5.0-darwin-amd64 -a -ldflags="-s -w" -o testproexport SW_AGENT_NAME="testpro200"
export SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE="xxx:11800"
export SW_AGENT_REPORTER_GRPC_CHECK_INTERVAL=20
./testpro