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()
}
}
关键修改点:
- 使用
defer func() { os.Exit(0) }()确保无论执行情况如何都返回退出状态0 - 为HTTP客户端添加超时设置避免长时间阻塞
- 移除所有错误处理逻辑,使HTTP请求失败不影响程序退出状态
- 简化DELETE请求的数据格式
这个实现确保:
- pushgateway可达时正常推送指标
- pushgateway不可达时静默失败
- 始终以exit status 0退出,避免Duplicati产生警告
- 保持原有的120秒延迟和DELETE清理逻辑

