golang经过itemid获取zabbix graph监控图

#简述 本文将使用golang和第三方http client 库gorequest编写。如须要只使用golang 标准库能够参考个人另一篇文章golang经过itemid获取zabbix graph监控图php

#F&Qpython

  1. 为何是golang? 网上很容易就能找到使用python下载zabbix graph监控图的脚本。但使用python存在两个问题:
  • 使用urllib等底层库,编程复杂,可读性差
  • 线上机器python版本低,安装脚本依赖或更新python版本很麻烦
  1. 为何是gorequestgorequest对golang的http标准库,作了二次封装,使得读取request body、dto、超时控制等很方便,还额外添加了retry功能。

ps:存在的问题。在添加query时,使用map格式,zabbix没法登陆。git

code

package zabbix

import (
	"fmt"
	"net/http"
	"os"
	"path/filepath"
	"time"

	"github.com/parnurzeal/gorequest"
)
var(
	HTTPRequestTimeOut = time.Duration(5) * time.Second
	HTTPRequestRetryPeriod = 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.SuperAgent
	username string
	password string
	url      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 zabbix

import (
	"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.gogithub

相关文章
相关标签/搜索