|
|
|
|
@ -33,8 +33,6 @@ import ( |
|
|
|
|
|
|
|
|
|
// Push metrics to a prometheus remote write (for testing purpose only).
|
|
|
|
|
func PushMetrics(url *url.URL, roundTripper http.RoundTripper, headers map[string]string, timeout time.Duration, labels map[string]string, files ...string) int { |
|
|
|
|
failed := false |
|
|
|
|
|
|
|
|
|
addressURL, err := url.Parse(url.String()) |
|
|
|
|
if err != nil { |
|
|
|
|
fmt.Fprintln(os.Stderr, err) |
|
|
|
|
@ -63,63 +61,37 @@ func PushMetrics(url *url.URL, roundTripper http.RoundTripper, headers map[strin |
|
|
|
|
headers: headers, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// add empty string to avoid matching filename
|
|
|
|
|
if len(files) == 0 { |
|
|
|
|
files = append(files, "") |
|
|
|
|
} |
|
|
|
|
var data []byte |
|
|
|
|
var failed bool |
|
|
|
|
|
|
|
|
|
for _, file := range files { |
|
|
|
|
var data []byte |
|
|
|
|
var err error |
|
|
|
|
|
|
|
|
|
// if file is an empty string it is a stdin
|
|
|
|
|
if file == "" { |
|
|
|
|
data, err = io.ReadAll(os.Stdin) |
|
|
|
|
if err != nil { |
|
|
|
|
fmt.Fprintln(os.Stderr, " FAILED:", err) |
|
|
|
|
failed = true |
|
|
|
|
break |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fmt.Printf("Parsing input from stdin\n") |
|
|
|
|
} else { |
|
|
|
|
data, err = os.ReadFile(file) |
|
|
|
|
if err != nil { |
|
|
|
|
fmt.Fprintln(os.Stderr, " FAILED:", err) |
|
|
|
|
failed = true |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
fmt.Printf("Parsing input from metric file %s\n", file) |
|
|
|
|
} |
|
|
|
|
metricsData, err := fmtutil.ParseMetricsTextAndFormat(bytes.NewReader(data), labels) |
|
|
|
|
if len(files) == 0 { |
|
|
|
|
data, err = io.ReadAll(os.Stdin) |
|
|
|
|
if err != nil { |
|
|
|
|
fmt.Fprintln(os.Stderr, " FAILED:", err) |
|
|
|
|
failed = true |
|
|
|
|
continue |
|
|
|
|
return failureExitCode |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
raw, err := metricsData.Marshal() |
|
|
|
|
if err != nil { |
|
|
|
|
fmt.Fprintln(os.Stderr, " FAILED:", err) |
|
|
|
|
failed = true |
|
|
|
|
continue |
|
|
|
|
fmt.Printf("Parsing standard input\n") |
|
|
|
|
if parseAndPushMetrics(client, data, labels) { |
|
|
|
|
fmt.Printf(" SUCCESS: metrics pushed to remote write.\n") |
|
|
|
|
return successExitCode |
|
|
|
|
} |
|
|
|
|
return failureExitCode |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Encode the request body into snappy encoding.
|
|
|
|
|
compressed := snappy.Encode(nil, raw) |
|
|
|
|
err = client.Store(context.Background(), compressed) |
|
|
|
|
for _, file := range files { |
|
|
|
|
data, err = os.ReadFile(file) |
|
|
|
|
if err != nil { |
|
|
|
|
fmt.Fprintln(os.Stderr, " FAILED:", err) |
|
|
|
|
failed = true |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if file == "" { |
|
|
|
|
fmt.Printf(" SUCCESS: metric pushed to remote write.\n") |
|
|
|
|
} else { |
|
|
|
|
fmt.Printf(" SUCCESS: metric file %s pushed to remote write.\n", file) |
|
|
|
|
fmt.Printf("Parsing metrics file %s\n", file) |
|
|
|
|
if parseAndPushMetrics(client, data, labels) { |
|
|
|
|
fmt.Printf(" SUCCESS: metrics file %s pushed to remote write.\n", file) |
|
|
|
|
continue |
|
|
|
|
} |
|
|
|
|
failed = true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if failed { |
|
|
|
|
@ -129,6 +101,30 @@ func PushMetrics(url *url.URL, roundTripper http.RoundTripper, headers map[strin |
|
|
|
|
return successExitCode |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func parseAndPushMetrics(client *remote.Client, data []byte, labels map[string]string) bool { |
|
|
|
|
metricsData, err := fmtutil.ParseMetricsTextAndFormat(bytes.NewReader(data), labels) |
|
|
|
|
if err != nil { |
|
|
|
|
fmt.Fprintln(os.Stderr, " FAILED:", err) |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
raw, err := metricsData.Marshal() |
|
|
|
|
if err != nil { |
|
|
|
|
fmt.Fprintln(os.Stderr, " FAILED:", err) |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Encode the request body into snappy encoding.
|
|
|
|
|
compressed := snappy.Encode(nil, raw) |
|
|
|
|
err = client.Store(context.Background(), compressed) |
|
|
|
|
if err != nil { |
|
|
|
|
fmt.Fprintln(os.Stderr, " FAILED:", err) |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type setHeadersTransport struct { |
|
|
|
|
http.RoundTripper |
|
|
|
|
headers map[string]string |
|
|
|
|
|