一、认识OpenObserve
1.1 平台定位与背景
OpenObserve(简称 O2)是一个用 Rust 开发的开源云原生可观测平台,专为日志(Logs)、指标(Metrics)、链路追踪(Traces)而构建,设计用于 PB 级工作负载。它是一款用于日志、指标、分析和追踪以及真实用户监控的可观测工具
核心价值与成本优势
- 极低成本:与 Elasticsearch 相比,使用 OpenObserve 可以将日志存储成本降低约 140 倍
- 简单易用:无需调整大量复杂的设置,2 分钟内即可启动并运行,且自带用户界面,无需单独安装
- 高性能:使用 Rust 编写,性能高、资源占用低,采用 Parquet 列式存储格式,查询和存储效率很高
- 统一可观测:集成日志、指标、链路追踪三大能力,实现全栈可观测性
1.2 核心功能全景图
| 功能模块 |
核心能力 |
用户价值 |
| 日志管理 |
支持多种协议接入日志,SQL + 全文搜索查询,VRL 函数转换 |
快速定位问题 |
| 指标监控 |
支持 Prometheus 远程写入协议,兼容 PromQL |
统一存储指标数据 |
| 链路追踪 |
使用 OpenTelemetry SDK 或 Collector 发送分布式追踪数据 |
调用链分析、性能诊断 |
| 告警 |
支持定时告警、实时告警、异常检测 |
主动发现问题 |
| 可视化 |
自带仪表板功能,无需安装额外组件 |
多维度数据展示 |
| 数据分析 |
支持 SQL 和 PromQL 查询 |
灵活的数据分析能力 |
二、部署与初始化
2.1 环境要求
| 项目 |
要求 |
| 操作系统 |
Linux(建议 Ubuntu 22.04 以上) |
| Docker |
20.x 及以上 |
| 内存 |
推荐 8GB 以上 |
| 磁盘 |
推荐 20GB 以上 |
| 端口 |
5080(Web UI / API) |
2.2 Docker快速部署
基础启动命令
sudo docker run -d \
--name openobserve \
-p 5080:5080 \
--ulimit nproc=65535:65535 \
--ulimit nofile=65535:65535 \
-e ZO_ROOT_USER_EMAIL="[email protected]" \
-e ZO_ROOT_USER_PASSWORD="OpenObserve@123" \
public.ecr.aws/zinclabs/openobserve:latest
带数据持久化的生产部署(推荐):
# 1. 创建宿主机数据目录
mkdir -p /data/openobserve
# 2. 启动容器(挂载数据卷)
docker run -d \
--name openobserve \
--security-opt seccomp=unconfined \
-p 5080:5080 \
-v /data/openobserve:/data \
-e ZO_DATA_DIR=/data \
-e ZO_ROOT_USER_EMAIL="[email protected]" \
-e ZO_ROOT_USER_PASSWORD="OpenObserve@123" \
public.ecr.aws/zinclabs/openobserve:latest
2.3 访问验证
启动容器后,打开浏览器访问 http://服务器IP:5080,输入启动时配置的管理员邮箱和密码即可登录。
⚠️ 部署避坑指南:
- 管理员账号必须配置:OpenObserve 在启动时必须初始化管理员账号,否则服务会直接退出
- 线程创建失败:如遇到
OS can't spawn worker thread: Operation not permitted 错误,请添加 --security-opt seccomp=unconfined 参数
- 资源预留:建议 8GB 以上内存,避免 OOM
- 数据持久化:生产环境务必挂载数据卷,否则容器重启后数据会丢失
2.4 Docker Compose 部署(可选)
version: "3.8"
services:
openobserve:
image: public.ecr.aws/zinclabs/openobserve:latest
container_name: openobserve
ports:
- "5080:5080"
volumes:
- /data/openobserve:/data
environment:
- ZO_DATA_DIR=/data
- [email protected]
- ZO_ROOT_USER_PASSWORD=OpenObserve@123
ulimits:
nofile:
soft: 65535
hard: 65535
三、核心概念与架构
3.1 核心概念
| 概念 |
说明 |
| Organizations(组织) |
对各种流、用户、功能进行分组的逻辑实体,代表一个企业、部门或应用程序。所有资源限定在组织范围内 |
| Streams(流) |
共享相同源的事件序列,例如来自特定应用程序的日志。OpenObserve 中的流可承载日志、指标或追踪三种类型的数据 |
| Functions(函数) |
可在数据摄取和查询期间使用,通过 VRL 脚本定义,用于数据丰富、编辑、日志缩减等 |
| Parquet |
数据以列式存储格式 Parquet 存储,查询和存储效率很高 |
| Timestamp(时间戳) |
_timestamp 被视为时间戳列,支持微秒、RFC3339、RFC2822 等多种格式 |
| User Roles(用户角色) |
支持 admin 和 member 两种角色,admin 用户拥有更大权限(如添加其他用户到组织) |
💡 概念类比
- Organization ≈ 租户/命名空间,就像公司的不同业务线
- Stream ≈ 数据表,像 Elasticsearch 中的索引
- Parquet ≈ 高效的列存储格式,让查询更快、存储更省
3.2 架构概述
OpenObserve 可以在单节点下运行,也可以在集群中以高可用模式运行:
-
单节点模式(默认) :数据存储于 SQLite 和本地磁盘。适合测试和小规模场景。性能测试显示,在 Mac M2 上可达到约 31 MB/秒的处理速度,即每天处理约 2.6 TB 数据
-
高可用(HA)模式:通过 Router、Querier、Ingester、Compactor、AlertManager 等组件组成,各组件可水平扩展。元数据存储于 MySQL/PostgreSQL,数据存储于对象存储(S3、MinIO、GCS 等),集群协调使用 Etcd 或 NATS
四、数据接入
4.1 接入概览
OpenObserve 支持从多种数据源采集可观测数据,包括日志转发器、监控代理、OpenTelemetry Collector、API 以及程序化方法。
| 数据类型 |
接入方式 |
| 日志 |
HTTP API、日志转发器(Filebeat/Fluentd)、SDK |
| 指标 |
Prometheus 远程写入协议、Telegraf、OpenTelemetry Collector |
| 链路追踪 |
OpenTelemetry SDK 或 Collector |
4.2 日志接入方式
(1)通过HTTP API接入
curl -u "[email protected]:OpenObserve@123" \
-H "Content-Type: application/json" \
-X POST "http://localhost:5080/api/default/<stream_name>/_json" \
-d '[{"message": "test log entry", "level": "info"}]'
(2)通过 Fliebeat接入
Filebeat 可通过 Elasticsearch 协议将日志发送到 OpenObserve,支持配置索引映射到特定的 Stream。
(3)通过代码直接接入
可在应用程序代码中直接调用 OpenObserve 的 HTTP API 将日志推送到平台。
4.3 指标接入
OpenObserve 支持 Prometheus 的远程写入(remote_write)协议,因此可以直接将 Prometheus 采集的指标数据远程写入到 OpenObserve 中。
Prometheus 配置示例:
remote_write:
- url: http://localhost:5080/api/default/prometheus/api/v1/write
basic_auth:
username: [email][email protected][/email]
password: OpenObserve@123
4.4 链路追踪接入
使用 OpenTelemetry SDK 或 Collector 将分布式追踪数据发送到 OpenObserve。配置 OpenTelemetry Collector 的 exporter 指向 OpenObserve 的 OTLP 接收端点即可。
五、日志查询与数据探索
5.1 日志查询基础操作
在日志页面进行查询的步骤:
- 选择组织:从页面顶部的下拉菜单中选择正确的组织
- 选择日志流:使用 Stream 选择器选择一个日志流
- 设置时间范围:选择相对时间(如最近 1 小时、最近 7 天)或绝对时间范围
- 执行查询:点击 Run query 查看该时间范围内的日志
5.2 查询编辑器
OpenObserve 提供两种查询模式,可通过 SQL Mode 切换:
| 模式 |
使用场景 |
| 非 SQL 模式(默认) |
通过过滤器、函数(如 match_all)等方式查询,无需编写完整 SQL |
| SQL 模式 |
支持完整 SQL 语法,可灵活控制筛选、排序和聚合。示例:SELECT * FROM "default" WHERE k8s_namespace_name = 'openobserve' |
5.3 查询示例
以下假设 Stream 名称为 default,需要在查询时替换为实际的 Stream 名称。
全文搜索(非 SQL 模式):
# 在所有全文索引字段中搜索包含 "error" 的日志
match_all('error')
字段精确搜索:
# 仅在 log 字段中搜索 "error"(效率更高)
str_match(log, 'error')
数值筛选(非 SQL 模式):
# 状态码等于 200
code = 200
# 状态码大于 399
code > 399
SQL 模式示例:
-- 按服务筛选和按状态码筛选
SELECT * FROM "default" WHERE service = 'api' AND code >= 400
-- 排除健康检查日志
SELECT * FROM "default" WHERE NOT (endpoint = '/health')
-- 按 IP 统计请求量
SELECT ip, COUNT(*) as request_count FROM "default" GROUP BY ip ORDER BY request_count DESC LIMIT 10
六、告警配置
xxx