Skip to content

Commit d25e132

Browse files
committed
feat(backend): 支持AI日志分析按照标签过滤 #16219
# Reviewed, transaction id: 73701
1 parent 97ec296 commit d25e132

File tree

6 files changed

+33
-11
lines changed

6 files changed

+33
-11
lines changed

dbm-ui/backend/bk_web/constants.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,3 +92,7 @@ class LogLevelName(StrStructuredEnum):
9292
WARNING = EnumField("WARNING", "WARNING")
9393
ERROR = EnumField("ERROR", "ERROR")
9494
DEBUG = EnumField("DEBUG", "DEBUG")
95+
96+
97+
class LogLabel(StrStructuredEnum):
98+
NOT_AI = EnumField("not_for_ai", "not_for_ai")

dbm-ui/backend/configuration/constants.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,12 @@ class SystemSettingsEnum(StrStructuredEnum):
181181
REPLENISH_RATIO_MAP = EnumField("REPLENISH_RATIO_MAP", _("补货比例"))
182182
REPLENISH_OS_MAP = EnumField("REPLENISH_OS_MAP", _("补货操作系统映射"))
183183
REPLENISH_SUBZONE_MAP = EnumField("REPLENISH_SUBZONE_MAP", _("补货园区映射"))
184-
# 判断待裁撤主机开关
184+
# 主机池转移开发配置
185185
HOST_DISSOLVED_SWITCH = EnumField("HOST_DISSOLVED_SWITCH", _("判断待裁撤主机开关"))
186-
# 转入故障池主机开关
187186
HOST_TO_FAULT_SWITCH = EnumField("HOST_TO_FAULT_SWITCH", _("转入故障池主机开关"))
188-
# 判断windows主机开关
189187
WINDOWS_HOST_TO_RECYCLE_SWITCH = EnumField("WINDOWS_HOST_TO_RECYCLE_SWITCH", _("判断windows主机开关"))
188+
# AIDEV相关配置
189+
AI_CODE_SCENE_MAP = EnumField("AI_CODE_SCENE_MAP", _("智能体code场景映射关系表"))
190190

191191

192192
class BizSettingsEnum(StrStructuredEnum):
@@ -317,6 +317,9 @@ class RedisFastRecoverEnum(StrStructuredEnum):
317317
"storage_device": True, # 磁盘
318318
}
319319

320+
# 默认智能体场景映射表
321+
DEFAULT_AI_CODE_SCENE_MAP = {"log_analysis": {"default": "LogAnalysis"}}
322+
320323
# DEFAULT_REVERSE_REPORT_EVENT_TYPES = ["mysql_dbbackup_result", "mysql_dbbackup_progress", "mysql_binlog_result"]
321324

322325
# 默认具备迁移权限的人员
@@ -341,6 +344,7 @@ class RedisFastRecoverEnum(StrStructuredEnum):
341344
[SystemSettingsEnum.DISABLE_DBHA_APPS_CLUSTER_TYPE, "dict", {}, _("禁用DBHA业务")],
342345
# [SystemSettingsEnum.REVERSE_REPORT_EVENT_TYPES, "list", DEFAULT_REVERSE_REPORT_EVENT_TYPES, _("反向上报事件类型")],
343346
[SystemSettingsEnum.OPERATION_DATA_SWITCH.value, "bool", False, _("运营数据开关")],
347+
[SystemSettingsEnum.AI_CODE_SCENE_MAP.value, "str", DEFAULT_AI_CODE_SCENE_MAP, _("智能体code场景映射关系表")],
344348
]
345349

346350
# 环境配置项 是否支持DNS解析 pulsar flow used

dbm-ui/backend/db_services/taskflow/handlers.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ def bklog_esquery_search(indices, query_string, start_time, end_time):
245245
)
246246
return resp["hits"]["hits"]
247247

248-
def get_version_logs(self, node_id: str, version_id: str) -> List[Dict[str, Dict[str, str]]]:
248+
def get_version_logs(self, node_id: str, version_id: str, label_filters: list = None) -> List[Dict[str, Dict]]:
249249
"""获取节点的日志信息"""
250250
if not FlowNode.objects.filter(root_id=self.root_id, node_id=node_id).count():
251251
return [self.generate_log_record(message=_("节点尚未运行,请稍后查看"))]
@@ -297,12 +297,14 @@ def get_version_logs(self, node_id: str, version_id: str) -> List[Dict[str, Dict
297297

298298
for hit in sorted_hits:
299299
log = self._format_log(hit["_source"]["log"], hit["_source"]["serverIp"], hit["_index"])
300-
if log:
301-
logs.append(
302-
self.generate_log_record(
303-
timestamp=hit["_source"].get("time"), levelname=log["levelname"], message=log["log"]
304-
)
300+
# 日志不存在,或者在过滤标签里面,则忽略
301+
if not log or (label_filters and log.get("label") in label_filters):
302+
continue
303+
logs.append(
304+
self.generate_log_record(
305+
timestamp=hit["_source"].get("time"), levelname=log["levelname"], message=log["log"]
305306
)
307+
)
306308
if not logs:
307309
return [self.generate_log_record(message=_("日志上报中,请稍后查看"))]
308310
return logs

dbm-ui/backend/dbm_aiagent/agent/builtin.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@
1717
ChatSessionShareView,
1818
ChatSessionViewSet,
1919
)
20+
from rest_framework.decorators import action
2021

22+
from backend.configuration.constants import SystemSettingsEnum
23+
from backend.configuration.models import SystemSettings
2124
from backend.dbm_aiagent.agent.commands import CommandProcessor
2225

2326

@@ -53,7 +56,9 @@ class AIChatSessionContentFeedbackViewSet(ChatSessionContentFeedbackViewSet):
5356

5457

5558
class AIAgentInfoViewSet(AgentInfoViewSet):
56-
pass
59+
@action(detail=False, methods=["GET"], url_path="agent_scene", url_name="agent_scene")
60+
def get_agent_scene(self, request):
61+
return SystemSettings.get_setting_value(key=SystemSettingsEnum.AI_CODE_SCENE_MAP, default={})
5762

5863

5964
class AIChatGroupViewSet(ChatGroupViewSet):

dbm-ui/backend/dbm_aiagent/agent/services/log_analysis/tasks.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
from celery import shared_task
1515

16+
from backend.bk_web.constants import LogLabel
1617
from backend.db_services.taskflow.handlers import TaskFlowHandler
1718
from backend.dbm_aiagent.agent.commands import TicketFlowLogAnalysisCommand
1819
from backend.dbm_aiagent.agent.handlers import AgentHandler
@@ -55,7 +56,7 @@ def pipeline_log_ai_analysis(root_id: str = None) -> List[Dict]:
5556
error_logs = []
5657
for node_id in node_ids:
5758
# 从日志平台获取节点日志
58-
logs = handler.get_version_logs(node_id, node_version_map[node_id])
59+
logs = handler.get_version_logs(node_id, node_version_map[node_id], label_filters=[LogLabel.NOT_AI])
5960
if not logs:
6061
continue
6162

dbm-ui/backend/flow/plugins/components/collections/common/base_service.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from backend import env
2424
from backend.bk_dataview.prometheus import metrics
2525
from backend.bk_dataview.prometheus.handlers import node_label_func, setup_counter, setup_gauge, setup_histogram
26+
from backend.bk_web.constants import LogLabel
2627
from backend.components import JobApi
2728
from backend.components.sops.client import BkSopsApi
2829
from backend.core.translation.constants import Language
@@ -40,6 +41,11 @@ class ServiceLogMixin:
4041
def log_info(self, msg: str):
4142
logger.info(msg, extra=self.extra_log)
4243

44+
def info_not_for_ai(self, msg: str):
45+
# 展示日志不交给AI分析
46+
extra = {**self.extra_log, "label": LogLabel.NOT_AI.value}
47+
logger.info(msg, extra=extra)
48+
4349
def log_error(self, msg: str):
4450
logger.error(msg, extra=self.extra_log)
4551

0 commit comments

Comments
 (0)