#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 里指定。
|
||||
Reference in new issue
Block a user