Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions message/controller.proto
Original file line number Diff line number Diff line change
Expand Up @@ -244,8 +244,12 @@ message PrometheusMetricTarget {

message PrometheusLabel {
required uint32 id = 1;
required string name = 2;
required string value = 3;
// Deprecated: use name_id instead.
optional string name = 2;
// Deprecated: use value_id instead.
optional string value = 3;
optional uint32 name_id = 4;
optional uint32 value_id = 5;
}

message PrometheusTargetRequest {
Expand Down
2 changes: 1 addition & 1 deletion server/controller/db/metadb/migrator/schema/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@ const (
RAW_SQL_ROOT_DIR = "/etc/metadb/schema/rawsql"

DB_VERSION_TABLE = "db_version"
DB_VERSION_EXPECTED = "7.1.0.39"
DB_VERSION_EXPECTED = "7.1.0.40"
)
Original file line number Diff line number Diff line change
Expand Up @@ -2570,10 +2570,11 @@ TRUNCATE TABLE prometheus_label_value;

CREATE TABLE IF NOT EXISTS prometheus_label (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(256) NOT NULL,
`value` TEXT,
`name_id` INT NOT NULL DEFAULT 0,
`value_id` INT NOT NULL DEFAULT 0,
`synced_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE INDEX `name_id_value_id_index` (`name_id`, `value_id`) USING BTREE
)ENGINE=innodb AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
TRUNCATE TABLE prometheus_label;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
-- Step 1: Truncate prometheus data tables.
-- Prometheus metrics/labels are re-synced from agents on next startup, so no data
-- migration is needed — a clean slate is both correct and instant.
TRUNCATE TABLE prometheus_metric_name;
TRUNCATE TABLE prometheus_label_name;
TRUNCATE TABLE prometheus_label_value;
TRUNCATE TABLE prometheus_label;
TRUNCATE TABLE prometheus_metric_app_label_layout;
TRUNCATE TABLE ch_app_label;
TRUNCATE TABLE ch_prometheus_label_name;
TRUNCATE TABLE ch_prometheus_metric_app_label_layout;
TRUNCATE TABLE ch_prometheus_metric_name;

-- Step 2: DDL — add name_id, value_id columns to prometheus_label (idempotent).
DROP PROCEDURE IF EXISTS ColumnExists;

CREATE PROCEDURE ColumnExists(
IN p_table_name VARCHAR(255),
IN p_col_name VARCHAR(255),
OUT p_exists TINYINT(1)
)
BEGIN
SELECT COUNT(*) > 0
INTO p_exists
FROM information_schema.columns
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = p_table_name
AND COLUMN_NAME = p_col_name;
END;

DROP PROCEDURE IF EXISTS AddColumnIfNotExists;

CREATE PROCEDURE AddColumnIfNotExists(
IN tableName VARCHAR(255),
IN colName VARCHAR(255),
IN colType VARCHAR(255),
IN afterCol VARCHAR(255)
)
BEGIN
CALL ColumnExists(tableName, colName, @exists);
IF NOT @exists THEN
SET @sql = CONCAT('ALTER TABLE ', tableName, ' ADD COLUMN ', colName, ' ', colType, ' AFTER ', afterCol);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END;

CALL AddColumnIfNotExists('prometheus_label', 'name_id', 'INT NOT NULL DEFAULT 0', 'id');
CALL AddColumnIfNotExists('prometheus_label', 'value_id', 'INT NOT NULL DEFAULT 0', 'name_id');

DROP PROCEDURE IF EXISTS ColumnExists;
DROP PROCEDURE IF EXISTS AddColumnIfNotExists;

-- Step 3: Add UNIQUE index on (name_id, value_id) before any data is inserted.
-- The tables are truncated below so no deduplication is needed first.
DROP PROCEDURE IF EXISTS AddUniqueIndexIfNotExists;

CREATE PROCEDURE AddUniqueIndexIfNotExists(
IN tableName VARCHAR(255),
IN indexName VARCHAR(255),
IN indexDef VARCHAR(1024)
)
BEGIN
DECLARE cnt INT;
SELECT COUNT(*) INTO cnt
FROM information_schema.statistics
WHERE table_schema = DATABASE()
AND table_name = tableName
AND index_name = indexName;
IF cnt = 0 THEN
SET @sql = CONCAT('ALTER TABLE ', tableName, ' ADD UNIQUE INDEX ', indexName, ' ', indexDef);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END;

CALL AddUniqueIndexIfNotExists('prometheus_label', 'name_id_value_id_index', '(name_id, value_id)');
DROP PROCEDURE IF EXISTS AddUniqueIndexIfNotExists;

-- Step 4: Rename unused tables to _bak.
DROP PROCEDURE IF EXISTS RenameTableIfExists;

CREATE PROCEDURE RenameTableIfExists(
IN oldName VARCHAR(255),
IN newName VARCHAR(255)
)
BEGIN
DECLARE cnt INT;
SELECT COUNT(*) INTO cnt
FROM information_schema.tables
WHERE table_schema = DATABASE()
AND table_name = oldName;
IF cnt > 0 THEN
SET @sql = CONCAT('RENAME TABLE ', oldName, ' TO ', newName);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END;

CALL RenameTableIfExists('prometheus_metric_target', 'prometheus_metric_target_bak');
CALL RenameTableIfExists('prometheus_metric_label_name', 'prometheus_metric_label_name_bak');
DROP PROCEDURE IF EXISTS RenameTableIfExists;

-- Step 4: Drop unused columns.
DROP PROCEDURE IF EXISTS DropColumnIfExists;

CREATE PROCEDURE DropColumnIfExists(
IN tableName VARCHAR(255),
IN colName VARCHAR(255)
)
BEGIN
DECLARE cnt INT;
SELECT COUNT(*) INTO cnt
FROM information_schema.columns
WHERE table_schema = DATABASE()
AND table_name = tableName
AND column_name = colName;
IF cnt > 0 THEN
SET @sql = CONCAT('ALTER TABLE ', tableName, ' DROP COLUMN ', colName);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END;

CALL DropColumnIfExists('prometheus_label', 'name');
CALL DropColumnIfExists('prometheus_label', 'value');
DROP PROCEDURE IF EXISTS DropColumnIfExists;

-- Update DB version
UPDATE db_version SET version='7.1.0.40';

4 changes: 2 additions & 2 deletions server/controller/db/metadb/model/prometheus_model.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ type PrometheusLabelValue struct {
type PrometheusLabel struct {
PrometheusAutoIncID `gorm:"embedded"`
PrometheusOperatedTime `gorm:"embedded"`
Name string `gorm:"column:name;type:varchar(256);not null"`
Value string `gorm:"column:value;type:text;default:''"`
NameID int `gorm:"column:name_id;type:int;not null;default:0"`
ValueID int `gorm:"column:value_id;type:int;not null;default:0"`
}

type PrometheusMetricLabelName struct {
Expand Down
31 changes: 14 additions & 17 deletions server/controller/prometheus/cache/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,10 +122,9 @@ func GetDebugCache(t controller.PrometheusCacheType) []byte {
temp := map[string]interface{}{
"name_to_id": make(map[string]interface{}),
}
tempCache.MetricName.nameToID.Range(func(key, value any) bool {
temp["name_to_id"].(map[string]interface{})[key.(string)] = value
return true
})
for k, v := range tempCache.MetricName.GetNameToID() {
temp["name_to_id"].(map[string]interface{})[k] = v
}
if len(temp["name_to_id"].(map[string]interface{})) > 0 {
content["metric_name"] = temp
}
Expand All @@ -134,10 +133,9 @@ func GetDebugCache(t controller.PrometheusCacheType) []byte {
temp := map[string]interface{}{
"name_to_id": make(map[string]interface{}),
}
tempCache.LabelName.nameToID.Range(func(key, value any) bool {
temp["name_to_id"].(map[string]interface{})[key.(string)] = value
return true
})
for k, v := range tempCache.LabelName.GetNameToID() {
temp["name_to_id"].(map[string]interface{})[k] = v
}
if len(temp["name_to_id"].(map[string]interface{})) > 0 {
content["label_name"] = temp
}
Expand All @@ -146,10 +144,10 @@ func GetDebugCache(t controller.PrometheusCacheType) []byte {
temp := map[string]interface{}{
"value_to_id": make(map[string]interface{}),
}
tempCache.LabelValue.GetValueToID().Range(func(key string, value int) bool {

for key, value := range tempCache.LabelValue.GetValueToID() {
temp["value_to_id"].(map[string]interface{})[key] = value
return true
})
}

if len(temp["value_to_id"].(map[string]interface{})) > 0 {
content["label_value"] = temp
Expand All @@ -159,10 +157,9 @@ func GetDebugCache(t controller.PrometheusCacheType) []byte {
temp := map[string]interface{}{
"layout_key_to_index": make(map[string]interface{}),
}
tempCache.MetricAndAPPLabelLayout.layoutKeyToIndex.Range(func(key, value any) bool {
temp["layout_key_to_index"].(map[string]interface{})[marshal(key)] = value
return true
})
for k, v := range tempCache.MetricAndAPPLabelLayout.GetLayoutKeyToIndex() {
temp["layout_key_to_index"].(map[string]interface{})[marshal(k)] = v
}
if len(temp["layout_key_to_index"].(map[string]interface{})) > 0 {
content["metric_and_app_label_layout"] = temp
}
Expand All @@ -171,8 +168,8 @@ func GetDebugCache(t controller.PrometheusCacheType) []byte {
temp := map[string]interface{}{
"key_to_id": make(map[string]interface{}),
}
for iter := range tempCache.Label.keyToID.Iter() {
temp["key_to_id"].(map[string]interface{})[iter.Key.String()] = iter.Val
for key, value := range tempCache.Label.GetKeyToID() {
temp["key_to_id"].(map[string]interface{})[key.String()] = value
}

if len(temp["key_to_id"].(map[string]interface{})) > 0 {
Expand Down
Loading
Loading