···
m.app = .SYSLOG_IDENTIFIER
m.severity = to_int(.PRIORITY) ?? 0
m.level = to_syslog_level(m.severity) ?? ""
m.message = strip_ansi_escape_codes!(.message)
···
endpoint = "http://localhost:8123";
+
password = "helloclickhouseworld";
date_time_best_effort = true;
···
+
# ACL configuration for Vector
+
etc."clickhouse-server/users.d/vector.xml".text = ''
+
<password>helloclickhouseworld</password>
+
<access_management>0</access_management>
+
<default_database>journald</default_database>
+
<query>GRANT INSERT ON journald.logs</query>
+
# ACL configuration for read-only client
+
etc."clickhouse-server/users.d/grafana.xml".text = ''
+
<password>helloclickhouseworld2</password>
+
<access_management>0</access_management>
+
<default_database>journald</default_database>
+
<query>GRANT SELECT ON journald.logs</query>
···
databaseDDL = pkgs.writeText "database.sql" "CREATE DATABASE IF NOT EXISTS journald";
# https://clickhouse.com/blog/storing-log-data-in-clickhouse-fluent-bit-vector-open-telemetry
+
# ORDER BY advice: https://kb.altinity.com/engines/mergetree-table-engine-family/pick-keys/
tableDDL = pkgs.writeText "table.sql" ''
CREATE TABLE IF NOT EXISTS journald.logs (
+
host LowCardinality(String),
+
boot_id LowCardinality(String),
app LowCardinality(String),
level LowCardinality(String),
···
+
ORDER BY (host, boot_id, toStartOfHour(timestamp), app, timestamp)
PARTITION BY toYYYYMM(timestamp)
···
"journalctl -o cat -u vector.service | grep 'Vector has started'"
+
"cat ${selectQuery} | clickhouse-client --user vector --password helloclickhouseworld | grep 2"
clickhouse.wait_until_succeeds(
+
"cat ${selectQuery} | clickhouse-client --user grafana --password helloclickhouseworld2 | grep 2"