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

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

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

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 界面来查看指标数据:

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

Prometheus UI

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

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

Prometheus stream

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

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

load5

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

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

load5

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

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

不支持

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

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

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:

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

Add Dashboard

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

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

Add var

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

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

编辑面板

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

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

筛选节点

链路追踪

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 界面中查看链路追踪数据:

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

traces

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

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

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"
}

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

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

Add Template

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

变量

描述

stream_name

流名称

报警创建的流名称

org_name

组织名

组织名称

alert_name

报警名

报警名称

alert_type

报警类型

可以取的值 : real time 或者 scheduled

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

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

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

Add Destination

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

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

Add Alert

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

select count(*) as echocnt FROM 'K8sLogs' WHERE (_timestamp >= 1691488182902275 AND _timestamp < 1691488242902275)  LIMIT 100

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

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

Slack

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

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

实时报警

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

©本文为清一色官方代发,观点仅代表作者本人,与清一色无关。清一色对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。本文不作为投资理财建议,请读者仅作参考,并请自行承担全部责任。文中部分文字/图片/视频/音频等来源于网络,如侵犯到著作权人的权利,请与我们联系(微信/QQ:1074760229)。转载请注明出处:清一色财经

(0)
打赏 微信扫码打赏 微信扫码打赏 支付宝扫码打赏 支付宝扫码打赏
清一色的头像清一色管理团队
上一篇 2023年8月10日 00:38
下一篇 2023年8月10日 00:38

相关推荐

发表评论

登录后才能评论

联系我们

在线咨询:1643011589-QQbutton

手机:13798586780

QQ/微信:1074760229

QQ群:551893940

工作时间:工作日9:00-18:00,节假日休息

关注微信