cloki
Version:
LogQL API with Clickhouse Backend
73 lines (71 loc) • 3.65 kB
JavaScript
const hb = require('handlebars')
const client = require('../clickhouse')
const getEnv = () => {
return {
CLICKHOUSE_DB: 'cloki',
LABELS_DAYS: 7,
SAMPLES_DAYS: 7,
...process.env
}
}
/**
*
* @param db {string}
*/
module.exports.upgrade = async (db) => {
const scripts = require('./scripts')
await client.rawRequest(`CREATE DATABASE IF NOT EXISTS ${db}`)
await client.rawRequest('CREATE TABLE IF NOT EXISTS ver (k UInt64, ver UInt64) ' +
'ENGINE=ReplacingMergeTree(ver) ORDER BY k', null, db)
let ver = await client.rawRequest('SELECT max(ver) as ver FROM ver FORMAT JSON', null, db)
ver = ver.data.data && ver.data.data[0] && ver.data.data[0].ver ? ver.data.data[0].ver : 0
for (let i = parseInt(ver); i < scripts.length; ++i) {
if (!scripts[i]) { continue }
scripts[i] = scripts[i].trim()
const tpl = hb.compile(scripts[i])
scripts[i] = tpl({ ...getEnv(), DB: db })
await client.rawRequest(scripts[i], null, db)
await client.rawRequest(`INSERT INTO ver (k, ver) VALUES (1, ${i + 1})`, null, db)
}
}
/**
* @param opts {{db: string, samples_days: number, time_series_days: number, storage_policy: string}[]}
* @returns {Promise<void>}
*/
module.exports.rotate = async (opts) => {
for (const db of opts) {
const settings = await client.getSettings([
{ type: 'rotate', name: 'v3_samples_days' },
{ type: 'rotate', name: 'v3_time_series_days' },
{ type: 'rotate', name: 'v3_storage_policy' }
], db.db)
if (db.samples_days + '' !== settings.v3_samples_days) {
const alterTable = 'ALTER TABLE samples_v3 MODIFY SETTING ttl_only_drop_parts = 1, merge_with_ttl_timeout = 3600, index_granularity = 8192'
const rotateTable = `ALTER TABLE samples_v3 MODIFY TTL toDateTime(timestamp_ns / 1000000000) + INTERVAL ${db.samples_days} DAY`
await client.rawRequest(alterTable, null, db.db)
await client.rawRequest(rotateTable, null, db.db)
await client.addSetting('rotate', 'v3_samples_days', db.samples_days + '', db.db)
}
if (db.time_series_days + '' !== settings.v3_time_series_days) {
const alterTable = 'ALTER TABLE time_series MODIFY SETTING ttl_only_drop_parts = 1, merge_with_ttl_timeout = 3600, index_granularity = 8192'
const rotateTable = `ALTER TABLE time_series MODIFY TTL "date" + INTERVAL ${db.time_series_days} DAY`
await client.rawRequest(alterTable, null, db.db)
await client.rawRequest(rotateTable, null, db.db)
const alterView = 'ALTER TABLE time_series_gin MODIFY SETTING ttl_only_drop_parts = 1, merge_with_ttl_timeout = 3600, index_granularity = 8192'
const rotateView = `ALTER TABLE time_series_gin MODIFY TTL "date" + INTERVAL ${db.time_series_days} DAY`
await client.rawRequest(alterView, null, db.db)
await client.rawRequest(rotateView, null, db.db)
await client.addSetting('rotate', 'v3_time_series_days', db.time_series_days + '', db.db)
}
if (db.storage_policy && db.storage_policy !== settings.v3_storage_policy) {
console.log('ALTER storage policy', db.storage_policy)
const alterTs = `ALTER TABLE time_series MODIFY SETTING storagePolicy='${db.storage_policy}'`
const alterTsVw = `ALTER TABLE time_series_gin MODIFY SETTING storagePolicy='${db.storage_policy}'`
const alterSm = `ALTER TABLE samples_v3 MODIFY SETTING storagePolicy='${db.storage_policy}'`
await client.rawRequest(alterTs, null, db.db)
await client.rawRequest(alterTsVw, null, db.db)
await client.rawRequest(alterSm, null, db.db)
await client.addSetting('rotate', 'v3_storage_policy', db.storage_policy, db.db)
}
}
}