OpenObserve(简称 O2)是一个用 Rust 开发的开源云原生可观测平台,专为日志、指标、追踪而构建,设计用于 PB 级工作。
与需要理解和调整大量配置置的 Elasticsearch 相比,它简单且易于操作。在 2 分钟内即可启动并运行 OpenObserve。对于使用 API 获取数据并执行搜索的用户来说,OpenObserve 可以无缝替代 Elasticsearch。OpenObserve 带有自己的用户界面,无需单独安装。与 Elasticsearch 相比,使用 OpenObserve 可以将日志存储成本降低约 140 倍。
与 ES 对比
在详细了解O2之前,我们需要了解一些相关概念,这些概念是O2的基础。
Organizations(组织)
组织是 OpenObserve 中对各种流、用户、功能进行分组的逻辑实体。组织可以代表一个企业、企业的一个部门或一个应用程序。所有流、用户、功能等都限定在一个组织范围内。
Streams(流)
OpenObserve 中的流是共享相同源的事件序列(日志/指标/跟踪),例如来自特定应用程序的日志或来自企业的日志。比如日志就是一种流,用于记录来自应用程序的事件。
Functions(函数)
OpenObserve 中的函数可在摄取和查询期间使用,以帮助增强高级功能,如丰富、编辑、日志缩减、合规性等。函数是使用VRL脚本定义的。
O2中的数据以parquet格式存储,这是一种列式存储格式,查询和存储效率很高。
Timestamp(时间戳)
_timestamp在 OpenObserve 中被视为时间戳列,如果_timestamp或@timestamp不存在于正在摄取的数据中,我们会将_timestamp添加到每个记录,其NOW值为微秒精度。
对于键为_timestamp/@timestamp的输入数据,对于值我们支持以下数据类型/格式:
如果用户想要支持_timestamp/@timestamp以外的键,用户可以使用ZO_COLUMN_TIMESTAMP配置来指定时间戳键。
User Roles(用户角色)
OpenObserve 中的用户可以具有admin或member角色。与具有member角色的用户相比,具有admin角色的用户拥有更大的权限,例如,具有admin角色的用户可以将其他用户添加到组织中。
OpenObserve 可以在单节点下运行,也可以在集群中以 HA 模式运行。
单节点模式也分几种架构,主要是数据存储的方式不同,主要有如下几种:
SQLite 和本地磁盘模式
如果你只需要进行简单使用和测试,或者对高可用性没有要求,可以使用此模式。当然你仍然可以在一台机器上每天处理超过 2 TB 的数据。在我们的测试中,使用默认配置,Mac M2 的处理速度为约 31 MB/秒,即每分钟处理 1.8 GB,每天处理 2.6 TB。该模式也是运行 OpenObserve 的默认模式。
SQLite本地模式
SQLite 和对象存储模式
该模式和 OpenObserve 的默认模式基本上一致,只是数据存在了对象存储中,这样可以更好的支持高可用性,因为数据不会丢失。
SQLite对象存储模式
HA 模式不支持本地磁盘存储,该模式下,OpenObserve 主要包括Router、Querier、Ingester、Compactor和AlertManager节点(组件),这些节点都可以水平扩展以适应更高的流量。另外使用 Etcd 或 NATS 用作集群协调器并存储节点信息,还用于集群事件。MySQL/PostgreSQL 用于存储组织、用户、函数、报警规则、流模式和文件列表(parquet文件的索引)等元数据。对象存储(例如 s3、minio、gcs 等)存储parquet文件的数据。
Etcd对象存储
Ingester用于接收摄取请求并将数据转换为parquet格式然后存储在对象存储中,它们在将数据传输到对象存储之前将数据临时存储在WAL中。
数据摄取流程如下所示:
Ingester Flow
Ingester 包含三部分数据:
这些数据都需要能够被查询到。
Router(路由器)将请求分发给ingester或querier,它还通过浏览器提供 UI 界面,Router 实际上就是一个非常简单的代理,用于在摄取器和查询器之间发送适当的请求。
Querier(查询器)用于查询数据,查询器节点是完全无状态的。数据查询流程如下:
Querier Flow
提示:
Compactor(压缩器)会将小文件合并成大文件,使搜索更加高效。Compactor还处理数据保留策略、full stream 删除和文件列表索引更新。
AlertManager
AlertManager运行标准报警查询、报告作业并发送通知。
由于O2用到的各个存储可选方案较多,这里我们选择使用PostgreSQL作为元数据存储,Minio作为对象存储,Nats作为集群协调器(建议使用Nats,为了向后兼容,目前仍然支持Etcd)。
接下来同样我们使用Helm来安装O2:
helm repo add openobserverepo update
官方的这个 Helm Chart 默认会部署 PostgreSQL,但是需要提前安装对应的cloudnative-pg operator:
kubectl apply --server-side -f \
然后我们就可以在 Helm Chart 中使用 PostgreSQL 了,此外为了启用Minio和Nats,我们需要在values.yaml中进行配置,修改后的values.yaml如下所示:
# o2-values.yaml# auth:#ZO_ROOT_USER_EMAIL: "root@example.com" # default user email#ZO_ROOT_USER_PASSWORD: "Complexpass#123"# default user passwordingester:headless:enabled: truepersistence:enabled: truestorageClass: "nfs-client"querier:persistence: # If enabled it will be used for disk cache. Highly recommend to enable this for productionenabled: truestorageClass: "nfs-client"service:type: NodePortnats:enabled: truecontainer:image:repository: library/natsregistry: dhub.kubesre.xyzconfig:cluster:enabled: truereplicas: 3jetstream:enabled: truefileStore:enabled: truepvc:enabled: truesize: 20GistorageClassName: "nfs-client"natsBox:container:image:registry: dhub.kubesre.xyzreloader:image:registry: dhub.kubesre.xyzminio:enabled: true # if true then minio will be deployed as part of openobservemode: standalone # or distributedpersistence:storageClass: "nfs-client"consoleService:type: NodePortnodePort: 32001# Postgres is used for storing openobserve metadata.# Make sure to install cloudnative-pg operator before enabling thispostgres:enabled: truepgadmin:enabled: falsespec:instances: 2 # creates a primary and a replica. replica will become primary if the primary failsstorage:size: 10GipvcTemplate:storageClassName: "nfs-client"
然后我们就可以安装O2了:
$ helm upgrade --install o2 openobserve/openobserve -f o2-values.yaml --namespace openobserve --create-namespaceRelease "o2" does not exist. Installing it now.NAME: o2LAST DEPLOYED: Sat Aug 24 17:29:23 2024NAMESPACE: openobserveSTATUS: deployedREVISION: 1NOTES:1. Get the application URL by running these commands:export NODE_PORT=$(kubectl get --namespace openobserve -o jsnotallow="{.spec.ports[0].nodePort}" services o2-openobserve)export NODE_IP=$(kubectl get nodes --namespace openobserve -o jsnotallow="{.items[0].status.addresses[0].address}")echo http:// $NODE_IP:$NODE_PORT
安装完成后,我们可以通过kubectl get pods -n openobserve查看所有的 Pod 是否正常运行。
$ kubectl get pods -n openobserveNAMEREADYSTATUSRESTARTSAGEo2-minio-5ff8c55559-g62551/1Running043mo2-nats-02/2Running032mo2-nats-12/2Running033mo2-nats-22/2Running033mo2-nats-box-588fb755c4-6qxl21/1Running043mo2-openobserve-alertmanager-95796f856-c6xlg1/1Running043mo2-openobserve-compactor-7f9b8cdb6b-kr8sp1/1Running031mo2-openobserve-ingester-01/1Running032mo2-openobserve-postgres-11/1Running043mo2-openobserve-postgres-21/1Running042mo2-openobserve-querier-01/1Running043mo2-openobserve-router-58dc4b8fd7-vl42p1/1Running031m$ kubectl get svc -n openobserveNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEo2-minioClusterIP10.96.2.46<none>9000/TCP43mo2-minio-consoleNodePort10.96.0.196<none>9001:32001/TCP43mo2-natsClusterIP10.96.2.18<none>4222/TCP43mo2-nats-headlessClusterIPNone<none>4222/TCP,6222/TCP,8222/TCP43mo2-openobserve-alertmanagerClusterIP10.96.1.79<none>5080/TCP,5081/TCP,5082/TCP43mo2-openobserve-compactorClusterIP10.96.0.207<none>5080/TCP,5081/TCP43mo2-openobserve-ingesterClusterIP10.96.2.154<none>5080/TCP,5081/TCP43mo2-openobserve-ingester-headlessClusterIPNone<none>5080/TCP,5081/TCP43mo2-openobserve-postgres-rClusterIP10.96.0.123<none>5432/TCP43mo2-openobserve-postgres-roClusterIP10.96.3.208<none>5432/TCP43mo2-openobserve-postgres-rwClusterIP10.96.0.165<none>5432/TCP43mo2-openobserve-querierClusterIP10.96.3.13<none>5080/TCP,5081/TCP43mo2-openobserve-routerNodePort10.96.3.228<none>5080:31984/TCP,5081:32212/TCP43m
安装完成后,我们可以通过访问O2的 Web 界面,然后就可以开始使用了。
使用默认的用户名root@example.com和密码Complexpass#123登录,然后就可以看到O2的主界面了。
因为现在我们还没有向O2中发送任何数据,所以暂时没有任何数据。我们可以切换到采集页面,里面就有各种遥测数据的采集方式。
O2 采集
这里我们可以先使用 JSON API 来加载一些示例日志数据来了解一下 OpenObserve 的基本使用方法。先使用下面命令下载示例日志数据:
$ curl -L-o k8slog_json.json.zip$ unzip k8slog_json.json.zip
然后使用下面命令将示例日志数据导入到 OpenObserve 中:
$ curl-i -u "root@example.com:Complexpass#123" -d "@k8slog_json.json"HTTP/1.1 100 ContinueHTTP/1.1 200 OKcontent-length: 71content-type: application/jsonx-api-node: o2-openobserve-ingester-0access-control-allow-credentials: truedate: Sat, 24 Aug 2024 10:31:05 GMTvary: accept-encoding{"code":200,"status":[{"name":"default","successful":3846,"failed":0}]}%
收据导入成功后,刷新页面即可看到有数据了:
OpenObserve Web
在数据流页面可以看到我们导入的数据元信息:
Stream流
然后切换到日志页面,从左侧的下拉列表中选择索引为default,就可以看到日志数据了:
现在我们就可以去根据直接的需求去查询日志了,比如要使用倒排索引搜索包含单词error的所有字段:
要在没有倒排索引的情况下搜索包含单词error的所有字段:
如果仅搜索log字段中的error,可以使用str_match(log, 'error'),这比match_all_raw更有效,因为它在单个字段中搜索。
同样如果我们要搜索包含code为 200 的所有日志条目,则可以直接使用code=200查询即可,其中code是一个数字字段。如果要搜索code字段不包含任何值的所有日志条目,可以使用code is null,但是需要注意使用code=' '不会产生正确的结果;同样的搜索code字段具有某个值的所有日志条目,则可以使用code is not null,但是不能使用code!=' '。另外也可以使用code > 399或者code >= 来搜索code大于 399 或者大于等于 的所有日志条目。
此外我们还可以勾选SQL 模式来使用 SQL 查询语句来查询日志数据:
同样现在我们可以去 Minio 中查看数据是否已经被正确的存储,使用用户名rootuser和密码rootpass123即可登录成功。
minio console
可以看到对象存储中已经有了我们的parquet文件数据。
O2还支持通过 OpenTelemetry 采集器导入数据。这里我们可以使用OpenTelemetry来采集 Kubernetes 集群的观测数据,首先我们需要安装OpenTelemetry的Operator,由于OpenTelemetry的Operator依赖cert-manager,所以我们需要先安装cert-manager:
kubectl apply -f
等待cert-manager安装完成后,我们就可以安装OpenTelemetry的Operator了:
$ kubectl get pods -n cert-managerNAMEREADYSTATUSRESTARTSAGEcert-manager-cainjector-65c7bff89d-rxjts1/1Running064scert-manager-cbcf9668d-tlz2k1/1Running064scert-manager-webhook-594cb9799b-c5sd81/1Running064s$ kubectl apply -f$ kubectl get pods -n opentelemetry-operator-systemNAMEREADYSTATUSRESTARTSAGEopentelemetry-operator-controller-manager-fd5689558-lchr72/2Running061s
然后我们就可以来安装 OpenTelemetry 的Collector了,为了方便使用 O2 官方的 Helm Chart 已经提供了一个定制的 Chart 包,我们可以直接使用它,该采集器可以:
使用我们这里安装的 O2 集群的认证信息覆盖默认的认证信息:
# o2c-values.yamlexporters:otlphttp/openobserve:endpoint:Basic cm9vdEBleGFtcGxlLmNvbTpScmtORWxpenhCWWV4Qzhr # 替换成自己的stream-name: k8s_logs # 替换成自己的数据流名称otlphttp/openobserve_k8s_events:endpoint:Basic cm9vdEBleGFtcGxlLmNvbTpScmtORWxpenhCWWV4Qzhr # 替换成自己的stream-name: k8s_eventsagent:enabled: truetolerations: # 如果需要在 master 节点上运行,需要添加这个容忍- key: "node-role.kubernetes.io/control-plane"operator: "Exists"effect: "NoSchedule"
其中endpoint地址为O2的router的 FQDN 地址,Authorization中Basic后面 的值为用户名:TOKEN的base64编码(可以在O2采集页面获取),stream-name为数据流名称。然后直接使用下面命令安装OpenTelemetry的Collector即可:
$ helm upgrade --install o2c openobserve/openobserve-collector -f o2c-values.yaml --namespace openobserve-collector --create-namespaceRelease "o2c" does not exist. Installing it now.NAME: o2cLAST DEPLOYED: Sun Aug 25 10:30:59 2024NAMESPACE: openobserve-collectorSTATUS: deployedREVISION: 1TEST SUITE: NoneNOTES:If everything proceeded without errors then your cluster is now sending logs and metrics to OpenObserve.You can add following to your pods/namespaces to auto instrument your applications to send traces:1. Java: instrumentation.opentelemetry.io/inject-java: "openobserve-collector/openobserve-java"2. NodeJS: instrumentation.opentelemetry.io/inject-nodejs: "openobserve-collector/openobserve-nodejs"3. Python: instrumentation.opentelemetry.io/inject-python: "openobserve-collector/openobserve-python"4. DotNet: instrumentation.opentelemetry.io/inject-dotnet: "openobserve-collector/openobserve-dotnet"5. Go: instrumentation.opentelemetry.io/inject-go: "openobserve-collector/openobserve-go" , instrumentation.opentelemetry.io/otel-go-auto-target-exe: "/path/to/container/executable"6. OpenTelemetry SDK environment variables only: instrumentation.opentelemetry.io/inject-sdk: "true"
我们可以查看OpenTelemetry的Collector是否正常运行:
$ kubectl get pods -n openobserve-collectorNAMEREADYSTATUSRESTARTSAGEo2c-openobserve-collector-agent-collector-46r821/1Running010mo2c-openobserve-collector-agent-collector-cbtnn1/1Running010mo2c-openobserve-collector-agent-collector-kkczz1/1Running010mo2c-openobserve-collector-gateway-collector-01/1Running010mo2c-openobserve-collector-gateway-targetallocator-59c4468dxmfts1/1Running010m
其实这里我们部署的采集器就是一个agent和一个gateway,在前面的额 OpenTelemetry 章节已经学习过了,只是这里我们是将数据导出到了O2中。
现在我们就可以去O2中查看我们的数据了,切换到数据流页面,可以看到我们的数据流已经被成功的导入了:
K8s 数据流
可以看到现在我们的数据流中已经有了k8s_logs和k8s_events两个日志数据流,分别对应我们的日志和事件数据。除此之外还有很多metrics类型的数据流,可以看到指标中的每一个标签都是一个独立的stream数据流。
我们可以切换到日志页面,选择数据流k8s_logs,就可以看到我们采集的 K8s 集群的日志数据了:
同样我们选择数据流k8s_events,就可以看到我们采集的 K8s 集群的事件数据了:
对于指标数据流,我们可以切换到
指标
页面,选择数据流k8s_metrics,就可以看到我们采集的 K8s 集群指标数据了:
K8s Metrics
左侧我们可以选择一个指标,然后就可以看到这个指标的标签列表,然后我们就可以在右侧填写 PromQL 语句来查询数据了,比如我们这里查询每个命名空间的内存使用情况,则可以使用下面的 PromQL 语句:
sum(k8s_pod_memory_usage) by (k8s_namespace_name)
查询结果如下图所示:
PromQL 查询
如果我们需要经常查询这个指标,这可以将其添加到仪表盘中,点击页面中的添加到仪表盘按钮即可,然后在仪表盘页面就可以看到我们的仪表盘了:
仪表盘
和 Grafana 类似,我们也可以编辑面板,在面板右上角点击Edit Panel,就可以进入面板编辑页面了,点击最右侧的配置按钮,就可以编辑面板了,比如我们这里可以选择图例的单位、图例的显示名称等,编辑后可以点击应用按钮预览,如果满意可以点击保存按钮保存:
编辑面板
同样我们也可以和 Grafana 一样配置一个变量,然后在面板上展示这个变量,比如我们这合理可以添加一个namespace变量,其值可以从k8s_namespace_phase这个数据流中获取,如下图所示:
变量设置
当然现在我们需要去修改下面板的 PromQL 查询语句,需要将变量namespace传入,更改成:sum(k8s_pod_memory_usage{k8s_namespace_name =~ "$namespace"}) by (k8s_namespace_name)即可:
修改PromQL
现在我们就可以在面板上通过筛选namespace变量来查看不同命名空间的内存使用情况了:
筛选面板
接下来还有链路追踪的数据,因为上面我们安装的OpenTelemetry的Collector已经自动为我们创建了自动埋点的Instrumentation对象,如下所示:
$ kubectl get instrumentation -n openobserve-collectorNAMEAGEENDPOINTSAMPLERSAMPLER ARGopenobserve-dotnet99m
可以看到上面的Instrumentation对象已经配置了端点地址、采样器和采样器参数,地址就是我们的OpenTelemetry的Collector的地址(gateway类型的),采样器是parentbased_traceidratio,参数是1,表示采样率为1。
针对上面的这些语言编写的应用,我们就可以进行自动埋点,只需要在应用的Pod中添加对应的Annotation即可:
这里我们可以部署一个微服务 HOT Commerce 来演示在 Kubernetes 环境中如何使用 OpenTelemetry Operator 进行自动埋点,并将数据发送到 OpenObserve 中。
这个应用包含 5 个简单的微服务,每个微服务都是用不同的编程语言编写的:
/-> review (python)/frontend (go) -> shop (nodejs) -> product (java)\\-> price (dotnet)
该应用对应的 Kubernetes 资源清单文件如下:
# hotcommerce.yamlapiVersion: v1kind: Servicemetadata:name: pricenamespace: hotcommercespec:selector:app: priceports:- protocol: TCPport: 80targetPort: 80---apiVersion: apps/v1kind: Deploymentmetadata:name: pricenamespace: hotcommercespec:replicas: 1selector:matchLabels:app: pricetemplate:metadata:labels:app: priceannotations:instrumentation.opentelemetry.io/inject-dotnet: "openobserve-collector/openobserve-dotnet"spec:containers:- name: priceimage: public.ecr.aws/zinclabs/sample-price-service-dotnet:3imagePullPolicy: Alwaysports:- containerPort: 80resources:limits:cpu: "1"memory: "544Mi"requests:cpu: "100m"memory: "448Mi"---apiVersion: v1kind: Servicemetadata:name: reviewnamespace: hotcommercespec:selector:app: reviewports:- protocol: TCPport: 80targetPort: 8004---apiVersion: apps/v1kind: Deploymentmetadata:name: reviewnamespace: hotcommercespec:replicas: 1selector:matchLabels:app: reviewtemplate:metadata:labels:app: reviewannotations:instrumentation.opentelemetry.io/inject-python: "openobserve-collector/openobserve-python"spec:containers:- name: reviewimage: public.ecr.aws/zinclabs/sample-review-service:51imagePullPolicy: Alwaysports:- containerPort: 8004resources:limits:cpu: "1"memory: "544Mi"requests:cpu: "100m"memory: "448Mi"---apiVersion: v1kind: Servicemetadata:name: productnamespace: hotcommercespec:selector:app: productports:- protocol: TCPport: 80targetPort: 8003---apiVersion: apps/v1kind: Deploymentmetadata:name: productnamespace: hotcommercespec:replicas: 1selector:matchLabels:app: producttemplate:metadata:labels:app: productannotations:instrumentation.opentelemetry.io/inject-java: "openobserve-collector/openobserve-java"spec:containers:- name: productimage: public.ecr.aws/zinclabs/sample-product-service-java:53imagePullPolicy: Alwaysenv:- name: REVIEW_SERVICE_URLvalue: "http://review.hotcommerce.svc.cluster.local"- name: PRICE_SERVICE_URLvalue: "http://price.hotcommerce.svc.cluster.local"ports:- containerPort: 8003resources:limits:cpu: "1"memory: "1048Mi"requests:cpu: "100m"memory: "1048Mi"---apiVersion: v1kind: Servicemetadata:name: shopnamespace: hotcommercespec:selector:app: shopports:- protocol: TCPport: 80targetPort: 8002---apiVersion: apps/v1kind: Deploymentmetadata:name: shopnamespace: hotcommercespec:replicas: 1selector:matchLabels:app: shoptemplate:metadata:labels:app: shopannotations:instrumentation.opentelemetry.io/inject-nodejs: "openobserve-collector/openobserve-nodejs"spec:containers:- name: shopimage: public.ecr.aws/zinclabs/sample-shop-service-nodejs:51imagePullPolicy: Alwaysenv:- name: PRODUCT_SERVICE_URLvalue: "http://product.hotcommerce.svc.cluster.local"ports:- containerPort: 8002resources:limits:cpu: "1"memory: "544Mi"requests:cpu: "100m"memory: "448Mi"---apiVersion: v1kind: Servicemetadata:name: frontendnamespace: hotcommercespec:type: NodePortselector:app: frontendports:- protocol: TCPport: 80targetPort: 8001---apiVersion: apps/v1kind: Deploymentmetadata:name: frontendnamespace: hotcommercespec:replicas: 1selector:matchLabels:app: frontendtemplate:metadata:labels:app: frontendannotations:instrumentation.opentelemetry.io/inject-go: "openobserve-collector/openobserve-go"instrumentation.opentelemetry.io/otel-go-auto-target-exe: "/app"spec:containers:- name: frontendimage: public.ecr.aws/zinclabs/sample-frontend-service-go:51imagePullPolicy: Alwaysenv:- name: SHOP_SERVICE_URLvalue: "http://shop.hotcommerce.svc.cluster.local"ports:- containerPort: 8001resources:limits:cpu: "1"memory: "543Mi"requests:cpu: "100m"memory: "438Mi"
注意上面的每个 Deployment 应用中,我们都添加了对应的instrumentation.opentelemetry.io/inject-xxx的Annotation,这样就可以实现自动埋点了。
直接使用下面命令部署 HOT Commerce 应用即可:
kubectl create ns hotcommercekubectl apply -f hotcommerce.yaml
部署完成后,我们先查看所有的服务是否正常运行:
$ kubectl get pods -n hotcommerceNAMEREADYSTATUSRESTARTSAGEfrontend-57c47854f7-8cwbp1/1Running06m56sprice-5d99b949b8-gzqr61/1Running06m56sproduct-85f94894f-7s8hw1/1Running06m56sreview-98bc7596f-ptbhk1/1Running06m57sshop-966895886-hgpxt1/1Running06m56s$ kubectl get svc -n hotcommerceNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGEfrontendNodePort10.96.3.25<none>80:30826/TCP4m42spriceClusterIP10.96.1.147<none>80/TCP4m43sproductClusterIP10.96.3.134<none>80/TCP4m42sreviewClusterIP10.96.1.22<none>80/TCP4m43sshopClusterIP10.96.2.4<none>80/TCP4m42s
我们可以通过访问frontend服务了,当我们访问frontend服务时,OpenTelemetry会自动为我们的应用程序生成链路追踪数据,并将其发送到 OpenTelemetry Collector,然后 Collector 会将数据发送到 OpenObserve 中。
$ curl{"description":"This is a sample product.","id":1,"in_stock":10,"name":"Sample Product","price":100,"rating":5,"review":"This is a great product!","warehouse_location":"A1-B2"}
然后我们就可以在O2中查看到有traces类型的数据流了。切换到追踪页面,就可以看到我们采集到的链路追踪数据了:
点击一个 Trace ID,就可以查看这个链路追踪的详细信息了:
Trace Detail
这里我们可以看到这个链路追踪的详细信息,包括每个服务的调用时间、调用耗时、调用结果等信息。
到这里我们就实现了在 OpenObserve 中查看我们的 K8s 集群的观测数据,当然同样的对于非 K8s 集群的应用也可以直接将数据采集到 OpenObserve 中,比如 Fluentd、Vector、Prometheus、OpenTelemetry Collector 等。
本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载者并注明出处:https://jmbhsh.com/shumazixun/36398.html