使用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
相关推荐
飞火流星020271 小时前
SkyWalking异步采集spring gateway日志
gateway·skywalking·日志监控·gateway链路监控
五岁小孩1 小时前
Go 原理之 GMP 并发调度模型
golang·gmp·并发调度模型
betazhou1 小时前
MySQL ROUTER安装部署
android·数据库·mysql·adb·mgr·mysql router
中东大鹅2 小时前
Mybatis Plus 多数据源
java·数据库·spring boot·后端·mybatis
一枚小小程序员哈3 小时前
springboot基于Java与MySQL库的健身俱乐部管理系统设计与实现
数据库·spring boot·mysql·spring·java-ee·intellij-idea
Antonio9153 小时前
【Redis】 Redis 基础命令和原理
数据库·redis·缓存
非优秀程序员3 小时前
未来的编程将会是什么样子?从面向对象转为面向业务数据!!
数据库·架构
老华带你飞4 小时前
口腔助手|口腔挂号预约小程序|基于微信小程序的口腔门诊预约系统的设计与实现(源码+数据库+文档)
java·数据库·微信小程序·小程序·论文·毕设·口腔小程序
hqxstudying4 小时前
J2EE模式---服务层模式
java·数据库·后端·spring·oracle·java-ee
Yu_Lijing4 小时前
MySQL进阶学习与初阶复习第四天
数据库·学习·mysql