组件控制器
组件控制器是Alloy的核心部分,负责在运行时管理组件。
组件控制器负责
- 读取和验证配置文件。
- 管理已定义组件的生命周期。
- 评估用于配置组件的参数。
- 报告已定义组件的健康状态。
组件图
当使用表达式设置一个组件的参数为另一个组件导出的字段时,会建立一个组件之间的关系。
所有组件及其之间的关系定义了一个有向无环图(DAG),这告知组件控制器哪些引用是有效的以及组件评估的顺序。
为了使配置文件有效,组件不得引用自身或包含循环引用。
// INVALID: local.file.some_file can not reference itself:
local.file "self_reference" {
filename = local.file.self_reference.content
}
// INVALID: cyclic reference between local.file.a and local.file.b:
local.file "a" {
filename = local.file.b.content
}
local.file "b" {
filename = local.file.a.content
}
组件评估
当组件的表达式被计算成具体值时,组件就会被评估。计算出的值将配置组件的运行时行为。所有组件评估、配置和运行完成后,组件控制器加载完毕。
组件控制器会在评估所有该组件的依赖项之后才评估一个给定的组件。不依赖其他组件的组件可以在任何评估过程期间被评估。
组件重新评估
组件是动态的。组件可以在其整个生命周期中更新其导出值任意多次。
当组件更新其导出时,会触发控制器重新评估。组件控制器将重新评估所有引用了更改组件的组件、引用了这些组件的组件等等,直到所有受影响的组件都被重新评估。
组件健康状态
在任何给定时间点,组件可以处于以下健康状况之一
- 未知:默认状态。组件尚未启动运行。
- 健康:组件正在按预期工作。
- 不健康:组件未按预期工作。
- 已退出:组件已停止运行。
默认情况下,组件控制器确定组件的健康状态。只要该组件正在运行且其最新评估成功,组件控制器就会将组件标记为健康。
某些组件可以报告它们自己的特定健康信息。例如,如果监视的文件被删除,local.file
组件会将自己报告为不健康。
组件的整体健康状态是通过组合控制器报告的组件健康状态与组件特定健康信息来确定的。
单个组件的健康状态与其所引用的其他组件的健康状态无关。一个组件可以在引用一个不健康组件的导出字段的情况下被标记为健康。
处理评估失败
当组件无法评估时,它会被标记为不健康,并显示评估失败的原因。
当评估失败时,组件仍以正常方式继续运行。组件继续使用之前评估过的参数集,并可以继续导出新的值。
此行为阻止了失败传播。如果你的 local.file
组件,它监控 API 密钥,突然停止工作,其他组件将继续使用最后一个有效的 API 密钥,直到该组件恢复到健康状态。
内存流量
暴露 HTTP 端点的组件,如 prometheus.exporter.unix,可以暴露一个完全绕过网络的内部地址,并进行内存通信。在同一个进程内的组件可以彼此通信,无需意识到任何网络级别的保护措施,如身份验证或双向 TLS。
内部地址默认为 alloy.internal:12345
。如果此地址与您网络上实际的目标发生冲突,请使用 run 命令中的 --server.http.memory-addr
标志将其更改为独一无二的地址。
组件必须选择启用内存流量。请参阅组件的个别文档,了解内存流量是否受支持。
更新配置文件
HTTP 端点 /-/reload
和信号 SIGHUP
可以通知组件控制器重新加载配置文件。当这种情况发生时,组件控制器将运行中的组件集与配置文件中的组件进行同步,删除配置文件中不再定义的组件,并创建配置文件中添加的新组件。在重新加载后,控制器管理的所有组件都会被重新评估。