Testing Snowbridge locally
The easiest way to test Snowbridge configuration (e.g. transformations) is to run it locally. Ideally, you should also use a sample of data that is as close to the real world as possible. The sample file should contain the events/messages you’d like to test with, one per line.
Snowplow data — generating a sample
If you're working with Snowplow data, you can follow the guide to use Snowplow Micro to generate test data, using the --output-tsv
to get the data into a file, as per the exporting to tsv section.
For example, here we’re using a file named data.tsv
:
docker run -p 9090:9090 snowplow/snowplow-micro:2.1.2 --output-tsv > data.tsv
Point some test environment tracking to localhost:9090
, and your events should land in data.tsv
.
Testing Snowbridge locally
Setup
You can run Snowbridge locally via Docker:
docker run --env SNOWBRIDGE_CONFIG_FILE="" --env ACCEPT_LIMITED_USE_LICENSE=yes snowplow/snowbridge:2.4.2
The default configuration for Snowbridge uses the stdin
source and the stdout
target. So, to test sending data through with no transformations, we can run the following command (where data.tsv
is a file with Snowplow events in TSV format):
cat data.tsv | docker run --env SNOWBRIDGE_CONFIG_FILE="" --env ACCEPT_LIMITED_USE_LICENSE=yes -i snowplow/snowbridge:2.4.2
This will print the data to the terminal, along with logs.
The metrics reported in the logs may state that no data has been processed. This is because the app reached the end of output and exited before the default reporting period of 1 second. You can safely ignore this.
You can output the results to a file to make it easier to examine them:
cat data.tsv | docker run -i snowplow/snowbridge:2.4.2 > output.txt
The output (in output.txt
) will contain more than the data itself. There will be additional fields called PartitionKey
, TimeCreated
TimePulled
and TimeTransformed
. The data that reaches the target in a production setup is under Data
.
Adding configuration
To add a specific configuration to test, create a configuration file (config.hcl
) and pass it to the Docker container. You will need to mount the file to the default config path of /tmp/config.hcl
:
cat data.tsv | docker run -i \
--env ACCEPT_LIMITED_USE_LICENSE=yes \
--mount type=bind,source=$(pwd)/config.hcl,target=/tmp/config.hcl \
snowplow/snowbridge:2.4.2 > output.txt
Note that docker expects absolute paths for mounted files - here we use $(pwd)
but you can specify the aboslute path manually too.
To test transformations, you only need to add the transform
block(s) to your configuration file. Don’t specify the source
and target
blocks to leave them on default (stdin
and stdout
).
To test specific sources or targets, add the respective source
or target
blocks. For example, see the configuration for an HTTP target sending data to Google Tag Manager Server Side.
Adding custom transformation scripts
You can add custom scripts by mounting a file, similarly to the above. Assuming the script is in script.js
, that looks like this:
cat data.tsv | docker run -i \
--env ACCEPT_LIMITED_USE_LICENSE=yes \
--mount type=bind,source=$(pwd)/config.hcl,target=/tmp/config.hcl \
--mount type=bind,source=$(pwd)/script.js,target=/tmp/script.js \
snowplow/snowbridge:2.4.2 > output.txt
The transformation config should point to the path of the script inside the container (/tmp/script.js
above). For example, the transformation block in the configuration might look like this:
transform {
use "js" {
script_path = "/tmp/script.js"
}
}
Further testing
You can use the above method to test all aspects of the app from a local environment too, including sources, targets, failure targets, metrics endpoints etc. In some cases, you'll need to ensure that the local envionment has access to any required resources and can authenticate (e.g. connecting from a laptop to a cloud account/local mock of cloud resources, or setting up a local metrics server for testing). Once that’s done, provide Snowbridge with an hcl file configuring it to connect to those resources, and run it the same way as in the examples above.