夜莺监控配置文件讲解
夜莺监控(Nightingale)配置文件 config.toml 的全量参数说明,包括可选参数及其默认值
中心端 n9e 的配置文件是 etc/config.toml,边缘告警引擎 n9e-edge 的配置文件是 etc/edge/edge.toml。这里我们先分块讲解 n9e 的配置文件,n9e-edge 的配置绝大部分与 n9e 相同,最后单独说明差异。
配置加载机制
开始之前,先了解几个配置加载的基础知识:
- n9e 启动时通过
-configs参数指定配置目录(默认是etc,也可以用环境变量N9E_CONFIGS指定),目录下所有.toml文件都会被合并加载,所以你可以把配置拆成多个 toml 文件分类管理 - 配置修改后需要重启 n9e 进程才能生效,n9e 不会热加载配置文件
- 很多可选参数并没有出现在发行包默认的
config.toml中,不配置时使用代码内置的默认值,下文会逐一说明
n9e 支持的命令行参数:
| 参数 | 说明 |
|---|---|
-configs |
指定配置目录,默认 etc,也可用环境变量 N9E_CONFIGS 指定 |
-crypto-key |
配置文件敏感字段的解密密钥,配合下面的「敏感字段加密」使用 |
-version |
打印版本号并退出 |
敏感字段加密
如果不想在配置文件里写明文密码,可以把敏感字段加密后写成 {{cipher}}xxxx 的形式(xxxx 是 AES-CBC 加密后再做 base64 编码的密文),然后启动时通过 -crypto-key your-secret-key 传入密钥,n9e 会自动解密。支持加密的字段有:
DB.DSNRedis.PasswordHTTP.APIForAgent.BasicAuth中的密码HTTP.APIForService.BasicAuth中的密码Pushgw.Writers中的BasicAuthPass
Global
[Global]
RunMode = "release"
这是夜莺研发人员用的配置项,普通用户不需要关心,永远保持 release 即可。
Log
[Log]
# stdout, stderr, file
Output = "stdout"
# log write dir
Dir = "logs"
# log level: DEBUG INFO WARNING ERROR
Level = "DEBUG"
# # rotate by time
# KeepHours = 4
# # rotate by size
# RotateNum = 3
# # unit: MB
# RotateSize = 256
| 参数 | 默认值 | 说明 |
|---|---|---|
Output |
stdout |
日志输出方式,支持 stdout、stderr、file,只有 file 模式才会把日志写入文件,才会用到下面的其他配置项 |
Dir |
logs |
日志文件的存放目录 |
Level |
DEBUG |
日志级别,支持 DEBUG、INFO、WARNING、ERROR |
KeepHours |
- | 按时间切分日志时的保留小时数,每小时一个日志文件 |
RotateNum |
- | 按大小切分日志时的文件保留数量 |
RotateSize |
- | 按大小切分日志时单个文件的大小,单位 MB |
OutputToOneFile |
false |
file 模式下,是否把所有级别的日志写到同一个文件里。默认是按级别拆分成不同文件 |
注意:file 模式下,KeepHours(按时间切分)和 RotateNum(按大小切分)必须二选一配置,两个都是 0 的话进程会启动失败。
HTTP
[HTTP]
# http listening address
Host = "0.0.0.0"
# http listening port
Port = 17000
# https cert file path
CertFile = ""
# https key file path
KeyFile = ""
# whether print access log
PrintAccessLog = false
# whether enable pprof
PProf = true
# expose prometheus /metrics?
ExposeMetrics = true
# http graceful shutdown timeout, unit: s
ShutdownTimeout = 30
# max content length: 64M
MaxContentLength = 67108864
# http server read timeout, unit: s
ReadTimeout = 20
# http server write timeout, unit: s
WriteTimeout = 40
# http server idle timeout, unit: s
IdleTimeout = 120
| 参数 | 默认值 | 说明 |
|---|---|---|
Host |
0.0.0.0 |
HTTP 服务监听地址,一般都是 0.0.0.0,表示监听所有网卡 |
Port |
17000 |
HTTP 服务监听端口 |
CertFile |
- | HTTPS cert 文件路径,和 KeyFile 同时配置后即启用 HTTPS(TLS 最低版本 1.2) |
KeyFile |
- | HTTPS key 文件路径 |
PrintAccessLog |
false |
是否打印访问日志 |
PProf |
true |
是否开启 pprof,开启后可在 /api/debug/pprof/ 查看 pprof 信息 |
ExposeMetrics |
true |
是否暴露 Prometheus 的 /metrics 接口,用于暴露夜莺自身的监控指标 |
ShutdownTimeout |
30 |
HTTP 服务优雅关闭超时时间,单位秒 |
MaxContentLength |
67108864 |
HTTP 请求体最大长度,单位字节,默认 64M |
ReadTimeout |
20 |
HTTP 读超时时间,单位秒 |
WriteTimeout |
40 |
HTTP 写超时时间,单位秒 |
IdleTimeout |
120 |
HTTP 空闲超时时间,单位秒 |
HTTP.ShowCaptcha
[HTTP.ShowCaptcha]
Enable = false
Enable:登录页是否开启验证码功能
HTTP.APIForAgent
[HTTP.APIForAgent]
Enable = true
# [HTTP.APIForAgent.BasicAuth]
# user001 = "ccc26da7b9aba533cbb263a36c07dcc5"
Enable:是否开启面向 Agent(如 categraf)的 API 接口,正常来讲必然是要开启的,所以这个配置项一般都是trueBasicAuth:Agent 的 API 接口支持 BasicAuth,这里配置 BasicAuth 用户名和密码。一般内网通信不需要配置,如果是公网通信,建议配置,而且密码一定不要使用默认的,容易被攻击
上例中 user001 是 BasicAuth 的用户名,ccc26da7b9aba533cbb263a36c07dcc5 是 BasicAuth 的密码,如果想要配置多个用户,可以继续添加:
[HTTP.APIForAgent.BasicAuth]
user001 = "ccc26da7b9aba533cbb263a36c07dcc5"
user002 = "d4f5e6a7b8c9d0e1f2g3h4i5j6k7l8m9"
注意:如果你配置了 BasicAuth,那么 Agent 端的配置文件中也需要配置相应的用户名和密码,否则 Agent 无法连接到中心 n9e。
HTTP.APIForService
[HTTP.APIForService]
Enable = false
[HTTP.APIForService.BasicAuth]
user001 = "ccc26da7b9aba533cbb263a36c07dcc5"
Enable:是否开启面向 Service 的 API 接口,边缘告警引擎 n9e-edge 和中心 n9e 通信就依赖这部分接口,所以如果你用到了 n9e-edge,就需要设置为trueBasicAuth:和 APIForAgent 的 BasicAuth 同理,公网通信务必启用并修改默认密码
注意:如果你配置了 BasicAuth,那么 n9e-edge 配置文件中的 CenterApi 部分也需要配置相应的用户名和密码,否则 n9e-edge 无法连接到中心 n9e。
HTTP.JWTAuth
[HTTP.JWTAuth]
# unit: min
AccessExpired = 1500
# unit: min
RefreshExpired = 10080
RedisKeyPrefix = "/jwt/"
夜莺页面登录的认证使用 JWT 方式。
| 参数 | 默认值 | 说明 |
|---|---|---|
AccessExpired |
1500 |
access token 的过期时间,单位分钟 |
RefreshExpired |
10080 |
refresh token 的过期时间,单位分钟 |
RedisKeyPrefix |
/jwt/ |
夜莺会把部分 JWT 相关信息存到 Redis 中,这是 Redis key 的前缀,一般不用改 |
SingleLogin |
false |
可选参数。开启后同一账号只允许一个活跃会话,新的登录会把旧会话踢下线 |
JWT 的签名密钥(SigningKey)由夜莺自动生成并保存在数据库中,多个 n9e 实例会自动共享,不需要也不应该在配置文件中配置。
HTTP.ProxyAuth
[HTTP.ProxyAuth]
# if proxy auth enabled, jwt auth is disabled
Enable = false
# username key in http proxy header
HeaderUserNameKey = "X-User-Name"
DefaultRoles = ["Standard"]
如果你想把夜莺嵌入到你自己的系统中,可以考虑使用 ProxyAuth 方式,类似 Grafana 的 ProxyAuth。相当于用户在你自己的系统中登录,你可以拿到用户名,然后把用户名放到 X-User-Name 这个 Header 中传给夜莺,夜莺就会认为这个用户已经登录了。DefaultRoles 是默认角色,如果你不传角色,夜莺就会把这个用户当做 Standard 角色处理。
注意:开启 ProxyAuth 后 JWT 认证就不生效了,等于把认证完全托管给前置代理,一定要保证夜莺的端口只能通过你的代理访问。
HTTP.TokenAuth
[HTTP.TokenAuth]
Enable = true
Enable:是否允许使用个人 Token(API Key)调用夜莺的 API。用户可以在个人中心创建 Token,调用 API 时通过 Header 携带HeaderUserTokenKey:可选参数,携带 Token 的 Header 名称,默认X-User-Token
HTTP.RSA
[HTTP.RSA]
OpenRSA = false
夜莺在登录的时候,用户密码默认是明文传输的,如果夜莺站点是 HTTPS 的倒是还好,如果是 HTTP 的,就建议开启 RSA 加密,这样用户密码就不会明文传输了。
| 参数 | 默认值 | 说明 |
|---|---|---|
OpenRSA |
false |
是否开启登录密码的 RSA 加密传输 |
RSAPublicKeyPath |
- | 可选参数,RSA 公钥文件路径 |
RSAPrivateKeyPath |
- | 可选参数,RSA 私钥文件路径 |
RSAPassWord |
- | 可选参数,RSA 私钥的密码 |
密钥对不是必须手工准备的:如果 RSAPublicKeyPath 和 RSAPrivateKeyPath 指向的文件都存在,就从文件加载;否则夜莺会自动生成一对密钥并持久化到数据库,多实例之间自动共享。
HTTP.A2A
v9 新增的可选配置,控制夜莺对外暴露的 AI 接口:A2A(Agent-to-Agent)和 MCP(Model Context Protocol)。两者默认都是开启的,外部的 AI Agent 或 MCP 客户端可以通过这些接口与夜莺的 AI 助手交互。
[HTTP.A2A]
# Disable = false
# DisableMCP = false
# BaseURL = ""
| 参数 | 默认值 | 说明 |
|---|---|---|
Disable |
false |
设置为 true 时同时关闭 A2A 和 MCP 接口 |
DisableMCP |
false |
设置为 true 时只关闭 MCP 接口,保留 A2A |
BaseURL |
- | AgentCard 中对外公布的访问地址。留空时根据请求的 Host 和 X-Forwarded-Proto 自动推导,如果夜莺部署在反向代理后面,建议显式配置成对外的完整 URL |
相关的 HTTP 路径:AgentCard 发现地址是 /.well-known/agent-card.json(无需认证),A2A 接口挂载在 /a2a,MCP 接口挂载在 /mcp。后两者的认证复用 TokenAuth(X-User-Token Header),所以使用 A2A/MCP 时需要保证 HTTP.TokenAuth.Enable = true。
DB
[DB]
# mysql postgres sqlite
DBType = "sqlite"
# postgres: DSN="host=127.0.0.1 port=5432 user=root dbname=n9e_v6 password=1234 sslmode=disable"
# mysql: DSN="root:1234@tcp(localhost:3306)/n9e_v6?charset=utf8mb4&parseTime=True&loc=Local"
DSN = "n9e.db"
# enable debug mode or not
Debug = false
# unit: s
MaxLifetime = 7200
# max open connections
MaxOpenConns = 150
# max idle connections
MaxIdleConns = 50
DBType 和 DSN 是最为关键的,两个配置联动。DBType 支持 mysql、postgres、sqlite 三种数据库,DSN 是数据库连接信息:如果是 sqlite,就是数据库文件路径;如果是 mysql 或 postgres,就是数据库连接串,写法参考注释中的例子。
夜莺从 v8 版本开始,默认 DBType 设置的是 sqlite,这样方便用户快速体验,不需要安装数据库。但是,生产环境中,还请使用 mysql 或 postgres。
| 参数 | 默认值 | 说明 |
|---|---|---|
DBType |
sqlite |
数据库类型:mysql、postgres、sqlite |
DSN |
n9e.db |
数据库连接信息 |
Debug |
false |
是否开启 SQL 调试日志 |
MaxLifetime |
7200 |
连接最大存活时间,单位秒 |
MaxOpenConns |
150 |
最大打开连接数,中小型环境保持默认即可 |
MaxIdleConns |
50 |
最大空闲连接数 |
TablePrefix |
- | 可选参数,表名前缀,多套系统共用一个数据库时可以用它做隔离,一般不需要配置 |
Redis
[Redis]
# standalone cluster sentinel miniredis
RedisType = "miniredis"
# address, ip:port or ip1:port,ip2:port for cluster and sentinel(SentinelAddrs)
Address = "127.0.0.1:6379"
# Username = ""
# Password = ""
# DB = 0
# UseTLS = false
# TLSMinVersion = "1.2"
# Mastername for sentinel type
# MasterName = "mymaster"
# SentinelUsername = ""
# SentinelPassword = ""
Redis 除了用于存储 JWT 相关的登录认证信息,还用于存放机器心跳上报的 metadata。夜莺中支持的机器失联告警规则,就是根据 Redis 中机器的心跳时间来判断的,如果很长时间没有心跳了,就认为机器失联了。
如果 Redis 响应较慢,可能会导致失联告警的误判。即机器明明是存活的,但是 Redis 中的心跳信息没有及时更新,最终导致夜莺误判机器失联了。v8.beta11 版本开始,增加了 Redis 操作相关的监控指标,需要关注这些指标,及时发现 Redis 响应慢的问题。
RedisType 支持 standalone、cluster、sentinel、miniredis 四种,从夜莺 v8 版本开始,默认使用 miniredis(进程内嵌的内存 Redis),这样方便用户快速体验,不需要安装 Redis。但生产环境中,请使用其他模式部署真实的 Redis。
| 参数 | 默认值 | 说明 |
|---|---|---|
RedisType |
miniredis |
Redis 部署模式:standalone、cluster、sentinel、miniredis |
Address |
- | Redis 地址。standalone 模式是 ip:port;cluster 和 sentinel 模式是逗号分隔的多个地址 ip1:port,ip2:port |
Username |
- | Redis 用户名 |
Password |
- | Redis 密码 |
DB |
0 |
数据库序号,cluster 模式不支持 |
MasterName |
- | sentinel 模式必填,master 名称 |
SentinelUsername |
- | sentinel 模式下哨兵节点的用户名 |
SentinelPassword |
- | sentinel 模式下哨兵节点的密码 |
DialTimeoutMills |
5000 |
可选参数,连接超时,单位毫秒 |
ReadTimeoutMills |
3000 |
可选参数,读超时,单位毫秒 |
WriteTimeoutMills |
3000 |
可选参数,写超时,单位毫秒 |
如果 Redis 启用了 TLS,还可以配置以下可选参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
UseTLS |
false |
是否使用 TLS 连接 Redis |
TLSCA |
- | CA 证书文件路径 |
TLSCert |
- | 客户端证书文件路径 |
TLSKey |
- | 客户端私钥文件路径 |
TLSKeyPwd |
- | 客户端私钥密码 |
InsecureSkipVerify |
false |
是否跳过服务端证书校验 |
ServerName |
- | 校验证书时使用的服务名 |
TLSMinVersion |
1.2 |
TLS 最小版本 |
TLSMaxVersion |
- | TLS 最大版本 |
Alert
夜莺从某个版本开始,为了降低部署复杂度,把 webapi 和告警引擎模块合并在一起了,Alert 这里的配置项是告警引擎的配置项。
[Alert]
[Alert.Heartbeat]
# auto detect if blank
IP = ""
# unit ms
Interval = 1000
EngineName = "default"
[Alert] 下还有几个可选参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
EngineDelay |
30 |
进程启动后延迟多少秒再开始执行告警规则评估,留给各类缓存做初始同步,避免启动初期因数据不全产生误判 |
Disable |
false |
是否禁用告警引擎,仅 n9e-edge 会检查该配置,中心端 n9e 不生效 |
Alert.Heartbeat
| 参数 | 默认值 | 说明 |
|---|---|---|
IP |
自动探测 | 告警引擎的 IP 地址,留空自动探测。每个告警引擎都会写心跳信息到数据库,这样每个告警引擎都知道所有活着的告警引擎列表,进而做告警规则的分片处理。比如有 100 条告警规则,两个 n9e 组成集群,那么每个 n9e 大概会处理 50 条告警规则,当其中一个挂掉时,另一个会接管全部规则 |
Interval |
1000 |
心跳间隔,单位毫秒 |
EngineName |
default |
告警引擎的名字。中心端维持 default 即可;边缘告警引擎 n9e-edge 可以自定义,比如 edge1、edge2。相同 EngineName 的告警引擎会被认为是一个集群,分片处理同一批规则 |
Alert.Alerting
可选配置块,控制通知发送行为:
[Alert.Alerting]
# NotifyConcurrency = 10
# TemplatesDir = ""
# WebhookBatchSend = false
| 参数 | 默认值 | 说明 |
|---|---|---|
NotifyConcurrency |
10 |
通知发送的并发数 |
TemplatesDir |
<配置目录>/template |
通知模板目录,首次启动时夜莺会把该目录下的模板初始化到数据库 |
WebhookBatchSend |
false |
回调(webhook)是否批量发送。true 时一次回调请求携带多个事件(数组),false 时每个事件单独发一次请求 |
Alert.Alerting.GlobalWebhook
可选配置块,全局事件回调。开启后,所有告警事件除了走各自的通知规则之外,还会额外推送一份到这个全局地址,适合把事件统一接入自研系统或事件中心:
[Alert.Alerting.GlobalWebhook]
Enable = false
Url = "http://127.0.0.1:8999/webhook"
BasicAuthUser = ""
BasicAuthPass = ""
Timeout = 10
Headers = ["X-From", "n9e"]
SkipVerify = false
| 参数 | 说明 |
|---|---|
Enable |
是否启用全局回调 |
Url |
回调地址 |
BasicAuthUser / BasicAuthPass |
BasicAuth 认证信息,不需要就留空 |
Timeout |
请求超时,单位秒,默认 10 |
Headers |
附加的请求头,数组形式,两两一组,比如 ["X-From", "n9e"] |
SkipVerify |
HTTPS 回调地址是否跳过证书校验 |
Center
中心端 n9e 的特有配置,边缘告警引擎 n9e-edge 没有这些配置项。即老版本的 n9e-webapi 相关的特有的配置。
[Center]
MetricsYamlFile = "./etc/metrics.yaml"
I18NHeaderKey = "X-Language"
[Center.AnonymousAccess]
PromQuerier = true
AlertDetail = true
| 参数 | 默认值 | 说明 |
|---|---|---|
MetricsYamlFile |
./etc/metrics.yaml |
指标说明配置文件路径,快捷视图里看到的指标解释说明就来自这个文件 |
OpsYamlFile |
内置 | 可选参数,权限操作点定义文件(即 ops.yaml),用于自定义角色权限点,留空使用内置定义 |
BuiltinIntegrationsDir |
内置 | 可选参数,内置集成模板(仪表盘、告警规则模板等)的目录,留空使用编译进二进制的内置模板 |
I18NHeaderKey |
X-Language |
国际化语言的 Header key,研发人员用的配置项,普通用户不需要关心 |
UseFileAssets |
false |
可选参数。true 时前端静态资源从运行目录下的 pub 目录读取,而不是使用编译进二进制的内置前端。想自行替换前端版本时使用 |
EventHistoryGroupView |
false |
可选参数。开启后,活跃告警、历史告警的列表按业务组权限过滤,用户只能看到自己有权限的业务组的事件 |
CleanNotifyRecordDay |
7 |
可选参数,通知发送记录的保留天数,每天凌晨 1 点清理一次 |
CleanPipelineExecutionDay |
7 |
可选参数,事件流水线执行记录的保留天数,每天早上 6 点分批清理 |
MigrateBusiGroupLabel |
false |
可选参数,老版本升级用:启动时把业务组标签迁移成新格式,正常情况下夜莺会自动判断,无需配置 |
Plugins |
内置 | 可选参数,数据源插件列表(类别、类型、名称),内置默认值覆盖所有支持的数据源,不建议修改 |
Center.AnonymousAccess
匿名访问相关的配置项:
PromQuerier:是否允许匿名查询各数据源的接口AlertDetail:是否允许匿名查看告警详情
内网环境可以开启,公网环境一定要关闭。
仪表盘有个公开访问的功能,甚至可以设置为不需要登录就可以访问,但前提是 PromQuerier 需要设置为 true。即如果 PromQuerier = false,那么即使设置了仪表盘为公开访问,也是需要登录的。
Center.RSA
可选配置块,和 HTTP.RSA(登录密码加密)不同,这里控制的是数据源密码在前后端之间传输时是否做 RSA 加密:
[Center.RSA]
OpenRSA = false
密钥对复用 HTTP.RSA 的密钥(自动生成或从文件加载)。
Center.FlashDuty
可选配置块,对接 FlashDuty(事件协作平台)时使用,包含 Api(FlashDuty 接口地址)、Headers(附加请求头)、Timeout(请求超时)三个参数。不使用 FlashDuty 集成则无需配置。
Center.AIAgent
v9 新增的可选配置块,AI 助手(Skill 体系)相关:
| 参数 | 默认值 | 说明 |
|---|---|---|
SkillsPath |
skill |
AI Skill 在磁盘上的物化目录 |
SkillSyncInterval |
60 秒 | 数据库中的 Skill 定义同步到磁盘的周期。多副本部署时每个副本都会按该周期自动对齐数据库内容;设置为负值表示只在启动时同步一次。一般无需配置 |
Pushgw
夜莺虽然不直接存储监控数据,但是提供了多种接收监控数据的接口,比如 Prometheus remote write 协议的接口、OpenTSDB 协议的接口、Datadog 协议的接口等。接收到数据之后,夜莺会把监控数据转发给后端时序库,所以这里夜莺就相当于一个 Pushgateway,相关的配置项都在 Pushgw 下面。
[Pushgw]
# use target labels in database instead of in series
LabelRewrite = true
ForceUseServerTS = true
常用参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
LabelRewrite |
true |
夜莺的机器管理可以给机器打标签,这些标签会附加到机器相关的时序数据里。如果上报的数据中有标签和机器管理里的标签冲突,true 表示以机器管理里的标签为准,否则以上报的标签为准 |
ForceUseServerTS |
true |
是否强制使用服务端时间戳覆盖上报数据的时间戳。很多公司的机器时间没有校准,会导致各种困惑,建议开启 |
BusiGroupLabelKey |
busigroup |
机器所属业务组附加到时序数据时使用的标签名 |
GetHeartbeatFromMetric |
false |
是否从上报的时序数据中提取机器心跳。开启后,即使 Agent 不调用心跳接口,只要持续上报带 ident 的数据,机器就被认为存活 |
IdentMetrics |
- | 可选参数,指标名白名单。配置后只有指标名在列表中的时序数据才会触发机器(target)的自动注册和心跳更新,避免所有带 ident 的指标都写 target 表 |
以下是面向大规模场景的进阶调优参数,一般保持默认即可:
| 参数 | 默认值 | 说明 |
|---|---|---|
PushConcurrency |
16 |
非关键后端(Kafka、AsyncWrite = true 的 writer)异步转发的最大并发 goroutine 数,超过则丢弃该批数据并记录日志 |
UpdateTargetRetryCount |
3 |
更新 target(机器)信息失败时的重试次数 |
UpdateTargetRetryIntervalMills |
500 |
更新 target 的重试间隔,单位毫秒 |
UpdateTargetTimeoutMills |
3000 |
更新 target 的超时时间,单位毫秒 |
UpdateTargetBatchSize |
20 |
更新 target 的批量大小 |
UpdateTargetByUrlConcurrency |
10 |
边缘模式下通过中心接口更新 target 的并发数 |
ProxyInflightMax |
1000 |
/proxy/v1/write 透明代理接口的最大并发请求数,超过直接返回 429,把背压交给客户端的 WAL 重试 |
ProxyMaxBodyBytes |
33554432 |
/proxy/v1/write 单个请求体的最大字节数(默认 32M),超过返回 413 |
Pushgw.DebugSample
# [Pushgw.DebugSample]
# ident = "xx"
# __name__ = "cpu_usage_active"
这个配置是为了调试、排查问题用的。它是一个监控指标的过滤条件(标签名 = 标签值,需全部匹配),如果上报给夜莺的指标符合这个过滤条件,就会打印到日志中。一般不需要配置,注释掉即可。
Pushgw.DropSample
可选配置,丢弃规则。符合任意一组过滤条件(组内标签需全部匹配)的时序数据会被直接丢弃,不再转发给后端时序库,适合在网关层挡掉不想要的指标:
[[Pushgw.DropSample]]
__name__ = "go_gc_duration_seconds"
[[Pushgw.DropSample]]
ident = "test-host"
__name__ = "cpu_usage_idle"
被丢弃的样本数可以通过夜莺自身监控指标 n9e_pushgw_drop_sample_total 观察。
Pushgw.WriterOpt
# [Pushgw.WriterOpt]
# QueueMaxSize = 1000000
# QueuePopSize = 1000
# QueueNumber = 0
这部分配置默认是注释的,正常来讲用户不需要关注。如果夜莺接收到太多数据,在内存里拥塞了,最终丢了指标,此时需要考虑调整这里的配置。
夜莺会在内存里创建 QueueNumber 个队列,收到监控数据之后写入这些队列;每个队列对应一个 goroutine,按 QueuePopSize 的批次大小从队列取数写入后端时序库。所以 QueueNumber 本质上就是写入后端时序库的并发量。
| 参数 | 默认值 | 说明 |
|---|---|---|
QueueMaxSize |
1000000 |
每个队列的最大容量 |
QueuePopSize |
1000 |
每次从队列取出的批次大小 |
QueueNumber |
CPU 核数 | 队列数量,0 表示按 CPU 核数自动设置 |
QueueWaterMark |
0.1 |
总积压水位。所有队列的总积压量超过 QueueNumber × QueueMaxSize × QueueWaterMark 时,接收接口开始拒绝新数据 |
AllQueueMaxSizeInterval |
200 |
统计总积压量的间隔,单位毫秒 |
RetryCount |
1000 |
写后端时序库失败时的重试次数 |
RetryInterval |
1 |
重试间隔,单位秒 |
OverLimitStatusCode |
499 |
超过积压水位时返回给上报客户端的 HTTP 状态码 |
Pushgw.Writers
这里配置后端时序库的 remote write 写入地址,所有支持 remote write 协议的时序库都可以配置在这里。一般来讲只需要配置一个,如果你想同时写入多个时序库做双写,可以配置多个 [[Pushgw.Writers]] 块。
[[Pushgw.Writers]]
Url = "http://127.0.0.1:9090/api/v1/write"
# Basic auth username
BasicAuthUser = ""
# Basic auth password
BasicAuthPass = ""
Headers = ["X-From", "n9e"]
# timeout settings, unit: ms
Timeout = 10000
DialTimeout = 3000
TLSHandshakeTimeout = 30000
ExpectContinueTimeout = 1000
IdleConnTimeout = 90000
KeepAlive = 30000
MaxConnsPerHost = 0
MaxIdleConns = 100
MaxIdleConnsPerHost = 100
| 参数 | 说明 |
|---|---|
Url |
时序库的 remote write 写入地址 |
BasicAuthUser / BasicAuthPass |
BasicAuth 认证信息,不需要就留空 |
Headers |
附加请求头,数组形式两两一组 |
AsyncWrite |
可选参数,默认 false。配置多个 writer 时,对不重要的 writer 可以设置为 true,异步转发不阻塞主流程(受 PushConcurrency 并发限制,超限丢弃) |
Timeout |
响应超时,单位毫秒 |
DialTimeout |
连接超时,单位毫秒 |
TLSHandshakeTimeout |
TLS 握手超时,单位毫秒 |
ExpectContinueTimeout |
Expect: 100-continue 等待超时,单位毫秒 |
IdleConnTimeout |
空闲连接超时,单位毫秒 |
KeepAlive |
TCP keepalive 间隔,单位毫秒 |
MaxConnsPerHost |
单 host 最大连接数,0 表示不限制 |
MaxIdleConns |
最大空闲连接数 |
MaxIdleConnsPerHost |
单 host 最大空闲连接数 |
如果时序库是 HTTPS 的,每个 writer 还支持一组可选的 TLS 参数:
# UseTLS = false
# TLSCA = "/etc/n9e/ca.pem"
# TLSCert = "/etc/n9e/cert.pem"
# TLSKey = "/etc/n9e/key.pem"
# InsecureSkipVerify = false
含义与 Redis 一节的 TLS 参数相同(还包括 TLSKeyPwd、ServerName、TLSMinVersion、TLSMaxVersion)。
Pushgw.Writers.WriteRelabels
写往时序库的数据,在写入之前可以做 relabel 操作。和 Prometheus 的 relabel 配置类似,只不过 Prometheus 用的 yaml 格式,夜莺用的 toml 格式:
[[Pushgw.Writers.WriteRelabels]]
Action = "replace"
SourceLabels = ["__address__"]
Regex = "([^:]+)(?::\\d+)?"
Replacement = "$1:80"
TargetLabel = "__address__"
| 参数 | 默认值 | 说明 |
|---|---|---|
Action |
replace |
relabel 动作,语义与 Prometheus 一致(replace、keep、drop、labeldrop、labelkeep、labelmap、hashmod 等) |
SourceLabels |
- | 源标签列表 |
Separator |
; |
多个源标签值拼接时的分隔符 |
Regex |
(.*) |
匹配正则 |
TargetLabel |
- | 目标标签 |
Replacement |
$1 |
替换内容 |
Modulus |
- | hashmod 动作使用的模数 |
If |
- | 前置过滤正则,匹配才执行该条 relabel |
Pushgw.KafkaWriters
可选配置,除了写时序库,夜莺还可以把接收到的监控数据转发到 Kafka:
[[Pushgw.KafkaWriters]]
Brokers = ["127.0.0.1:9092"]
Topic = "n9e-metrics"
[Pushgw.KafkaWriters.SASL]
Enable = true
User = "admin"
Password = "admin"
Mechanism = "PLAIN"
Version = 1
Handshake = true
AuthIdentity = ""
| 参数 | 默认值 | 说明 |
|---|---|---|
Brokers |
- | Kafka broker 地址列表 |
Topic |
- | 写入的 topic |
Typ |
async |
生产者类型,async(异步)或 sync(同步) |
Version |
- | Kafka 协议版本,比如 2.0.0,留空用客户端默认 |
Timeout |
- | 写入超时 |
SASL |
- | SASL 认证配置,见上例。Mechanism 支持 PLAIN 等机制 |
WriteRelabels |
- | 与 Writers 的 WriteRelabels 相同,写入 Kafka 前做 relabel |
Ibex
故障自愈引擎 Ibex 的配置项,即远程执行脚本的那个功能。原本这个功能是单独拆开的一个模块叫 ibex,后来合并到 n9e 里了,所以这个配置项也在 n9e 里。
[Ibex]
Enable = true
RPCListen = "0.0.0.0:20090"
Enable:是否开启 Ibex 服务端功能RPCListen:Ibex 的 RPC 服务监听地址,Agent(categraf 的 ibex 插件)通过这个端口与服务端通信
n9e-edge 的配置
边缘告警引擎 n9e-edge 的配置文件是 etc/edge/edge.toml,大部分配置和中心 n9e 的配置相同,差异主要有:
- n9e-edge 没有
[Center]相关配置 - n9e-edge 必须配置
[CenterApi],用于连接中心端 n9e:
[CenterApi]
Addrs = ["http://127.0.0.1:17000"]
BasicAuthUser = "user001"
BasicAuthPass = "ccc26da7b9aba533cbb263a36c07dcc5"
# unit: ms
Timeout = 9000
BasicAuthUser、BasicAuthPass 对应中心端 [HTTP.APIForService.BasicAuth] 里配置的用户名密码,同时中心端的 HTTP.APIForService.Enable 要设置为 true。
更多信息可以参考这篇文章:《夜莺架构中的边缘模式说明》。
常见问题
1. 修改了配置文件为什么不生效?
n9e 不支持配置热加载,任何配置修改后都需要重启 n9e 进程。另外注意 -configs 指定目录下的所有 toml 文件都会被加载,检查一下是否有其他 toml 文件覆盖了同名配置。
2. 生产环境最少需要修改哪些配置?
把 DB 从 sqlite 换成 mysql 或 postgres,把 Redis 从 miniredis 换成真实的 Redis(standalone/cluster/sentinel),配置 Pushgw.Writers 指向你的时序库。其余配置保持默认基本就能跑起来。
3. 时序数据偶尔丢点,如何排查是不是夜莺侧拥塞了?
观察夜莺自身的 /metrics 指标中队列相关的指标(如 n9e_pushgw_sample_queue_size),如果持续接近 QueueMaxSize,说明写后端时序库的速度跟不上接收速度,可以调大 Pushgw.WriterOpt 的 QueueNumber/QueueMaxSize,或检查后端时序库的写入性能。
4. 配置文件里的密码不想写明文怎么办?
用「敏感字段加密」机制:把密码用 AES 加密后写成 {{cipher}}xxx 形式,启动时通过 -crypto-key 传入密钥。支持 DB.DSN、Redis 密码、BasicAuth 密码、Writers 的 BasicAuthPass。
5. 想用自己编译的前端页面替换内置前端怎么办?
设置 Center.UseFileAssets = true,然后把前端构建产物放到 n9e 运行目录下的 pub 目录中即可。