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

WilliamGates
发布于 2023-11-22 14:52
浏览
0收藏

​前面我们讲到了 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 的指标数据就会被写入到 OpenObserve 中了,我们可以在 OpenObserve 的 UI 界面中查看该指标流:

OpenObserve 指标和链路追踪方面的支持-鸿蒙开发者社区

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

OpenObserve 指标和链路追踪方面的支持-鸿蒙开发者社区

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

OpenObserve 指标和链路追踪方面的支持-鸿蒙开发者社区

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

OpenObserve 指标和链路追踪方面的支持-鸿蒙开发者社区

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

OpenObserve 指标和链路追踪方面的支持-鸿蒙开发者社区

除了使用 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 指标和链路追踪方面的支持-鸿蒙开发者社区

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

OpenObserve 指标和链路追踪方面的支持-鸿蒙开发者社区

然后编辑 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 指标和链路追踪方面的支持-鸿蒙开发者社区

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

OpenObserve 指标和链路追踪方面的支持-鸿蒙开发者社区

关于如何使用 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 指标和链路追踪方面的支持-鸿蒙开发者社区

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

变量

描述

stream_name

流名称

报警创建的流名称

org_name

组织名

组织名称

alert_name

报警名

报警名称

alert_type

报警类型

可以取的值 : real time 或者 scheduled

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

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

OpenObserve 指标和链路追踪方面的支持-鸿蒙开发者社区

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

OpenObserve 指标和链路追踪方面的支持-鸿蒙开发者社区

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

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

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

OpenObserve 指标和链路追踪方面的支持-鸿蒙开发者社区

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

OpenObserve 指标和链路追踪方面的支持-鸿蒙开发者社区

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


文章转载自公众号:k8s技术圈

分类
已于2023-11-22 14:52:23修改
收藏
回复
举报
回复
    相关推荐