Справочник ошибок
100 Unhandled root runtime error
Корневое выражение может вызывать ошибку времени выполнения, и она не обрабатывается в программе VRL.
Обоснование
VRL надежно обрабатывает ошибки и требует, чтобы все возможные ошибки времени выполнения были обработаны. Это гарантирует безотказную работу VRL и помогает обеспечить надежное выполнение программ VRL при их развертывании.
Решение
Обработайте ошибку времени выполнения путем присвоения, объединения или вызова ошибки.
Примеры
Необработанная ошибка времени выполнения корневого выражения (присвоение)
get_env_var("HOST")
- get_env_var("HOST") +# .host = get_env_var("HOST")
101 Malformed regex literal
Выражение регулярного литерала сформировано неправильно и, следовательно, не приводит к действительному регулярному выражению.
Обоснование
Недопустимые регулярные выражения не компилируются.
Решение
Регулярные выражения часто приводят к ошибкам синтаксиса. Если вы обрабатываете общий формат лога (Common Log Format), рекомендуется использовать одну из функций parse_*
VRL.
Если вы не обнаружили подходящей функции для вашего формата, попробуйте использовать инструмент тестирования регулярных выражений Rust для тестирования и исправления вашего регулярного выражения.
Примеры
Неверный литерал регулярного выражения (общий формат)
. |= parse_regex!(.message, r'^(?P<хост>[\w\.]+) - (?P<пользователь>[\w]+) (?P<байты_вход>[\d]+) \[?P<метка_времени>.*)\] "(?P<метод>[\w]+) (?P<путь>.*)" (?P<статус>[\d]+) (?P<байты_выход>[\d]+)$')
-. |= 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
.
Примеры
Предикат условного выражения с логическим типом (строки)
{ "сообщение": "ключ=значение" }
if .message { . |= parse_key_value!(.message) }
-if .message { +if exists(.message) { . |= parse_key_value!(.message) }
103 Unhandled fallible assignment
Правая часть этого присваивания может вызывать ошибку времени выполнения, но ошибка не обрабатывается.
Обоснование
VRL надежно обрабатывает ошибки и требует, чтобы все возможные ошибки времени выполнения были обработаны. Это гарантирует безотказную работу VRL и помогает обеспечить надежное выполнение программ VRL при их развертывании.
Решение
Обработайте ошибку времени выполнения путем присвоения, объединения или вызова ошибки.
Примеры
Необработанное присваивание с возвратом ошибки(объединение)
{ "сообщение": "ключ=значение" }
. = parse_key_value(.message)
-. = parse_key_value(.message) +. = parse_key_value(.message) ?? {}
Необработанное присваивание с возвратом ошибки (вызов ошибки)
{ "сообщение": "ключ=значение" }
. = parse_key_value(.message)
-. = parse_key_value(.message) +. = parse_key_value!(.message)
Необработанное присваивание с возвратом ошибки (присвоение)
{ "сообщение": "ключ=значение" }
. = parse_key_value(.message)
-. = parse_key_value(.message) +., err = parse_key_value(.message)
104 Unnecessary error assignment
Левая часть выражения присваивания обрабатывает ошибки, хотя правая часть не может вызвать ошибку.
Обоснование
Присваивание ошибки, когда это невозможно, фактически является мертвым кодом, который затрудняет чтение программы. Удаление присваивания ошибки упростит вашу программу.
Решение
Удалите присваивание ошибки.
Примеры
Ненужное присваивание ошибки (строки)
.message, err = downcase(.message)
-.message, err = downcase(.message) +.message = downcase(.message)
105 Undefined function
Вызывается неизвестная функция.
Решение
Это обычно связано с опечаткой. Исправление имени функции должно решить эту проблему.
Примеры
Неопределенная функция (опечатка)
parse_keyvalue(.message)
-parse_keyvalue(.message) +parse_key_value(.message)
106 Function argument arity mismatch
Выражение вызова функции вызывает функцию слишком большим перечнем аргументов.
Решение
Удалите лишние аргументы, чтобы соответствовать задокументированной сигнатуре функции.
Примеры
Несоответствие количества аргументов функции
parse_json(.message, pretty: true)
-parse_json(.message, pretty: true) +parse_json(.message)
107 Required function argument missing
Выражение вызова функции не передает обязательный аргумент.
Решение
Укажите все обязательные аргументы функции, чтобы соответствовать задокументированной сигнатуре функции.
Примеры
Отсутствует обязательный аргумент функции
parse_timestamp(.timestamp)
-parse_timestamp(.timestamp) +parse_timestamp(.timestamp, format: "%D")
108 Unknown function argument keyword
Выражение вызова функции содержит неизвестное именованное значение аргумента.
Решение
Исправьте имя так, чтобы оно соответствовало задокументированным именам аргументов функции.
Примеры
Неизвестное ключевое слово аргумента функции
parse_timestamp(.timestamp, fmt: "%D")
-parse_timestamp(.timestamp, fmt: "%D") +parse_timestamp(.timestamp, format: "%D")
110 Invalid argument type
Аргумент, переданный выражению функции, не является поддерживаемым типом.
Обоснование
VRL надежно обрабатывает ошибки и требует, чтобы все возможные ошибки времени выполнения были обработаны. Это гарантирует безотказную работу VRL и помогает обеспечить надежное выполнение программ VRL при их развертывании.
Решение
Обеспечьте тип переменной, используя соответствующий тип или функцию приведения типов.
Примеры
Неверный тип аргумента (защита с использованием значений по умолчанию)
downcase(.message)
+.message = string(.message) ?? "" downcase(.message)
Неверный тип аргумента (защита с использованием ошибок)
downcase(.message)
downcase(string!(.message))
111 Unhandled predicate error
Предикат вызывает ошибку времени выполнения, и она не обрабатывается в программе VRL.
Обоснование
VRL надежно обрабатывает ошибки и требует, чтобы все возможные ошибки времени выполнения были обработаны. Это гарантирует безотказную работу VRL и помогает обеспечить надежное выполнение программ VRL при их развертывании.
Решение
Обработайте ошибку времени выполнения путем присвоения, объединения или вызова ошибки.
Примеры
Необработанная ошибка предиката (предикат)
if contains(.field, "thing") { log("thing") }
- if contains(.field, "thing") { +# if contains(.field, "thing") ?? false {
203 Unrecognized token
Ваша программа VRL содержит токен (символ), который парсер VRL не распознает как допустимый.
Решение
Используйте допустимый токен.
Примеры
Нераспознанный токен
😂
-😂 +"некоторое допустимое значение"
204 Unrecognized end-of-file (EOF)
Парсер VRL достиг конца программы в недопустимом состоянии, возможно, из-за опечатки или висячего выражения.
Решение
Убедитесь, что последнее выражение в программе является допустимым.
Примеры
Нераспознанный конец файла (EOF)
.field1 = "value1" .field2 =
-.bar = +.field2 = " value2"
205 Reserved keyword
Вы использовали имя переменной, которое служит для другой цели в VRL или зарезервировано для возможного будущего использования.
Решение
Используйте другое имя переменной.
Примеры
Зарезервированное ключевое слово
else = "some value"
-else = "some value" +some_non_reserved_name = "some value"
207 Invalid string literal
Ваша программа VRL содержит строковый литерал, который парсер VRL не распознает как допустимый.
Решение
Убедитесь, что ваша строка правильно заключена в одинарные или двойные кавычки.
Примеры
Недопустимый строковый литерал
"Houston, we have a problem'
- "Houston, we have a problem' + "Houston, we have a problem"
209 Invalid escape character
Ваша строка содержит символ экранирования, который компилятор VRL не распознает как допустимый.
305 Divide by zero
Вы пытаетесь разделить целое число или число с плавающей точкой на ноль.
Обоснование
В отличие от некоторых других языков программирования, VRL не имеет понятия бесконечности, так как неясно, как это может быть применимо к области использования данных для целей наблюдения. Таким образом, деление на ноль не может иметь смыслового результата.
Решение
Если вы знаете, что значение обязательно равно нулю, не делите на него. Если значение может быть нулем, обработайте потенциальную ошибку, вызванную операцией:
result, err = 27 / .some_value
if err != nil {
# Обработать ошибку
}
312 Greater than or equal to error
Эти два значения нельзя использовать в выражении "больше или равно".
314 Less than or equal to error
Эти два значения нельзя использовать в выражении "меньше или равно".
315 mutation of read-only value
Это значение доступно только для чтения и не может быть удалено или изменено.
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.
Примеры
Неверное форматирование метки времени
.timestamp = format_timestamp!(t'next Tuesday', format: "%v %R")
-.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 функции, которые не возвращают ошибки — это функции, которые не могут завершиться с ошибкой и не требуют обработки ошибок, что означает, что не имеет смысла использовать !
в вызове функции для прерывания при ошибке.
Решение
Удалите !
из вызова функции.
Примеры
Прерывание невосприимчивой функции
encode_json!(["one", "two", "three"])
- encode_json!(["one", "two", "three"]) +# encode_json(["one", "two", "three"])
630 Fallible argument
Вы передали выражение, которое возвращает ошибки, в качестве аргумента функции.
Обоснование
В VRL выражения, которые вы передаете функциям в качестве аргументов, сами также не должны возвращать ошибки. В противном случае результат функции будет неопределенным.
Решение
Сделайте так, чтобы выражение, передаваемое в функцию, не могло возвращать ошибки, потенциально прервав его при возникновении ошибки с помощью !
, объединив его ошибку с помощью ??
или с помощью некоторого другого метода.
Примеры
Невосприимчивый аргумент
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") + format_timestamp!(parse_timestamp!("2021-01-17T23:27:31.891948Z", "%+"), format: "%v %R")
631 Fallible abort message expression
Вы передали выражение, которое возвращает ошибки, в качестве сообщения для прерывания.
Обоснование
Выражение, которое вы передаете для прерывания, не должно возвращать ошибки. В противном случае, выражение прерывания может завершиться с ошибкой во время выполнения.
Решение
Сделайте так, чтобы выражение, передаваемое в функцию, не могло возвращать ошибки, потенциально прервав его при возникновении ошибки с помощью !
, объединив его ошибку с помощью ??
или с помощью некоторого другого метода.
Примеры
Выражение с сообщением о прерывании (может возвращать ошибку)
abort to_syslog_level(0)
- abort to_syslog_level(0) + abort to_syslog_level(0) ?? "other"
640 No-op assignment
Вы присвоили значение чему-то, что не является ни переменной, ни путем.
Обоснование
Все присваивания в VRL должны быть либо путем, либо переменной. Если вы пытаетесь присвоить значение, например, подчеркиванию (_
), эта операция считается "бездействующей" (no-op), так как она не имеет эффекта (и, следовательно, не является присваиванием).
Решение
Присвойте значение правой стороны (выражения) переменной или пути.
Примеры
Присваивание значения
_ = "the hills are alive"
- _ = "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
является допустимым, так как в нем используются отдельные логические выражения.
Примеры
Цепочка операторов сравнения
1 == 1 == 2
- 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"
является бессмысленным выражением.
Решение
Используйте оператор отрицания только с логическими выражениями.
Примеры
Отрицание нелогических значений
!47
- !47 +# !(47 == 48)
701 Call to Undefined Variable
Ссылка на неопределенную переменную.
Обоснование
Ссылка на переменную, которая не определена, приводит к неожиданному поведению и, скорее всего, связана с опечаткой.
Решение
Сначала присвойте переменной значение или исправьте опечатку в ссылке.
Примеры
Неопределенная переменная
my_variable
+my_variable = true my_variable
Неправильное имя переменной
my_variable = true my_var
-my_var +my_variable