openobseve单节点和查询语法

2023年 8月 21日 126.7k 0

OpenObserve声称可以比Elasticsearch 它⼤约可以节省 140 倍的存储成本,同时由Rust开发的可观测性平台(⽇志、指标、追踪),它可以进行日志搜索,基于sql查询语句和搜索的日志关键字的上下周围数据,高压缩比的存储,身份验证和多租户,支持S3,miniio的高可用和集群,并且兼容elasticsearch的摄取,搜索,聚合api,计划报警和实时报警等功能。

如果只是对日志搜索引擎感兴趣,相比于Elasticsearch的和zincSearch,OpenObserve更轻量,它不依赖于数据索引,数据被压缩后存储或者使用parquet列格式存储到对象存储中,尽管如此,在分区和缓存等技术的加持下,速度也不会太慢,并且在聚合查询数据情况下,OpenObserve的速度要比es快的多。

OpenObserve的节点是无状态的,因此在水平扩展中,无需担心数据的复制损坏,他的运维工作和成本比Elasticsearch要低得多。并且OpenObserve内置的图像界面,单节点无需使用其他组件,仅仅OpenObserve就完成了存储和查询。

同时OpenObserve作为prometheus的远程存储和查看,但是对于查询语句并非全部支持,因此,我们只进行日志收集的处理,其他不进行测试。

单节点

sled单节点和本地磁盘

单节点使用本地磁盘模式,也是默认的方式,对于简单使用和测试在官方数据中,每天可以处理超过2T的数据

arch-sled-local.png

我们可以简单的理解为sled是存储的元数据的地方,本地磁盘存储的数据。

sled单机和对象存储

数据存放在对象存储后,高可用的问题交给了对象存储提供商,并且openobseve使用列式存储的方式,并且进行分区,这样的情况下就规避了一定部分因为对象存储与openobseve之间的网络延迟导致的网络问题

arch-sled-s3-16924522091369.png

etcd和对象存储

除此之外,进一步来说,元数据也需要进行有个妥善的地方存储,因此,元数据存储的etcd,meta数据存储在本地或者s3来保证数据的安全性

arch-etcd-s3.png

单机安装

在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端口

image-20230819150256677.png

当前的版本中多语言通过机器翻译,因此并不准确

log

log支持curl,filebeat,fluentbit,fluentd, vector等,并且这些提供了一定的示例

image-20230819151615288.png

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

    image-20230819155202452.png

    0820

    image-20230819155138483.png

    查询

    默认情况下,如果将要查询的数据的字段是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

    image-20230819151729025.png

    我们重组数据进行查询

    如果此时,以下字段中的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

    image-20230819155901931.png

    如果我们要查询的字段是marksugar,就不能使用match_all('marksugar'),因为match_all只能在是msg, message, log, logs中默认使用,正确的语法是:str_match(author, 'marksugar'),并且str_match的查询比match_all要快

    image-20230819160055727.png

    而对于其他的,可以直接使用key:value来, 比如: name='linuxea'

    image-20230819170430258.png

    对于这条查询,也可以使用sql语句的方式

     name='linuxea' 等于 SELECT * FROM "0819" WHERE  name='linuxea'

    image-20230819170705397.png

    参考

    基于k8s上loggie/vector/openobserve日志收集https://openobserve.ai/docs/example-queries/https://everything.curl.dev/http/post/jsonhttps://openobserve.ai/docs/ingestion/logs/curl/

    相关文章

    对接alertmanager创建钉钉卡片(1)
    手把手教你搭建OpenFalcon监控系统
    无需任何魔法即可使用 Ansible 的神奇变量“hostvars”
    openobseve HA本地单集群模式
    基于k8s上loggie/vector/openobserve日志收集
    2023 年需要学习和掌握的 30 个最佳 DevOps 工具:Git、Docker 等

    发布评论