|
7 | 7 | "fmt"
|
8 | 8 | tmplhtml "html/template"
|
9 | 9 | "net/url"
|
| 10 | + "strings" |
10 | 11 | tmpltext "text/template"
|
11 | 12 |
|
12 | 13 | "github.com/prometheus/alertmanager/template"
|
@@ -37,29 +38,51 @@ type grafanaExploreParams struct {
|
37 | 38 |
|
38 | 39 | // grafanaExploreURL is a template helper function to generate Grafana range query explore URL in the alert template.
|
39 | 40 | func grafanaExploreURL(grafanaURL, datasource, from, to, expr string) (string, error) {
|
40 |
| - res, err := json.Marshal(&grafanaExploreParams{ |
41 |
| - Range: grafanaExploreRange{ |
42 |
| - From: from, |
43 |
| - To: to, |
44 |
| - }, |
45 |
| - Queries: []grafanaExploreQuery{ |
46 |
| - { |
47 |
| - Datasource: grafanaDatasource{ |
48 |
| - Type: "prometheus", |
49 |
| - UID: datasource, |
| 41 | + grafanaExploreQueryPrefix := "/explore?left=" |
| 42 | + var res []byte |
| 43 | + var err error |
| 44 | + var grafanaExplore grafanaExploreParams |
| 45 | + |
| 46 | + if strings.HasPrefix(expr, grafanaExploreQueryPrefix) { |
| 47 | + // remove begging to get queries params |
| 48 | + expr = strings.ReplaceAll(expr, grafanaExploreQueryPrefix, "") |
| 49 | + if err = json.Unmarshal([]byte(expr), &grafanaExplore); err != nil { |
| 50 | + return "", err |
| 51 | + } |
| 52 | + grafanaExplore.Queries[0].Range = true |
| 53 | + grafanaExplore.Queries[0].RefID = "A" |
| 54 | + grafanaExplore.Range.From = from |
| 55 | + grafanaExplore.Range.To = to |
| 56 | + } else { |
| 57 | + grafanaExplore = grafanaExploreParams{ |
| 58 | + Range: grafanaExploreRange{ |
| 59 | + From: from, |
| 60 | + To: to, |
| 61 | + }, |
| 62 | + Queries: []grafanaExploreQuery{ |
| 63 | + { |
| 64 | + Datasource: grafanaDatasource{ |
| 65 | + Type: "prometheus", |
| 66 | + UID: datasource, |
| 67 | + }, |
| 68 | + Expr: expr, |
| 69 | + Instant: false, |
| 70 | + Range: true, |
| 71 | + RefID: "A", |
50 | 72 | },
|
51 |
| - Expr: expr, |
52 |
| - Instant: false, |
53 |
| - Range: true, |
54 |
| - RefID: "A", |
55 | 73 | },
|
56 |
| - }, |
57 |
| - }) |
58 |
| - return grafanaURL + "/explore?left=" + url.QueryEscape(string(res)), err |
| 74 | + } |
| 75 | + } |
| 76 | + res, err = json.Marshal(grafanaExplore) |
| 77 | + return grafanaURL + grafanaExploreQueryPrefix + url.QueryEscape(string(res)), err |
59 | 78 | }
|
60 | 79 |
|
61 | 80 | // queryFromGeneratorURL returns a PromQL expression parsed out from a GeneratorURL in Prometheus alert
|
62 | 81 | func queryFromGeneratorURL(generatorURL string) (string, error) {
|
| 82 | + // if generator url source is a grafana product |
| 83 | + if strings.HasPrefix(generatorURL, "/explore?left=") { |
| 84 | + return generatorURL, nil |
| 85 | + } |
63 | 86 | u, err := url.Parse(generatorURL)
|
64 | 87 | if err != nil {
|
65 | 88 | return "", fmt.Errorf("failed to parse generator URL: %w", err)
|
|
0 commit comments