安装
helm upgrade --install skywalking ./skywalking-v1 --namespace skywalking --create-namespace
查看安装结果
bash
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 转发到钉群或者微信群
我现在让他执行脚本因为这样可以根据你们自己自定义吧,这是公开解决方案
go
package main
import (
"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 []AlarmData
if 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")
}
报警配置
yaml
# 示例告警规则
rules:
# 唯一的规则名,必须以 `_rule` 结尾
service_resp_time_rule:
metrics-name: service_resp_time
op: ">"
threshold: 1000
period: 10
count: 3
silence-period: 5
message: 服务 {name} 的响应时间在过去10分钟中有3分钟超过了1000毫秒。
service_sla_rule:
metrics-name: service_sla
op: "<"
threshold: 8000
period: 10
count: 2
silence-period: 3
message: 服务 {name} 的成功率在过去10分钟中有2分钟低于80%。
service_resp_time_percentile_rule:
metrics-name: service_percentile
op: ">"
threshold: 1000,1000,1000,1000,1000
period: 10
count: 3
silence-period: 5
message: 服务 {name} 在过去10分钟中有3分钟触发了百分位响应时间告警,p50、p75、p90、p95、p99 超过1000毫秒。
service_instance_resp_time_rule:
metrics-name: service_instance_resp_time
op: ">"
threshold: 1000
period: 10
count: 2
silence-period: 5
message: 服务实例 {name} 的响应时间在过去10分钟中有2分钟超过了1000毫秒。
database_access_resp_time_rule:
metrics-name: database_access_resp_time
threshold: 1000
op: ">"
period: 10
count: 2
message: 数据库访问 {name} 的响应时间在过去10分钟中有2分钟超过了1000毫秒。
endpoint_relation_resp_time_rule:
metrics-name: endpoint_relation_resp_time
threshold: 1000
op: ">"
period: 10
count: 2
message: 端点关系 {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里面运行就行
go
package main
import (
"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")
}
bash
#!/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 testpro
export SW_AGENT_NAME="testpro200"
export SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE="xxx:11800"
export SW_AGENT_REPORTER_GRPC_CHECK_INTERVAL=20
./testpro