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

安装

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
相关推荐
倔强的石头_13 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
花酒锄作田4 天前
Gin 框架中的规范响应格式设计与实现
golang·gin
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐4 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip