1. 简介
注! 我只是自己写的玩 现在监控全面很多 没必要重复造轮子
其实此方法测试成功 但未曾实践 只是表明思路 有代码有图
思路就是 服务暴露一些健康监测的东西 我这里就是简易的hello world
如果真要自己写一个强大的监控 个人感觉以下几步必不可少
1. 日志的处理可以做的很细很明了
2. 服务挂了重启后要做些什么
3. 监控的url 不希望开接口等等
4. 前端
5. 消息推送 错误日志的 打电话还是短信推钉钉都可以
可以自己配置重启的在yaml中 自建的或者 docker 部署都可以 不过建议还是用docker自己的监控重启 有条件还是k8s吧
go 去请求然后 拿到结果判断 我这里是用的简易的状态码
2. config
分为一个conf文件 一个main
Cfg.yaml文件
DingToken: 38639587dd2da3eccc800a8a73bffbbec5be586394dd4e8********
Server:
- serverName: service-**
url: 'https://*****'
- serverName: service-**
url: '*******'
3. 推送钉钉方法
1. 包名
github.com/wanghuiyt/ding
2. 运用方法
import (
"fmt"
"github.com/wanghuiyt/ding"
"gopkg.in/yaml.v2"
"io"
"io/ioutil"
"net/http"
"os"
)
func pushDingToken(dingToken string, message string) {
// 发送钉钉消息
ZjdUlr := dingToken
d := ding.Webhook{AccessToken: ZjdUlr}
_ = d.SendMessage(message)
}
4. 整体main文件代码
/**
* @Time : 2022/5/18 10:19
* @Author : lee
* @Email :
* @File : main.go
*/
package main
import (
"fmt"
"github.com/wanghuiyt/ding"
"gopkg.in/yaml.v2"
"io"
"io/ioutil"
"net/http"
"os"
)
type Cfg struct {
DingToken string `yaml:"DingToken"`
Server []Item `yaml:"Server"`
}
type Item struct {
ServerName string `yaml:"serverName"`
Url string `yaml:"url"`
}
func pushDingToken(dingToken string, message string) {
// 发送钉钉消息
ZjdUlr := dingToken
d := ding.Webhook{AccessToken: ZjdUlr}
_ = d.SendMessage(message)
}
func sendHttp(serverUrl string) (int, error) {
// url 检测方法
response, err := http.Get(serverUrl)
if err != nil {
fmt.Println(err)
return 500, err
}
if response.StatusCode == 200 {
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
fmt.Println(err)
}
}(response.Body)
}
return response.StatusCode, err
}
func readYaml() (cfg Cfg) {
var cf Cfg //定义一个结构体变量
//读取yaml文件到缓存中
config, err := ioutil.ReadFile("Cfg.yaml")
if err != nil {
fmt.Print(err)
}
//yaml文件内容影射到结构体中
err1 := yaml.Unmarshal(config, &cf)
if err1 != nil {
fmt.Println("error")
}
//通过访问结构体成员获取yaml文件中对应的key-value
return cf
}
func main() {
str, _ := os.Getwd()
fmt.Println(str)
cf := readYaml()
for _, v := range cf.Server {
statusCode, _ := sendHttp(v.Url)
if statusCode != 200 {
var message string
message = message + fmt.Sprintf("测试\n服务: %s异常\n请求地址: %s\n", v.ServerName, v.Url)
pushDingToken(cf.DingToken, message)
}
}
}
测试结果