0x00 组件介绍
WeOps-Proxy是WeOps开源的监控组件,封装了Grafana Agent和IPMI Exporter,提供跨网络区域的snmp和ipmi监控采集能力。
采集交互过程如下图:

0x01 安装部署
前置动作:WeOps Proxy 使用 consul 来进行数据同步,为了不影响蓝鲸平台的 consul,一般需要单独在蓝鲸服务器上部署一套单独的 consul,仅使用 kv 能力。在非高可用架构下,consul,weops-proxy 默认安装在蓝鲸的 APPT 服务器上
## 中控机操作
cat <<EOF > /data/install/bin/04-final/weops.env
WEOPS_CONSUL_KEYSTR_32BYTES=$(consul keygen)
EOF
/data/install/bkcli install bkenv
/data/install/bkcli sync common
---
## APPT 服务器操作
docker run -d \
--restart=always \
-v /data/weops/proxy/:/consul/data \
--net=host \
--name=weops-consul \
-e CONSUL_HTTP_ADDR=http://127.0.0.1:8501 \
docker-bkrepo.cwoa.net/ce1b09/weops-docker/consul:latest agent -server -bootstrap-expect=1 -encrypt="${WEOPS_CONSUL_KEYSTR_32BYTES}" -client=127.0.0.1 -server-port=8603 -serf-wan-port=8602 -serf-lan-port=8601 -http-port=8501 -bind=${LAN_IP}
---
## 在 appo 服务器操作和所有的 weops-proxy 节点操作 (APPT 除外)
source /data/install/load_env.sh
docker run -d \
--restart=always \
--net=host \
--name=weops-consul-client \
-e CONSUL_HTTP_ADDR=http://127.0.0.1:8501 \
docker-bkrepo.cwoa.net/ce1b09/weops-docker/consul:latest agent -client=127.0.0.1 -server-port=8603 -serf-wan-port=8602 -serf-lan-port=8601 -http-port=8501 -bind=${LAN_IP} -join ${BK_APPT_IP} -encrypt="${WEOPS_CONSUL_KEYSTR_32BYTES}"
---
1、WEOPS_PROXY_CLIENT_HOST 更新为 127.0.0.1
2、重新部署 weops saas
部署 weops proxy,推荐使用docker方式部署,部署脚本如下:
#!/bin/bash
source /data/install/utils.fc
mkdir -p /data/weops/proxy/
chown -R 1001:1001 /data/bkce/logs/weopsproxy
docker run -d --net=host --restart=always --name=weops-proxy \
-e CONSUL_ADDR=${BK_APPT_IP}:8501 \
-e REMOTE_URL=http://admin:admin@${BK_APPT_IP}:9093/api/v1/write \
-v /data/bkce/logs/weopsproxy:/app/log \
docker-bkrepo.cwoa.net/ce1b09/weops-docker/weopsproxy:1.0.4
在拉起服务后,需要手动初始化接入点,脚本如下:
#!/bin/bash
source /data/install/utils.fc
proxy_url="http://${BK_APPT_IP}:8501/v1/kv/weops/access_points/default"
req=$(cat << EOF
{
"ip":"${BK_APPT_IP}",
"name":"默认区域采集节点",
"zone":"default",
"port": 8089
}
EOF
)
# 单独写入access_points的key path
curl --request PUT http://${BK_APPT_IP}:8501/v1/kv/weops/access_points/
# 注册default接入点
curl --request PUT --data "$(jq -r <<<$req)" $proxy_url
检查服务状态:
docker exec -it weops-proxy sh -c "supervisorctl -c /app/config/supervisord.conf status all"
预期为四个进程都是启动状态,如下

0x02 组件详解
WeOps Proxy包括五个进程,其中supervisor用于托管其他进程,其他4个进程用途如下:
进程名 | 用途 | 日志 |
---|---|---|
consul-template | 从consul获取采集任务的配置,并对进程进行reload | /data/bkce/logs/weopsproxy/consul-template.out.log |
grafana-agent | 暴露snmp的指标,监听http://127.0.0.1:12345 | /data/bkce/logs/weopsproxy/grafana-agent.out.log |
ipmi | 暴露ipmi的指标,监听http://127.0.0.1:9290 | /data/bkce/logs/weopsproxy/ipmi.out.log |
grafana-agent-flow | 执行采集&数据清洗,将数据传输到Prometheus,监听http://127.0.0.1:1234 | /data/bkce/logs/weopsproxy/grafana-flow.out.log |
在启动WeOps Proxy时指定了两个环境变量:
变量名 | 说明 |
---|---|
CONSUL_ADDR | proxy获取配置的consul地址。默认为APPT服务器的8501端口 |
REMOTE_URL | remotewrite到Prometheus的地址,默认为APPT服务器的9093端口(需要在url中添加basic auth) |
0x03 常见问题与排查思路
- 日志目录权限异常,现象为supervisor看不到

这个问题一般是由于uid为1001的用户没有挂载的/data/bkce/logs/weopsproxy目录权限导致的。
chown -R 1001:1001 /data/bkce/logs/weopsproxy
然后
docker exec -it weops-proxy sh -c "supervisorctl -c /app/config/supervisord.conf reload
即可
- snmp采集失败
在appt的服务器使用snmpwalk验证目标snmp是否能正常访问
snmpwalk -v2c -c {团体字} {ip} 1.3.6.1

确认能正常访问后,将proxy的1234端口代理出来,
server {
listen 80;
server_name flow.weops.com;
location / {
proxy_pass http://${BK_APPT_IP}:1234;
}
}
并配置hosts,访问flow.weops.com,在页面找到目标任务,查看Debug Info信息

查看last_error后,复制url,在APPT上手动curl查看结果,结合grafana.out.log排查更多错误信息。
- ipmi采集失败
与snmp相同,先在weops-proxy的容器中运行
ipmi-sel -h {服务器ip} -u {用户名} -p {密码} -D LAN_2_0
正常可以看到输出大量的ipmi指标

如果确认ipmi-sel可以正常获取数据后,granfa flow页面显示500,可以尝试重启ipmi exporter。
0x04 Proxy的多云区域部署
在需要跨网段进行采集时,可部署多个proxy进行采集,网络要求如下:
源 | 目标 | 端口 | 用途 | 是否双向 |
---|---|---|---|---|
proxy 服务器 | 蓝鲸的 APPT 服务器 | 9093, 8501, 8200, 8089 | 监控数据传输 | 是 |
proxy 服务器 | 蓝鲸的 redis 服务器 | 6379 | 任务数据获取 | 是 |
proxy服务器要求已安装docker,已导入weops-proxy镜像/可以访问到有proxy镜像的仓库且已安装蓝鲸环境变量
#!/bin/bash
# 此脚本可以在任意蓝鲸服务器上执行,依赖uuid和jq命令
export ZONE=$(uuid)
export ACCESS_POINT_NAME="要注册的接入点名称,可自由命名如:广州园区核心网"
export ACCESS_POINT_IP="接入点IP,如10.10.0.1"
# 以上变量需手动填写
ok "zone uuid=${ZONE}"
req=$(cat << EOF
{
"ip":"${ACCESS_POINT_IP}",
"name":"${ACCESS_POINT_NAME}",
"zone":"${ZONE}"
"port":8089
}
EOF
)
ok $req
proxy_url="http://${BK_APPT_IP}:8501/v1/kv/weops/access_points/${ZONE}"
curl --request PUT --data "$(jq -r <<<$req)" $proxy_url
ok "get ${ZONE}_access_ponit"
curl --request GET $proxy_url | jq -r .[].Value|base64 -d
需要记录执行此脚本后输出的uuid,然后在新的服务器执行
## 新建 weops proxy
#!/bin/bash
source /data/install/utils.fc
mkdir -p /data/weops/proxy/
chown -R 1001:1001 /data/bkce/logs/weopsproxy
docker run -d --net=host --restart=always --name=weops-proxy \
-e CONSUL_ADDR=${BK_APPT_IP}:8501 \
-e REMOTE_URL=http://admin:admin@${BK_APPT_IP}:9093/api/v1/write \
-e ZONE=${ZONE的uuid}
-v /data/bkce/logs/weopsproxy:/app/log \
docker-bkrepo.cwoa.net/ce1b09/weops-docker/weopsproxy:1.0.4
## 新建 automate,请自行替换所需变量
# 注意 celery broker 不可重复
# paas 地址需要填写域名形式且采用 http
# access point 需填写和接入点一致的 ip
# 添加 paas 的 hosts 解析
export APP_AUTH_TOKEN=$( mysql -uroot -p$BK_MYSQL_ADMIN_PASSWORD --socket=/var/run/mysql/default.mysql.socket -BNe "select auth_token from open_paas.paas_app where code='weops_saas';" )
docker run -d --restart=always --net=host \
-e APP_PORT=8089 \
-e CELERY_BROKER=redis://:${BK_REDIS_ADMIN_PASSWORD}@${BK_REDIS_IP}:6379/1 \
-e CELERY_BACKEND=redis://:${BK_REDIS_ADMIN_PASSWORD}@${BK_REDIS_IP}:6379/14 \
-e VAULT_URL=http://${BK_APPT_IP}:8200 \
-e VAULT_TOKEN=${VAULT_ROOT_TOKEN} \
-e REDIS_URL=redis://:${BK_REDIS_ADMIN_PASSWORD}@${BK_REDIS_IP}:6379/14 \
-e WEOPS_PATH=http://DOMAIN/o/weops_saas \
-e PROMETHEUS_RW_URL=http://${BK_APPT_IP}:9093/api/v1/write \
-e PROMETHEUS_USER=admin \
-e PROMETHEUS_PWD=admin \
-e ACCESS_POINT_URL=$(hostname -I|awk '{print $1}'):8089 \
-e ENABLE_OTEL=false \
-e BK_PAAS_HOST=http://DOMAIN \
-e WEOPS_APP_ID=weops_saas \
-e WEOPS_APP_TOKEN=${APP_AUTH_TOKEN} \
-v /data/bkce/logs/automate:/app/logs \
--name=auto-mate docker-bkrepo.cwoa.net/ce1b09/weops-docker/auto-mate:v1.0.21-fix1