OpenObserve声称可以比Elasticsearch 它⼤约可以节省 140 倍的存储成本,同时由Rust开发的可观测性平台(⽇志、指标、追踪),它可以进行日志搜索,基于sql查询语句和搜索的日志关键字的上下周围数据,高压缩比的存储,身份验证和多租户,支持S3,miniio的高可用和集群,并且兼容elasticsearch的摄取,搜索,聚合api,计划报警和实时报警等功能。
如果只是对日志搜索引擎感兴趣,相比于Elasticsearch的和zincSearch,OpenObserve更轻量,它不依赖于数据索引,数据被压缩后存储或者使用parquet列格式存储到对象存储中,尽管如此,在分区和缓存等技术的加持下,速度也不会太慢,并且在聚合查询数据情况下,OpenObserve的速度要比es快的多。
OpenObserve的节点是无状态的,因此在水平扩展中,无需担心数据的复制损坏,他的运维工作和成本比Elasticsearch要低得多。并且OpenObserve内置的图像界面,单节点无需使用其他组件,仅仅OpenObserve就完成了存储和查询。
同时OpenObserve作为prometheus的远程存储和查看,但是对于查询语句并非全部支持,因此,我们只进行日志收集的处理,其他不进行测试。
单节点
sled单节点和本地磁盘
单节点使用本地磁盘模式,也是默认的方式,对于简单使用和测试在官方数据中,每天可以处理超过2T的数据
我们可以简单的理解为sled是存储的元数据的地方,本地磁盘存储的数据。
sled单机和对象存储
数据存放在对象存储后,高可用的问题交给了对象存储提供商,并且openobseve使用列式存储的方式,并且进行分区,这样的情况下就规避了一定部分因为对象存储与openobseve之间的网络延迟导致的网络问题
etcd和对象存储
除此之外,进一步来说,元数据也需要进行有个妥善的地方存储,因此,元数据存储的etcd,meta数据存储在本地或者s3来保证数据的安全性
单机安装
在k8s的用户可以参考官方的deploy文件, 而使用docker-compose我们需要指定三个环境变量,分别是数据的存储目录,用户名和密码
- ZO_DATA_DIR=/data
- ZO_ROOT_USER_EMAIL=root@example.com
- ZO_ROOT_USER_PASSWORD=Complexpass#123
如下
version: "2.2"
services:
openobserve:
container_name: openobserve
restart: always
image: public.ecr.aws/zinclabs/openobserve:latest
ports:
- "5080:5080"
volumes:
- /etc/localtime:/etc/localtime:ro # 时区2
- /data/openobserve:/data
environment:
- ZO_DATA_DIR=/data
- ZO_ROOT_USER_EMAIL=root@example.com
- ZO_ROOT_USER_PASSWORD=Complexpass#123
logging:
driver: "json-file"
options:
max-size: "100M"
mem_limit: 4096m
而后我们直接打开映射的5080端口
当前的版本中多语言通过机器翻译,因此并不准确
log
log支持curl,filebeat,fluentbit,fluentd, vector等,并且这些提供了一定的示例
curl
curl在低版本中,我们需要-d指定文件最快,如果你的版本在7.82,那么可以使用--json指定,参考官方文档
1.创建一个linuxea的组,组下创建一个名为0819的分区,在0819中写入'[{"author":"marksugar"}]'
[root@Node-172_16_100_151 /data/openObserve]# curl http://172.16.100.151:5080/api/linuxea/0819/_json -i -u 'root@example.com:Complexpass#123' -d '[{"author":"marksugar"}]'
HTTP/1.1 200 OK
content-length: 65
content-type: application/json
vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
date: Sat, 19 Aug 2023 07:43:15 GMT
{"code":200,"status":[{"name":"0819","successful":1,"failed":0}]}
cat > linuxea.json << LOF
[{
"name": "linuxea",
"web": "www.linuxea.com",
"time": "2023-08-19",
"log": "2023-08-18 09:04:01 Info Super Saiyan , this is a normal phenomenon",
"info": "this is test"
}]
LOF
接着也添加到linuxea/0819
curl http://172.16.100.151:5080/api/linuxea/0819/_json -i -u 'root@example.com:Complexpass#123' --data-binary "@linuxea.json"
如:
[root@Node-172_16_100_151 /data/openObserve]# cat > linuxea.json << LOF
> [{
> "name": "linuxea",
> "web": "www.linuxea.com",
> "time": "2023-08-19",
> "log": "2023-08-18 09:04:01 Info Super Saiyan , this is a normal phenomenon",
> "info": "this is test"
> }]
> LOF
[root@Node-172_16_100_151 /data/openObserve]# curl http://172.16.100.151:5080/api/linuxea/0819/_json -i -u 'root@example.com:Complexpass#123' --data-binary "@linuxea.json"
HTTP/1.1 200 OK
content-length: 65
content-type: application/json
vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
date: Sat, 19 Aug 2023 07:46:37 GMT
{"code":200,"status":[{"name":"0819","successful":1,"failed":0}]}
3, 在linuxea组下创建一个0820的分区写入不同的数据
curl http://172.16.100.151:5080/api/linuxea/0820/_json -i -u 'root@example.com:Complexpass#123' -d '[{"author":"marksugar","name":"www.linuxea.com"}]'
如下:
[root@Node-172_16_100_151 /data/openObserve]# curl http://172.16.100.151:5080/api/linuxea/0820/_json -i -u 'root@example.com:Complexpass#123' -d '[{"author":"marksugar","name":"www.linuxea.com"}]'
HTTP/1.1 200 OK
content-length: 65
content-type: application/json
vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
date: Sat, 19 Aug 2023 07:47:45 GMT
{"code":200,"status":[{"name":"0820","successful":1,"failed":0}]}
接着 ,我们回到界面查看数据的插入情况
0819
0820
查询
默认情况下,如果将要查询的数据的字段是msg, message, log, logs,可以使用match_all('error')
,match_all('error')
是说匹配所有的error,但前提是msg, message, log, logs的字段内
如果不是msg, message, log, logs的,比如是body,我们可以使用str_match(body, 'error')
当然,这也可以使用str_match(log, 'error')
来进行查询
其他更多用法,参考example-queries
我们重组数据进行查询
如果此时,以下字段中的log中包含了我们需要的数据,那么我们就可以使用match_all
cat > linuxea.json << LOF
[{
"name": "linuxea",
"web": "www.linuxea.com",
"time": "2023-08-19",
"log": "2023-08-18 09:04:01 Info Super Saiyan , this is a normal phenomenon linuxea",
"info": "this is test",
"author":"marksugar",
}]
LOF
比如,我们查询的关键字是linuxea
如果我们要查询的字段是marksugar,就不能使用match_all('marksugar'),因为match_all只能在是msg, message, log, logs中默认使用,正确的语法是:str_match(author, 'marksugar')
,并且str_match的查询比match_all要快
而对于其他的,可以直接使用key:value来, 比如: name='linuxea'
对于这条查询,也可以使用sql语句的方式
name='linuxea' 等于 SELECT * FROM "0819" WHERE name='linuxea'
参考
基于k8s上loggie/vector/openobserve日志收集https://openobserve.ai/docs/example-queries/https://everything.curl.dev/http/post/jsonhttps://openobserve.ai/docs/ingestion/logs/curl/