Configuration Reference
Laredo uses HOCON configuration. Config is resolved in order (later overrides earlier):
- Built-in defaults
- Config file (
--configflag orLAREDO_CONFIGenv var) - Config directory (
/etc/laredo/conf.d/*.conf, alphabetical) - Environment variables (
LAREDO_SOURCES_PG_MAIN_CONNECTION) - CLI flags (
--set key=value)
Sources
sources {
<source_id> {
type = postgresql | s3-kinesis
# PostgreSQL
connection = "postgresql://user:pass@host:5432/dbname"
slot_mode = ephemeral | stateful # default: ephemeral
slot_name = "laredo_01" # required for stateful
publication {
name = "laredo_01_pub" # default: {slot_name}_pub
create = false # default: false
publish = "insert, update, delete, truncate"
tables {
"schema.table" {
where = "status = 'active'" # PG 15+ row filter
columns = [col1, col2] # PG 15+ column list
}
}
}
reconnect {
max_attempts = 10 # default: 10
initial_backoff = 1s # default: 1s
max_backoff = 60s # default: 60s
backoff_multiplier = 2.0 # default: 2.0
}
# S3 + Kinesis
baseline_bucket = "s3://bucket/prefix/"
baseline_format = jsonl
stream_arn = "arn:aws:kinesis:..."
consumer_group = "laredo-01"
checkpoint_table = "dynamodb://table"
region = us-east-1
}
}
Tables & Pipelines
tables = [
{
source = <source_id>
schema = public
table = config_document
targets = [
{
type = indexed-memory | compiled-memory | http-sync | replication-fanout
# indexed-memory
lookup_fields = [field1, field2]
additional_indexes = [
{ name = idx_name, fields = [field], unique = false }
]
# compiled-memory
compiler = "compiler_name"
key_fields = [field1, field2]
filter { field = key, prefix = "prefix/" }
# http-sync
base_url = "https://..."
batch_size = 500 # default: 500
flush_interval = 200ms # default: 200ms
timeout_ms = 5000 # default: 5000
retry_count = 3 # default: 3
auth_header = "Bearer ..."
headers { X-Custom = value }
# replication-fanout
journal { max_entries = 1000000, max_age = 24h }
snapshot { interval = 5m, store = local, retention { keep_count = 5 } }
grpc { port = 4002, max_clients = 500 }
client_buffer { max_size = 50000, policy = drop_disconnect }
# Common
buffer { max_size = 10000, policy = block }
error_handling {
max_retries = 5
retry_backoff_ms = 1000
retry_backoff_max_ms = 30000
on_persistent_failure = isolate # isolate | stop_source | stop_all
dead_letter { enabled = false, store = s3, config { ... } }
}
filters = [{ type = field-equals, field = f, value = v }]
transforms = [{ type = drop-fields, fields = [f1, f2] }]
}
]
ttl { mode = field, field = expires_at, check_interval = 30s }
validation {
post_baseline_row_count = true
periodic_row_count { enabled = true, interval = 1h }
on_mismatch = warn # warn | re_baseline | error
}
}
]
Snapshots
snapshot {
enabled = true
store = s3 | local
store_config { bucket = ..., prefix = ..., region = ..., path = ... }
serializer = jsonl
schedule = "every 6h"
on_shutdown = true
retention { keep_count = 10, max_age = 7d }
user_meta { key = value }
on_restore_mismatch = warn # warn | reject
}
gRPC Server
grpc {
port = 4001
tls { enabled = false, cert_path = "", key_path = "" }
}
Health
health {
http_port = 8080
readiness_path = "/health/ready"
liveness_path = "/health/live"
}
Observability
observability {
metrics { type = prometheus, port = 9090, path = "/metrics" }
logging { type = structured, level = info }
}