···
m.app = .SYSLOG_IDENTIFIER
13
+
m.boot_id = ._BOOT_ID
m.severity = to_int(.PRIORITY) ?? 0
m.level = to_syslog_level(m.severity) ?? ""
m.message = strip_ansi_escape_codes!(.message)
···
endpoint = "http://localhost:8123";
67
+
password = "helloclickhouseworld";
date_time_best_effort = true;
···
82
+
# ACL configuration for Vector
84
+
etc."clickhouse-server/users.d/vector.xml".text = ''
88
+
<password>helloclickhouseworld</password>
90
+
<access_management>0</access_management>
92
+
<quota>default</quota>
93
+
<default_database>journald</default_database>
96
+
<query>GRANT INSERT ON journald.logs</query>
103
+
# ACL configuration for read-only client
104
+
etc."clickhouse-server/users.d/grafana.xml".text = ''
108
+
<password>helloclickhouseworld2</password>
110
+
<access_management>0</access_management>
112
+
<quota>default</quota>
113
+
<default_database>journald</default_database>
116
+
<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
159
+
# 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 (
163
+
host LowCardinality(String),
164
+
boot_id LowCardinality(String),
app LowCardinality(String),
115
-
host LowCardinality(String),
level LowCardinality(String),
···
123
-
ORDER BY (host, app, timestamp)
173
+
ORDER BY (host, boot_id, toStartOfHour(timestamp), app, timestamp)
PARTITION BY toYYYYMM(timestamp)
···
"journalctl -o cat -u vector.service | grep 'Vector has started'"
202
+
"cat ${selectQuery} | clickhouse-client --user vector --password helloclickhouseworld | grep 2"
clickhouse.wait_until_succeeds(
152
-
"cat ${selectQuery} | clickhouse-client | grep 2"
206
+
"cat ${selectQuery} | clickhouse-client --user grafana --password helloclickhouseworld2 | grep 2"