需求

自己搭建Prometheus服务端(已实现):

Prometheus目前可以做到监控数动态添加主机(自动增删被监控主机,博客待补充,主要是懒????)

用阿里云云监控服务:

阿里云云监控没有grafana服务端,生成不了PDF,再加上Prometheus不能生成exl表格数据,阿里云云监控企业版太贵,一个报表0.14元。我们可以自己调取阿里云的api接口,获取ECS主机cpu负载、内存使用率等信息,生成报表定时发送指定邮箱

本篇效果

获取一个主机的7天内的cpu使用率信息,生成报表

推荐Go语言开源项目:Excelize ,获取阿里云监控数据,创建自定义Excel表格(二)_json

阿里云API

阿里云 云监控服务API地址:​​https://next.api.aliyun.com/home​

本篇使用的API网址:​​https://next.api.aliyun.com/api/Cms/2019-01-01/DescribeMetricTop?params={}​

代码示例

// This file is auto-generated, don't edit it. Thanks.
package main

import (
"encoding/json"
"fmt"
"/xuri/excelize/v2"
"os"
cms20190101 "/alibabacloud-go/cms-20190101/v2/client"
openapi "/alibabacloud-go/darabonba-openapi/client"
"/alibabacloud-go/tea/tea"
"strings"
)
type List struct {
Order int `json:"order"`
Timestamp int `json:"timestamp"`
UserId string `json:"userId"`
InstanceId string `json:"instanceId"`
Minimum float32 `json:"Minimum"`
Maximum float32 `json:"Maximum"`
Average float32 `json:"Average"`
Count float32 `json:"_count"`
}

/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
func CreateClient (accessKeyId *string, accessKeySecret *string) (_result *cms20190101.Client, _err error) {
config := &openapi.Config{
// 您的AccessKey ID
AccessKeyId: accessKeyId,
// 您的AccessKey Secret
AccessKeySecret: accessKeySecret,
}
// 访问的域名
config.Endpoint = tea.String("metrics.cn-hangzhou.aliyuncs.com")
_result = &cms20190101.Client{}
_result, _err = cms20190101.NewClient(config)
return _result, _err
}

func _main (args []*string) (_err error) {
client, _err := CreateClient(tea.String("LTxxxxxxxxx5dUc"), tea.String("G1WxxxxxxxxxxxxxxxxxxiF6"))
if _err != nil {
return _err
}

describeMetricListRequest := &cms20190101.DescribeMetricListRequest{
StartTime: tea.String("1636905600000"),
EndTime: tea.String("1637424000000"),
MetricName: tea.String("cpu_total"),
Namespace: tea.String("acs_ecs_dashboard"),
Dimensions: tea.String("{\"instanceId\":\"i-8vxxxxxxxxgh\"}"),
Period: tea.String("604800"),
}
// 复制代码运行请自行打印 API 的返回值
M, _err := client.DescribeMetricList(describeMetricListRequest)
N := *M.Body.Datapoints
fmt.Println(N)
N1 := strings.TrimLeft(N, "[")
N2 := strings.TrimRight(N1, "]")
//fmt.Printf("N类型:%T,N值:%v\n",N2,N2)
fmt.Println(N2)
var list List
err1 := json.Unmarshal([]byte(N2), &list)
if err1 != nil {
fmt.Printf("序列化转化失败,%v",err1)
}else {
fmt.Println("序列化转化成功")
}
fmt.Println(list)
f := excelize.NewFile()


// 创建一个工作表
index := f.NewSheet("主机列表")
err2 := f.SetColWidth("主机列表", "A", "H", 23)
if err2 != nil {
fmt.Printf("表格创建失败,%v",err2)
}else {
fmt.Println("表格创建成功")
}
// 设置单元格的值
f.SetCellValue("主机列表", "A1", "实例ID号")
f.SetCellValue("主机列表", "A2", list.InstanceId)
f.SetCellValue("主机列表","B1","7天CPU最小使用率")
f.SetCellValue("主机列表","B2",list.Minimum)
f.SetCellValue("主机列表","C1","7天CPU最大使用率")
f.SetCellValue("主机列表","C2",list.Maximum)
f.SetCellValue("主机列表","D1","7天CPU平均使用率")
f.SetCellValue("主机列表","D2",list.Average)

// 设置工作簿的默认工作表
f.SetActiveSheet(index)
// 根据指定路径保存文件
if err := f.SaveAs("Book1.xlsx"); err != nil {
fmt.Println(err)
}
if _err != nil {
return _err
}
return _err
}


func main() {
err := _main(tea.StringSlice(os.Args[1:]))
if err != nil {
panic(err)
}
}