组件控制器
组件控制器是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
组件会报告自己为不健康。
组件的整体健康状态是通过组合组件控制器报告的健康状态和组件特定的健康信息来确定的。
单个组件的健康状态与其引用的任何其他组件的健康状态无关。即使组件引用了不健康组件的导出字段,组件也可以被标记为健康。
评估失败
当组件无法评估时,它会被标记为不健康,并显示评估失败的原因。
当评估失败时,组件将继续正常运行。组件将继续使用其先前评估的参数集,并可以继续导出新值。
这种行为防止了失败传播。如果监视API密钥的local.file
组件突然停止工作,其他组件将继续使用最后一个有效的API密钥,直到组件返回到健康状态。
内存流量
暴露HTTP端点(如prometheus.exporter.unix
)的组件可以公开一个完全绕过网络的内地址,并以内存在进行通信。同一进程内的组件可以相互通信,而无需了解任何网络级别保护,如身份验证或双向TLS。
默认情况下,内部地址为alloy.internal:12345
。如果此地址与您的网络上的实际目标冲突,请在运行命令中使用--server.http.memory-addr
标志将其更改为唯一地址。
组件必须选择使用内存流量。有关内存流量是否受支持的详细信息,请参阅各个组件的单独文档。
配置文件更新
《/-/reload》HTTP端点和《SIGHUP》信号可以通知组件控制器重新加载配置文件。当发生这种情况时,组件控制器将正在运行的组件集与配置文件中的组件同步,删除配置文件中不再定义的组件,并创建配置文件中添加的新组件。在重新加载后,控制器管理的所有组件都会被重新评估。