> For the complete documentation index, see [llms.txt](https://book.eru.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://book.eru.dev/specs/agent.md).

# Agent Config

#### 介绍

Agent Config 是用来决定 Agent 行为的配置，一般会保存在 `/etc/eru/agent.yaml` 也可以通过 `agent --config` 来指定。一个标准的 agent 配置如下：

```
pid: /tmp/agent.pid                              pid path
store: grpc                             optional store 的类型，默认为 grpc，即 eru-core 的 grpc 服务
runtime: docker                         optional runtime 类型，默认为 docker
kv: etcd                                optional kv 类型，默认为 ETCD

core:                                            Core 的 API 地址
  - 127.0.0.1:5001                               可以配置多个地址

healthcheck:                                     Health Check 配置
  interval: 120                         optional Health Check 间隔
  timeout: 10                           optional Health Check 超时判定
  cache_ttl: 300                        optional 本地缓存的过期时间，仅当 enable_selfmon 为 true 时生效
  enable_selfmon: false                 optional 集群里是否启动了 selfmon

auth:                                   optional Core API Basic auth
  username: username
  password: password

docker:                                          Docker 配置
  endpoint: unix:///var/run/docker.sock          Docker url，支持 unix socket file 地址和 tcp 地址的形式

yavirt:                                          Yavirt 配置
  endpoint: grpc://127.0.0.1:9697                Yavirt url，支持 grpc 地址和 http 地址
  skip_guest_report_regexps:                     ID 符合任意正则表达式的 VM 将不会被检查
    - .+002

metrics:                                         Metrics 配置
  step: 30                                       发送间隔
  transfers:                            optional 默认支持 prometheus，也可以开启 statsd
    - 127.0.0.1:8125                             可以配置多个 statsd 后端

api:                                    optional profile API 配置
  addr: 127.0.0.1:12345                          profile API 地址

log:                                             日志选项
  forwards:
    - tcp://127.0.0.1:5144              optional 日志远端, 支持 tcp、udp、journal 和特殊的 __discard__
  stdout: False                                  是否把容器日志打到 agent 自身日志流里面

ha_keepalive_interval: 16s              optional selfmon 发送心跳的时间间隔

etcd:                                            ETCD 配置，仅当此 agent 以 selfmon 模式运行时生效
  machines:                                      ETCD 服务器地址
    - 127.0.0.1:2379
  prefix: /agent-selfmon                         Key的前缀
```

Agent 在监听到隶属 Eru 的容器启动后，会把 stdout/stderr 的日志 forward 到配置的远端，同时开始监听 metrics。

对于日志，格式如下：

```
{"id":"{CONTAINER_ID}","name":"{APP_NAME}","type":"{stderr || stdout}","entrypoint":"{APP_ENTRYPOINT}","ident":"{APP_IDENT}","data":"{LOG_MSG}","datetime":"2018-06-27 07:19:25.507018","extra":{CONTAINER_LABELS}}
```

在测试的时候甚至可以用 `netcat` 来模拟日志接收，使用

```
nc -l {PORT} -k
```

需要注意的是，log 参数支持 tcp 和 udp 2种形式，udp 对于单条日志大小限制为了1024K，因此对于线上系统而言，建议使用 TCP 模式。

对于 Metrics，Agent 会发一组数据到配置的远端 statsd 中：

```
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.cpu_usage:0.06814310051085702|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.cpu_user_usage:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.cpu_sys_usage:40.00000000003638|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.mem_rss:6184960|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.mem_usage:2088960|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.mem_max_usage:2215936|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.mem_usage_percent:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.lo.drop.in:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.lo.drop.out:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.lo.err.in:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.lo.err.out:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.lo.bytes.recv:10445.6|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.lo.bytes.sent:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.lo.packets.recv:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.lo.packets.sent:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.cali0.drop.in:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.cali0.drop.out:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.cali0.err.in:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.cali0.err.out:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.cali0.bytes.recv:5191.333333333333|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.cali0.bytes.sent:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.cali0.packets.recv:0|g
eru.{APPNAME}.{TAG}.{ENTRYPOINT}.{HOST}.{CONTAINER_ID}.cali0.packets.sent:0|g
```

通过这个数据我们就可以从容器外面监控容器行为。

如果没有开启 statsd，也可以通过 `API_HOST:PORT/metrics` 拿到 prometheus 规格的 metrics。
