使用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
相关推荐
code_shenbing5 分钟前
.NET Core 数据库ORM框架用法简述
数据库·c#·.netcore·orm
❀͜͡傀儡师14 分钟前
基于Spring Boot 3.0、ShardingSphere、PostgreSQL或达梦数据库的分库分表
数据库·spring boot·postgresql
我真的不会C18 分钟前
QT中的多线程
数据库·qt·系统架构
王中阳Go23 分钟前
最新字节跳动运维云原生面经分享
运维·后端·云原生·面试·golang
YONG823_API1 小时前
借助电商 API 接口实现电商平台商品数据分析的详细步骤分享
数据库·爬虫·microsoft·数据挖掘·数据分析
hnlucky1 小时前
redis 数据类型新手练习系列——List类型
运维·数据库·redis·学习·bootstrap·list
梦想画家2 小时前
Bash 脚本:让数据库管理更高效
数据库·bash
想睡好2 小时前
mysql约束
数据库
烂漫心空4 小时前
数据库的死锁相关(一)
数据库·sql·mysql