Справочник ошибок

100 Unhandled root runtime error

Корневое выражение может вызывать ошибку времени выполнения, и она не обрабатывается в программе VRL.

Обоснование

VRL надежно обрабатывает ошибки и требует, чтобы все возможные ошибки времени выполнения были обработаны. Это гарантирует безотказную работу VRL и помогает обеспечить надежное выполнение программ VRL при их развертывании.

Решение

Обработайте ошибку времени выполнения путем присвоения, объединения или вызова ошибки.

Примеры

Необработанная ошибка времени выполнения корневого выражения (присвоение)

Example 1. Программа VRL
get_env_var("HOST")
Example 2. Как исправить
- get_env_var("HOST")
+# .host = get_env_var("HOST")

101 Malformed regex literal

Выражение регулярного литерала сформировано неправильно и, следовательно, не приводит к действительному регулярному выражению.

Обоснование

Недопустимые регулярные выражения не компилируются.

Решение

Регулярные выражения часто приводят к ошибкам синтаксиса. Если вы обрабатываете общий формат лога (Common Log Format), рекомендуется использовать одну из функций parse_* VRL.

Если вы не обнаружили подходящей функции для вашего формата, попробуйте использовать инструмент тестирования регулярных выражений Rust для тестирования и исправления вашего регулярного выражения.

Примеры

Неверный литерал регулярного выражения (общий формат)

Example 3. Программа VRL
. |= parse_regex!(.message, r'^(?P<хост>[\w\.]+) - (?P<пользователь>[\w]+) (?P<байты_вход>[\d]+) \[?P<метка_времени>.*)\] "(?P<метод>[\w]+) (?P<путь>.*)" (?P<статус>[\d]+) (?P<байты_выход>[\d]+)$')
Example 4. Как исправить
-. |= parse_regex!(.message, r'^(?P<хост>[\w\.]+) - (?P<пользователь>[\w]+) (?P<байты_вход>[\d]+) \[?P<метка_времени>.*)\] "(?P<метод>[\w]+) (?P<путь>.*)" (?P<статус>[\d]+) (?P<байты_выход>[\d]+)$')
+. |= parse_common_log!(.message)

102 Non-boolean if expression predicate

Предикат условного выражения не вычисляется в значение логического типа.

Обоснование

VRL не поддерживает "истинные" значения (нелогические значения, которые приводятся к значению "true", например, 1), так как они могут привести к неожиданному поведению при использовании в условных выражениях. Это гарантирует безопасную работу VRL и надежное выполнение программ VRL при их развертывании.

Решение

Измените предикат условного выражения так, чтобы он вычислялся в значение логического типа. Полезной функцией для решения этой проблемы является is_nullish.

Примеры

Предикат условного выражения с логическим типом (строки)

Example 5. Событие журнала
{
"сообщение": "ключ=значение"
}
Example 6. Программа VRL
if .message {
. |= parse_key_value!(.message)
}
Example 7. Как исправить
-if .message {
+if exists(.message) {
. |= parse_key_value!(.message)
}

103 Unhandled fallible assignment

Правая часть этого присваивания может вызывать ошибку времени выполнения, но ошибка не обрабатывается.

Обоснование

VRL надежно обрабатывает ошибки и требует, чтобы все возможные ошибки времени выполнения были обработаны. Это гарантирует безотказную работу VRL и помогает обеспечить надежное выполнение программ VRL при их развертывании.

Решение

Обработайте ошибку времени выполнения путем присвоения, объединения или вызова ошибки.

Примеры

Необработанное присваивание с возвратом ошибки(объединение)

Example 8. Событие журнала
{
"сообщение": "ключ=значение"
}
Example 9. Программа VRL
. = parse_key_value(.message)
Example 10. Как исправить
-. = parse_key_value(.message)
+. = parse_key_value(.message) ?? {}

Необработанное присваивание с возвратом ошибки (вызов ошибки)

Example 11. Событие журнала
{
"сообщение": "ключ=значение"
}
Example 12. Программа VRL
. = parse_key_value(.message)
Example 13. Как исправить это
-. = parse_key_value(.message)
+. = parse_key_value!(.message)

Необработанное присваивание с возвратом ошибки (присвоение)

Example 14. Событие журнала
{
"сообщение": "ключ=значение"
}
Example 15. Программа VRL
. = parse_key_value(.message)
Example 16. Как исправить
-. = parse_key_value(.message)
+., err = parse_key_value(.message)

104 Unnecessary error assignment

Левая часть выражения присваивания обрабатывает ошибки, хотя правая часть не может вызвать ошибку.

Обоснование

Присваивание ошибки, когда это невозможно, фактически является мертвым кодом, который затрудняет чтение программы. Удаление присваивания ошибки упростит вашу программу.

Решение

Удалите присваивание ошибки.

Примеры

Ненужное присваивание ошибки (строки)

Example 17. Программа VRL
.message, err = downcase(.message)
Example 18. Как исправить
-.message, err = downcase(.message)
+.message = downcase(.message)

105 Undefined function

Вызывается неизвестная функция.

Решение

Это обычно связано с опечаткой. Исправление имени функции должно решить эту проблему.

Примеры

Неопределенная функция (опечатка)

Example 19. Программа VRL
parse_keyvalue(.message)
Example 20. Как исправить
-parse_keyvalue(.message)
+parse_key_value(.message)

106 Function argument arity mismatch

Выражение вызова функции вызывает функцию слишком большим перечнем аргументов.

Решение

Удалите лишние аргументы, чтобы соответствовать задокументированной сигнатуре функции.

Примеры

Несоответствие количества аргументов функции

Example 21. Программа VRL
parse_json(.message, pretty: true)
Example 22. Как исправить
-parse_json(.message, pretty: true)
+parse_json(.message)

107 Required function argument missing

Выражение вызова функции не передает обязательный аргумент.

Решение

Укажите все обязательные аргументы функции, чтобы соответствовать задокументированной сигнатуре функции.

Примеры

Отсутствует обязательный аргумент функции

Example 23. Программа VRL
parse_timestamp(.timestamp)
Example 24. Как исправить
-parse_timestamp(.timestamp)
+parse_timestamp(.timestamp, format: "%D")

108 Unknown function argument keyword

Выражение вызова функции содержит неизвестное именованное значение аргумента.

Решение

Исправьте имя так, чтобы оно соответствовало задокументированным именам аргументов функции.

Примеры

Неизвестное ключевое слово аргумента функции

Example 25. Программа VRL
parse_timestamp(.timestamp, fmt: "%D")
Example 26. Как исправить
-parse_timestamp(.timestamp, fmt: "%D")
+parse_timestamp(.timestamp, format: "%D")

110 Invalid argument type

Аргумент, переданный выражению функции, не является поддерживаемым типом.

Обоснование

VRL надежно обрабатывает ошибки и требует, чтобы все возможные ошибки времени выполнения были обработаны. Это гарантирует безотказную работу VRL и помогает обеспечить надежное выполнение программ VRL при их развертывании.

Решение

Обеспечьте тип переменной, используя соответствующий тип или функцию приведения типов.

Примеры

Неверный тип аргумента (защита с использованием значений по умолчанию)

Example 27. Программа VRL
downcase(.message)
Example 28. Как исправить
+.message = string(.message) ?? ""
downcase(.message)

Неверный тип аргумента (защита с использованием ошибок)

Example 29. Программа VRL
downcase(.message)
Example 30. Как исправить
downcase(string!(.message))

111 Unhandled predicate error

Предикат вызывает ошибку времени выполнения, и она не обрабатывается в программе VRL.

Обоснование

VRL надежно обрабатывает ошибки и требует, чтобы все возможные ошибки времени выполнения были обработаны. Это гарантирует безотказную работу VRL и помогает обеспечить надежное выполнение программ VRL при их развертывании.

Решение

Обработайте ошибку времени выполнения путем присвоения, объединения или вызова ошибки.

Примеры

Необработанная ошибка предиката (предикат)

Example 31. Программа VRL
if contains(.field, "thing") {
log("thing")
}
Example 32. Как исправить
- if contains(.field, "thing") {
+# if contains(.field, "thing") ?? false {

203 Unrecognized token

Ваша программа VRL содержит токен (символ), который парсер VRL не распознает как допустимый.

Решение

Используйте допустимый токен.

Примеры

Нераспознанный токен

Example 33. Программа VRL
😂
Example 34. Как исправить
-😂
+"некоторое допустимое значение"

204 Unrecognized end-of-file (EOF)

Парсер VRL достиг конца программы в недопустимом состоянии, возможно, из-за опечатки или висячего выражения.

Решение

Убедитесь, что последнее выражение в программе является допустимым.

Примеры

Нераспознанный конец файла (EOF)

Example 35. Программа VRL
.field1 = "value1"
.field2 =
Example 36. Как исправить
-.bar =
+.field2 = " value2"

205 Reserved keyword

Вы использовали имя переменной, которое служит для другой цели в VRL или зарезервировано для возможного будущего использования.

Решение

Используйте другое имя переменной.

Примеры

Зарезервированное ключевое слово

Example 37. Программа VRL
else = "some value"
Example 38. Как исправить
-else = "some value"
+some_non_reserved_name = "some value"

206 Invalid numeric literal

Компилятор VRL не распознает этот числовой литерал как допустимый.

207 Invalid string literal

Ваша программа VRL содержит строковый литерал, который парсер VRL не распознает как допустимый.

Решение

Убедитесь, что ваша строка правильно заключена в одинарные или двойные кавычки.

Примеры

Недопустимый строковый литерал

Example 39. Программа VRL
"Houston, we have a problem'
Example 40. Как исправить это
- "Houston, we have a problem'
+ "Houston, we have a problem"

208 Invalid literal

Компилятор VRL не распознает этот литерал как допустимое значение.

209 Invalid escape character

Ваша строка содержит символ экранирования, который компилятор VRL не распознает как допустимый.

300 Unexpected type

Компилятор VRL ожидал значение определенного типа, но обнаружил другой тип.

301 Type coercion error

Это значение не может быть приведено к желаемому типу.

302 Remainder error

Эти два типа не могут дать остаток.

303 Multiplication error

Эти типы не могут быть перемножены.

304 Division error

Левое значение не может быть разделено на правое значение.

305 Divide by zero

Вы пытаетесь разделить целое число или число с плавающей точкой на ноль.

Обоснование

В отличие от некоторых других языков программирования, VRL не имеет понятия бесконечности, так как неясно, как это может быть применимо к области использования данных для целей наблюдения. Таким образом, деление на ноль не может иметь смыслового результата.

Решение

Если вы знаете, что значение обязательно равно нулю, не делите на него. Если значение может быть нулем, обработайте потенциальную ошибку, вызванную операцией:

result, err = 27 / .some_value
if err != nil {
# Обработать ошибку
}

306 306 NaN float

В числах с плавающей точкой VRL не может быть NaN (не число).

307 Addition error

Эти два значения не могут быть сложены вместе.

308 Subtraction error

Правое значение не может быть вычтено из левого значения.

309 Or expression error

Эти два значения не могут быть объединены в выражение OR.

310 And expression error

Эти два значения не могут быть объединены в выражение AND.

311 Greater than error

Эти два значения нельзя использовать в выражении "больше чем".

312 Greater than or equal to error

Эти два значения нельзя использовать в выражении "больше или равно".

313 Less than error

Эти два значения нельзя использовать в выражении "меньше чем".

314 Less than or equal to error

Эти два значения нельзя использовать в выражении "меньше или равно".

315 mutation of read-only value

Это значение доступно только для чтения и не может быть удалено или изменено.

400 Unexpected expression

Компилятор VRL встретил тип выражения, которое здесь не ожидалось.

401 Invalid enum variant

VRL ожидает значение перечисления для этого аргумента, но значение, которое вы ввели для перечисления, недопустимо.

Решение

Проверьте документацию для этой функции в справочнике функций VRL, чтобы узнать, какие значения перечисления допустимы для этого аргумента.

402 Expected static expression for function argument

VRL ожидал статическое выражение для аргумента функции, но было предоставлено динамическое выражение (например, переменная).

Для некоторых аргументов функций VRL требуются статические выражения для проверки типов аргументов на этапе компиляции, чтобы избежать ошибок времени выполнения.

Решение

Замените динамический аргумент статическим выражением.

403 Invalid argument

Функции передан недопустимый аргумент. Строка ошибки содержит более подробные сведения о том, что было недопустимо.

Решение

Проверьте строку ошибки этой ошибки, чтобы узнать, что было недопустимо.

601 Invalid timestamp

Предоставленный литерал метки времени корректно оформлен (т. е. использует синтаксис t'…​'), но метка времени не соответствует формату RFC 3339.

Обоснование

Недопустимые метки времени не компилируются.

Решение

Приведите метку времени в соответствие с форматом RFC 3339.

Примеры

Неверное форматирование метки времени

Example 41. Программа VRL
.timestamp = format_timestamp!(t'next Tuesday', format: "%v %R")
Example 42. Как исправить
-.timestamp = format_timestamp!(t'next Tuesday', format: "%v %R")
+.timestamp = format_timestamp!(t'2021-03-09T16:33:02.405806Z', format: "%v %R")

620 Aborting infallible function

Вы указали, что функция должна прерываться при ошибке, хотя функция не возвращает ошибки.

Обоснование

В VRL функции, которые не возвращают ошибки — это функции, которые не могут завершиться с ошибкой и не требуют обработки ошибок, что означает, что не имеет смысла использовать ! в вызове функции для прерывания при ошибке.

Решение

Удалите ! из вызова функции.

Примеры

Прерывание невосприимчивой функции

Example 43. Программа VRL
encode_json!(["one", "two", "three"])
Example 44. Как исправить
- encode_json!(["one", "two", "three"])
+# encode_json(["one", "two", "three"])

630 Fallible argument

Вы передали выражение, которое возвращает ошибки, в качестве аргумента функции.

Обоснование

В VRL выражения, которые вы передаете функциям в качестве аргументов, сами также не должны возвращать ошибки. В противном случае результат функции будет неопределенным.

Решение

Сделайте так, чтобы выражение, передаваемое в функцию, не могло возвращать ошибки, потенциально прервав его при возникновении ошибки с помощью !, объединив его ошибку с помощью ?? или с помощью некоторого другого метода.

Примеры

Невосприимчивый аргумент

Example 45. Программа VRL
format_timestamp!(parse_timestamp!("2021-01-17T23:27:31.891948Z", "%+"), format: "%v %R")
Example 46. Как исправить
- format_timestamp!(parse_timestamp!("2021-01-17T23:27:31.891948Z", "%+"), format: "%v %R")
+ format_timestamp!(parse_timestamp!("2021-01-17T23:27:31.891948Z", "%+"), format: "%v %R")

631 Fallible abort message expression

Вы передали выражение, которое возвращает ошибки, в качестве сообщения для прерывания.

Обоснование

Выражение, которое вы передаете для прерывания, не должно возвращать ошибки. В противном случае, выражение прерывания может завершиться с ошибкой во время выполнения.

Решение

Сделайте так, чтобы выражение, передаваемое в функцию, не могло возвращать ошибки, потенциально прервав его при возникновении ошибки с помощью !, объединив его ошибку с помощью ?? или с помощью некоторого другого метода.

Примеры

Выражение с сообщением о прерывании (может возвращать ошибку)

Example 47. Программа VRL
abort to_syslog_level(0)
Example 48. Как исправить
- abort to_syslog_level(0)
+ abort to_syslog_level(0) ?? "other"

640 No-op assignment

Вы присвоили значение чему-то, что не является ни переменной, ни путем.

Обоснование

Все присваивания в VRL должны быть либо путем, либо переменной. Если вы пытаетесь присвоить значение, например, подчеркиванию (_), эта операция считается "бездействующей" (no-op), так как она не имеет эффекта (и, следовательно, не является присваиванием).

Решение

Присвойте значение правой стороны (выражения) переменной или пути.

Примеры

Присваивание значения

Example 49. Программа VRL
_ = "the hills are alive"
Example 50. Как исправить это
- _ = "the hills are alive"
+# .movie_song_quote = "the hills are alive"

650 Chained comparison operators

Вы связали несколько операторов сравнения вместе таким образом, что не может получиться допустимое выражение.

Обоснование

Операторы сравнения могут работать только с двумя операндами, например, 1 != 2. Связывание их вместе, например, 1 < 2 < 3, приводит к бессмысленному неприменимому выражению.

Решение

Используйте операторы сравнения только с левым и правым значением. Вы можете связывать операции сравнения вместе при условии, что выражения правильно сгруппированы. Так, например, a == b == c не является допустимым, но a == b && b == c является допустимым, так как в нем используются отдельные логические выражения.

Примеры

Цепочка операторов сравнения

Example 51. Программа VRL
1 == 1 == 2
Example 52. Как исправить
- 1 == 1 == 2
+# (1 == 1) && (1 == 2)

651 Unnecessary error coalescing operation

Вы использовали операцию слияния ошибок (??) для обработки ошибки, но в данном случае левая операция не может возвращать ошибки, и поэтому правое значение после ?? никогда не достигается.

Обоснование

Операции слияния ошибок полезны, когда вы хотите указать, что происходит, если операция завершается с ошибкой. Вот пример:

result = op1 ?? op2

В этом примере, если op1 не возвращает ошибки (не может завершиться с ошибкой), то переменная result устанавливается в значение op1, а op2 никогда не достигается.

Решение

Если левая операция не должна возвращать ошибки, удалите оператор ?? и правую операцию. Если, однако, левая операция должна возвращать ошибки, удалите ! из вызова функции и все остальное, что приводит к вызову ошибок.

652 Only objects can be merged

Вы пытаетесь объединить два значения, но одно или оба из них не являются объектами.

Обоснование

Среди типов, доступных в VRL, только объекты могут быть объединены вместе. Не ясно, что бы означало объединение, например, объекта с логическим значением. Однако следует отметить, что для некоторых других типов VRL доступны операции, похожие на объединение:

  • Строки можно объединять вместе

  • Массивы можно присоединять к другим массивам

Эти операции могут оказаться полезными, если вы случайно использовали merge.

Решение

Убедитесь, что оба значения, которые вы объединяете, являются объектами VRL. Если вы не уверены, является ли значение объектом, вы можете использовать функцию object для проверки.

660 Non-Boolean negation

Вы использовали оператор отрицания для отрицания нелогического выражения.

Обоснование

Оператор отрицания (!) может использоваться только с логическими значениями. Например, выражение !false приводит к значению true, в то время как !"hello" является бессмысленным выражением.

Решение

Используйте оператор отрицания только с логическими выражениями.

Примеры

Отрицание нелогических значений

Example 53. Программа VRL
!47
Example 54. Как исправить
- !47
+# !(47 == 48)

701 Call to Undefined Variable

Ссылка на неопределенную переменную.

Обоснование

Ссылка на переменную, которая не определена, приводит к неожиданному поведению и, скорее всего, связана с опечаткой.

Решение

Сначала присвойте переменной значение или исправьте опечатку в ссылке.

Примеры

Неопределенная переменная

Example 55. Программа VRL
my_variable
Example 56. Как исправить
+my_variable = true
my_variable

Неправильное имя переменной

Example 57. Программа VRL
my_variable = true
my_var
Example 58. Как исправить
-my_var
+my_variable

801 Usage of deprecated item

Ссылка на устаревший элемент. Обычно предлагается альтернатива, которую можно использовать вместо нее.

Обоснование

Этот элемент будет удален в будущем.

Решение

Примените предложенную альтернативу.