欢迎来到思维库

思维库

OpenObserve 指标和链路追踪方面的支持

时间:2025-11-05 09:35:17 出处:域名阅读(143)

前面我们讲到了 OpenObserve 的指追踪基本使用,使用 Fluentd 将日志采集后输出到了 OpenObserve,标和此外 OpenObserve 还支持指标和链路追踪。链路

指标

OpenObserve 除了支持日志之外,指追踪也支持指标数据的标和摄取,它支持 Prometheus 的链路远程写入协议,这样我们就可以直接将 Prometheus 的指追踪数据远程写入到 OpenObserve 中了。

下面的标和资源清单就是一个简单的 Prometheus 示例,我们使用 node_exporter 来采集节点的链路指标数据,然后通过 Prometheus 将其远程写入到 OpenObserve 中:

复制# prometheus.yaml apiVersion: v1 kind: ConfigMap metadata: name: prometheus-config namespace: openobserve data: prometheus.yaml: | global: scrape_interval: 15s scrape_timeout: 15s remote_write: # 写入到远程 OO,指追踪url 是标和远程写入接口地址 - url: http://openobserve.openobserve.svc.cluster.local:5080/api/default/prometheus/api/v1/write basic_auth: username: root@example.com password: root321 # queue_config: # 如果 Prometheus 抓取指标很大,可以加调整 queue,链路但是指追踪会提高内存占用 # max_samples_per_send: 10000 # 每次发送的最大样本数 # capacity: 20000 # max_shards: 30 # 最大分片数,即并发量。标和 scrape_configs: - job_name: "nodes" static_configs: - targets: [10.206.16.6:9100,链路 10.206.16.5:9100, 10.206.16.10:9100] relabel_configs: # 通过 relabeling 从 __address__ 中提取 IP 信息,为了后面验证 VM 是否兼容 relabeling - source_labels: [__address__] regex: "(.*):(.*)" replacement: "${1}" target_label: ip action: replace --- apiVersion: apps/v1 kind: Deployment metadata: name: prometheus namespace: openobserve spec: selector: matchLabels: app: prometheus template: metadata: labels: app: prometheus spec: containers: - args: - --config.file=/etc/prometheus/prometheus.yaml - --storage.tsdb.path=/prometheus - --storage.tsdb.retention.time=4h - --web.enable-lifecycle image: prom/prometheus:v2.44.0 imagePullPolicy: IfNotPresent name: prometheus ports: - containerPort: 9090 name: http protocol: TCP securityContext: runAsUser: 0 volumeMounts: - mountPath: /etc/prometheus name: config-volume - mountPath: /prometheus name: data volumes: - name: data emptyDir: {} - configMap: defaultMode: 420 name: prometheus-config name: config-volume --- apiVersion: v1 kind: Service metadata: name: prometheus namespace: openobserve spec: ports: - name: http port: 9090 targetPort: 9090 selector: app: prometheus type: NodePort1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.

上面的资源清单文件中,我们使用了 Prometheus 的 remote_write 配置项来将数据远程写入到 OpenObserve 中,其中 url 参数指定了远程写入接口地址,username 和 password 参数指定了管理员的邮箱和密码。企商汇

直接应用上面的资源清单文件即可:

复制$ kubectl apply -f prometheus.yaml $ kubectl get pods -n openobserve NAME READY STATUS RESTARTS AGE openobserve-0 1/1 Running 0 2d18h prometheus-756c8c78f5-kvvbl 1/1 Running 0 20s $ kubectl get svc -n openobserve NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE openobserve ClusterIP None <none> 5080/TCP 2d18h prometheus NodePort 10.107.32.131 <none> 9090:31019/TCP 37s1.2.3.4.5.6.7.8.9.

部署后我们依然可以使用 Prometheus 的 UI 界面来查看指标数据:

Prometheus UI

正常现在 Prometheus 的指标数据就会被写入到 OpenObserve 中了,我们可以在 OpenObserve 的 UI 界面中查看该指标流:

Prometheus stream

可以看到 OpenObserve 中是将每个指标看成一个独立的 stream 流来进行管理的,这样无疑大大增加了对指标数据管理的灵活性,但要想针对某个 job 进行管理难度也就大大增加了。现在我们就可以在 OpenObserve 的 UI 界面中查看指标数据了,比如查询 node_load5 指标:

load5

可以和 Prometheus 中的查询结果进行对比:

load5

从图形中可以看到 OpenObserve 的查询结果和 Prometheus 的查询结果是一致的。但是目前 OpenObserve 的 UI 界面中支持的 promql 语法还比较有限,比如不支持向量运算等操作(本周发布的版本即将支持了)。

不支持

此外我们也可以使用 SQL 语法来查询指标数据,比如查询node_load5指标:

sql

除了使用 Prometheus 的远程写入方式之外,OpenObserve 还支持通过 OpenTelemetry Collector(后面会讲解)来写入指标数据,只需要在 exporters 中配置 prometheusremotewrite 即可,如下所示配置:

复制exporters: prometheusremotewrite: endpoint: "http://<oo-url>/api/org_name/prometheus/api/v1/write" headers: Authorization: Basic base64_encoded_data_of(userid:password)1.2.3.4.5.

在指标页面查询数据的时候我们还可以将查询结果保存为 Dashboard:

Add Dashboard

在 Dashboard 里面还可以添加变量,站群服务器比如我们这里添加一个变量 instance:

Add var

然后编辑 Panel,将查询语句中的 instance 替换成 $instance:

编辑面板

然后就可以在 Dashboard 中选择不同的 instance 来查看不同的指标数据了:

筛选节点

链路追踪

OpenObserve 除了支持日志和指标之外,还支持链路追踪,OpenObserve 遵循 OpenTelemetry 的追踪标准,我们可以使用通过 OpenTelemetry SDK 检测的代码将 Trace 数据发送到 OpenObserve,或通过自动检测将跟踪发送到 OpenObserve。

下面是一个集成 OpenTelemetry SDK 的 Python 示例,代码位于 git clone https://github.com/openobserve/sample-tracing-python:

复制from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.resources import SERVICE_NAME, Resource from opentelemetry.sdk.trace.export import BatchSpanProcessor from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter # Service name is required for most backends resource = Resource(attributes={ SERVICE_NAME: "python-service" }) # create a tracer provider tracer_provider = TracerProvider(resource=resource) # create an OTLP trace exporter url = HTTP_Endpoint headers = {"Authorization": "Authorization"} exporter = OTLPSpanExporter(endpoint=url, headers=headers) # create a span processor to send spans to the exporter span_processor = BatchSpanProcessor(exporter) # add the span processor to the tracer provider tracer_provider.add_span_processor(span_processor) # set the tracer provider as the global provider trace.set_tracer_provider(tracer_provider)1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.

我们只需要将 HTTP_Endpoint 和 Authorization 替换成 OpenObserve 的地址和管理员的认证信息即可。其中地址为 https://url:5080/api/<orgname>/traces,Authorization 为 Basic base64(userid:password)。然后运行上面的代码即可将 Trace 数据发送到 OpenObserve 中。

除此之外 OpenObserve 还支持通过 OpenTelemetry Collector 来收集链路追踪数据,只需要在 OpenTelemetry Collector 的配置文件中配置otlp输出即可,如下所示:

复制# ...... exporters: # 导出器,用于导出数据 jaeger: endpoint: "jaeger:14250" # 使用 jaeger 容器名称 tls: insecure: true # 不使用 TLS # Data sources: traces, metrics otlphttp: traces_endpoint: http://url:5080/api/<orgname>/traces # OpenObserve 的接口地址,这里要用 traces_endpoint headers: Authorization: Basic base64(userid:password) # 管理员的认证信息 service: # 服务配置 pipelines: # 管道配置 traces: # 链路追踪配置 receivers: [otlp] # 接收器 exporters: [otlphttp] # 导出器 processors: [batch] # 处理器1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.

然后我们在应用中只需要通过 OpenTelemetry SDK 配置 OTLPTraceExporter 地址为 OpenTelemetry Collector 的地址即可,正常链路追踪数据就可以被收集到 OpenObserve 中去了。

如下图所示,我们可以在 OpenObserve 的WordPress模板 UI 界面中查看链路追踪数据:

traces

点击某个 Trace 可以查看详细信息:

trace detail

关于如何使用 OpenTelemetry 来生成并收集 Traces 数据、OpenTelemetry Collector 的部署等知识点我们后面会详细讲解。

报警

OpenObserve 支持两种警报方式,针对指定流进行评估:

计划报警实时报警

要使用报警我们首先需要创建一个报警模板,当发送警报通知时使用模板,模板构建发送到目的地的请求正文,例如。对于 slack,可以创建如下模板:

复制{ "text": "For stream {stream_name} of organization {org_name} alert {alert_name} of type {alert_type} is active" }1.2.3.

在报警页面先添加一个报警模板,如下所示:

Add Template

发送通知时,OpenObserve 会将 {stream_name}、{org_name} 等占位符替换为 stream、alert、organization 的实际值。可以在模板中使用的变量有:

变量

描述

stream_name

流名称

报警创建的流名称

org_name

组织名

组织名称

alert_name

报警名

报警名称

alert_type

报警类型

可以取的值 : real time 或者 scheduled

然后接下来需要创建一个 Destinations 目的地,用于发送警报通知,创建后可以在多个报警中使用。

比如我们这里创建一个 Slack 目的地,用于发送警报通知,如下所示:

Add Destination

最后我们就可以创建一个报警了,如下所示:

Add Alert

这里我们添加了一个计划报警,当 K8sLogs 日志流在 1 分钟内的日志数量大于 50 条时就会触发报警,然后发送到 Slack 目的地中,需要注意的是这里查询语句最终会加上时间范围进行过滤,比如我们这里的查询语句在执行的时候实际执行的语句如下所示:

复制select count(*) as echocnt FROM K8sLogs WHERE (_timestamp >= 1691488182902275 AND _timestamp < 1691488242902275) LIMIT 1001.

正常情况下我们可以在 Slack 中看到报警信息:

Slack

另外对于实时报警是根据指定的条件在摄取时进行评估:

实时报警

除此之外 OpenObserve 还支持函数功能,使用的是 Vector Remap Language (vrl)(https://vector.dev/docs/reference/vrl/) 定义的,可以在数据摄取或查询期间用于帮助实现高级功能,例如增强、遮蔽、日志减少、合规性等。还有内置的查询函数,如 match_all 和 match_all_ignore_case 等,可用于根据用户的流设置或默认设置进行全文搜索,这些高级功能可以关注后续文章。

分享到:

上一篇:HTCE8(探索HTCE8的卓越功能和令人惊叹的设计)

下一篇:你可能会有很多理由想要把一个应用、一个用户或者一个环境与你的 linux 系统隔离开来。不同的操作系统有不同的实现方式,而在 linux 中,一个典型的方式就是 chroot 环境。在这份教程中,我会一步一步指导你怎么使用 chroot 命令去配置一个与真实系统分离出来的独立环境。这个功能主要可以用于测试项目,以下这些步骤都在 Ubuntu 14.04 虚拟专用服务器(VPS)上执行。学会快速搭建一个简单的 chroot 环境是一项非常实用的技能,绝大多数系统管理员都能从中受益。Chroot 环境一个 chroot 环境就是通过系统调用,将一个本地目录临时变成根目录。一般所说的系统根目录就是挂载点/,然而使用 chroot 命令后,你可以使用其它目录作为根目录。原则上,任何运行在 chroot 环境内的应用都不能访问系统中其他信息(LCTT译注:使用 chroot 把一个目录变成根目录,在里面运行的应用只能访问本目录内的文件,无法访问到目录外的文件。然而,运行在 chroot 环境的应用可以通过 sysfs 文件系统访问到环境外的信息,所以,这里有个“原则上”的修饰语)。Chroot 环境的用处         测试一个不稳定的应用服务不会影响到整个主机系统。         就算使用 root 权限做了些不当的操作,把 chroot 环境搞得一塌糊涂,也不会影响到主机系统。         可以在你的系统中运行另外一个操作系统。举个例子,你可以在 chroot 环境中编译、安装、测试软件,而不去动真实的系统。你也可以在64位环境下使用 chroot 创建一个32位环境,然后运行一个32位的程序(LCTT泽注:假如你的真实环境是32位的,那就不能 chroot 一个64位的环境了)。但是为了安全考虑,chroot 环境为非特权用户设立了非常严格的限制,而不是提供完整的安全策略。假如你需要的是有完善的安全策略的隔离方案,可以考虑下 LXC、Docker、vservers等等。Debootstrap 和 Schroot使用 chroot 环境需要安装 debootstrap 和 schroot,这两个软件都在 Ubuntu 的镜像源中。其中 schroot 用于创建 chroot 环境。Debootstrap 可以让你通过镜像源安装任何 Debian(或基于 Debian 的)系统,装好的系统会包含最基本的命令。Schroot 命令允许用户使用相同的机制去创建 chroot 环境,但在访问 chroot 环境时会做些权限检查,并且会允许用户做些额外的自动设置,比如挂载一些文件系统。在 Ubuntu 14.04 LTS 上,我们可以通过两步来实现这个功能:1. 安装软件包第一步,在Ubuntu 14.04 LTS 主机系统上安装 debootstrap 和 schroot:复制代码代码如下:$ sudo apt-get install debootstrap $ sudo apt-get install schroot2. 配置 Schroot现在我们有工具在手,需要指定一个目录作为我们的 chroot 环境。这里创建一个目录先:复制代码代码如下:sudo mkdir /linoxide编辑 schroot 的配置文件:复制代码代码如下:sudo nano /etc/schroot/schroot.conf再提醒一下,我们现在是在 Ubuntu 14.04 LTS 系统上。假如我们想测试一个软件包能不能在 Ubuntu 13.10(代号是“Saucy Salamander”) 上运行,就可以在配置文件中添加下面的内容:复制代码代码如下: [saucy] description=Ubuntu Saucy location=/linoxide priority=3 users=arun root-groups=root 根据你的系统要求,调整上面的配置信息。3. 使用 debootstrap 安装32位 Ubuntu 系统Debootstrap 命令会在你的 chroot 环境里面下载安装一个最小系统。只要你能访问镜像源,你就可以安装任何基于 Debian 的系统版本。前面我们已经创建了 /linoxide 目录用于放置 chroot 环境,现在我们可以在这个目录里面运行 debootstrap 了:复制代码代码如下:cd /linoxide sudo debootstrap --variant=buildd --arch amd64 saucy /linoxide/ http://archive.ubuntu.com/ubuntu/ sudo chroot /linoxide /debootstrap/debootstrap --second-stage你可以将 --arch 的参数换成 i386 或其他架构,只要存在这种架构的镜像源。你也可以把镜像源 http://archive.ubuntu.com/ubuntu/ 换成离你最近的镜像源,具体可参考 Ubuntu 官方镜像主页。注意:假如你是在64位系统中创建32位系统,你需要在上面第3行命令中加入 --foreign 选项,就像下面的命令:复制代码代码如下:sudo debootstrap --variant=buildd --foreign --arch i386 saucy /linoxide/ http://archive.ubuntu.com/ubuntu/下载需要一段时间,看你网络带宽性能。最小系统大概有500M。4. 完成 chroot 环境安装完系统后,我们需要做一些收尾工作,确保系统运行正常。首先,保证主机的 fstab 程序能意识到 chroot 环境的存在:复制代码代码如下: sudo nano /etc/fstab在文件最后面添加下面的配置:复制代码代码如下:proc /linoxide/proc proc defaults 0 0 sysfs /linoxide/sys sysfs defaults 0 0保存并关闭文件。挂载一些文件系统到 chroot 环境:复制代码代码如下:$ sudo mount proc /linoxide/proc -t proc $ sudo mount sysfs /linoxide/sys -t sysfs复制 /etc/hosts 文件到 chroot 环境,这样 chroot 环境就可以使用网络了:复制代码代码如下:$ sudo cp /etc/hosts /linoxide/etc/hosts最后使用 schroot -l 命令列出系统上所有的 chroot 环境:复制代码代码如下:$ schroot -l使用下面的命令进入 chroot 环境:复制代码代码如下:$ sudo chroot /linoxide/ /bin/bash测试安装的版本:复制代码代码如下:# lsb_release -a # uname -a为了在 chroot 环境中使用图形界面,你需要设置 DISPLAY 环境变量:复制代码代码如下:$ DISPLAY=:0.0 ./apps目前为止,我已经成功地在 Ubuntu 14.04 LTS 上安装了 Ubuntu 13.10。退出 chroot 环境:复制代码代码如下:# exit清理一下,卸载文件系统:复制代码代码如下:$ sudo umount /test/proc $ sudo umount /test/sys

温馨提示:以上内容和图片整理于网络,仅供参考,希望对您有帮助!如有侵权行为请联系删除!

友情链接: