saotolls 发表于 2026-6-5 11:58:00

OpenOBServe部署与使用

# 一、认识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快速部署
**基础启动命令**
```bash
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
```
**带数据持久化的生产部署**(推荐):
```bash
# 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,输入启动时配置的管理员邮箱和密码即可登录。
> ⚠️ **部署避坑指南**:
> 1. **管理员账号必须配置**:OpenObserve 在启动时**必须初始化管理员账号**,否则服务会直接退出
> 2. **线程创建失败**:如遇到 `OS can't spawn worker thread: Operation not permitted` 错误,请添加 `--security-opt seccomp=unconfined` 参数
> 3. **资源预留**:建议 8GB 以上内存,避免 OOM
> 3. **数据持久化**:生产环境务必挂载数据卷,否则容器重启后数据会丢失

## 2.4 Docker Compose 部署(可选)
```yaml
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)通过HTTPAPI接入**
```bash
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 配置示例:**
```yaml
remote_write:
- url: http://localhost:5080/api/default/prometheus/api/v1/write
    basic_auth:
      username: [email protected]
      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 模式)**:
```text
# 在所有全文索引字段中搜索包含 "error" 的日志
match_all('error')
```

**字段精确搜索**:
```text
# 仅在 log 字段中搜索 "error"(效率更高)
str_match(log, 'error')
```

**数值筛选(非 SQL 模式)**:
```text
# 状态码等于 200
code = 200

# 状态码大于 399
code > 399
```

**SQL 模式示例**:
```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
页: [1]
查看完整版本: OpenOBServe部署与使用