Golang中Duplicati与pushgateway的集成使用探讨

Golang中Duplicati与pushgateway的集成使用探讨 你好,

我正在研究一个通过Grafana监控Duplicati备份的解决方案。Duplicati在备份完成后会向推送网关发送一个“POST”请求。使用下面的脚本目前可以正常工作。如果推送网关无法访问,脚本会以“exit status 2”退出。这会导致Duplicati产生一个警告错误信息。脚本在出错时也应该以“exit status 0”退出。

如何实现这一点? 希望你能帮助我。


package main
import (
	"os"
	"strings"
        "strconv"
	"net/http"
	"bytes"
	"time"
)
func main() {
	var res int
	if strings.EqualFold(os.Getenv("DUPLICATI__PARSED_RESULT"),"Success")  {
	  res = 1
	} else {
	  res = 0
	}
	data := "backup_result " + strconv.Itoa(res) + "\n"
	body := bytes.NewReader([]byte(data))
	req, err := http.NewRequest("POST", "http://pushgateway.tld:9091/metrics/job/"+os.Getenv("DUPLICATI__backup_name"), body)
	req.Header.Set("Content-Type", "application/octet-stream")
	client := &http.Client{}
	resp,err := client.Do(req)
	defer resp.Body.Close()
	if err != nil {
	}
	func() {
    time.Sleep(120 * time.Second)
    }()
    data2 := "backup_result "  + "\n"
	body2 := bytes.NewReader([]byte(data2))
	req2,err2 := http.NewRequest("DELETE", "http://pushgateway.tld:9091/metrics/job/"+os.Getenv("DUPLICATI__backup_name"), body2)
        req2.Header.Set("Content-Type", "application/octet-stream")
	client2 := &http.Client{}
	resp2,err2 := client2.Do(req2)
	defer resp2.Body.Close()
	if err2 != nil {
	}
}

更多关于Golang中Duplicati与pushgateway的集成使用探讨的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

此主题可以删除了,我已经自己解决了问题,谢谢

更多关于Golang中Duplicati与pushgateway的集成使用探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Duplicati集成pushgateway的场景中,需要确保脚本在pushgateway不可访问时仍能正常退出。以下是修改后的代码示例:

package main

import (
	"bytes"
	"net/http"
	"os"
	"strconv"
	"strings"
	"time"
)

func main() {
	// 始终以状态码0退出
	defer func() { os.Exit(0) }()

	// 解析备份结果
	var res int
	if strings.EqualFold(os.Getenv("DUPLICATI__PARSED_RESULT"), "Success") {
		res = 1
	} else {
		res = 0
	}

	// 准备POST请求
	backupName := os.Getenv("DUPLICATI__backup_name")
	data := "backup_result " + strconv.Itoa(res) + "\n"
	body := bytes.NewReader([]byte(data))

	// 发送POST请求(忽略错误)
	req, _ := http.NewRequest("POST", "http://pushgateway.tld:9091/metrics/job/"+backupName, body)
	req.Header.Set("Content-Type", "application/octet-stream")
	client := &http.Client{Timeout: 30 * time.Second}
	if resp, err := client.Do(req); err == nil {
		defer resp.Body.Close()
	}

	// 等待后发送DELETE请求(忽略错误)
	time.Sleep(120 * time.Second)
	
	data2 := "backup_result\n"
	body2 := bytes.NewReader([]byte(data2))
	req2, _ := http.NewRequest("DELETE", "http://pushgateway.tld:9091/metrics/job/"+backupName, body2)
	req2.Header.Set("Content-Type", "application/octet-stream")
	client2 := &http.Client{Timeout: 30 * time.Second}
	if resp2, err := client2.Do(req2); err == nil {
		defer resp2.Body.Close()
	}
}

关键修改点:

  1. 使用defer func() { os.Exit(0) }()确保无论执行情况如何都返回退出状态0
  2. 为HTTP客户端添加超时设置避免长时间阻塞
  3. 移除所有错误处理逻辑,使HTTP请求失败不影响程序退出状态
  4. 简化DELETE请求的数据格式

这个实现确保:

  • pushgateway可达时正常推送指标
  • pushgateway不可达时静默失败
  • 始终以exit status 0退出,避免Duplicati产生警告
  • 保持原有的120秒延迟和DELETE清理逻辑
回到顶部