diff --git a/panels_vl.go b/panels_vl.go index a40e4d0..876fb34 100644 --- a/panels_vl.go +++ b/panels_vl.go @@ -58,6 +58,8 @@ func makeVLTargetWithType(refID, expr, datasourceUID, legendFormat, queryType st // luceneToLogsQL конвертирует базовый Lucene-запрос в LogsQL. // Поддерживает: AND→пробел, SID:(a OR b)→SID:in(a,b), field:[X TO Y]→field:>=X AND field:<=Y func luceneToLogsQL(q string) string { + // Убираем Lucene-экранирование — заменяем все \X на X + q = unescapeLucene(q) // AND → пробел (LogsQL использует пробел как AND) q = strings.ReplaceAll(q, " AND ", " ") @@ -449,3 +451,20 @@ func buildVLBucketLogsTargets(cfg map[string]interface{}, _ string, _ string, da makeVLStatsTarget("A", expr, datasourceUID, legendFormat), } } + +// unescapeLucene убирает Lucene-экранирование символов вида \X → X +func unescapeLucene(q string) string { + var result strings.Builder + i := 0 + for i < len(q) { + if q[i] == '\\' && i+1 < len(q) { + // Пропускаем обратный слеш, берём следующий символ как есть + result.WriteByte(q[i+1]) + i += 2 + } else { + result.WriteByte(q[i]) + i++ + } + } + return result.String() +}