OneUptime 工作流组件全景指南:从 API、AI 到数据组件的选型与实现机制
【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime
本篇以 OneUptime 官方文档的 Workflow 组件目录(App/FeatureSet/Docs/Content/da/workflows/components.md)为主体,完整覆盖触发器之后可添加的每一类组件(API、AI、Webhook、Slack/Teams/Discord/Telegram/Email、Custom Code、JSON、Conditions、Delay、Log、Execute Workflow 以及 OneUptime 数据组件)的用途、设置项、输出端口与选型规则,并结合 RunWorkflow.ts、Component.ts 与 AI.md 等仓库源码,深入解析组件参数模型、执行路径与输出值的流转机制,帮助你既能照目录配置组件,也能读懂底层实现。
组件(Components)是什么
组件是触发器(Trigger)之后添加的构建块。每个组件只做一件事——发一条消息、调一个 API、判断一个条件——然后连接到下一个组件。组件目录页回答"有哪些组件、每个组件能做什么",而如何在画布上添加与连线,见 authoring.md。
从源码结构看,画布上每个节点都携带一份统一的元数据模型。Component.ts 定义了NodeDataProp接口:每个节点包含metadata/metadataId(组件定义)、arguments(输入参数)、returnValues(输出值)以及componentType(Trigger 或 Component 两类)。Argument定义中还有一个值得注意的字段isSensitive:当其为 true 时,运行时传给组件的仍是真实值,但该参数在工作流日志中的记录会被替换为脱敏标记——这是组件级敏感参数(如令牌)不落盘的原理依据。
API 组件:调用任意 HTTP 接口
向任意 URL 发起 HTTP 请求,是覆盖面最广的组件。
设置项:
- Method—
GET、POST、PUT、PATCH或DELETE。 - URL— 要调用的地址。
- Headers— 随请求发送的请求头。
- Body—
POST/PUT/PATCH时的请求体。
输出端口:
- Succes(成功)— 调用成功(2xx 响应)时触发,向下游传递状态码、响应头和响应体。
- Fejl(错误)— 网络失败或非 2xx 响应时触发,传递错误信息。
适用场景:任何外部 API、你自己的管理端点,或任何没有专属组件的集成。文档中给出的取舍规则很实用:需要读取响应就用 API;只想发一条消息就走 Webhook(出站)——后者是 API 组件的简化版,只向 URL 发送一个 JSON body,属于"发射后不管"(fire and forget)场景。
在仓库中,Webhook 组件有独立的实现文档 Webhook.md,其请求发送逻辑最终由 RunStep.ts 逐步执行。
AI 组件:Generate Text with AI
该组件基于一段 Prompt 和可选的 JSON Context 生成一个文本响应。组件使用项目配置好的默认 LLM 提供商;若不存在则回退到安装级别的全球(全局)提供商。提供商的凭据与端点是集中配置的,不是工作流的参数——这一点在 AI.md 中被反复强调,目的是让凭据永远不成为工作流参数。
设置项:
- System Instructions— 可选的模型角色、语气与约束说明。
- Prompt— 必填任务描述,可包含工作流变量和之前组件的输出。
- Context— 可选 JSON,是你有意带入请求的数据。它被追加在一条显式的"消息结束信任标记"之后,并在消息剩余部分中按不可信数据处理。
- Temperature—
0到1的变化度,默认0.2,以获得可预测的自动化输出。 - Maximum Output Tokens—
1到4096,默认1024。
硬性限制:System Instructions、Prompt 与序列化后的 Context 合计上限 50,000 字符;对提供商的请求最长 60 秒且只尝试一次;每个项目最多 3 个工作流 AI 请求并发执行。
输出值(AI.md 中的输出表与文档一致):
| 输出 | 说明 |
|---|---|
| Response | 模型生成的文本。 |
| Provider/Model | 本次调用使用的提供商与模型配置。 |
| Total Tokens/Completion Tokens | 提供商报告的用量。 |
| LLM Log ID | 本次调用对应的计费 AI 日志条目 ID。 |
| Fejl(错误) | 校验、访问、提供商、预算、计费或超时错误(如有)。 |
执行方式与安全边界:组件发出的是无工具(tool-free)的单次模型请求,不包含工具定义或提供商原生能力字段——因此模型无法自行查询 OneUptime、调用 API 或修改项目数据。除 OneUptime 固定的组件安全指令外,只有你配置的 System Instructions、Prompt 和 Context(工作流变量先解析)会被发送给提供商。AI.md 进一步说明:提供商层的附加参数仍可通过一份"仅限生成调优字段"的白名单生效,而能力与保留类字段(工具、网页搜索/数据源、非文本模态、多路选择、流式、请求留存标志、更高的输出 token 上限)会被丢弃,未知未来能力字段默认丢弃。配置的提供商/模型仍是信任边界,因为模型可能带有内在的提供商托管能力。
数据、日志与计费:System Instructions、Prompt、Context 与生成的 Response 会从该 AI 组件自身在自动执行日志中的参数与返回值记录里被脱敏,但在本次运行中仍可供下游组件使用;如果你把它插入其他组件,则适用那个组件的日志策略。每次调用都被计量:计费的全球提供商会从项目 AI 信用余额中扣减,且调用受项目每日自主 AI token 预算约束,预算耗尽后组件走错误路径而不再发起提供商请求。
安全使用原则:模型输出是不可信文本。对外沟通的草稿要先审阅,不要用自由文本 AI 输出单独授权工作流中的破坏性操作;如果必须让输出控制分支,应把 Prompt 约束到一小集合允许值,并用确定性工作流逻辑校验后再行动。
消息组件:Slack、Microsoft Teams、Discord、Telegram、Email
| 组件 | 作用 | 设置项 | 前置条件 |
|---|---|---|---|
| Slack | 在 Slack 频道发消息 | Kanal(频道)— 频道名,机器人须已在该频道;Besked(消息)— 支持 Slack 格式化 | 先在Projektindstillinger(项目设置)→ Arbejdsområde(工作区)→ Slack下连接 Slack(见 workspace-connections/slack) |
| Microsoft Teams | 在 Teams 频道发消息 | Team and channel— 目标位置;Besked— 消息文本 | 见 workspace-connections/microsoft-teams |
| Discord | 通过入站 Webhook URL 在 Discord 频道发消息 | 入站 webhook URL | Discord 侧创建 webhook |
| Telegram | 用 bot token + chat ID 向 Telegram 聊天发消息 | bot token、chat ID | Telegram bot |
| 通过 OneUptime 发送邮件 | Til(收件人)— 邮箱地址;Emne(主题)— 主题行;Body(正文)— Markdown 或 HTML | 邮件从项目配置的发送方发出,见 emails/smtp |
这些专属消息组件的价值在于更友好的错误处理和更清晰的日志——这正是"有专属块就用专属块"规则的原因(见文末选型规则)。
Custom Code:跑一段小 JavaScript
当其他块做不到时使用。
设置项:
- Kode(代码)— 你的 JavaScript。最后一个值(或 async 函数中 return 的值)成为该块的输出。
- Arguments(参数)— 你可以传入的命名值。
输出:succes(你的返回值)与 fejl(任何异常)。
用途:在两个系统之间整形数据、做小计算,任何不值得单独一块的场景。更重的脚本应改用 Runbook。仓库中对这类 JavaScript 执行组件的实现说明见 JavaScript.md。
JSON 组件:文本与 JSON 互转
- JSON → Text— 把 JSON 对象转成字符串,适用于下一块期望文本的场景。
- Text → JSON— 把字符串解析成 JSON 对象,适用于数据以文本形式到达、需要读取其中字段的场景。
Conditions:If / Else 分支
按一次比较结果分支。在Tilføj komponent(添加组件)面板中该块叫If / Else,位于 Conditions 分类下。
设置项:
- Left value(左值)— 通常是之前某个块的输出。
- Operator(操作符)—
==、!=、>、>=、<、<=、contains、starts with、ends with。 - Right value(右值)— 比较对象。
输出:Ja(是)与Nej(否)两个端口,把后续块接到你需要的分支上。
Delay 与 Log
- Delay— 让工作流暂停固定时长再继续,用于给另一个系统留出追赶时间。
- Log— 往运行日志写一行。无任何对外效果,只出现在工作流日志里供你阅读,适合调试。
Execute Workflow:调用另一个工作流
从当前工作流调用另一个工作流。被调用的工作流独立运行——你的工作流不等待它完成就继续。适合共享公共逻辑:建一个"向事件频道发消息"的工作流,之后任何需要通知该频道的工作流都可以调用它。
存在安全上限,防止工作流互相调用成环。细节见 configuration.md。
OneUptime 数据组件:读写平台自身的数据
对 OneUptime 中的每一种记录(monitor、incident、alert、status page、on-call policy 等等),添加组件面板都提供一套按类型名生成的组件——按类型名搜索即可。每个标题由记录类型生成,以 Monitor 为例:
- Find One Monitor— 读取一条匹配查询的记录。
- Find Many Monitors— 读取匹配查询的记录列表。
- Create One Monitor— 从一个 JSON 对象创建一条记录。
- Create Many Monitors— 从一个 JSON 数组创建多条记录。
- Update One Monitor— 把写载荷应用到一条匹配记录。
- Update Many Monitors— 把写载荷应用到匹配记录,最多 Limit 条。
- Delete One Monitor— 删除一条匹配记录。
- Delete Many Monitors— 删除匹配记录,最多 Limit 条。
同一套模式还提供三个触发器——On Create Monitor、On Update Monitor、On Delete Monitor,见 triggers.md。
两个重要约束:
- 一种类型只提供其模型允许的组件。只读类型只有两个 Find 组件,因此如果你在面板里找不到Delete One Monitor,就是该类型不允许删除,而不是你没找到。
- 这是工作流读写 OneUptime 数据的唯一正规途径。例如:CI 工具的 webhook 可以用Create One Incident打开一条带失败详情的事件。
数据组件的完整实现说明分布在 DatabaseFind.md、DatabaseCreate.md、DatabaseUpdate.md、DatabaseDelete.md 与 DatabaseTriggers.md。
与记录(Records)打交道:列名、Query 与 Skip/Limit
数据组件的每个字段都以记录自身的列名为键——与 API 使用的名称相同,而不是 dashboard 表单上的标签。ID 列叫_id。id拼写作为别名在任何可以输入列名的地方被接受,但记录返回时给的是_id,所以"出站"读取时用_id:
{ "_id": "00000000-0000-0000-0000-000000000000" }Query决定组件作用于哪些记录。键是列,值是匹配条件:
{ "monitorType": "Website", "isEnabled": true }查询始终限定在 workflow 所在的项目内——你无法触达其他项目的记录,也不需要自己在查询里写项目。
写载荷同样按键传入:Create One 的JSON Object、Create Many 的JSON Array、Update 组件的Data (JSON Object):
{ "name": "Checkout API", "monitorType": "Website" }非列名的键会被忽略而不是拒绝——运行日志会列出被丢弃的键,字段没落地时先看日志。Select Fields(Find 组件与触发器上)用相同的列名键配合true值:{"_id": true, "name": true}。
Skip 与 Limit是 Find Many、Update Many、Delete Many 上的两个数字字段——Skip: 0加Limit: 100取前 100 条匹配。Limit 默认10,且在 Update Many / Delete Many 上它限制的是实际写入的记录数,而不只是返回数。所以Items Deleted: 10意味着删掉了 10 条,而不是 10 条匹配。打算改动超过 10 条时记得调大 Limit。
Succes 与 Fejl 报告的是查询是否执行了,而不是查到什么。零匹配的查询返回0并依然从 Succes 出去——那不是失败。想按"是否匹配到"分支,就把返回的计数读进一个If / Else块。
执行引擎:组件如何被运行
从源码结构看,工作流的执行入口是 RunWorkflow.ts(约 1300 行):执行器从节点数据中识别ComponentType.Trigger节点作为起点,然后沿连线逐节点解析arguments、调用对应组件实现、把结果写入returnValues。单个步骤的请求执行在 RunStep.ts 中完成;排队与调度由 QueueWorkflow.ts 管理;组件参数的日志脱敏由 SecretRedaction.ts 落实——这与前文isSensitive字段描述的"真实值运行、日志中替换为脱敏标记"机制相互印证。这也解释了文档中反复出现的两条行为:未连接错误路径会让该分支停止,以及输出端口(Succes/Fejl、Ja/Nej)决定执行流向——端口本质上是节点数据上的连接关系,由执行器按端口 ID 解析。
该用哪个组件?速查规则
- 有专属块(Slack、Email、OneUptime 记录)就用它——错误处理更好、日志更清晰。
- 其他外部 API 一律用API。
- 要基于你有意选择的工作流数据做摘要、分类或写文本草稿,用Generate Text with AI。
- 块与块之间整形数据,用Custom Code或JSON。
- 按值执行不同动作,用Conditions。
继续深入
- Workflow-variabler(变量) — 数据如何在块之间传递。
- Workflow-kørsler & logfiler(运行与日志) — 查看每次运行中每个块做了什么。
- Workflow-konfiguration & sikkerhed(配置与安全) — 限制、属主与机密。
- Opret et workflow(创建工作流) — 在画布上添加与连接组件的操作细节。
【免费下载链接】oneuptimeComplete open-source monitoring and observability platform.项目地址: https://gitcode.com/GitHub_Trending/on/oneuptime
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考