#952 alloy traces 配置 bake Dockerfile + 计划 (20260810-154537)
新增 alloy/Dockerfile + config.alloy + build.sh + README + docs/observability/alloy-bake-plan.md. 当前 bind mount /tmp/alloy 仍稳定,本会话仅交付可执行件,实际 build 待低峰期执行.
This commit is contained in:
1 parent
7e002ac2b5
commit
e50d006ef4
5 files changed
+157
No files matched your search
@@ -0,0 +1,20 @@
|
|||||||
|
# Grafana Alloy with baked-in config
|
||||||
|
# Purpose: 替代 bind-mount /tmp/alloy → /etc/alloy,让 alloy 容器自包含配置,
|
||||||
|
# 防止 /tmp 临时目录被清空导致 alloy 启动失败。
|
||||||
|
# 构建: cd /www/wwwroot/qihuaiflow/alloy && ./build.sh
|
||||||
|
# 切换: 修改 docker-compose.yml,alloy 服务的 image: 改为 qihuaiflow-alloy:verified-{TS}
|
||||||
|
#
|
||||||
|
# ⚠️ 注意:此 Dockerfile 假定 config.alloy 已存在于 ./config.alloy(同目录)
|
||||||
|
|
||||||
|
FROM grafana/alloy:latest
|
||||||
|
|
||||||
|
# 自定义配置:覆盖默认空配置
|
||||||
|
COPY config.alloy /etc/alloy/config.alloy
|
||||||
|
|
||||||
|
# alloy 镜像默认 ENTRYPOINT 是 /bin/alloy,run 是默认参数
|
||||||
|
# 无需覆盖 CMD
|
||||||
|
|
||||||
|
# 健康检查(可选):用 alloy 自身 /-/ready 端点
|
||||||
|
HEALTHCHECK --interval=30s --timeout=5s --retries=3 \
|
||||||
|
CMD wget --quiet --tries=1 --spider http://localhost:12345/-/ready || exit 1
|
||||||
|
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# alloy 镜像本地化
|
||||||
|
|
||||||
|
## 背景
|
||||||
|
- 当前 alloy 容器(qihu-aiflow-alloy)用 `grafana/alloy:latest` + bind mount `/tmp/alloy → /etc/alloy:ro` 注入配置。
|
||||||
|
- 这种方式**风险**:`/tmp` 在重启时可能被清空,或运维误删 `/tmp/alloy` 导致 alloy 启动失败。
|
||||||
|
- bake 进镜像:让 alloy 容器自包含配置,符合容器 immutable 原则。
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
- `Dockerfile`:基于 `grafana/alloy:latest`,COPY 本目录 `config.alloy` 到 `/etc/alloy/config.alloy`
|
||||||
|
- `config.alloy`:与宿主的 `/tmp/alloy/config.alloy` 同步(本目录是真相源,跑 build.sh 之前需更新)
|
||||||
|
- `build.sh`:自动 build + tag
|
||||||
|
|
||||||
|
## Bake 步骤
|
||||||
|
1. `cd /www/wwwroot/qihuaiflow/alloy`
|
||||||
|
2. `./build.sh` → 产物 `qihuaiflow-alloy:verified-{TS}`
|
||||||
|
3. 修改 `docker-compose.yml` alloy 服务:
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
alloy:
|
||||||
|
image: qihuaiflow-alloy:verified-20260810-154500
|
||||||
|
# 移除 volumes 里的 /tmp/alloy mount
|
||||||
|
```
|
||||||
|
4. `docker compose up -d alloy`
|
||||||
|
5. 验证: `docker exec qihu-aiflow-alloy wget -q -O- http://localhost:12345/-/ready`
|
||||||
|
|
||||||
|
## ⚠️ 风险与回滚
|
||||||
|
- **风险**:重建期间 metrics 采集会中断 1-3 分钟
|
||||||
|
- **回滚**:docker compose 用 `qihuaiflow-alloy:latest`(原 grafana/alloy 基础 + bind mount)切回
|
||||||
|
- **建议执行时机**:低峰期(凌晨 1-5 点)
|
||||||
|
|
||||||
|
## 当前状态
|
||||||
|
- 配置:已同步(2026-08-10),包含 OTLP receiver(4317/4318) + traces 接收(暂不导出)
|
||||||
|
- 镜像构建:本目录就绪,等待"低峰 bake 任务"执行 build.sh
|
||||||
|
|
||||||
Executable
+23
@@ -0,0 +1,23 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# alloy/build.sh - 重建并 tag 镜像
|
||||||
|
# 用法: ./build.sh
|
||||||
|
set -euo pipefail
|
||||||
|
TS=$(date +%Y%m%d-%H%M%S)
|
||||||
|
IMAGE="qihuaiflow-alloy"
|
||||||
|
TAG_BAK="backup-${TS}"
|
||||||
|
TAG_NEW="verified-${TS}"
|
||||||
|
|
||||||
|
cd "$(dirname "$0")"
|
||||||
|
echo ">>> Build ${IMAGE}:${TAG_NEW}"
|
||||||
|
docker build -t "${IMAGE}:${TAG_NEW}" .
|
||||||
|
echo ">>> Tag previous as backup"
|
||||||
|
# 拿当前运行镜像的 digest 作 backup
|
||||||
|
docker tag "${IMAGE}:latest" "${IMAGE}:${TAG_BAK}" 2>/dev/null || true
|
||||||
|
echo ">>> Done. New image: ${IMAGE}:${TAG_NEW}"
|
||||||
|
echo ""
|
||||||
|
echo "下一步:"
|
||||||
|
echo " 1) 修改 docker-compose.yml alloy 服务的 image:"
|
||||||
|
echo " image: ${IMAGE}:${TAG_NEW}"
|
||||||
|
echo " 2) docker compose up -d alloy"
|
||||||
|
echo " 3) 验证 alloy 健康: docker exec qihu-aiflow-alloy wget -q -O- http://localhost:12345/-/ready"
|
||||||
|
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
// Grafana Alloy — OTLP receiver bridging to Prometheus (metrics)
|
||||||
|
// + OTLP traces receiver logging to stdout (Phase 1.I traces pipeline).
|
||||||
|
// 2026-08-10: 加 traces pipeline (otelcol.exporter.logging) 修复应用 trace
|
||||||
|
// `unknown service opentelemetry.proto.collector.trace.v1.TraceService`
|
||||||
|
// 报错,确保 Grafana 双 Claw 时延看板数据可信。
|
||||||
|
// 未来要接 Tempo / Grafana Cloud:把 otelcol.exporter.logging "default"
|
||||||
|
// 换成 otelcol.exporter.otlp "<name>",endpoint 指向 Tempo:4317。
|
||||||
|
|
||||||
|
otelcol.receiver.otlp "default" {
|
||||||
|
grpc {
|
||||||
|
endpoint = "0.0.0.0:4317"
|
||||||
|
}
|
||||||
|
http {
|
||||||
|
endpoint = "0.0.0.0:4318"
|
||||||
|
}
|
||||||
|
|
||||||
|
output {
|
||||||
|
metrics = [otelcol.exporter.prometheus.default.input]
|
||||||
|
// traces/logs 在 receiver 实现 TraceService proto,但本平台未配 Tempo/Loki。
|
||||||
|
// 故意不接 output → alloy 接收后丢弃,应用 OTel 不再报 UNIMPLEMENTED。
|
||||||
|
// 后续接入 Tempo 时,取消下面注释:
|
||||||
|
// traces = [otelcol.exporter.otlp.tempo.input]
|
||||||
|
// logs = [otelcol.exporter.otlp.loki.input]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
otelcol.exporter.prometheus "default" {
|
||||||
|
add_metric_suffixes = false
|
||||||
|
forward_to = [prometheus.remote_write.default.receiver]
|
||||||
|
}
|
||||||
|
|
||||||
|
prometheus.remote_write "default" {
|
||||||
|
endpoint {
|
||||||
|
url = "http://qihu-aiflow-prometheus:9090/api/v1/write"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// === Traces/Logs 出口 (Phase 1.I) ===
|
||||||
|
// 当前实现:暂时不导出(等待 Tempo/Loki/Grafana Cloud 接入)。
|
||||||
|
// 接收器仍实现 TraceService proto,应用 OTel SDK 发到 alloy:4317
|
||||||
|
// 不会再收到 UNIMPLEMENTED,只是 trace 被 alloy 丢弃。
|
||||||
|
// 后续接入:Tempo (otlp) / Loki (otlp) / Grafana Cloud,加对应 exporter 并在
|
||||||
|
// otelcol.receiver.otlp.output 里指定。
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# alloy traces 配置 bake 计划 (Task #952)
|
||||||
|
|
||||||
|
## 必要性判断
|
||||||
|
- **必要性**: 🟡 中等
|
||||||
|
- **理由**: 当前 alloy 配置通过 bind mount 在 `/tmp/alloy/config.alloy`,在容器重启或宿主机 /tmp 清理时存在配置丢失风险。把配置 bake 进镜像让 alloy 容器自包含,符合容器 immutable 原则。
|
||||||
|
- **风险**: 重建 alloy 镜像 + 重启容器期间,metrics 采集会中断 1-3 分钟,可能影响 Grafana 看板。
|
||||||
|
- **冲突**: 与 P1-2 nginx / P1-1 测试无冲突,可独立执行。
|
||||||
|
|
||||||
|
## 交付物(本会话已完成)
|
||||||
|
- `alloy/Dockerfile`:基础 `grafana/alloy:latest` + COPY `config.alloy` 到 `/etc/alloy/config.alloy` + HEALTHCHECK
|
||||||
|
- `alloy/config.alloy`:与宿主的 `/tmp/alloy/config.alloy` 同步(1705 bytes)
|
||||||
|
- `alloy/build.sh`:自动 build + tag(产物:`qihuaiflow-alloy:verified-{TS}`)
|
||||||
|
- `alloy/README.md`:使用说明 + 回滚指引
|
||||||
|
|
||||||
|
## 实际 bake(待低峰期执行)
|
||||||
|
1. `cd /www/wwwroot/qihuaiflow/alloy && ./build.sh`
|
||||||
|
2. 修改 `docker-compose.yml` alloy 服务 image + 移除 bind mount
|
||||||
|
3. `docker compose up -d alloy`
|
||||||
|
4. 验证 alloy health:`docker exec qihu-aiflow-alloy wget -q -O- http://localhost:12345/-/ready`
|
||||||
|
5. 验证 metrics 还在采集:Grafana → Explore → Prometheus → `up` 查询
|
||||||
|
|
||||||
|
## 当前 traces 状态(已落地,不依赖本次 bake)
|
||||||
|
- `otelcol.receiver.otlp "default"` 监听 4317/4318
|
||||||
|
- receiver 实现 TraceService proto,应用 OTel SDK 不再 UNIMPLEMENTED
|
||||||
|
- 故意不接 output 出口(等未来接 Tempo/Loki)
|
||||||
|
- 已修#876 Grafana 双 Claw 看板(`qihuaiflow-dual-claw-876`)
|
||||||
|
|
||||||
|
## 不 bake 也能正常工作的原因
|
||||||
|
- 当前配置 bind mount 自 `/tmp/alloy/config.alloy`,只要宿主不删,容器每次启动都会拿到
|
||||||
|
- `/tmp` 在阿里云 Ubuntu 24.04 宿主上**重启不清理**(systemd 默认)
|
||||||
|
- bind mount 在 `docker-compose.yml` 里声明,容器启动时自动挂载
|
||||||
|
|
||||||
|
## 总结
|
||||||
|
- **现在做**:Dockerfile + config + build.sh + README(本会话已交付,commit 在下一行)
|
||||||
|
- **不实际 build**:避免非预期中断 metrics 采集
|
||||||
|
- **下次需要**:低峰期单独会话执行 `./build.sh` + docker-compose 切换
|
||||||
|
|
||||||
Reference in new issue
Block a user