From 961cc4666e59d48ddae713d89d11d8b2b512c0b5 Mon Sep 17 00:00:00 2001 From: Santiago Carmuega Date: Fri, 4 Feb 2022 19:00:13 -0300 Subject: [PATCH] docs: Add documentation for new v1.1 features --- README.md | 50 +++++++++++++++++++++++++++++--------- assets/diagram.png | Bin 0 -> 54194 bytes book/src/SUMMARY.md | 2 ++ book/src/sinks/README.md | 1 + book/src/sinks/logs.md | 26 ++++++++++++++++++++ book/src/usage/README.md | 2 +- book/src/usage/daemon.md | 9 +++++++ book/src/usage/library.md | 2 ++ 8 files changed, 79 insertions(+), 13 deletions(-) create mode 100644 assets/diagram.png create mode 100644 book/src/sinks/logs.md diff --git a/README.md b/README.md index 59281e86..eee61b62 100644 --- a/README.md +++ b/README.md @@ -54,34 +54,60 @@ _Oura_ running in `daemon` mode can be configured to use custom filters to pinpo If the available out-of-the-box features don't satisfiy your particular use-case, _Oura_ can be used a library in your Rust project to setup tailor-made pipelines. Each component (sources, filters, sinks, etc) in _Oura_ aims at being self-contained and reusable. For example, custom filters and sinks can be built while reusing the existing sources. +## How it Works + +Oura is in its essence just a pipeline for proccessing events. Each stage of the pipeline fulfills a different roles: + +- Source Stages: are in charge of pulling data from the blockchain and mapping the raw blocks into smaller, more granular events. Each event is then sent through the output port of the stage for further processing. +- Filter Stages: receive individual events from the source stage and apply some sort of transformation to each one. The transformations applied will depend on the particular use-case, but they usually revolve around selecting relevant events and enriching them with extra information. +- Sink Stages: receive the final events from the filter stage and submits the payload to some external system, database or service for further processing. + +![diagram](assets/diagram.png) + ## Feature Status - Sources - [x] chain-sync full-block (node-to-client) - [ ] chain-sync headers-only (node-to-node) - [x] chain-sync + block-fetch (node-to-node) - - [ ] shared file system - Sinks - [x] Kafka topic - [x] Elasticsearch index / data stream + - [x] Rotating log files with compression - [ ] Redis streams - [ ] AWS SQS queue - [ ] AWS Lambda call - [ ] GCP PubSub - [x] webhook (http post) - [x] terminal (append-only, tail-like) - - [ ] TUI +- Events / Parsers + - [x] block events (start, end) + - [x] transaction events (inputs, outputs, assets) + - [x] metadata events (labels, content) + - [x] mint events (policy, asset, quantity) + - [x] pool registrations events + - [x] delegation events + - [x] CIP-25 metadata parser (image, files) + - [ ] CIP-15 metadata parser - Filters - - [x] by event type (block, tx, mint, cert, etc) - - [x] by asset subject (policy, name, etc) - - [x] by metadata keys - - [ ] by block property (size, tx count) - - [ ] by tx property (fee, has native script, has plutus script, etc) - - [ ] by utxo property (address, asset, amount range) -- Enrichment - - [ ] policy info from metadata service - - [ ] input tx info from Blockfrost api - - [ ] address translation from ADAHandle + - [x] cherry pick by event type (block, tx, mint, cert, etc) + - [x] cherry pick by asset subject (policy, name, etc) + - [x] cherry pick by metadata keys + - [ ] cherry pick by block property (size, tx count) + - [ ] cherry pick by tx property (fee, has native script, has plutus script, etc) + - [ ] cherry pick by utxo property (address, asset, amount range) + - [ ] enrich events with policy info from external metadata service + - [ ] enrich input tx info from Blockfrost API + - [ ] enrich addresses descriptions using ADAHandle +- Other + - [x] stateful chain cursor to recover from restarts + - [ ] buffer stage to hold blocks until they reach a certain depth + +## Known Limitations + +- Oura only knows how to process blocks from the Shelley era. We are working on adding support for Byron in a future release. +- Oura reads events from minted blocks / transactions. Support for querying the mempool is planned for a future release. +- Oura will notify about chain rollbacks as a new event. The business logic for "undoing" the already processed events is a responsability of the consumer. We're working on adding support for a "buffer" filter stage which can hold blocks until they reach a configurable depth (number of confirmations). ## Contributing diff --git a/assets/diagram.png b/assets/diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..6e974b31b70555645f29da1d5f4755d68c3450ab GIT binary patch literal 54194 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�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 literal 0 HcmV?d00001 diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md index 99b5c59d..794eb7c7 100644 --- a/book/src/SUMMARY.md +++ b/book/src/SUMMARY.md @@ -9,6 +9,7 @@ - [Usage](./usage/README.md) - [Watch Mode](./usage/watch.md) - [Daemon Mode](./usage/daemon.md) + - [Dump Mode](./usage/dump.md) - [Library](./usage/library.md) - [Filters](./filters/README.md) - [Fingerprint](./filters/fingerprint.md) @@ -21,6 +22,7 @@ - [Kafka](./sinks/kafka.md) - [Elasticsearch](./sinks/elastic.md) - [Webhook](./sinks/webhook.md) + - [Logs](./sinks/logs.md) - [Reference](reference/README.md) - [Data Dictionary](./reference/data_dictionary.md) - [Guides](./guides/README.md) diff --git a/book/src/sinks/README.md b/book/src/sinks/README.md index 81a0888e..a691023b 100644 --- a/book/src/sinks/README.md +++ b/book/src/sinks/README.md @@ -10,5 +10,6 @@ These are the existing sinks that are included as part the main _Oura_ codebase: - [Kakfa](kafka.md): a sink that sends each event into a Kafka topic - [Elasticsearch](elastic.md): a sink that writes events into an Elasticsearch index or data stream. - [Webhook](webhook.md): a sink that outputs each event as an HTTP call to a remote endpoint. +- [Logs](logs.md): a sink that saves events to the file system using JSONL text files. New sinks are being developed, information will be added in this documentation to reflect the updated list. Contributions and feature request are welcome in our [Github Repo](https://github.com/txpipe/oura). \ No newline at end of file diff --git a/book/src/sinks/logs.md b/book/src/sinks/logs.md new file mode 100644 index 00000000..a1c8512f --- /dev/null +++ b/book/src/sinks/logs.md @@ -0,0 +1,26 @@ +# Logs + +A sink that saves events into the file system. Each event is json-encoded and appended to the of a text file. Files are rotated once they reach a certain size. Optionally, old files can be automatically compressed once they have rotated. + +## Configuration + +Example sink section config + +```toml +[sink] +type = "Logs" +output_path = "/var/oura/mainnet" +output_format = "JSONL" +max_bytes_per_file = 1_000_000 +max_total_files = 10 +compression = true +``` + +### Section: `sink` + +- `type`: the literal value `Logs`. +- `output_path`: the path-like prefix for the output log files +- `output_format` (optional): specified the type of syntax to use for the serialization of the events. Only available option at the moment is `JSONL` (json + line break) +- `max_bytes_per_file` (optional): the max amount of bytes to add in a file before rotating it +- `max_total_files` (optional): the max amount of files to keep in the file system before start deleting the old ones +- `compression` (optional): a boolean indicating if the rotated files should be compressed. diff --git a/book/src/usage/README.md b/book/src/usage/README.md index 67c712c8..c7ad8c32 100644 --- a/book/src/usage/README.md +++ b/book/src/usage/README.md @@ -2,6 +2,6 @@ _Oura_ provides three different execution modes: -- [Dameon](daemon.md): a fully-configurable pipeline that runs in the background. Sources, filters and sinks can be combined to fulfil particular use-cases. +- [Daemon](daemon.md): a fully-configurable pipeline that runs in the background. Sources, filters and sinks can be combined to fulfil particular use-cases. - [Watch](watch.md): to watch live block events from a node directly in the terminal. It is meant for humans, it uses colors and throttling to facilitate reading. - [Dump](dump.md): to dump live block events from a node into rotation log files or stdout. It uses JSONL format for persistence of the events. \ No newline at end of file diff --git a/book/src/usage/daemon.md b/book/src/usage/daemon.md index 85ff9b30..79b6c352 100644 --- a/book/src/usage/daemon.md +++ b/book/src/usage/daemon.md @@ -44,6 +44,11 @@ type = "Z" # custom config fields for this sink type foo = "123" bar = "789" + +# optional cursor settings, remove seaction to disable feature +[cursor] +type = "File" +path = "/var/oura/cursor" ``` ### The `source` section @@ -58,6 +63,10 @@ This section specifies a collection of filters that are applied in sequence to e This section specifies the destination of the data. The special `type` field must always be present and containing a value matching any of the available built-in sinks. The rest of the fields in the section will depend on the selected `type`. See the [sinks](../sinks/index.md) section for a list of available options. +### The `cursor` section + +This section specifies how to configure the "cursor" feature. A cursor is a reference of the current position of the pipeline. If the pipeline needs to restart for whatever reason, and a cursor is available, the pipeline will start reading from that point in the chain. Removing the section from the config will disable the cursor feature. + ### Full Example Here's an example configuration file that uses a Node-to-Node source and output the events into a Kafka sink: diff --git a/book/src/usage/library.md b/book/src/usage/library.md index b2902985..2a699a59 100644 --- a/book/src/usage/library.md +++ b/book/src/usage/library.md @@ -1 +1,3 @@ # Library + +Coming Soon!