Sensu 6.15.0 配置参数详解
Sensu 6.15.0 配置参数详解:以 `sensu-backend start --help`、`sensu-agent start --help` 与 CheckConfig 资源实测为据,逐条讲透 backend.yml 核心键(state-dir/api-url/log-level/access-token-expiry 等)、agent 配置面与实体配置优先级(backend 存储的实体配置压过 agent 本地,附对照实验)、CheckConfig 调度字段(cron 精点、timeout 记 CRITICAL、publish:false 不调度、round_robin)与 6.15 新版 check_hooks 结构([{"warning":[hook名]}],老教程 HookList 写法已失效),并给出生产参数模板与 FAQ。
Sensu 6.15.0 配置参数详解
目标:把 Sensu 6.15.0 的三张配置面——backend 服务端(旗标/
backend.yml)、agent 客户端(旗标/agent.yml/环境变量)、check 等资源对象(CheckConfig字段)——逐条讲透。全部行为与回显在 6.15.0(build 7746)Compose 环境(见部署篇)实测验证,默认值摘自sensu-backend start --help/sensu-agent start --help实测输出。
一、参数总览:三张配置面与生效方式
| 配置面 | 载体 | 生效方式 | 实测要点 |
|---|---|---|---|
| backend 服务端 | --config-file /etc/sensu/backend.yml(默认路径)或同名旗标 | 改文件后重启进程 | YAML 未知键静默忽略;CLI 未知旗标立即 fatal(见 2.3) |
| agent 客户端 | --config-file /etc/sensu/agent.yml、旗标或 SENSU_* 环境变量 | 改配置后重启 agent 进程 | 已注册实体的订阅以 backend 存储为准,agent 本地改动不生效(见 3.2) |
| 监控资源 | CheckConfig 等资源对象(YAML/JSON) | sensuctl create -f 即时写入存储 | 资源不落配置文件,create 即"替换式更新" |
三张面的优先级:agent 侧为 旗标 > 环境变量 > 配置文件;但"实体是否纳入哪个订阅"最终由 backend 存储的实体配置裁决(3.2 节实测)。
二、backend 参数详解
2.1 核心参数表(默认值实测摘录)
参数(YAML 键 = 旗标名去 --) | 默认值 | 说明 |
|---|---|---|
| state-dir | 无默认(必配) | 内嵌 etcd 与 bbolt 状态目录,必须挂持久卷 |
| config-file | /etc/sensu/backend.yml | 配置文件路径 |
| api-listen-address | [::]:8080 | REST API 监听地址 |
| api-url | http://localhost:8080 | 对外宣告的 API 地址;多网卡/集群必须显式指向稳定地址 |
| agent-host / agent-port | [::] / 8081 | agent WebSocket 监听 |
| dashboard-host / dashboard-port / dashboard-beta-port | [::] / 3000 / 3001 | Web UI 监听(6.15 社区版无免费 UI,端口空占) |
| log-level | info | panic/fatal/error/warn/info/debug |
| access-token-expiry | 5m0s | API access token 有效期,sensuctl 频繁 401 的根源(见 6.2) |
| api-request-limit | 512000 字节 | 单个 API 请求体上限 |
| api-write-timeout / agent-write-timeout | 15s / 15 | API 与 agent 通道写超时 |
| agent-burst-limit / agent-rate-limit | 0(不限)/ 0(不限) | agent 接入的突发/速率限制,大规模 agent 接入时的保护阀 |
| assets-burst-limit / assets-rate-limit | 100 / 1.39 | backend 侧资产拉取限速 |
| auth-lockout-duration | 5m | 密码连续失败后的账号锁定时长 |
| cache-dir | /var/cache/sensu/sensu-backend | 运行时缓存 |
| disable-platform-metrics | true(6.15 起默认关闭) | 平台指标默认关闭(Release Notes 明确防高基数撑爆磁盘) |
| default-silenced-expiry-time | 未设(永不过期) | silence 未指定 expire 时的默认时长 |
| deregistration-handler | 无 | 实体注销事件的默认 handler |
| etcd-* 系列 | 单成员 127.0.0.1:2379/2380 | 内嵌 etcd 监听、心跳 300ms、选举 3000ms、配额 4GB 等调参 |
💡 技术拓展:
api-url与api-listen-address是两个容易被混淆的参数——前者是"宣告给集群成员与 agent 的地址"(相当于对外名片),后者是"实际监听套接字"。单机部署两者可以不一致(如监听[::]:8080、宣告http://sensu.example.com:8080);集群部署时api-url错误会导致成员间无法互访,是 3 backend 集群部署最常见的首障点。
2.2 日志级别实测:log-level 的代价
把 log-level 从 info 改为 debug 并重启 backend,实测 30 秒内产生 648 条 debug 日志,内容主要是内嵌 etcd 底层的 bbolt 事务记录:
{"level":"debug","time":"2026-10-20T00:34:57Z","logger":"bbolt","caller":"backend/backend.go:685","msg":"Starting a new transaction [writable: true]"}
{"level":"debug","time":"2026-10-20T00:34:57Z","logger":"bbolt","caller":"bbolt@v1.4.3/db.go:756","msg":"Starting a new transaction [writable: true] successfully"}
结论:debug 级别仅适合短时排障,生产长期开启会带来可观磁盘写入与日志噪音;info 足以覆盖"事件接收(eventd received event)、管道执行(pipelined)、服务启停"等关键链路。
2.3 配置容错行为实测:YAML 宽松、CLI 严格
在 backend.yml 中加入一个不存在的键 bad-key-example: whatever 后重启:backend 正常启动(/health 返回 200,事件照常流转)——YAML 配置文件对未知键静默忽略。而同样的错误用 CLI 旗标传入则立即失败:
sensu-backend start --bad-flag-x
time="2026-10-20T00:35:46Z" level=fatal msg="error executing sensu-backend" component=sensu-enterprise error="unknown flag: --bad-flag-x"
sensu-agent start --bad-flag-x
{"component":"agent","error":"unknown flag: --bad-flag-x","level":"fatal","msg":"error executing sensu-agent","time":"2026-10-20T00:35:46Z"}
运维含义:YAML 方式的拼错键名不会被提示(如把 state-dir 写成 state_dir 会静默丢失该配置),改配置文件后应养成"重启前用 sensuctl/日志复核关键值"的习惯;CLI 方式则天然 fail-fast。
三、agent 参数详解
3.1 核心参数表(默认值实测摘录)
| 参数 | 默认值 | 说明 |
|---|---|---|
| backend-url | ws://127.0.0.1:8081 | backend 地址,可配置多个实现故障转移 |
| subscriptions | 无 | 订阅标签,服务端 check 按 Subscription 匹配下发(注意 3.2 的优先级规则) |
| name | 主机名 | 实体名,同 namespace 内唯一 |
| namespace | default | 所属命名空间 |
| user / password | agent / P@ssw0rd! | agent 内置账号(由 backend init 自动创建),安全环境务必修改 |
| cache-dir | /var/cache/sensu/sensu-agent | 资产与临时缓存(本文部署篇将其迁到 /var/lib/sensu/sensu-agent 并挂卷) |
| api-host / socket-host | 127.0.0.1 | agent 本地 HTTP API(:3031)与客户端 socket(:3030)监听 |
| statsd-metrics-host | 127.0.0.1 | 内置 statsd 服务(:8125),可直接接收应用打点 |
| log-level | info | 同 backend 五档 |
| deregister | false | agent 停止时是否自动删除实体(云上弹性节点建议开启) |
| allow-list | 未设 | check 命令白名单文件路径,安全加固项 |
| cert-file / key-file / trusted-ca-file | 未设 | TLS 双向认证三件套,配 wss:// 使用 |
对应的 YAML 键即旗标名去 --(如 backend-url、subscriptions),实测的 agent.yml:
name: web01
namespace: default
backend-url:
- ws://sensu-backend:8081
subscriptions:
- linux
- web
- db
cache-dir: /var/lib/sensu/sensu-agent
启动方式:sensu-agent start --config-file /etc/sensu/agent.yml,实测日志确认加载成功:
{"component":"agent","level":"info","msg":"configuration successfully validated","time":"2026-10-20T00:36:04Z"}
3.2 实体配置优先级实测(重要)
Sensu 6.x 引入了"实体配置"(entity config)机制:backend 会把存储中的实体配置主动推送给 agent(agent 日志可见 message received ... type: entity_config)。实测结论:一旦实体已在 backend 注册,其订阅等属性以 backend 存储为准,agent 本地的修改(配置文件或 SENSU_SUBSCRIPTIONS 环境变量)不再生效。
对照实验(同一 agent,三种方式全部实测):
| 步骤 | agent 本地订阅配置 | 实体列表显示的订阅 |
|---|---|---|
初始注册(旗标 --subscriptions linux,web) | linux,web | linux,web,entity:web01 |
改 agent.yml 增加 db,重启 agent | linux,web,db | linux,web,entity:web01(未变) |
改用环境变量 SENSU_SUBSCRIPTIONS=linux,web,db 重建 agent | linux,web,db | linux,web,entity:web01(未变) |
删除实体(sensuctl entity delete web01 --skip-confirm) | 同上 | 数秒后 web01 自动重注册,仍为旧订阅(agent 进程内存中沿用被推送的实体配置) |
换全新实体名 web02 + SENSU_SUBSCRIPTIONS=linux,db | linux,db | linux,db,entity:web02(新实体采纳本地配置) |
运维含义:
- 改已有 agent 的订阅,正确姿势是改服务端:
sensuctl entity update <name>(交互式)或经 APIPUT /api/core/v2/entity/<name>,改完 backend 会把新配置推送给 agent; - "删实体让它重新注册"只在 agent 进程重启后才会按本地配置生成新订阅;
- 这也解释了很多迁移场景的怪现象:换配置文件后"订阅怎么改都不变"——不是配置没生效,是被服务端实体配置覆盖了。
四、CheckConfig 资源参数详解
4.1 核心字段表(实测口径)
| 字段 | 类型/默认 | 说明与实测结论 |
|---|---|---|
| command | string,必填 | 任意可执行命令,agent 上以子进程方式运行,退出码即状态(0=OK,1=WARNING,2=CRITICAL,≥3=UNKNOWN) |
| subscriptions | []string | 匹配哪些 agent 执行;与 proxy_entity_name 互斥使用场景见下 |
| interval | int(秒) | 定时调度间隔;interval: 10 实测每 10 秒一跑 |
| cron | string | cron 表达式;实测 */1 * * * * 精确在每分钟 0 秒执行(输出 00:42:00、00:43:00) |
| publish | bool | false 时 check 仅定义不调度。实测创建后事件列表中永远不会出现该 check 的事件 |
| timeout | int(秒) | 命令超时。实测 sleep 30 + timeout: 5 → 事件输出 Execution timed out,**status 2(CRITICAL)**而非 warning |
| round_robin | bool | true 时订阅组内轮替执行(同一次调度只在一台 agent 跑);单 agent 环境实测正常执行,多 agent 时用于去重告警 |
| proxy_entity_name | string | 代理检查:事件归属到该虚拟实体(实测归属 sensu-api,entity list 中 Class=proxy,Last Seen 显示 N/A) |
| handlers | []string | 事件要送达的 handler 名单(实测 log-events 触发 pipe handler 落盘成功) |
| check_hooks | []HookList | 6.15 结构为 [{"warning": ["hook名"]}],见 4.2 |
| output_metric_format / output_metric_handlers | string / []string | 指标提取格式(nagios_perfdata、graphite_plaintext、influxdb_line、opentsdb_line、prometheus_text)与指标 handler |
| stdin | bool | true 时 check 输出经 stdin 传给 hook/mutator |
| high_flap_threshold / low_flap_threshold | int | 抖动检测阈值(百分比) |
| subdue / ttl | 时间窗 / 秒 | 调度压制时间窗与事件 TTL(超时未更新即判失败) |
| secrets | []Secret | 密钥管理器引用(env/vault),避免明文 |
4.2 check_hooks 的 6.15 新结构(易踩坑)
老教程(5.x~6.x 早期)的写法是 HookList 对象数组:
check_hooks:
- type: warning
hooks:
- collect-diag
该写法在 6.15.0 会解析失败,实测三种错误回显(经 sensuctl create -f 与直连 API 各验证一遍):
resource 0: json: cannot unmarshal string into Go struct field CheckConfig.check_hooks of type []string
resource 0: json: cannot unmarshal object into Go struct field CheckConfig.check_hooks of type map[string][]string
resource 0: json: cannot unmarshal object into Go struct field CheckConfig.check_hooks of type []v2.HookList
6.15 的正确结构是"数组,每个元素为 {严重级别: [hook 名列表]} 映射":
check_hooks:
- warning:
- collect-diag
实测通过后,事件 JSON 的 hooks 数组中可看到 hook 执行明细:
"hooks": [{"metadata": {"name": "collect-diag", "namespace": "default"},
"command": "sh -c 'echo hook-fired-ok'",
"duration": 0.001610176, "executed": 1792457321,
"output": "hook-fired-ok\n", "status": 0}]
注意:sensuctl event info 的表格视图不展示 hook 输出(实测仅有 Output/Status/History 等行),需经 API 查看事件 JSON 才能看到 hooks[].output——排障时别在 CLI 表格里找。
4.3 完整可用的 check 资源模板(实测文件)
以下即本文实测通过的三段式资源文件(hook + handler + check 引用),可直接 sensuctl create -f 复用:
---
type: HookConfig
api_version: core/v2
metadata:
name: collect-diag
namespace: default
spec:
command: sh -c 'echo hook-fired-ok'
timeout: 10
---
type: Handler
api_version: core/v2
metadata:
name: log-events
namespace: default
spec:
type: pipe
command: cat >> /var/lib/sensu/sensu-backend/handled.log
timeout: 10
---
type: CheckConfig
api_version: core/v2
metadata:
name: check_tmp_flag
namespace: default
spec:
command: test -f /tmp/healthy
subscriptions:
- linux
interval: 10
publish: true
timeout: 10
handlers:
- log-events
check_hooks:
- warning:
- collect-diag
端到端实测结果:check 持续失败(status 1)→ warning hook 每次执行(hooks[].output = "hook-fired-ok")→ 事件送 log-events handler,backend 侧执行 cat >>,事件 JSON 全文落盘到 backend-data/handled.log(宿主机 bind mount 目录直接可见,8.3KB 实测)。
五、生产参数模板
5.1 backend.yml(4C8G、SSD、数百节点内)
state-dir: /var/lib/sensu/sensu-backend
api-url: http://sensu.example.com:8080
log-level: info
access-token-expiry: 1h
agent-burst-limit: 100
agent-rate-limit: 0
参数依据:access-token-expiry 从 5m 调到 1h,减少 sensuctl/自动化的重认证频率(5m 默认值实测会频繁触发 401,见部署篇 FAQ);agent-burst-limit 给突发接入(如大批量节点重启后同时重连)一个 100 的削峰阀;agent 数百节点内无需动 etcd 调参,超千节点直接上 3 backend 集群。
5.2 agent.yml(生产节点)
name: web01
namespace: default
backend-url:
- wss://sensu.example.com:8081
- wss://sensu2.example.com:8081
subscriptions:
- linux
- web
deregister: false
参数依据:双 backend-url 实现故障转移;生产走 wss://(TLS 由 cert-file/trusted-ca-file 支撑);deregister 按节点生命周期取舍——弹性云节点 true(自动注销),稳态虚机 false(避免误删历史数据)。
5.3 指标与告警分流的 check 模板
---
type: CheckConfig
api_version: core/v2
metadata:
name: check_mem_metrics
namespace: default
spec:
command: free -m
subscriptions: [linux]
interval: 30
timeout: 10
output_metric_format: nagios_perfdata
output_metric_handlers: [influxdb]
(influxdb handler 需另行以 asset 方式安装官方 sensu-influxdb-handler,见命令篇。)
六、常见问题(FAQ)
6.1 check_hooks 按老教程写法创建报错?
见 4.2:6.15 已把 check_hooks 从 [{type, hooks}] 改为 [{"级别": [hook 名]}]。报错形如 cannot unmarshal string into Go struct field CheckConfig.check_hooks of type []string 时,先检查结构而不是字段名。
6.2 sensuctl 频繁 401、refresh token 失效?
backend access-token-expiry 默认 5 分钟,backend 重启会使已签发的 refresh token 失效。处理:重新 sensuctl configure;长期方案调大 access-token-expiry(如 1h)或脚本改用 API Key 认证(Authorization: Key 头,无过期问题)。
6.3 改了 agent 订阅为什么不生效?
见 3.2:已注册实体以 backend 存储的实体配置为准。用 sensuctl entity update 服务端修改,或删实体并重启 agent 让其按本地配置重新注册。
6.4 timeout 触发后状态为什么是 CRITICAL 而不是 WARNING?
实测 Execution timed out 事件 status=2。Sensu 把"超时"视为比"命令返回 1"更严重的情况(命令可能已失控),排障时注意别把超时事件按 warning 分级路由。
6.5 backend.yml 改了个键但行为没变?
YAML 未知键静默忽略(2.3 实测),先确认键名拼写与官方参考一致(- 连字符而非下划线),再确认改后是否重启了进程。
七、参考链接
- backend 参考(旗标全集):https://docs.sensu.io/sensu-go/latest/reference/backend/
- agent 参考:https://docs.sensu.io/sensu-go/latest/reference/agent/
- check 参考:https://docs.sensu.io/sensu-go/latest/reference/checks/
- hooks 参考:https://docs.sensu.io/sensu-go/latest/reference/hooks/
- 本专栏相关:《Sensu 6.15.0 介绍与选型指南》《Sensu 6.15.0 Docker Compose 部署指南》《Sensu 6.15.0 常用 CLI 命令详解》(同批次发布于 Sensu 专栏)