Skip to content

Commit de0b593

Browse files
committed
feat(backend): 多租户巡检报告改造 #13481
# Reviewed, transaction id: 60634
1 parent abdbf91 commit de0b593

File tree

11 files changed

+185
-8
lines changed

11 files changed

+185
-8
lines changed

dbm-ui/backend/db_periodic_task/local_tasks/mysql_backup/bklog_query.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from backend import env
1616
from backend.components.bklog.client import BKLogApi
1717
from backend.utils.string import pascal_to_snake
18+
from backend.utils.tenant import TenantHandler
1819
from backend.utils.time import datetime2str
1920

2021

@@ -37,6 +38,7 @@ def _get_log_from_bklog(bk_biz_id, collector, start_time, end_time, query_string
3738
"start": 0,
3839
"size": 6000,
3940
"sort_list": [["dtEventTimeStamp", "asc"], ["gseIndex", "asc"], ["iterationIndex", "asc"]],
41+
"tenant_id": TenantHandler.get_tenant_id_by_biz(bk_biz_id),
4042
},
4143
use_admin=True,
4244
)

dbm-ui/backend/db_periodic_task/local_tasks/redis_backup/bklog_query.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from backend import env
1919
from backend.components.bklog.client import BKLogApi
2020
from backend.utils.string import pascal_to_snake
21+
from backend.utils.tenant import TenantHandler
2122
from backend.utils.time import datetime2str
2223

2324
logger = logging.getLogger("root")
@@ -43,6 +44,7 @@ def _get_log_from_bklog(
4344
"start": 0,
4445
"size": 6000,
4546
"sort_list": [["dtEventTimeStamp", "asc"], ["gseIndex", "asc"], ["iterationIndex", "asc"]],
47+
"tenant_id": TenantHandler.get_tenant_id_by_biz(env.DBA_APP_BK_BIZ_ID),
4648
},
4749
use_admin=True,
4850
)

dbm-ui/backend/db_periodic_task/local_tasks/sqlserver/backup_file_check.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from backend.db_meta.models import Cluster
2323
from backend.db_report.models.sqlserver_check_report import SqlserverFullBackupInfoReport, SqlserverLogBackupInfoReport
2424
from backend.flow.utils.sqlserver.sqlserver_db_function import get_app_setting_data, get_routine_backup_dbs
25+
from backend.utils.tenant import TenantHandler
2526

2627
logger = logging.getLogger("root")
2728

@@ -96,7 +97,11 @@ def check_task(self):
9697
try:
9798
if cluster.cluster_type == ClusterType.SqlserverSingle:
9899
instance = cluster.storageinstance_set.get(instance_role=InstanceRole.ORPHAN)
99-
data, err = get_app_setting_data(instance=instance, bk_cloud_id=cluster.bk_cloud_id)
100+
data, err = get_app_setting_data(
101+
instance=instance,
102+
bk_cloud_id=cluster.bk_cloud_id,
103+
tenant_id=TenantHandler.get_tenant_id_by_biz(cluster.bk_biz_id),
104+
)
100105
if err:
101106
common_data["status"] = False
102107
common_data["msg"] = err

dbm-ui/backend/db_periodic_task/local_tasks/sqlserver/check_app_setting_data.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
get_app_setting_data,
3232
insert_sqlserver_config,
3333
)
34+
from backend.utils.tenant import TenantHandler
3435

3536
logger = logging.getLogger("root")
3637

@@ -156,7 +157,11 @@ def check_app_setting_data(self, cluster: Cluster):
156157

157158
# 按照集群维度查询所有的实例,状态running中的
158159
for instance in cluster.storageinstance_set.filter(status=InstanceStatus.RUNNING):
159-
data, err = get_app_setting_data(instance=instance, bk_cloud_id=cluster.bk_cloud_id)
160+
data, err = get_app_setting_data(
161+
instance=instance,
162+
bk_cloud_id=cluster.bk_cloud_id,
163+
tenant_id=TenantHandler.get_tenant_id_by_biz(cluster.bk_biz_id),
164+
)
160165
if data is None:
161166
# 如果返回是空则,则大概率是访问异常,录入异常信息,跳过这次的校验
162167
SqlserverCheckAppSettingReport.objects.create(
@@ -204,6 +209,7 @@ def check_user(master_instance: StorageInstance, slave_instance: StorageInstance
204209
slave_instance=slave_instance,
205210
bk_cloud_id=cluster.bk_cloud_id,
206211
check_tag="user",
212+
tenant_id=TenantHandler.get_tenant_id_by_biz(cluster.bk_biz_id),
207213
)
208214
if not status:
209215
SqlserverCheckUserSyncReport.objects.create(
@@ -229,6 +235,7 @@ def check_job(master_instance: StorageInstance, slave_instance: StorageInstance,
229235
slave_instance=slave_instance,
230236
bk_cloud_id=cluster.bk_cloud_id,
231237
check_tag="job",
238+
tenant_id=TenantHandler.get_tenant_id_by_biz(cluster.bk_biz_id),
232239
)
233240
if not status:
234241
SqlserverCheckJobSyncReport.objects.create(
@@ -254,6 +261,7 @@ def check_link_server(master_instance: StorageInstance, slave_instance: StorageI
254261
slave_instance=slave_instance,
255262
bk_cloud_id=cluster.bk_cloud_id,
256263
check_tag="link_server",
264+
tenant_id=TenantHandler.get_tenant_id_by_biz(cluster.bk_biz_id),
257265
)
258266
if not status:
259267
SqlserverCheckLinkServerReport.objects.create(
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 3.2.25 on 2025-10-11 10:20
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("db_periodic_task", "0013_auto_20250917_2108"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="mysqlbackuprecovertask",
15+
name="tenant_id",
16+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
17+
),
18+
]
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# Generated by Django 3.2.25 on 2025-10-11 09:58
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("db_report", "0019_auto_20250925_1446"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="checksumcheckreport",
15+
name="tenant_id",
16+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
17+
),
18+
migrations.AddField(
19+
model_name="dbmonheartbeatreport",
20+
name="tenant_id",
21+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
22+
),
23+
migrations.AddField(
24+
model_name="failoverdrillreport",
25+
name="tenant_id",
26+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
27+
),
28+
migrations.AddField(
29+
model_name="metacheckreport",
30+
name="tenant_id",
31+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
32+
),
33+
migrations.AddField(
34+
model_name="mongodbbackupcheckreport",
35+
name="tenant_id",
36+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
37+
),
38+
migrations.AddField(
39+
model_name="mysqlbackupcheckreport",
40+
name="tenant_id",
41+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
42+
),
43+
migrations.AddField(
44+
model_name="redisbackupcheckreport",
45+
name="tenant_id",
46+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
47+
),
48+
migrations.AddField(
49+
model_name="sqlservercheckappsettingreport",
50+
name="tenant_id",
51+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
52+
),
53+
migrations.AddField(
54+
model_name="sqlservercheckjobsyncreport",
55+
name="tenant_id",
56+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
57+
),
58+
migrations.AddField(
59+
model_name="sqlserverchecklinkserverreport",
60+
name="tenant_id",
61+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
62+
),
63+
migrations.AddField(
64+
model_name="sqlserverchecksysjobstatureport",
65+
name="tenant_id",
66+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
67+
),
68+
migrations.AddField(
69+
model_name="sqlservercheckusersyncreport",
70+
name="tenant_id",
71+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
72+
),
73+
migrations.AddField(
74+
model_name="sqlserverfullbackupinforeport",
75+
name="tenant_id",
76+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
77+
),
78+
migrations.AddField(
79+
model_name="sqlserverlogbackupinforeport",
80+
name="tenant_id",
81+
field=models.CharField(default="default", help_text="租户ID", max_length=128),
82+
),
83+
]

dbm-ui/backend/db_report/report_basemodel.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,21 @@
1212
from django.utils.translation import ugettext_lazy as _
1313

1414
from backend.bk_web.models import AuditedModel
15+
from backend.utils.tenant import TenantHandler
16+
17+
18+
class BaseReportManager(models.Manager):
19+
def create(self, **kwargs):
20+
# 获取租户id
21+
bk_biz_id = kwargs.get("bk_biz_id")
22+
kwargs["tenant_id"] = TenantHandler.get_tenant_id_by_biz(bk_biz_id)
23+
return super().create(**kwargs)
24+
25+
def bulk_create(self, objs, **kwargs):
26+
for obj in objs:
27+
if not obj.tenant_id:
28+
obj.tenant_id = TenantHandler.get_tenant_id_by_biz(obj.bk_biz_id)
29+
return super().bulk_create(objs, **kwargs)
1530

1631

1732
class BaseReportABS(AuditedModel):
@@ -22,6 +37,9 @@ class BaseReportABS(AuditedModel):
2237
state = models.CharField(default="", max_length=64, help_text=_("巡检结果状态"))
2338
failed_days = models.IntegerField(default=0, help_text=_("失败持续天数"))
2439
msg = models.TextField(default="", help_text=_("备注信息"))
40+
tenant_id = models.CharField(help_text=_("租户ID"), max_length=128, default="default")
41+
42+
objects = BaseReportManager()
2543

2644
class Meta:
2745
abstract = True

dbm-ui/backend/db_report/report_baseview.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ def summary_state_count(self):
6464
state_map.update({info["state"]: info["count"] for info in state_count_info})
6565
return state_map
6666

67+
def get_queryset(self):
68+
return self.filter_by_tenant_id(super().get_queryset())
69+
6770
def list(self, request, *args, **kwargs):
6871
response = super().list(request, *args, **kwargs)
6972
response.data["name"] = self.report_name or ReportType.get_choice_label(self.report_type)

dbm-ui/backend/flow/utils/sqlserver/sqlserver_bk_config.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from backend.db_meta.enums import ClusterType
1414
from backend.db_services.version.constants import SqlserverVersion
1515
from backend.flow.consts import ConfigTypeEnum
16+
from backend.utils.tenant import TenantHandler
1617

1718

1819
def get_module_infos(bk_biz_id: int, db_module_id: int, cluster_type: ClusterType) -> dict:
@@ -31,6 +32,7 @@ def get_module_infos(bk_biz_id: int, db_module_id: int, cluster_type: ClusterTyp
3132
"conf_type": "deploy",
3233
"namespace": cluster_type,
3334
"format": FormatType.MAP,
35+
"tenant_id": TenantHandler.get_tenant_id_by_biz(bk_biz_id),
3436
}
3537
)["content"]
3638
return data
@@ -59,6 +61,7 @@ def get_sqlserver_config(
5961
"namespace": cluster_type,
6062
"format": FormatType.MAP_LEVEL,
6163
"method": ReqType.GENERATE_AND_PUBLISH,
64+
"tenant_id": TenantHandler.get_tenant_id_by_biz(bk_biz_id),
6265
}
6366
)
6467
return data["content"]
@@ -82,6 +85,7 @@ def get_sqlserver_backup_config(bk_biz_id: int, cluster_domain: str, db_module_i
8285
"conf_type": "backup",
8386
"namespace": "sqlservercomm",
8487
"format": FormatType.MAP,
88+
"tenant_id": TenantHandler.get_tenant_id_by_biz(bk_biz_id),
8589
}
8690
)["content"]
8791
return data
@@ -106,6 +110,7 @@ def get_sqlserver_alarm_config(bk_biz_id: int, cluster_domain: str, db_module_id
106110
"conf_type": "alarm",
107111
"namespace": "sqlservercomm",
108112
"format": FormatType.MAP,
113+
"tenant_id": TenantHandler.get_tenant_id_by_biz(bk_biz_id),
109114
}
110115
)["content"]
111116
init_sql = data.pop("init_sql")

dbm-ui/backend/flow/utils/sqlserver/sqlserver_db_function.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,19 @@
2929
)
3030
from backend.flow.utils.mysql.db_table_filter import DbTableFilter
3131
from backend.flow.utils.mysql.get_mysql_sys_user import generate_mysql_tmp_user
32+
from backend.utils.tenant import TenantHandler
3233

3334
logger = logging.getLogger("flow")
3435

3536

36-
def base_sqlserver_drs(instances: list, bk_cloud_id: int, sqls: list):
37+
def base_sqlserver_drs(instances: list, bk_cloud_id: int, sqls: list, tenant_id: str):
3738
return DRSApi.sqlserver_rpc(
3839
{
3940
"bk_cloud_id": bk_cloud_id,
4041
"addresses": instances,
4142
"cmds": sqls,
4243
"force": False,
44+
"tenant_id": tenant_id,
4345
}
4446
)
4547

@@ -681,6 +683,10 @@ def insert_sqlserver_config(
681683
else:
682684
sync_mode = ""
683685
drop_sql = "use Monitor truncate table [Monitor].[dbo].[APP_SETTING]"
686+
687+
# 获取租户id
688+
tenant_id = TenantHandler.get_tenant_id_by_biz(cluster.bk_biz_id)
689+
684690
for storage in storages:
685691
if is_get_old_backup_config:
686692
# 按照需求获取旧的备份配置
@@ -690,6 +696,7 @@ def insert_sqlserver_config(
690696
"addresses": [storage.ip_port],
691697
"cmds": [f"select * from [{SQLSERVER_CUSTOM_SYS_DB}].[dbo].[BACKUP_SETTING_OLD]"],
692698
"force": False,
699+
"tenant_id": tenant_id,
693700
}
694701
)
695702
if ret[0]["error_msg"]:
@@ -823,12 +830,12 @@ def insert_sqlserver_config(
823830
return True
824831

825832

826-
def get_app_setting_data(instance: StorageInstance, bk_cloud_id: int):
833+
def get_app_setting_data(instance: StorageInstance, bk_cloud_id: int, tenant_id: str):
827834
"""
828835
根据实例查询app_setting表的结果
829836
"""
830837
sql = f"select * from [{SQLSERVER_CUSTOM_SYS_DB}].[dbo].[APP_SETTING]"
831-
ret = base_sqlserver_drs(bk_cloud_id=bk_cloud_id, instances=[instance.ip_port], sqls=[sql])
838+
ret = base_sqlserver_drs(bk_cloud_id=bk_cloud_id, instances=[instance.ip_port], sqls=[sql], tenant_id=tenant_id)
832839
if ret[0]["error_msg"]:
833840
return None, f"select app_setting failed: {ret[0]['error_msg']}"
834841

@@ -856,7 +863,12 @@ def fix_app_setting_data(cluster: Cluster, instance: StorageInstance, sync_mode:
856863
[MASTER_IP] = '{master.machine.ip}',
857864
[MASTER_PORT]= {master.port}
858865
"""
859-
ret = base_sqlserver_drs(bk_cloud_id=cluster.bk_cloud_id, instances=[instance.ip_port], sqls=[sql])
866+
ret = base_sqlserver_drs(
867+
bk_cloud_id=cluster.bk_cloud_id,
868+
instances=[instance.ip_port],
869+
sqls=[sql],
870+
tenant_id=TenantHandler.get_tenant_id_by_biz(cluster.bk_biz_id),
871+
)
860872
if ret[0]["error_msg"]:
861873
return False, f"fix app_setting failed: {ret[0]['error_msg']}"
862874

@@ -871,7 +883,12 @@ def check_sys_job_status(cluster: Cluster, instance: StorageInstance):
871883
"select name, enabled from msdb.dbo.sysjobs where name like 'TC_%' and name "
872884
"not in('TC_SNAPSHOT_DAY','TC_SNAPSHOT_ONE','TC_REPORT_LOAD')"
873885
)
874-
ret = base_sqlserver_drs(bk_cloud_id=cluster.bk_cloud_id, instances=[instance.ip_port], sqls=[sql])
886+
ret = base_sqlserver_drs(
887+
bk_cloud_id=cluster.bk_cloud_id,
888+
instances=[instance.ip_port],
889+
sqls=[sql],
890+
tenant_id=TenantHandler.get_tenant_id_by_biz(cluster.bk_biz_id),
891+
)
875892
msg = ""
876893
if ret[0]["error_msg"]:
877894
msg = f"[{instance.ip_port}] select sys job failed: {ret[0]['error_msg']}"
@@ -891,7 +908,7 @@ def check_sys_job_status(cluster: Cluster, instance: StorageInstance):
891908

892909

893910
def check_ha_config(
894-
master_instance: StorageInstance, slave_instance: StorageInstance, bk_cloud_id: int, check_tag: str
911+
master_instance: StorageInstance, slave_instance: StorageInstance, bk_cloud_id: int, check_tag: str, tenant_id: str
895912
):
896913
"""
897914
检查传入的源和目的的实例的业务账号是否一致
@@ -916,6 +933,7 @@ def check_ha_config(
916933
bk_cloud_id=bk_cloud_id,
917934
instances=[master_instance.ip_port, slave_instance.ip_port],
918935
sqls=[check_sql_map[check_tag]],
936+
tenant_id=tenant_id,
919937
)
920938

921939
if ret[0]["error_msg"] or ret[1]["error_msg"]:

0 commit comments

Comments
 (0)