New native and native_json codecs
We have added new experimental native and native_json codecs that allow
users to provide Vector with data directly in its native format. This allows
simpler, more efficient configuration of some often-requested use cases.
Sending metrics to generic sources
Generic event sources like the http source or exec source can now directly
receive metrics rather than needing to pass them through a log_to_metric
transform.
For example, an exec source can now be configured to receive events via the
native_json codec:
[sources.in]
type = "exec"
mode = "scheduled"
command = ["./scrape.sh"]
decoding.codec = "native_json"
If scrape.sh contained:
#!/usr/bin/env bash
echo $RANDOM | jq --raw-input --compact-output \
'{
metric: {
name: "my_metric",
counter: {
value: .|tonumber
},
kind: "incremental",
}
}'
Vector would read in counters with random values.
Logs are just simple JSON objects, but it is typical to include a message and
a timestamp key like:
{
"log": {
"message": "hello world",
"timestamp": "2019-10-12T07:20:50.52Z"
}
}
The specific JSON schema here is subject to change, but you can find an initial
schema here. The protobuf schema for the native codec is the
same used in the vector source and sink, and the definition can be found
here.
We will be providing more thorough guidance for using each as the feature matures. One current limitation of the JSON-based native codec is that timestamp fields within log messages will be converted to strings. This is partially due to limitations with JSON itself, but we are exploring workarounds.
Sending events between Vector instances
Another example use case is Vector-to-Vector communication via a transport other
than our existing gRPC-based vector source and sink. Using the native
encoding on a source/sink pair like kafka will utilize the same Protocol
Buffers-based encoding scheme, providing compact binary messages that
deserialize directly to the same native representation within Vector.
Example source configuration:
[sources.in]
type = "kafka"
bootstrap_servers = "localhost:9092"
topics = ["vector"]
decoding.codec = "native"
This would allow an instance of Vector to receive events from another Vector
instance that has a kafka sink configured like:
[sinks.out]
type = "kafka"
inputs = ["..."]
bootstrap_servers = "localhost:9092"
topic = "vector"
encoding.codec = "native"
Note that the new native encoding option is not yet documented on sinks as we
are waiting until it is fully rolled out to document and announce the feature;
however, is available on kafka and some other sinks.