Pushgateway go get & push

From UVOO Tech Wiki
Jump to navigation Jump to search
./g -blackbox-url="http://blackbox.example.com:9115/probe?target=https://google.com&module=http_2xx" -pushgateway-url="https://pushgateway.example.com/metrics/job/pushdemo" -username=myuser -password=mypass
./g -blackbox-url="http://blackbox.example.com:9115/probe?target=https://google.com&module=http_2xx" -pushgateway-url="https://pushgateway.example.com/metrics/job/pushdemo/label1/foo/label2/bar" -username=myuser -password=mypass
package main

import (
    "bytes"
    "flag"
    "fmt"
    "io/ioutil"
    "net/http"
)

func fetchMetrics(url, username, password string) ([]byte, error) {
    client := &http.Client{}
    req, err := http.NewRequest("GET", url, nil)
    if err != nil {
        return nil, err
    }

    if username != "" && password != "" {
        req.SetBasicAuth(username, password)
    }

    resp, err := client.Do(req)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    return ioutil.ReadAll(resp.Body)
}

func pushMetrics(url, username, password string, metrics []byte) error {
    client := &http.Client{}
    req, err := http.NewRequest("POST", url, bytes.NewBuffer(metrics))
    if err != nil {
        return err
    }

    if username != "" && password != "" {
        req.SetBasicAuth(username, password)
    }

    resp, err := client.Do(req)
    if err != nil {
        return err
    }
    defer resp.Body.Close()

    if resp.StatusCode >= 400 {
        body, _ := ioutil.ReadAll(resp.Body)
        return fmt.Errorf("error pushing metrics: %s", body)
    }

    return nil
}

func main() {
    blackboxURL := flag.String("blackbox-url", "", "URL of the Blackbox Exporter")
    pushgatewayURL := flag.String("pushgateway-url", "", "URL of the Pushgateway")
    username := flag.String("username", "", "Optional username for Basic Auth")
    password := flag.String("password", "", "Optional password for Basic Auth")
    flag.Parse()

    if *blackboxURL == "" || *pushgatewayURL == "" {
        fmt.Println("Both blackbox-url and pushgateway-url are required")
        return
    }

    metrics, err := fetchMetrics(*blackboxURL, *username, *password)
    if err != nil {
        fmt.Printf("Error fetching metrics: %v\n", err)
        return
    }

    err = pushMetrics(*pushgatewayURL, *username, *password, metrics)
    if err != nil {
        fmt.Printf("Error pushing metrics: %v\n", err)
        return
    }

    fmt.Println("Metrics pushed successfully")
}