VRL is a fail-safe language, which means that a VRL program doesn’t compile unless
every potential error is handled. Observability data is notoriously unpredictable and fail safety
ensures that your VRL programs elegantly handle malformed data.
A root expression is fallible and its runtime error isn’t handled in the VRL
program.
Rationale
VRL is fail safe and thus requires that all possible runtime errors be handled.
This provides important safety guarantees to VRL and helps to ensure that VRL programs
run reliably when deployed.
Regular expressions are difficult to write and commonly result in syntax errors. If you’re parsing a common
log format we recommend using one of VRL’s parse_* functions. If
you don’t see a function for your format please request it. Otherwise, use the
Rust regex tester to test and correct your regular expression.
An if expression predicate doesn’t
evaluate to a Boolean.
Rationale
VRL doesn’t implement “truthy” values (non-Boolean values that resolve to a Boolean, such as 1) since these
are common foot-guns that can result in unexpected behavior when used in if expressions. This provides important
safety guarantees in VRL and ensures that VRL programs are reliable once deployed.
Resolution
Adjust your if expression predicate to resolve to a Boolean. Helpful functions to solve this include
exists and
is_nullish.
The right-hand side of this assignment
is fallible (that is, it can produce a runtime error), but the error isn’t
handled.
Rationale
VRL is fail safe and thus requires that all possible runtime errors be handled.
This provides important safety guarantees to VRL and helps to ensure that VRL programs
run reliably when deployed.
The left-hand side of an assignment expression
needlessly handles errors even though the right-hand side can’t fail.
Rationale
Assigning errors when one is not possible is effectively dead code that makes your program difficult to follow.
Removing the error assignment simplifies your program.
VRL is fail safe and thus requires that all possible runtime errors be handled.
This provides important safety guarantees to VRL and helps to ensure that VRL programs
run reliably when deployed.
Resolution
You must guarantee the type of the variable by using the appropriate
type or coercion function.
A predicate is fallible and its runtime error isn’t handled in the VRL
program.
Rationale
VRL is fail safe and thus requires that all possible runtime errors be handled.
This provides important safety guarantees to VRL and helps to ensure that VRL programs
run reliably when deployed.
You’ve attempted to divide an integer or float by zero.
Rationale
Unlike some other programming languages, VRL doesn’t have any concept of infinity, as it’s
unclear how that could be germane to observability data use cases. Thus, dividing by zero
can’t have any meaningful result.
Resolution
If you know that a value is necessarily zero, don’t divide by it. If a value could be
zero, capture the potential error thrown by the operation:
You’ve specified that a function should abort on error even though the function is infallible.
Rationale
In VRL, infallible functions—functions that can’t fail—don’t require error
handling, which in turn means it doesn’t make sense to abort on failure using a ! in the function call.
You’ve passed a fallible expression as an argument to a function.
Rationale
In VRL, expressions that you pass to functions as arguments need to be infallible themselves. Otherwise, the
outcome of the function would be indeterminate.
Resolution
Make the expression passed to the function infallible, potentially by aborting on error using !, coalescing
the error using ??, or via some other method.
You’ve assigned a value to something that is neither a variable nor a path.
Rationale
All assignments in VRL need to be to either a path or a variable. If you try to assign a value to, for example,
underscore (_), this operation is considered a “no-op” as it has no effect (and is thus not an assignment at
all).
Resolution
Assign the right-hand-side value to either a variable or a path.
Examples
No-op assignment
VRL program
_ = "the hills are alive"
How to fix it
- _ = "the hills are alive"
+# .movie_song_quote = "the hills are alive"
You’ve chained multiple comparison operators together in a way that can’t result in a valid expression.
Rationale
Comparison operators can only operate on two operands, e.g. 1 != 2. Chaining them together, as in
1 < 2 < 3, produces a meaningless non-expression.
Resolution
Use comparison operators only on a left-hand- and a right-hand-side value. You can chain comparisons together
provided that the expressions are properly grouped. While a == b == c, for example, isn’t valid,
a == b && b == cis valid because it involves distinct Boolean expressions.
You’ve used a coalescing operation (??) to handle an error, but in this case the left-hand
operation is infallible, and so the right-hand value after ?? is never reached.
Rationale
Error coalescing operations are useful when you want to specify what happens if an operation
fails. Here’s an example:
result = op1??op2
In this example, if op1 is infallible (that is, it can’t error) then the result variable
if set to the value of op1 while op2 is never reached.
Resolution
If the left-hand operation is meant to be infallible, remove the ?? operator and the
right-hand operation. If, however, the left-hand operation is supposed to be fallible,
remove the ! from the function call and anything else that’s making it infallible.
You’re attempting to merge two values together but one or both isn’t an object.
Rationale
Amongst VRL’s available types, only objects can be merged together. It’s not clear what it
would mean to merge, for example, an object with a Boolean. Please note, however,
that some other VRL types do have merge-like operations available:
These operations may come in handy if you’ve used merge by
accident.
Resolution
Make sure that both values that you’re merging are VRL objects. If you’re not sure whether
a value is an object, you can use the object function to
check.
You’ve used the negation operator to negate a non-Boolean expression.
Rationale
Only Boolean values can be used with the negation operator (!). The expression !false, for example, produces
true, whereas !"hello" is a meaningless non-expression.
Resolution
Use the negation operator only with Boolean expressions.
The referenced item is deprecated. Usually an alternative is given that can be used instead.
Rationale
This will be removed in the future.
Resolution
Apply the suggested alternative.
Runtime errors
A runtime error occurs after compilation and during program runtime. Because VRL is fail safe, all
runtime errors must be handled. This forces you to address how VRL programs should
respond to errors.
Runtime errors are strings that describe the error.
Handling
You have three options for handling errors in VRL:
As documented in the assignment expression reference, you can assign errors when
invoking an expression that’s fallible. When assigned, runtime errors are simple strings:
structured,err = parse_json("not json")iferr!=null{log("Unable to parse JSON: "+err,level: "error")}else{.=merge(.,structured)}
If the expression fails, the ok assignment target is assigned the “empty” value of its type:
# `.foo` can be `100` or `"not an int"`
foo,err = to_int(.foo)# `err` can be `null` or `"unable to coerce value to integer"`
iferr==null{# `foo` can be `100` or `0`
.result = foo*5}
The above example compiles because foo will either be assigned the integer representation of
.foo if it can be coerced to an integer, or it will be set to the “empty integer value” 0 if
.foo can’t be coerced into an integer.
Because of this, it is important to always check whether err is null before using the ok value
of an infallible assignment.
Empty values
Type
Empty value
String
""
Integer
0
Float
0.0
Boolean
false
Object
{}
Array
[]
Timestamp
t'1970-01-01T00:00:00Z' (Unix epoch)
Regular expression
r''
Null
null
Coalescing
As documented in the coalesce expression reference, you can coalesce errors to
efficiently step through multiple expressions:
While raising errors can simplify your program, you should think carefully before aborting your
program. If this operation is critical to the structure of your data you should abort, otherwise
consider handling the error and proceeding with the rest of your program.