|
4 | 4 | "encoding/json" |
5 | 5 | "fmt" |
6 | 6 | "math" |
| 7 | + "regexp" |
7 | 8 | "sort" |
8 | 9 | "strconv" |
9 | 10 | "strings" |
@@ -191,32 +192,52 @@ func (c *PrometheusGroup) seriesByTagToPromQL(step, target string) (string, stri |
191 | 192 | } |
192 | 193 |
|
193 | 194 | func convertGraphiteTargetToPromQL(query string) string { |
194 | | - // Special case for query for "*", which is used to get top level metric parts |
195 | | - if query == "*" { |
196 | | - return ".*" |
197 | | - } |
198 | | - reQuery := strings.Builder{} |
| 195 | + var sb strings.Builder |
| 196 | + |
| 197 | + for { |
| 198 | + n := strings.IndexAny(query, "*[{") |
| 199 | + if n < 0 { |
| 200 | + sb.WriteString(regexp.QuoteMeta(query)) |
| 201 | + return sb.String() |
| 202 | + } |
199 | 203 |
|
200 | | - inGroup := 0 |
201 | | - for _, c := range query { |
202 | | - switch c { |
203 | | - case '.': |
204 | | - reQuery.WriteString("\\\\.") |
| 204 | + sb.WriteString(regexp.QuoteMeta(query[:n])) |
| 205 | + ch := query[n] |
| 206 | + query = query[n+1:] |
| 207 | + |
| 208 | + switch ch { |
205 | 209 | case '*': |
206 | | - reQuery.WriteString("[^.][^.]*") |
| 210 | + if query == "" { |
| 211 | + // needed to support find requests when asterisk is the last character and dots should be included |
| 212 | + sb.WriteString(".*") |
| 213 | + break |
| 214 | + } |
| 215 | + |
| 216 | + sb.WriteString("[^.]*?") |
| 217 | + |
| 218 | + case '[': |
| 219 | + n = strings.Index(query, "]") |
| 220 | + if n < 0 { |
| 221 | + sb.WriteString(regexp.QuoteMeta("[" + query)) |
| 222 | + return sb.String() |
| 223 | + } |
| 224 | + sb.WriteString("[" + query[:n+1]) |
| 225 | + query = query[n+1:] |
| 226 | + |
207 | 227 | case '{': |
208 | | - reQuery.WriteString("(") |
209 | | - inGroup++ |
210 | | - case ',': |
211 | | - reQuery.WriteString("|") |
212 | | - case '}': |
213 | | - reQuery.WriteString(")") |
214 | | - default: |
215 | | - reQuery.WriteRune(c) |
| 228 | + n = strings.Index(query, "}") |
| 229 | + if n < 0 { |
| 230 | + sb.WriteString(regexp.QuoteMeta("{" + query)) |
| 231 | + return sb.String() |
| 232 | + } |
| 233 | + alts := strings.Split(query[:n], ",") |
| 234 | + query = query[n+1:] |
| 235 | + for i := range alts { |
| 236 | + alts[i] = regexp.QuoteMeta(alts[i]) |
| 237 | + } |
| 238 | + sb.WriteString("(" + strings.Join(alts, "|") + ")") |
216 | 239 | } |
217 | 240 | } |
218 | | - |
219 | | - return reQuery.String() |
220 | 241 | } |
221 | 242 |
|
222 | 243 | // inserts math.NaN() in place of gaps in data from Prometheus |
|
0 commit comments