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

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

前面我们讲到了 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: NodePort

上面的资源清单文件中,我们使用了 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   37s

部署后我们依然可以使用 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)

在指标页面查询数据的时候我们还可以将查询结果保存为 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)

我们只需要将 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] # 处理器

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

如下图所示,我们可以在 OpenObserve 的 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"
}

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

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 100

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

Slack

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

实时报警

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

责任编辑:姜华 来源: k8s技术圈
相关推荐

2022-05-23 08:23:24

链路追踪SleuthSpring

2022-05-25 08:23:32

ZipKinTwitter开源项目

2023-10-16 23:43:52

云原生可观测性

2022-07-22 07:59:17

日志方案

2023-01-30 22:34:44

Node.js前端

2023-08-24 22:13:31

2020-12-16 09:24:18

Skywalking分布式链路追踪

2024-06-07 13:04:31

2022-05-19 13:33:39

系统客户端链路追踪

2022-09-15 10:03:42

Jaeger分布式追踪系统

2024-01-26 07:49:49

Go分布式链路

2021-02-22 07:58:51

分布式链路追踪

2020-09-11 09:44:04

微服务分布式链路

2024-08-21 08:09:17

2022-01-05 08:27:17

C++全链路追踪

2024-08-28 11:34:37

2024-07-09 08:11:56

2023-11-21 08:25:09

2022-12-05 19:15:12

得物云原生全链路

2024-09-06 12:24:19

点赞
收藏

51CTO技术栈公众号