Wanger | Zabbix開源社區簽約專家
Zabbix運維工程師,熟悉Zabbix開源監控系統的架構。樂於分享Zabbix運維經驗,個人公衆號“運維開發故事”。
擅長領域:Zabbix基礎設施運維以及Zabbix圖形化展示。
需求
zabbix-agent2自定義https_expire插件
zabbix.com/pkg/plugin
軟件包。
import "zabbix.com/pkg/plugin"
plugin.Base
結構。
type Plugin struct {
plugin.Base
}
var impl Plugin
func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (result interface{}, err error) {
if len(params) > 0 {
p.Debugf("received %d parameters while expected none", len(params))
return nil, errors.New("Too many parameters")
}
return time.Now().Format(time.RFC3339)
}
func init() {
plugin.RegisterMetrics(&impl, "Time", "system.time", "Returns time string in RFC 3999 format.")
}
func (p *Plugin) Configure(global *plugin.GlobalOptions, options interface{}) {
if err = conf.Unmarshal(options, &p.options); err != nil {
p.Errf("cannot unmarshal configuration options: %s", err)
}
if p.options.Timeout == 0 {
p.options.Timeout = global.Timeout
}
p.client = newClient(p.options.Timeout)
}
func (p *Plugin) Validate(options interface{}) error {
return conf.Unmarshal(options, &opts)
}
func checkParamnums(params []string) error {
if len(params) > paramnums {
err:=errors.New("Too many parameters.")
return zbxerr.ErrorTooFewParameters.Wrap(err)
} else if len(params) ==0 {
err:=errors.New("Missing URL parameters.")
return zbxerr.ErrorTooFewParameters.Wrap(err)
}
return nil
}
func checkParams(params []string) (string, error) {
if strings.HasPrefix(params[0], "http://") {
errorsting:=fmt.Sprintf("Target is using http scheme: %s", params[0])
err:=errors.New(errorsting)
return "",zbxerr.ErrorInvalidParams.Wrap(err)
}
if !strings.HasPrefix(params[0], "https://") {
params[0] = "https://" + params[0]
}
return string(params[0]),nil
}
func (cli *client) Query(url string) (int64, error) {
resp, err := cli.client.Get(url)
if err != nil {
impl.Debugf("cannot fetch data: %s", err)
err:=errors.New("cannot fetch data")
return 0, zbxerr.ErrorCannotFetchData.Wrap(err)
}
defer resp.Body.Close()
certInfo:=resp.TLS.PeerCertificates[0]
expiredays:=(certInfo.NotAfter.Unix()-time.Now().Unix())/60/60/24
return expiredays,nil
}
// Export implements the Exporter interface.
func (p *Plugin) Export(key string, params []string, ctx plugin.ContextProvider) (interface{}, error) {
if err = checkParamnums(params); err != nil {
return nil, err
}
urls,err:= checkParams(params)
if err!= nil {
return nil,err
}
body, err := p.client.Query(urls)
if err!=nil{
return nil, err
}
return body,nil
}
func init() {
plugin.RegisterMetrics(&impl, pluginName,
"https_expire", "Returns the number of days between the HTTPS certificate expiration time and the current date.")
}
下載zabbix agent2源碼並將自定義插件編譯
yum install golang
git clone https://git.zabbix.com/scm/zbx/zabbix.git --depth 1 zabbix-agent2
cd zabbix-agent2
git submodule add https://github.com/cxf210/ssl_expire.git src/go/plugins/https_expire
導入https_expire插件
vi src/go/plugins/plugins_linux.go
_ "zabbix.com/plugins/ceph"
_ "zabbix.com/plugins/docker"
_ "zabbix.com/plugins/kernel"
_ "zabbix.com/plugins/log"
_ "zabbix.com/plugins/memcached"
_ "zabbix.com/plugins/modbus"
_ "zabbix.com/plugins/mqtt"
_ "zabbix.com/plugins/mysql"
_ "zabbix.com/plugins/net/netif"
_ "zabbix.com/plugins/net/tcp"
...
_ "zabbix.com/plugins/https_expire"
編譯安裝zabbix agent2
yum install automake autoconf pcre* -y
./bootstrap.sh
pushd .
cd src/go/
go mod vendor
popd
./configure --enable-agent2 --enable-static
make install
編輯配置文件
egrep -v "^$|^#" conf/zabbix_agent2.conf
LogType=console
LogFile=/tmp/zabbix_agent2.log
DebugLevel=4
Server=172.17.0.5
Plugins.Https_expire.Timeout=5
Hostname=node2
ControlSocket=/tmp/agent.sock
啓動Zabbix_agent2
cd /root/zabbix_agent/src/go/bin
zabbix_agent2 -c conf/zabbix_agent2.conf
Zabbix創建監控項
https_expire["www.xyzabbix.cn"]
https_expire["https://www.xyzabbix.cn"]
延伸閱讀
2021.4.12-16 ZCS中級培訓 上海
2021.4.19-21 ZCP高級培訓 上海
歡迎聯繫小Z獲取內容大綱。
關注Zabbix開源社區
乾貨滿滿
加“小Z“入羣
3000+Zabbixer已加入
本文分享自微信公衆號 - Zabbix開源社區(china_zabbix)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。