安装
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