微信扫码
添加专属顾问
我要投稿
DIFY结合Prometheus历史告警与实时数据,打造智能分析闭环,提升运维效率。 核心内容: 1. 告警数据清洗与指标查询语句生成的关键步骤 2. 数据量控制与查询优化的实战经验 3. 后端实现代码示例与参数调优技巧
# 在 monitor/AlertView.py 文件中修改以下代码import datetimeimport requestsfrom django.http import JsonResponsefrom django.views.decorators.http import require_GETimport logginglogger = logging.getLogger(__name__)def prometheus_query_range(request):"""转发请求到Prometheus的query_range API,并根据namespace过滤结果参数:- query: Prometheus查询语句(支持多个,用分号分隔)- start: 开始时间 (RFC3339格式)- end: 结束时间 (RFC3339格式)- step: 时间步长- namespace: 可选,用于过滤结果中的namespace(支持多个,用逗号分隔)"""try:# 从请求参数中获取值query = request.GET.get('query')start = request.GET.get('start')end = request.GET.get('end')step = request.GET.get('step', '30m') # 默认步长30分钟filter_namespaces = request.GET.get('namespace') # 过滤用的namespace# 参数校验if not all([query, start, end]):return JsonResponse({'error': '缺少必要参数: query, start, end都是必需的'}, status=400)# 处理多个namespace过滤参数filter_namespace_list = Noneif filter_namespaces:filter_namespace_list = [ns.strip() for ns in filter_namespaces.split(',') if ns.strip()]# Prometheus API地址prometheus_url = "http://IP:9090/api/v1/query_range"# 支持多个查询语句,用分号分隔queries = [q.strip() for q in query.split(';') if q.strip()]# 存储所有查询结果all_results = []# 执行每个查询for q in queries:# 构造请求参数params = {'query': q,'start': start,'end': end,'step': step}# 发送请求到Prometheusresponse = requests.get(prometheus_url, params=params, timeout=30)# 检查响应状态if response.status_code == 200:data = response.json()# 如果指定了namespace过滤,则进行过滤if filter_namespace_list is not None and 'data' in data and 'result' in data['data']:filtered_result = []for item in data['data']['result']:# 检查metric中是否有namespace字段,并且是否匹配if 'metric' in item and 'namespace' in item['metric']:if item['metric']['namespace'] in filter_namespace_list:filtered_result.append(item)# 如果没有namespace字段,根据需求决定是否包含# 这里假设只包含有明确namespace且匹配的项# 更新返回数据中的resultdata['data']['result'] = filtered_result# 处理结果,只保留pod, instance, namespace, values这四个参数# 并过滤掉包含+Inf值的metricif 'data' in data and 'result' in data['data']:processed_result = []for item in data['data']['result']:# 检查values中是否包含+Inf值has_inf = Falseif 'values' in item:for value_pair in item['values']:if len(value_pair) > 1 and value_pair[1] == "+Inf":has_inf = Truebreak# 如果包含+Inf值,则跳过这个metricif has_inf:continueprocessed_item = {}# 只保留指定的字段if 'metric' in item:# 提取需要的字段processed_metric = {}if 'pod' in item['metric']:processed_metric['pod'] = item['metric']['pod']if 'instance' in item['metric']:processed_metric['instance'] = item['metric']['instance']if 'namespace' in item['metric']:processed_metric['namespace'] = item['metric']['namespace']processed_item['metric'] = processed_metric# 保留values字段if 'values' in item:formatted_values = []for value_pair in item['values']:if len(value_pair) >= 2:timestamp = value_pair[0]value = value_pair[1]formatted_value = {'time': datetime.datetime.utcfromtimestamp(timestamp).strftime('%Y-%m-%d ''%H:%M:%S'),'value': value}formatted_values.append(formatted_value)processed_item['values'] = formatted_valuesprocessed_result.append(processed_item)# 将处理后的结果添加到总结果中all_results.extend(processed_result)elif 'data' in data:# 即使没有result字段,也要添加空的结果以确保所有查询都被处理all_results.extend([])else:logger.warning(f"Prometheus API调用失败,状态码: {response.status_code},查询: {q}")# 构造最终返回的数据结构final_response = {'status': 'success','data': {'resultType': 'matrix','result': all_results}}return JsonResponse(final_response)except requests.exceptions.RequestException as e:logger.error(f"请求Prometheus API时发生网络错误: {str(e)}")return JsonResponse({'error': '网络错误','message': str(e)}, status=500)except Exception as e:logger.error(f"处理Prometheus查询时发生错误: {str(e)}")return JsonResponse({'error': '服务器内部错误','message': str(e)}, status=500)
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-10-30
Dify流程暂停与人工干预:3种实现方案+避坑指南
2025-10-16
告别升级噩梦:Dify 二次开发的无缝适配策略与实战案例(基于 v1.9.1)
2025-10-13
用Dify搭建企业知识库:5个实战技巧提升检索准确率90%
2025-10-13
Dify接口调用实战指南:从入门到精通的避坑手册,收藏了!
2025-10-12
Dify1.6.0升级1.9.1步骤及踩坑记
2025-10-10
用 Dify 零代码搭建 AI 用研助理,5分钟完成100个虚拟用户调研
2025-09-30
重大消息,刚刚Dify 1.9.1发布了!我们聊聊带来了哪些吸引人的功能特性?
2025-09-26
内网环境下Dify1.9.0版本镜像构建过程记录
2025-10-13
2025-09-03
2025-09-16
2025-09-06
2025-08-19
2025-09-23
2025-09-02
2025-08-18
2025-09-04
2025-10-12
2025-09-30
2025-09-23
2025-09-06
2025-09-05
2025-08-29
2025-08-18
2025-08-02
2025-07-30