diff --git a/api/core/tools/builtin_tool/providers/apo_analysis/tools/threshold.py b/api/core/tools/builtin_tool/providers/apo_analysis/tools/threshold.py index cb955cf87d..b6f0dd029e 100644 --- a/api/core/tools/builtin_tool/providers/apo_analysis/tools/threshold.py +++ b/api/core/tools/builtin_tool/providers/apo_analysis/tools/threshold.py @@ -18,10 +18,17 @@ class ThresholdTool(BuiltinTool): metric = tool_parameters.get('metricData') metric_data = json.loads(metric) threshold = float(tool_parameters.get('threshold')) - res = {} - for k, v in metric_data['data'].items(): - if v > threshold: - res[str(k)] = v + res = [] + for serie in metric_data['data']: + tmpres = { + "name": serie['legend'], + "data": {}, + } + for k, v in serie['chart']['chartData'].items(): + v = float(v) + if v > threshold: + tmpres['data'][str(k)] = v + res.append(tmpres) res = json.dumps({ "type": 'llm', "display": False, diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/container_cpu.py b/api/core/tools/builtin_tool/providers/apo_select/tools/container_cpu.py index c0553a6f61..1f64477139 100644 --- a/api/core/tools/builtin_tool/providers/apo_select/tools/container_cpu.py +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/container_cpu.py @@ -7,7 +7,7 @@ import requests from configs import dify_config from core.tools.builtin_tool.tool import BuiltinTool from core.tools.entities.tool_entities import ToolInvokeMessage - +from core.tools.builtin_tool.providers.utils import APOUtils class SelectContainerCPUTool(BuiltinTool): def _invoke( @@ -18,25 +18,26 @@ class SelectContainerCPUTool(BuiltinTool): app_id: Optional[str] = None, message_id: Optional[str] = None, ) -> Generator[ToolInvokeMessage, None, None]: - container_name = tool_parameters.get("container") + pod = tool_parameters.get("pod") + namespace = tool_parameters.get("namespace") start_time = tool_parameters.get("startTime") end_time = tool_parameters.get("endTime") - pmql = 'rate(container_cpu_usage_seconds_total{container="' + container_name + '"}[1m])' params = { - 'query': pmql, - 'start': start_time, - 'end': end_time, - 'step': '1m' + 'metricName': '基础设施情况 - 容器CPU - 容器CPU使用率 - Containerd', + 'params': { + "pod": pod, + "namespace": namespace + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), } - url = dify_config.APO_VM_URL + "/api/v1/query_range" - resp = requests.get(url, params=params) - list = resp.json()['data']['result'][0] - res = {} - for item in list['values']: - res[str(item[0] * 1000)] = float(item[1]) + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] list = json.dumps({ 'type': 'cpu', 'display': True, - 'data': res, + 'unit': list['unit'], + 'data': list['timeseries'] }) yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/container_cpu.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/container_cpu.yaml index 8ecf8c09e3..028b98a7b3 100644 --- a/api/core/tools/builtin_tool/providers/apo_select/tools/container_cpu.yaml +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/container_cpu.yaml @@ -15,18 +15,31 @@ description: pt_BR: Query the CPU utilization of the container llm: Query the CPU utilization of the container parameters: - - name: container + - name: pod type: string required: true label: - en_US: container - zh_Hans: container - pt_BR: container + en_US: pod + zh_Hans: pod + pt_BR: pod human_description: - en_US: Specified container name - zh_Hans: 指定的容器名称 - pt_BR: Specified container name - llm_description: Specified container name + en_US: Specified pod name + zh_Hans: 指定的容器POD名称 + pt_BR: Specified pod name + llm_description: Specified pod name + form: llm + - name: namespace + type: string + required: true + label: + en_US: namespace + zh_Hans: namespace + pt_BR: namespace + human_description: + en_US: Specified namespace + zh_Hans: 指定的容器所在Namespace + pt_BR: Specified namespace + llm_description: Specified namespace form: llm - name: startTime type: number diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/container_rss.py b/api/core/tools/builtin_tool/providers/apo_select/tools/container_rss.py index 588af31957..fedd516ddc 100644 --- a/api/core/tools/builtin_tool/providers/apo_select/tools/container_rss.py +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/container_rss.py @@ -7,7 +7,7 @@ import requests from configs import dify_config from core.tools.builtin_tool.tool import BuiltinTool from core.tools.entities.tool_entities import ToolInvokeMessage - +from core.tools.builtin_tool.providers.utils import APOUtils class SelectContainerRSSTool(BuiltinTool): def _invoke( @@ -18,24 +18,26 @@ class SelectContainerRSSTool(BuiltinTool): app_id: Optional[str] = None, message_id: Optional[str] = None, ) -> Generator[ToolInvokeMessage, None, None]: - container_name = tool_parameters.get("container") + pod = tool_parameters.get("pod") + namespace = tool_parameters.get("namespace") start_time = tool_parameters.get("startTime") end_time = tool_parameters.get("endTime") - pmql = 'container_memory_rss{container="' + container_name + '"}' params = { - 'query': pmql, - 'start': start_time, - 'end': end_time, - 'step': '1m' + 'metricName': '基础设施情况 - 容器内存 - 容器内存使用率 - Containerd', + 'params': { + "pod": pod, + "namespace": namespace + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), } - resp = requests.get(dify_config.APO_VM_URL + '/api/v1/query_range', params=params) - list = resp.json()['data']['result'][0] - res = {} - for item in list['values']: - res[str(item[0] * 1000)] = float(item[1]) + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] list = json.dumps({ 'type': 'memory', 'display': True, - 'data': res, + 'unit': list['unit'], + 'data': list['timeseries'] }) yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/container_rss.yaml b/api/core/tools/builtin_tool/providers/apo_select/tools/container_rss.yaml index b452d7ee0c..33c2724a2e 100644 --- a/api/core/tools/builtin_tool/providers/apo_select/tools/container_rss.yaml +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/container_rss.yaml @@ -3,30 +3,43 @@ identity: author: APO label: en_US: Query container resident memory usage - zh_Hans: 查询容器驻留内存使用量 + zh_Hans: 查询容器内存使用量 pt_BR: Query container resident memory usage description: human: en_US: Query container resident memory usage - zh_Hans: 查询容器驻留内存使用量 + zh_Hans: 查询容器内存使用量 pt_BR: Query container resident memory usage llm: Query container resident memory usage display: type: memory unit: bytes parameters: - - name: container + - name: pod type: string required: true label: - en_US: container - zh_Hans: container - pt_BR: container + en_US: pod + zh_Hans: pod + pt_BR: pod human_description: - en_US: Specified container name - zh_Hans: 指定的容器名称 - pt_BR: Specified container name - llm_description: Specified container name + en_US: Specified pod name + zh_Hans: 指定的容器POD名称 + pt_BR: Specified pod name + llm_description: Specified pod name + form: llm + - name: namespace + type: string + required: true + label: + en_US: namespace + zh_Hans: namespace + pt_BR: namespace + human_description: + en_US: Specified namespace + zh_Hans: 指定的容器所在Namespace + pt_BR: Specified namespace + llm_description: Specified namespace form: llm - name: startTime type: number diff --git a/api/core/tools/builtin_tool/providers/apo_select/tools/select_cpu.py b/api/core/tools/builtin_tool/providers/apo_select/tools/select_cpu.py index 9eff32aaef..0917427054 100644 --- a/api/core/tools/builtin_tool/providers/apo_select/tools/select_cpu.py +++ b/api/core/tools/builtin_tool/providers/apo_select/tools/select_cpu.py @@ -7,7 +7,7 @@ import requests from configs import dify_config from core.tools.builtin_tool.tool import BuiltinTool from core.tools.entities.tool_entities import ToolInvokeMessage - +from core.tools.builtin_tool.providers.utils import APOUtils class SelectCPUTool(BuiltinTool): def _invoke( @@ -21,22 +21,21 @@ class SelectCPUTool(BuiltinTool): node_name = tool_parameters.get("nodeName") start_time = tool_parameters.get("startTime") end_time = tool_parameters.get("endTime") - sumql = 'sum by (instance_name) (avg by (mode, instance_name)' - pmql = sumql + ' (rate(node_cpu_seconds_total{mode!="idle", instance_name="' + node_name + '"}[1m])))' params = { - 'query': pmql, - 'start': start_time, - 'end': end_time, - 'step': '1m' + 'metricName': '宿主机监控指标 - Quick CPU / Mem / Disk - CPU Busy', + 'params': { + "node": node_name, + }, + 'startTime': start_time, + 'endTime': end_time, + 'step': APOUtils.get_step(start_time, end_time), } - resp = requests.get(dify_config.APO_VM_URL + '/api/v1/query_range', params=params) - list = resp.json()['data']['result'][0] - res = {} - for item in list['values']: - res[str(item[0] * 1000)] = float(item[1]) + resp = requests.post(dify_config.APO_BACKEND_URL + '/api/metric/query', json=params) + list = resp.json()['result'] list = json.dumps({ 'type': 'cpu', 'display': True, - 'data': res, + 'unit': list['unit'], + 'data': list['timeseries'] }) yield self.create_text_message(list) \ No newline at end of file diff --git a/api/core/tools/builtin_tool/providers/utils.py b/api/core/tools/builtin_tool/providers/utils.py new file mode 100644 index 0000000000..0e044a9a38 --- /dev/null +++ b/api/core/tools/builtin_tool/providers/utils.py @@ -0,0 +1,35 @@ + +class APOUtils: + + @classmethod + def get_step(self, start_time, end_time): + time_diff = end_time - start_time + + SECOND = 1000000 # microseconds + MINUTE = 60 * SECOND + HOUR = 60 * MINUTE + + step = SECOND # default step is 1 second + + if time_diff <= 15 * MINUTE: + step = 30 * SECOND + elif time_diff <= 30 * MINUTE: + step = 1 * MINUTE + elif time_diff <= 1 * HOUR: + step = 2 * MINUTE + elif time_diff <= 1.5 * HOUR: + step = 3 * MINUTE + elif time_diff <= 3 * HOUR: + step = 6 * MINUTE + elif time_diff <= 6 * HOUR: + step = 12 * MINUTE + elif time_diff <= 12 * HOUR: + step = 24 * MINUTE + elif time_diff <= 15 * HOUR: + step = 30 * MINUTE + elif time_diff <= 30 * HOUR: + step = 1 * HOUR + else: + step = ((time_diff + 30 * SECOND - 1) // (30 * SECOND)) * SECOND + + return step \ No newline at end of file