Skip to content

Commit bde84d4

Browse files
committed
feat(deploy): limit OpenObserve retention to 30 days
1 parent 059db5a commit bde84d4

10 files changed

Lines changed: 173 additions & 1 deletion

File tree

apps/api/test/telemetry-deployment-config.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ describe("telemetry deployment configuration", () => {
3838
expect(collector).toContain("level: warn");
3939
});
4040

41+
test("retains OpenObserve telemetry for 30 days by default", () => {
42+
const service = compose.split("\n openobserve:")[1]?.split("\n otel-collector:")[0] || "";
43+
expect(service).toContain(
44+
'ZO_COMPACT_DATA_RETENTION_DAYS: "${ZO_COMPACT_DATA_RETENTION_DAYS:-30}"',
45+
);
46+
expect(productionEnv).toContain("ZO_COMPACT_DATA_RETENTION_DAYS=30");
47+
});
48+
4149
test("routes applications only to the Collector", () => {
4250
expect(productionEnv).toContain(
4351
"CNODE_OTEL_EXPORTER_OTLP_BASE_ENDPOINT=http://otel-collector:4318",

docs/deployment/deployment.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ docker rm openobserve
4949
docker compose up -d --no-build openobserve
5050
```
5151

52-
OpenObserve uses `latest`. Before pulling an update, create and verify a restorable `openobserve-data` backup and record the current image ID. Its internal address is `http://openobserve:5080`; Compose does not publish that port.
52+
OpenObserve uses `latest`. Before pulling an update, create and verify a restorable `openobserve-data` backup and record the current image ID. Its internal address is `http://openobserve:5080`; Compose does not publish that port. `ZO_COMPACT_DATA_RETENTION_DAYS=30` applies one global 30-day retention period to logs, metrics, and traces. OpenObserve's compactor removes older data asynchronously, so disk usage does not drop immediately after restart. Never delete files directly from `openobserve-data`; increasing the retention value later cannot restore data already deleted by the compactor.
5353

5454
## Configure Application Telemetry
5555

docs/deployment/docker-compose.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ services:
8383
openobserve:
8484
image: public.ecr.aws/zinclabs/openobserve:latest
8585
env_file: ${CNODE_ENV_FILE:-.env}
86+
environment:
87+
ZO_COMPACT_DATA_RETENTION_DAYS: "${ZO_COMPACT_DATA_RETENTION_DAYS:-30}"
8688
volumes:
8789
- openobserve-data:/data
8890
healthcheck:

docs/deployment/env.production.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ CNODE_OTEL_TRACE_SAMPLE_RATIO=0.1
7070
# OpenObserve service
7171
ZO_ROOT_USER_EMAIL=admin@example.com
7272
ZO_ROOT_USER_PASSWORD=replace-with-openobserve-root-password
73+
ZO_COMPACT_DATA_RETENTION_DAYS=30
7374

7475
# OpenTelemetry Collector
7576
OPENOBSERVE_OTLP_ENDPOINT=https://metrics.example.com/api/default
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
schema: spec-driven
2+
created: 2026-08-11
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
## Context
2+
3+
生产 OpenObserve 使用单节点、本地持久卷和 `latest` 镜像。当前部署未显式设置数据保留期,因此继承上游 `ZO_COMPACT_DATA_RETENTION_DAYS=3650`。应用现已持续导出 traces、logs 和 metrics,需要在 OpenObserve 进程边界设置统一、可审计的磁盘保留上限。
4+
5+
## Goals / Non-Goals
6+
7+
**Goals:**
8+
9+
- 将生产 OpenObserve 的全局默认数据保留期固定为 30 天。
10+
- 让 Compose、dotenv example、部署说明和自动化测试表达同一配置。
11+
- 通过重建 OpenObserve 使配置生效,并验证容器健康。
12+
13+
**Non-Goals:**
14+
15+
- 不配置 stream-level retention 或不同信号的独立期限。
16+
- 不同步删除数据卷文件,不承诺配置生效后立即释放磁盘。
17+
- 不修改应用 telemetry exporter 或 Collector pipeline。
18+
19+
## Decisions
20+
21+
### 使用 OpenObserve 全局 compactor retention 变量
22+
23+
在 OpenObserve service environment 中传入 `ZO_COMPACT_DATA_RETENTION_DAYS`,Compose 默认值为 `30`,并在生产 dotenv example 中显式声明 `30`。官方将该变量定义为全局数据保留天数,最小值为 3,适用于 compactor 自动清理。
24+
25+
备选方案是在 UI 中逐 stream 配置 retention。该方案容易遗漏新建 stream,且生产状态无法由仓库配置审计,因此不采用。
26+
27+
### 允许 dotenv 覆盖但默认保持 30 天
28+
29+
Compose 使用 `${ZO_COMPACT_DATA_RETENTION_DAYS:-30}`,使标准部署无需额外配置即可获得 30 天边界,同时保留紧急容量调整能力。部署说明要求任何覆盖都经过明确运维评估。
30+
31+
备选方案是直接写死 `30`。该方案无法在不改 Compose 文件的情况下处理临时容量策略,因此不采用。
32+
33+
### 依赖 compactor 异步清理
34+
35+
配置仅通过 OpenObserve 支持的 retention 机制生效,不直接操作 `openobserve-data`。超过 30 天的数据由 compactor 后台删除,磁盘释放存在延迟。
36+
37+
备选方案是运行文件级删除命令。该方案可能破坏 OpenObserve metadata 与数据文件一致性,因此禁止。
38+
39+
## Risks / Trade-offs
40+
41+
- [超过 30 天的数据不可恢复] → 部署说明明确这是观测数据策略,并在缩短期限前确认无需长期审计数据。
42+
- [compactor 清理不是即时发生] → 验证配置注入和容器健康,不以立即减少卷大小作为发布成功条件。
43+
- [`latest` 行为变化] → 保留既有镜像漂移审计和恢复点要求。
44+
- [stream-level retention 覆盖全局值] → 本 change 只定义全局默认;后续若引入 stream override,必须另行规范并审计。
45+
46+
## Migration Plan
47+
48+
1. 更新仓库 Compose、dotenv example、部署说明和配置测试。
49+
2. 在生产 dotenv 中设置 `ZO_COMPACT_DATA_RETENTION_DAYS=30`
50+
3. 执行只读 `docker compose config` 预检,不输出环境值。
51+
4. 重建 OpenObserve service 并等待 healthcheck 通过。
52+
5. 回滚时恢复上一 retention 配置并重建服务;已经被 compactor 删除的数据不能通过配置回滚恢复。
53+
54+
## Database Change Audit
55+
56+
- PostgreSQL schema、Drizzle migration、seed、索引、约束和业务数据均不变。
57+
- 本 change 的 data retention 仅作用于 OpenObserve 的观测数据卷,不得运行 PostgreSQL migration 或数据清理命令。
58+
59+
## Open Questions
60+
61+
无。
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
## Why
2+
3+
OpenObserve 当前依赖上游 3650 天默认保留期,应用 logs、metrics 和 traces 持续写入后会长期占用生产磁盘。生产单节点观测服务需要明确的 30 天全局保留边界,以限制存储增长并保持运维行为可预测。
4+
5+
## What Changes
6+
7+
- 为 OpenObserve Compose service 配置 `ZO_COMPACT_DATA_RETENTION_DAYS=30`
8+
- 在生产 dotenv example 中记录同一安全默认值,并在部署说明中说明该值适用于 logs、metrics 和 traces,旧数据由 compactor 异步清理。
9+
- 增加部署配置测试,防止保留期退回 OpenObserve 上游默认值。
10+
11+
## Capabilities
12+
13+
### New Capabilities
14+
15+
无。
16+
17+
### Modified Capabilities
18+
19+
- `openobserve-compose-service`: OpenObserve 生产服务必须将全局数据保留期显式限制为 30 天。
20+
21+
## Impact
22+
23+
- 受影响文件:`docs/deployment/docker-compose.yml``docs/deployment/env.production.example``docs/deployment/deployment.md` 和 telemetry deployment 配置测试。
24+
- 受影响系统:生产 OpenObserve compactor 及其本地持久化数据卷。
25+
- 高风险类别:数据保留与自动删除;配置生效后,超过 30 天的观测数据将进入异步清理流程。
26+
- 不涉及应用 API、PostgreSQL schema、业务数据或 Web UI。
27+
28+
## Scope
29+
30+
- 范围内:OpenObserve 全局观测数据保留期、Compose/env 示例、部署说明和配置验证。
31+
- 范围外:按 stream 设置不同保留期、历史数据导出、OpenObserve 版本固定、容量告警和对象存储迁移。
32+
33+
## Non-goals
34+
35+
- 不为 logs、metrics、traces 设置不同的 retention policy。
36+
- 不立即强制删除历史数据,也不修改 OpenObserve 数据卷内容。
37+
38+
## Documentation Impact
39+
40+
- 更新 `docs/deployment/deployment.md` 和部署示例,作为生产保留策略的权威说明。
41+
- `docs/arch/``docs/biz/`、根治理文件、app README 和生成的 Web API reference 不受影响。
42+
- 适用 Skill:`cnode-docs`,确保部署说明仅包含安全、可复用的配置值。
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
## ADDED Requirements
2+
3+
### Requirement: OpenObserve 观测数据必须默认保留 30 天
4+
5+
生产 Compose SHALL 将 OpenObserve 的全局数据保留期显式配置为 30 天,使 logs、metrics 和 traces 中超过该期限的数据由 OpenObserve compactor 异步清理。部署 MUST NOT 通过直接删除 `openobserve-data` 文件实现 retention。
6+
7+
#### Scenario: 渲染默认生产配置
8+
9+
- **WHEN** 运维使用安全占位环境渲染 `docs/deployment/docker-compose.yml`
10+
- **THEN** `openobserve` service MUST 获得 `ZO_COMPACT_DATA_RETENTION_DAYS=30`
11+
- **AND** `docs/deployment/env.production.example` MUST 声明同一 30 天值
12+
13+
#### Scenario: 30 天前数据进入清理流程
14+
15+
- **WHEN** OpenObserve compactor 在 retention 配置生效后处理超过 30 天的观测数据
16+
- **THEN** 这些数据 MUST 由 OpenObserve 支持的 retention 机制异步清理
17+
- **AND** 部署流程 MUST NOT 假定重建容器后磁盘空间立即释放
18+
19+
#### Scenario: 回滚 retention 配置
20+
21+
- **WHEN** 运维恢复先前的 retention 值并重建 OpenObserve
22+
- **THEN** 新配置 MUST 只影响后续 compactor 行为
23+
- **AND** 运维 MUST NOT 声称配置回滚能够恢复已经删除的数据
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
## 1. MVP 配置
2+
3+
- [x] 1.1 在生产 Compose 和 dotenv example 中将 OpenObserve 默认 retention 配置为 30 天
4+
- [x] 1.2 增加部署配置测试,验证 retention 变量和默认值
5+
6+
## 2. 完整说明与验证
7+
8+
- [x] 2.1 更新权威部署说明,记录全局适用范围、异步清理和不可恢复边界
9+
- [x] 2.2 运行 targeted test、secret scan、Compose 只读渲染和 OpenSpec strict validation
10+
- [x] 2.3 核对文档 owner、过期路径、安全示例和 PostgreSQL 无变更审计
11+
- [x] 2.4 在生产环境应用 30 天 retention,重建 OpenObserve 并验证健康状态

openspec/specs/openobserve-compose-service/spec.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,25 @@ OpenObserve SHALL 将 `/data` 挂载到 Compose 声明的 `openobserve-data` vol
8181
- **WHEN** 运维准备拉取或重新创建 OpenObserve
8282
- **THEN** 运维 MUST 记录变更前后的实际 image ID 或 digest
8383
- **AND** 运维 MUST 在替换前确认上游版本兼容性和 `openobserve-data` 的可恢复备份
84+
85+
### Requirement: OpenObserve 观测数据必须默认保留 30 天
86+
87+
生产 Compose SHALL 将 OpenObserve 的全局数据保留期显式配置为 30 天,使 logs、metrics 和 traces 中超过该期限的数据由 OpenObserve compactor 异步清理。部署 MUST NOT 通过直接删除 `openobserve-data` 文件实现 retention。
88+
89+
#### Scenario: 渲染默认生产配置
90+
91+
- **WHEN** 运维使用安全占位环境渲染 `docs/deployment/docker-compose.yml`
92+
- **THEN** `openobserve` service MUST 获得 `ZO_COMPACT_DATA_RETENTION_DAYS=30`
93+
- **AND** `docs/deployment/env.production.example` MUST 声明同一 30 天值
94+
95+
#### Scenario: 30 天前数据进入清理流程
96+
97+
- **WHEN** OpenObserve compactor 在 retention 配置生效后处理超过 30 天的观测数据
98+
- **THEN** 这些数据 MUST 由 OpenObserve 支持的 retention 机制异步清理
99+
- **AND** 部署流程 MUST NOT 假定重建容器后磁盘空间立即释放
100+
101+
#### Scenario: 回滚 retention 配置
102+
103+
- **WHEN** 运维恢复先前的 retention 值并重建 OpenObserve
104+
- **THEN** 新配置 MUST 只影响后续 compactor 行为
105+
- **AND** 运维 MUST NOT 声称配置回滚能够恢复已经删除的数据

0 commit comments

Comments
 (0)