Skip to content

Commit 363f341

Browse files
Merge pull request #3 from WoodProgrammer/label-fetcher
Supports for dynamic label fetching and migration
2 parents eaddbb0 + e4b6706 commit 363f341

File tree

3 files changed

+49
-25
lines changed

3 files changed

+49
-25
lines changed

cmd/prometheus.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,20 @@ import (
66
"net/http"
77
"os/exec"
88

9-
lib "github.com/WoodProgrammer/prom-migrator/lib"
109
"github.com/rs/zerolog/log"
1110
)
1211

1312
type Prometheus interface {
14-
FetchPrometheusData(url string) lib.PrometheusData
13+
FetchPrometheusData(url string) map[string]interface{}
1514
ImportPrometheusData(file, targetDir string) error
1615
ExecutePromtoolCommand(args ...string) (string, error)
1716
}
1817

1918
type PromClient struct {
2019
}
2120

22-
func (promClient *PromClient) FetchPrometheusData(url string) lib.PrometheusData {
23-
var metric lib.PrometheusData
21+
func (promClient *PromClient) FetchPrometheusData(url string) map[string]interface{} {
22+
var metric map[string]interface{}
2423

2524
resp, err := http.Get(url)
2625
if err != nil {

lib/types.go

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,3 @@ package lib
33
const (
44
DirMode = 0777
55
)
6-
7-
type PrometheusData struct {
8-
Status string `json:"status"`
9-
Data Data
10-
}
11-
12-
type Data struct {
13-
ResultType string `json:"resultType"`
14-
Result []Result
15-
}
16-
type Result struct {
17-
Metric string `json:"__name__"`
18-
Instance string `json:"string"`
19-
Job string `json:"job"`
20-
Values [][]interface{} `json:"values"`
21-
}

main.go

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package main
22

33
import (
4+
"errors"
45
"fmt"
56
"os"
67
"strings"
@@ -35,15 +36,55 @@ func CallPrometheus() {
3536
}
3637
url := fmt.Sprintf("http://%s:%s/api/v1/query_range?query=%s&start=%s&end=%s&step=%s",
3738
promHost, promPort, query, startStamp, endStamp, step)
38-
fmt.Println("The url is ", url)
3939
data := newPrometheusClient.FetchPrometheusData(url)
4040
rawMetricData = append(rawMetricData, fmt.Sprintf("# TYPE %s counter", strings.Split(query, "{")[0]))
4141

42-
for _, result := range data.Data.Result {
43-
for _, k := range result.Values {
44-
line := fmt.Sprintf("%s %f %s", query, k[0], k[1])
45-
rawMetricData = append(rawMetricData, line)
42+
parsedData, ok := data["data"].(map[string]interface{})
43+
44+
if !ok {
45+
err := errors.New("json parsing error on rawPrometheus data ")
46+
log.Err(err).Msg("Error parsing 'data'")
47+
return
48+
}
49+
50+
results, ok := parsedData["result"].([]interface{})
51+
if !ok {
52+
err := errors.New("json parsing error on parsedData['result'] data ")
53+
log.Err(err).Msg("Error parsing 'result'")
54+
return
55+
}
56+
57+
for _, r := range results {
58+
59+
result, ok := r.(map[string]interface{})
60+
if !ok {
61+
continue
4662
}
63+
labelMap := []string{}
64+
metric, ok := result["metric"].(map[string]interface{})
65+
66+
metricName, ok := metric["__name__"].(string)
67+
if ok {
68+
for key, value := range metric {
69+
70+
if key != "__name__" {
71+
labelMap = append(labelMap, fmt.Sprintf(`%s="%s"`, key, value))
72+
}
73+
}
74+
query := fmt.Sprintf(`%s{%s}`, metricName, strings.Join(labelMap, ","))
75+
76+
values, ok := result["values"].([]interface{})
77+
if ok {
78+
for _, v := range values {
79+
valArr, ok := v.([]interface{})
80+
if ok && len(valArr) == 2 {
81+
tmpData := fmt.Sprintf("%s %v %v", query, valArr[0], valArr[1])
82+
rawMetricData = append(rawMetricData, tmpData)
83+
}
84+
}
85+
}
86+
}
87+
4788
}
4889
rawMetricData = append(rawMetricData, fmt.Sprintf("# EOF"))
4990

0 commit comments

Comments
 (0)