微软发布AIOpsLab:一个开源的全面AI框架,用于AIOps代理
在当今这个云计算技术迅猛发展的时代,企业面临着前所未有的挑战与机遇。随着云基础设施的日益复杂化,它们成为了企业运营不可或缺的支柱。网站可靠性工程师(Site Reliability Engineers,简称SRE)和DevOps团队肩负着关键任务,即管理和维护系统的稳定性,这包括故障的检测、诊断和缓解。特别是在微服务和无服务器架构成为主流的今天,这些任务的难度和复杂性都在不断上升。这些架构虽然提升了系统的可扩展性,但同时也可能带来新的故障点,比如在亚马逊的AWS云平台上,仅仅一小时的服务中断就可能造成巨大的经济损失。
为了应对这些挑战,微软的研究人员和加州大学伯克利分校、伊利诺伊大学香槟分校、印度科学研究所以及Agnes Scott学院的团队一起,开发了AIOpsLab。这个框架就是为了让AIOps代理的设计、开发和提升变得更加系统化。AIOpsLab的目标是提供可复制、标准化、可扩展的基准。它的核心功能包括整合现实世界的工作负载、故障注入能力,还有代理和云环境之间的接口,这样就能模拟出类似生产环境的场景。这个开源框架覆盖了云运营的整个生命周期,从故障检测到解决,一应俱全。通过提供模块化、可适应的平台,AIOpsLab帮助研究人员和实践者提升云系统的可靠性,减少对手动干预的依赖。
图 1:AIOpsLab 的系统架构
如图1所示,协调器(Orchestrator)就像是系统元素之间的协调者,也是代理和云之间的接口(Agent-Cloud-Interface,ACI)。代理通过协调器来解决问题,接收问题描述、指令和相关API。协调器用工作负载(Workload)和故障(Fault)生成器来制造各种问题,然后注入到它能部署的应用中。部署的服务在多个层面都能被观察到,提供遥测数据、追踪和日志。协调器用Kubernetes、Helm甚至Shell这些工具和服务、云进行沟通。代理通过协调器来行动,协调器执行它们并更新服务的状态。最后,协调器用预定义的指标来评估解决方案。
技术细节和优势
AIOpsLab框架有几个关键组件。协调器是一个核心模块,它通过提供任务描述、动作API和反馈来协调代理和云环境之间的互动。故障和工作负载生成器模拟现实世界的条件来考验被测试的代理。可观察性是框架的另一个基石,它提供全面的遥测数据,比如日志、指标和跟踪,帮助诊断故障。这种设计很灵活,可以和多种架构集成,包括Kubernetes和微服务。AIOpsLab通过标准化AIOps工具的评估,确保了测试环境的一致性和可复制性。它还为研究人员提供了关于代理性能的宝贵信息,让故障定位和解决能力能持续提升。
结果和洞见
在一个案例研究中,研究人员用DeathStarBench的SocialNetwork应用程序来测试AIOpsLab的能力。他们设置了一个真实的故障——微服务配置错误——然后测试了一个基于LLM的代理,这个代理用的是GPT-4驱动的ReAct框架。代理在36秒内就识别并解决了问题,这显示了框架在模拟现实世界条件方面的有效性。详细的遥测数据对于找出问题的根本原因非常关键,而协调器的API设计帮助代理在探索性和针对性行动之间找到了平衡。这些发现都强调了AIOpsLab作为一个强大基准的潜力,它能帮助评估和提升AIOps代理。
安装和设置选项
AIOpsLab提供了灵活的设置选项,适应不同的用户环境。根据您现在的设置,您可以选择以下路径之一:
-
使用已有的带有Kubernetes集群的虚拟机:
您可以用下面的命令来克隆仓库。我们推荐用
poetry
来管理依赖,您也可以用标准的pip install -e .
来安装包。
$ git clone <CLONE_PATH_TO_THE_REPO>
$ cd AIOpsLab
$ pip install poetry
$ poetry install -vvv
$ poetry shell
-
在现有的虚拟机上设置Kubernetes
您还需要一个运行中的Kubernetes(k8s)集群作为前提。您可以参照官方的 k8s 安装(
https://github.com/microsoft/AIOpsLab/blob/main/scripts/kube_install.sh
),它会直接在服务器上安装k8s(注意,这只是一个安装示例,不是可执行脚本;您可能需要根据您的情况修改一些部分,比如脚本中的节点名称和证书哈希)。之后,运行:
$ cd scripts
$ ./setup.sh $(hostname) # 或者 <YOUR_NODE_NAME>
-
在云上配置虚拟机和Kubernetes
用户可以在公有云,比如Azure上创建一个双节点Kubernetes集群。这也可以作为创建更复杂部署或在其他云上部署的起点。
快速开始
作为代理的人类:
$ python3 cli.py
(aiopslab) $ start misconfig_app_hotel_res-detection-1 # 或者选择任何您想要解决的问题
# ...等待设置...
(aiopslab) $ submit("Yes") # 提交解决方案
运行GPT-4基线代理:
$ export OPENAI_API_KEY=<YOUR_OPENAI_API_KEY>
$ python3 clients/gpt.py # 您也可以在脚本中更改要解决的问题
您可以用k9s或其他集群监控工具方便地检查集群的状态。
使用方法
AIOpsLab可以这样用:
-
把您的代理接入AIOpsLab
-
向AIOpsLab添加新应用
-
向AIOpsLab添加新问题
如何把您的代理接入AIOpsLab?
AIOpsLab让开发和评估您的代理变得特别简单。您只需要3个简单的步骤就能把您的代理接入AIOpsLab:
-
创建您的代理:您可以自由地用任何您喜欢的框架来开发代理。唯一的要求是:
-
把您的代理包装在一个Python类中,比如叫
Agent
-
在类中添加一个异步方法
get_action
:
-
# 根据当前状态并返回代理的行动
async def get_action(self, state: str) -> str:# <您的代理逻辑在这里>
-
把您的代理注册到AIOpsLab:现在您可以把代理注册到AIOpsLab的协调器中。协调器会管理您的代理和环境之间的互动:
from aiopslab.orchestrator import Orchestratoragent = Agent() # 创建您的代理实例
orch = Orchestrator() # 获取AIOpsLab的协调器
orch.register_agent(agent) # 把您的代理注册到AIOpsLab
-
在问题上评估您的代理:
-
初始化问题:AIOpsLab提供了一些问题,您可以在这些问题上评估您的代理。在这里找到可用问题列表或者用
orch.probs.get_problem_ids()
。现在通过它的ID来初始化一个问题:
-
problem_desc, instructs, apis = orch.init_problem("k8s_target_port-misconfig-mitigation-1")
-
设置代理上下文:用问题描述、指令和可用的API来为您的代理设置上下文。(这一步取决于您的代理设计,留给用户自己来)
-
开始问题:通过调用
start_problem
方法来开始问题。您也可以指定最大步数:
import asyncio
asyncio.run(orch.start_problem(max_steps=30))
这个过程会创建一个和协调器的Session
,在这个Session
里,代理会解决问题。协调器会评估您的代理的解决方案并提供结果(存储在data/results/
下)。您可以用这些结果来改进您的代理。
如何向AIOpsLab添加新应用?
AIOpsLab提供了一个默认的应用列表,用来评估代理的操作任务。但是,作为开发者,您可以向AIOpsLab添加新应用,并围绕它们设计问题。
要用Helm向AIOpsLab添加新应用,您需要:
-
添加应用元数据
-
应用元数据是一个描述应用的JSON对象。
-
包括任何字段,比如应用的名字、描述、命名空间等等。
-
我们建议还包括一个特别的
Helm Config
字段,如下:
-
"Helm Config": {"release_name": "<部署Helm版本名称>","chart_path": "<应用Helm图表的路径>","namespace": "<应用应该部署的K8S命名空间>"
}
-
Helm Config
被协调器用来在与应用相关的问题开始时自动部署您的应用。 -
协调器会自动提供所有其他字段作为上下文给代理,用于与此应用相关的任何问题。
创建一个包含这个元数据的JSON文件,并保存在metadata
目录中。比如social-network
应用:social-network.json
-
添加应用类
在apps
目录中的新Python文件里扩展基类:
from aiopslab.service.apps.base import Applicationclass MyApp(Application):def __init__(self):super().__init__("<path to app metadata JSON>")
Application
类为应用提供了基础实现。您可以根据需要覆盖方法并添加新的方法以适应您的应用需求,但基类应该足以满足大多数应用。
如何向AIOpsLab添加新问题?
和应用类似,AIOpsLab提供了一个默认的问题列表来评估代理。但是,作为开发者,您可以向AIOpsLab添加新问题,并围绕您的应用设计它们。
AIOpsLab中的每个问题都有5个组件:
-
应用:问题所基于的应用。
-
任务:代理需要执行的AIOps任务。目前我们支持:检测、定位、分析和缓解。
-
故障:在应用中引入的故障。
-
工作负载:为应用生成的工作负载。
-
评估器:检查代理性能的评估器。
要向AIOpsLab添加新问题,请在problems
目录中创建一个新的Python文件,如下:
-
设置。导入您选择的应用(比如
MyApp
)和任务(比如LocalizationTask
):
from aiopslab.service.apps.myapp import MyApp
from aiopslab.orchestrator.tasks.localization import LocalizationTask
-
定义。要定义一个问题,创建一个从您选择的
Task
继承的类,并定义3个方法:start_workload
、inject_fault
和eval
:
class MyProblem(LocalizationTask):def __init__(self):self.app = MyApp()def start_workload(self):# <您的工作负载逻辑在这里>def inject_fault(self)# <您的故障注入逻辑在这里>def eval(self, soln, trace, duration):# <您的评估逻辑在这里>
-
注册。最后,把您的问题添加到协调器的注册表中。
-
start_workload
:启动应用的工作负载。使用您自己的生成器或者AIOpsLab的默认生成器,后者基于wrk2:
from aiopslab.generator.workload.wrk import Wrkwrk = Wrk(rate=100, duration=10)
wrk.start_workload(payload="<wrk payload script>", url="<app URL>")
-
inject_fault
:向应用引入故障。使用您自己的注入器或者AIOpsLab的内置注入器,您也可以扩展它。比如,K8S层的配置错误:
from aiopslab.generators.fault.inject_virtual import *inj = VirtualizationFaultInjector(testbed="<namespace>")
inj.inject_fault(microservices=["<service-name>"], fault_type="misconfig")
-
eval
:用3个参数评估代理的解决方案:(1) soln:代理提交的解决方案(如果有),(2) trace:代理的行动轨迹,和(3) duration:代理所花费的时间。
在这里,您可以使用每个任务的内置默认评估器和/或添加自定义评估。结果存储在self.results
中:
def eval(self, soln, trace, duration) -> dict:super().eval(soln, trace, duration) # 默认评估self.add_result("myMetric", my_metric(...)) # 添加自定义指标return self.results
注意:当代理开始一个问题时,协调器会创建一个
Session
对象,存储代理的交互。trace
参数是这个会话的记录轨迹。
结论
AIOpsLab为推进自动化云运营提供了一个深思熟虑的方法。它通过解决现有工具的不足,并提供一个可复制和现实的评估框架,来支持可靠和高效的AIOps代理的持续发展。AIOpsLab的开源特性,鼓励了研究人员和实践者之间的合作和创新。随着云系统的规模和复杂性的增长,像AIOpsLab这样的框架将变得越来越重要,它们是确保运营可靠性和推进AI在IT运营中角色的关键。
详见论文:https://arxiv.org/pdf/2407.12165
github: https://github.com/microsoft/AIOpsLab/?tab=readme-ov-file
相关文章:

微软发布AIOpsLab:一个开源的全面AI框架,用于AIOps代理
在当今这个云计算技术迅猛发展的时代,企业面临着前所未有的挑战与机遇。随着云基础设施的日益复杂化,它们成为了企业运营不可或缺的支柱。网站可靠性工程师(Site Reliability Engineers,简称SRE)和DevOps团队肩负着关键…...

ElasticSearch | Elasticsearch与Kibana页面查询语句实践
关注:CodingTechWork 引言 在当今大数据应用中,Elasticsearch(简称 ES)以其高效的全文检索、分布式处理能力和灵活的查询语法,广泛应用于各类日志分析、用户行为分析以及实时数据查询等场景。通过 ES,用户…...
12.C语言中的struct详解:定义、赋值、指针、嵌套与位字段
目录 1.简介2.struct 的复制3.struct 指针4.struct 的嵌套5.位字段6.弹性数组成员 1.简介 本篇原文为:C语言中的struct详解:定义、赋值、指针、嵌套与位字段。 更多C进阶、rust、python、逆向等等教程,可点击此链接查看:酷程网 …...
文件读写到SQLite数据库的方法
在 SQLite 数据库中,将文件读写到数据库的常见方法主要有以下几种: 1. 将文件以 BLOB 类型存储 BLOB(Binary Large Object) 是 SQLite 中的二进制数据类型,可以直接用来存储文件内容。 步骤: 创建表 创建一…...

springboot项目部署至linux
1.修改pom.xml 确认是否有以下代码,没有请进行添加,mainClass改成你的启动类 <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.ve…...

使用sed命令封装自定义dos2unix脚本
使用sed命令封装自定义dos2unix脚本 创建 `dos2unix` 脚本使用自定义的 `dos2unix` 脚本注意事项要将 sed -i 封装为一个简单的 dos2unix 脚本,你可以创建一个 Bash 脚本文件,该文件接受文件名作为参数,并使用 sed 命令来删除文件中的 DOS 回车符(\r)。以下是一个基本的实…...

调整Python+Pytest+Allure+Yaml+Pymysql框架中需要执行的用例顺序
当pytest框架中有时时候会因为用例的前后关联关系需要调整用例执行顺序时则可以跟进具体的要求调整pytest.ini配置文件中执行用例文件夹的前后顺序 当如果是需要调整某个文件夹中用例的执行顺序时,则跟进具体的文件调整对应testcases中test_*.py文件中的执行顺序...
带内管理和带外管理
带内管理(In-Band Management) 概述 带内管理是一种借助生产网络来传输管理数据的网络管理方式,其管理流量与业务流量共享相同的网络路径。 特点 共享网络路径:管理数据和业务数据一同使用现有的网络基础设施,在同…...
【操作系统】阻塞非阻塞I/O、同步异步I/O
阻塞I/O:程序发起I/O操作时,程序被挂起,直到I/O操作完成并返回结果。在这个过程中,程序会被阻塞无法执行其他任务。适用于简单、低并发的场景。 非阻塞I/O:程序发起I/O操作时,不会等待,立即返回…...
spring cloud alibaba-dubbo3 rpc运行原理
Dubbo3 运行原理 Dubbo3 是 Apache Dubbo 的最新版本,是一个高性能、轻量级的分布式服务框架,支持微服务架构。相比 Dubbo2,它在协议、扩展性、服务治理、流控等方面做了大量改进,特别是引入了 Triple 协议,使其更加适…...

【Uniapp-Vue3】computed计算属性用法及方法对比
如果我们想要将两个响应式变量进行某种运算,就可以使用computed计算属性。 比如下面这个例子中,输入名和姓合成全名,可以用直接显示的方法: 我们也可以使用computed属性: import {computed} from "vue"; le…...

web实操10——Filter和Listener
Filter介绍 web三大组件:servlet,filter, lisenter。 Filter快速入门 步骤 拦截路径:你访问什么样的资源,过滤器会生效,包括静态资源,动态资源。 配置:两种配置方式 代码实现 代码&#…...
Spring中,出现依赖不完全注入后才执行逻辑
1. Bean生命周期机制 Spring管理的Bean是通过生命周期回调进行初始化和依赖注入的。以下是典型的生命周期阶段: 实例化(Instantiation): 创建Bean对象。依赖注入(Dependency Injection): 向Be…...
如何选择 Dockerfile 的放置方式
是否将 Dockerfile 放在项目根目录下还是为每个应用服务单独创建 Dockerfile,取决于项目架构和使用场景。以下是针对不同项目类型的最佳实践和推荐方式: 一、单体应用项目 项目特点 项目是一个单体应用,只有一个运行环境,例如&a…...
用 HTML5 Canvas 和 JavaScript 实现炫酷跨年烟花特效
一、引言 跨年夜,五彩斑斓、绚丽绽放的烟花是最令人期待的视觉盛宴之一。在网页端,我们能否通过技术手段复现这一梦幻场景呢?答案是肯定的。本文将深入剖析一段使用 HTML5 Canvas 和 JavaScript 实现的跨年烟花特效源码,带你领略前端技术创造的惊艳画面。 用 HTML5 Canvas…...

cat命令详解
🏝️专栏:https://blog.csdn.net/2301_81831423/category_12872319.html 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” cat 是 Linux/Unix 中的一个非常常用的命令&…...

el-table 自定义表头颜色
第一种方法:计算属性 <template><div><el-table:data"formData.detail"border stripehighlight-current-row:cell-style"{ text-align: center }":header-cell-style"headerCellStyle"><el-table-column fixed…...
window.print()预览时表格显示不全
问题描述:使用element的table组件,表格列宽为自适应,但使用window.print()方法预览的页面会直接按预览宽度截取表格内容进行展示,造成表格可能的显示不全问题 解决方法:添加如下样式 media print {::v-deep {// 表头…...
React Router底层核心原理详解
React Router 是一个功能强大的路由库,它允许开发者在 React 单页面应用(SPA)中实现客户端路由管理。React Router 通过匹配 URL 和组件的关系来实现页面的导航,它不仅提供了简单的 API,还在底层实现了复杂的 URL 匹配…...
linux MySQL 实时性能监控工具
在 Linux 上,有多个工具可以用于 实时监控 MySQL 的性能。根据你的需求,以下是常用的 MySQL 实时性能监控工具,包括轻量级的命令行工具和可视化监控工具。 🔧 1. MySQLTuner – 一键性能优化建议 ✅ 特点 快速分析 MySQL 的性能…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...