2019独角兽企业重金招聘Python工程师标准>>>
#简述 本文将使用golang和第三方http client 库gorequest编写。如需要只使用golang 标准库可以参考我的另外一篇文章golang通过itemid获取zabbix graph监控图
#F&Q
- 为什么是golang? 网上很容易就能找到使用
python
下载zabbix graph监控图的脚本。但使用python存在两个问题:
- 使用urllib等底层库,编程复杂,可读性差
- 线上机器python版本低,安装脚本依赖或更新python版本很麻烦
- 为什么是
gorequest
?gorequest
对golang的http标准库,做了二次封装,使得读取request body、dto、超时控制等很方便,还额外添加了retry
功能。
ps:存在的问题。在添加query
时,使用map格式,zabbix无法登录。
code
package zabbiximport ("fmt""net/http""os""path/filepath""time""github.com/parnurzeal/gorequest"
)
var(HTTPRequestTimeOut = time.Duration(5) * time.SecondHTTPRequestRetryPeriod = time.Duration(5) * time.Second
)
//获取timestamp
func getTimeStr() string {timeDelta, _ := time.ParseDuration("-3h")stime := time.Now().Add(timeDelta)timeStr := stime.Format("20060102150405")return timeStr
}func generateErr(frefix string, errs []error) error {if errs == nil {return nil}temp := []string{frefix}for _, err := range errs {temp = append(temp, err.Error())}return fmt.Errorf(strings.Join(temp, ":"))
}type Client struct {reqAgent *gorequest.SuperAgentusername stringpassword stringurl string
}func New(url, username, password string) *Client {reqAgent := gorequest.New().SetDoNotClearSuperAgent(true).Timeout(HTTPRequestTimeOut).Retry(3, HTTPRequestRetryPeriod, http.StatusBadRequest, http.StatusInternalServerError)return &Client{reqAgent: reqAgent,username: username,password: password,url: url,}
}func (client *Client) indexUrl() string {return fmt.Sprintf("%s/index.php", client.url)
}func (client *Client) login() error {res, _, errs := client.reqAgent.Get(client.indexUrl()).Query("autologin=1&enter=Sign%20in").Query("name="+client.username).Query("password="+client.password).Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0").AppendHeader("Referer", client.indexUrl()).End()if errs != nil {return generateErr("", errs)}fmt.Println(res.Status)return nil
}func (client *Client) SaveImage(itemid, fileName string) (string, error) {if err := client.login(); err != nil {return "", fmt.Errorf("ZabbixClient:SaveImage:GetCookies:%v", err)}timeStr := getTimeStr()_, byteBody, errs := client.reqAgent.Get(client.url + "/chart.php").Query("period=7200&width=600").Query("time+" + timeStr).Query("itemids=" + itemid).EndBytes()if errs != nil {return "", generateErr("ZabbixClient:SaveImage:RequestImage", errs)}if fileName == "" {fileName = filepath.Join("tmp", timeStr+".jpg")} else {fileName = filepath.Join("tmp", fileName+".jpg")}out, err := os.Create(fileName)if err != nil {return fileName, fmt.Errorf("ZabbixClient:SaveImage:CreateImage:%v", err)}defer out.Close()_, err = out.Write(byteBody)if err != nil {return fileName, fmt.Errorf("ZabbixClient:SaveImage:SaveImage:%v", err)}return fileName, nil
}
test
package zabbiximport ("testing"
)func get_client() *Client {return New("http://127.0.0.1/zabbix", "Admin", "zabbix")
}func Test_downloadImage(t *testing.T) {client := get_client()_, err := client.SaveImage("69618", "")if err != nil {t.Fatal(err)}
}
zabbix_client.go