由于测试环境升级通知不及时可能会造成一些问题就写了一个钉钉自动通知的功能到吗如下:
效果:
image.png
go代码,编译成二进制放在服务升级脚本里面自动执行
package main
import (
"encoding/json"
"fmt"
"github.com/shirou/gopsutil/cpu"
"github.com/shirou/gopsutil/disk"
"github.com/shirou/gopsutil/mem"
"net"
"net/http"
"strings"
"time"
)
type VirtualMemory struct {
Total uint64 `json:"total"`
Available uint64 `json:"available"`
Used uint64 `json:"used"`
UsedPercent float64 `json:"usedPercent"`
Free uint64 `json:"free"`
}
type Disk struct {
Path string `json:"path"`
Fstype string `json:"fstype"`
Total uint64 `json:"total"`
Free uint64 `json:"free"`
Used uint64 `json:"used"`
UsedPercent float64 `json:"usedPercent"`
}
type Cpu struct {
VendorID string `json:"vendorId"`
Family string `json:"family"`
Model string `json:"model"`
Stepping int32 `json:"stepping"`
Cores int32 `json:"cores"`
ModelName string `json:"modelName"`
Mhz float64 `json:"mhz"`
}
func main() {
var ips []string
addrs, err := net.InterfaceAddrs()
if err != nil {
return
}
for _, a := range addrs {
if ipnet, ok := a.(*net.IPNet); ok && !ipnet.IP.IsLoopback() && ipnet.IP.To4() != nil {
ips = append(ips, ipnet.IP.String())
}
}
v, _ := mem.VirtualMemory()
akeetaVM := VirtualMemory{
Total:v.Total,
Available:v.Available,
Used:v.Used,
UsedPercent:v.UsedPercent,
Free:v.Free,
}
disk,_ := disk.Usage("/")
akeetaDisk := Disk{
Path:disk.Path,
Fstype:disk.Fstype,
Total:disk.Total,
Free:disk.Free,
Used:disk.Used,
UsedPercent:disk.UsedPercent,
}
var akeetaCpuList []Cpu
c,_ := cpu.Info()
for _,cpu := range c{
akeetaCpu := Cpu{
VendorID:cpu.VendorID,
Family:cpu.Family,
Model:cpu.Model,
Stepping:cpu.Stepping,
Cores:cpu.Cores,
ModelName:cpu.ModelName,
Mhz:cpu.Mhz,
}
akeetaCpuList = append(akeetaCpuList, akeetaCpu)
}
SendDingMsg(akeetaVM,akeetaDisk,akeetaCpuList,ips)
}
//#### UP:\n akeeta服务升级,服务器时间:201210:12\n #### Disk:\n DiskMsg\n #### VirtualMemory:\n VirtualMemoryMsg\n #### CPU:\n CpuMsg\n
func SendDingMsg(vm VirtualMemory,disk Disk,cpu []Cpu,ips []string) {
DiskMsg,_ := json.Marshal(disk)
VirtualMemoryMsg,_ := json.Marshal(vm)
CpuMsg,_ := json.Marshal(cpu)
currTimeStr := time.Now().Format("2006/01/02 15:04:05")
text := fmt.Sprintf(`### UP:\n cccc服务升级,服务器时间:%s Addrs: %s \n ### Disk:\n %s\n ### VirtualMemory:\n %s\n ### CPU:\n %s\n`,currTimeStr,ips,DiskMsg,VirtualMemoryMsg,CpuMsg)
text = strings.ReplaceAll(text,`"`,"")
fmt.Println(text)
//请求地址模板
webHook := `https://oapi.dingtalk.com/robot/send?access_token=cb6b102268d8bd17a0ead565bxxxxasdsadsa116eb41ed6a7c`
//webHook := `https://oapi.dingtalk.com/robot/send?access_token=a75f26488e606c47xxxx715casdsadas91e7da8d7f232`
content := `{
"msgtype": "markdown",
"markdown": {
"title":"123",
"text": "`+text+`"
},
}`
//创建一个请求
req, err := http.NewRequest("POST", webHook, strings.NewReader(content))
if err != nil {
fmt.Println("Error:",err)
return
}
client := &http.Client{}
//设置请求头
req.Header.Set("Content-Type", "application/json; charset=utf-8")
//发送请求
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error:",err)
return
}
//关闭请求
defer resp.Body.Close()
}
网友评论