当前位置: 首页 > news >正文

使用skywalking进行go的接口监控和报警

安装

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

相关文章:

  • Galini AI 技术实现方案及 GitHub 开源库推荐
  • EchoMimic 阿里开源数字人项目的复现过程
  • Vue 项目中运行 `npm run dev` 时发生的过程
  • 【优选算法 | 前缀和】前缀和算法:高效解决区间求和问题的关键
  • VR汽车线束:汽车制造的新变革
  • 改进系列(10):基于SwinTransformer+CBAM+多尺度特征融合+FocalLoss改进:自动驾驶地面路况识别
  • 【Bootstrap V4系列】学习入门教程之 加载必要文件和入门模板
  • IDEA git配置[通俗易懂]
  • 网络原理 - 12(HTTP/HTTPS - 3 - 响应)
  • Spring Boot 中 `@EnableConfigurationProperties` 注解
  • 【c++】【STL】list详解
  • python-docx清空段落样式的方法有哪些
  • Java学习手册:Spring 中常用的注解
  • 全面解析SimHash算法:原理、对比与Spring Boot实践指南
  • 决策树在电信客户流失分析中的实战应用
  • 基于C++的IOT网关和平台5:github项目ctGateway开发指南
  • 「动态规划」线性DP:最长上升子序列(LIS)|编辑距离 / LeetCode 300|72(C++)
  • 景联文科技牵头起草的《信息技术 可扩展的生物特征识别数据交换格式 第4部分:指纹图像数据》国家标准正式发布
  • LeetCode路径总和系列问题解析:I、II、III的解决方案与优化
  • LeetCode392_判断子序列
  • 五大国货美妆去年业绩分化:珀莱雅百亿营收领跑,上海家化转亏
  • 浪尖计划再出发:万亿之城2030课题组赴九城调研万亿产业
  • 视频丨中国海警位中国黄岩岛领海及周边区域执法巡查
  • 年轻人的事业!6家上海人工智能企业畅想“模范生”新征程
  • 贵州茅台一季度净利268亿元增长11.56%,系列酒营收增近两成
  • 美国通过《删除法案》:打击未经同意发布他人私密图像,包括“深度伪造”