文章采集接口(【每日一题】json监控接口获取监控数据的方案 )
优采云 发布时间: 2022-04-13 20:01文章采集接口(【每日一题】json监控接口获取监控数据的方案
)
【文本】
一个应用场景:
对于自带监控的业务系统或组件,可以直接通过其外部监控接口获取监控数据,避免重复造轮子,缩短开发周期。本文主要记录本次采集器开发中通过golang调用第三方api的方法。
两个具体案例
由于项目需求,蓝鲸监控需要监控腾讯云Tstack。经过一番沟通,已经确定了通过Tstack监控接口获取相应监控数据的方案。
这个采集器开发对我来说的难点在于golang实现了http请求,构造了json请求体,解析了json字符串。在python中,我们可以很容易地构造字典类型的json字符串或者将json字符串解析成字典。Golang 的 map 类型(类似于 golang 中的字典类型的数据类型)可以用来解析 json 字符串。但是,如果 json 数据有多层嵌套,使用 map 解析 json 字符串会很痛苦。在golang中,我们也可以使用struct类型来解析json字符串,通过struct的多层嵌套声明实现json数据的多层嵌套。
下面是一个调用登录界面的例子。示例代码如下:
type DomainStruct struct {
Id string <b>`json:"id"` // struct变量首字母需要是大写,后面加``,json化时可变成小写
Name string <b>`json:"name"`
}
<b>type UserStrcut struct {
Id string <b>`json:"id"`
Name string `json:"name"`
Domain DomainStruct `json:"domain"`
Password_expires_at string `json:"password_expires_at"`
}
<b>type TokenStruct struct {
Issued_at string <b>`json:"issued_at"`
User UserStrcut `json:"user"`
Methods []string `json:"methods"`
Expires_at string `json:"expires_at"`
Audit_ids []string `json:"audit_ids"`
}
<b>type Auth struct {
Token TokenStruct <b>`json:"token"`
}
url := *tstackAuthHost + "/v3/auth/tokens"
authStr := fmt.Sprintf(`{"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"name": "%s",
"domain": {"id": "default"},
"password": "%s"
}
}
}
}
}`, *tstackUser, tstackPassword)
bodyType := <b>"application/json;charset=utf-8"
payload := strings.NewReader(string(authStr))
resp, err := http.Post(url, bodyType, payload)
<b>if err != nil {
log.Fatal(err.Error())
}
body, err := ioutil.ReadAll(resp.Body)
<b>if err != nil {
log.Fatal(err.Error())
}
<b>var result Auth
json.Unmarshal([]byte(body), &result)
<b>if result.Token.Audit_ids == nil {
err = errors.New(fmt.Sprintf(<b>"get auth error, status:%s", resp.Status))
<b>return
}
sessionId = result.Token.Audit_ids[0]
userId = result.Token.User.Id
fmt.Println(sessionId, userId)
<b>示例代码说明:
<p>l