sidekick 默认重包装 falco 事件为特定 json 结构而非透传原始 event,导致 webhook 接收端解析失败;需用 template_file 自定义模板访问 .event、设 timeout 防超时、开 debug 日志排查;多 output 并行需共用 output_rule 条件路由,字段缺失源于 falco 插件或 output_fields 配置错误,yaml 缩进/空格不规范易致启动失败。

Webhook 输出不触发或 payload 格式异常
Sidekick 默认把 Falco 事件转成 webhook 发出去,但很多人配完发现没请求、或者下游收不到有效字段——根本原因是 Sidekick 不直接透传 Falco 原始 JSON,而是先做了一层结构重包装。
默认 payload 是 {"output": "...", "priority": "...", "rule": "...", "time": "...", "output_fields": {...}} 这种格式,不是原始 event 对象。如果你的接收端(比如自建 API)只认 event.xxx 字段,就会解析失败。
- 用
template_file自定义输出:在sidekick.yaml里设webhook.template_file: ./my-webhook.tmpl,模板里可用 Go template 语法访问.Event(即原始 Falco event) - 别漏掉
webhook.timeout,默认 5s,网络抖动时容易超时静默失败;建议设为10 - 调试时加
log_level: debug,看日志里有没有webhook: sending to ...和webhook: response status=,状态码非 2xx 就是下游拒收了
同时发给多个下游(Slack + HTTP + Kafka)怎么配不冲突
Sidekick 支持多 output 并行,但不是“开多个 webhook 配置”就行——它用的是 output type 分发机制,每个 type 独立配置,互不影响,但共用同一份 event 流。
关键点在于:所有 output 共享同一个 output_rule 过滤逻辑,不是各自过滤;想实现差异化路由(比如只把 shell_spawn 发 Slack,write_etc 发 Kafka),得靠 output_rule 的条件表达式,而不是靠多个 sidekick 实例。
- 在
sidekick.yaml里平级写多个 output 块:webhook:、slack:、kafka:,每个带自己的enabled: true -
output_rule是全局的,值为字符串,例如"{{.Rule == 'Shell spawned'}}",支持and/or和.OutputFields.xxx访问 - Kafka output 要注意
topic必须存在且可写,否则会静默丢事件;加kafka.required_acks: 1确保至少 leader 写入成功
Falco event 字段在 Sidekick 中访问不到 proc.name 或 k8s.pod.name
Sidekick 暴露的字段取决于 Falco 启动时是否启用了对应驱动和元数据插件。比如 k8s.pod.name 在 Falco 日志里能看到,但在 Sidekick 的 .OutputFields 里为空,大概率是 Falco 没加载 k8saudit 插件,或没挂载 /var/run/docker.sock 或 /run/containerd/containerd.sock。
Sidekick 本身不采集字段,它只是把 Falco 输出的 output_fields 键值对原样塞进 .OutputFields。所以字段缺失是上游问题,不是 Sidekick 配置能解决的。
- 检查 Falco 启动参数:必须含
-A(启用所有规则)、--k8s-api(K8s 元数据)、--cri /run/containerd/containerd.sock(容器运行时) - 确认
rules_file里对应 rule 的output_fields定义正确,例如%proc.name %k8s.pod.name,不能写成proc.name(缺前缀%) - 在 Falco 日志里搜
output_fields,看实际输出的 key 列表,Sidekick 只能拿到这些
Sidekick 启动失败报 failed to load config: yaml: unmarshal errors
这个错误几乎全是 YAML 缩进或冒号后空格不规范导致的。Sidekick 对 YAML 格式敏感,尤其嵌套结构(如 webhook.headers、slack.fields)里少一个空格,就会整个配置加载失败,且不提示具体哪一行。
最容易错的是 map 值里混用单引号和双引号、或者在布尔值后多打空格,比如 enabled: true (末尾空格)或 headers: {'Content-Type': 'application/json'}(用单引号包 key)。
- 用
yamllint -d "{extends: [default], rules: {line-length: disable}}"扫一遍配置文件 - 所有字符串值统一用双引号,包括 URL、token、topic 名;布尔值后不要空格:
enabled: true,不是enabled: true - 嵌套结构严格用 2 空格缩进,别用 tab;
webhook:下的url、timeout必须同级对齐
Sidekick 的转发逻辑看着简单,但字段链路长(Falco → output_fields → Sidekick template → HTTP body),任一环断掉都表现为“没发出去”。最省事的排查顺序是:Falco 日志确认 event 生成 → Sidekick debug 日志确认收到 → curl 模拟下游接口看是否接受当前 payload 结构。










