挺好用的! 讲真 OpenObserve

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 等。

您可能还会对下面的文章感兴趣: