前面我们讲到了 OpenObserve 的标和基本使用,使用 Fluentd 将日志采集后输出到了 OpenObserve,链路此外 OpenObserve 还支持指标和链路追踪。指追踪
OpenObserve 除了支持日志之外,标和也支持指标数据的链路摄取,它支持 Prometheus 的指追踪远程写入协议,这样我们就可以直接将 Prometheus 的标和数据远程写入到 OpenObserve 中了。
下面的链路资源清单就是一个简单的 Prometheus 示例,我们使用 node_exporter 来采集节点的指追踪指标数据,然后通过 Prometheus 将其远程写入到 OpenObserve 中:
# prometheus.yamlapiVersion: v1kind: ConfigMapmetadata: name: prometheus-config namespace: openobservedata: 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/v1kind: Deploymentmetadata: name: prometheus namespace: openobservespec: 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: v1kind: Servicemetadata: name: prometheus namespace: openobservespec: 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 openobserveNAME READY STATUS RESTARTS AGEopenobserve-0 1/1 Running 0 2d18hprometheus-756c8c78f5-kvvbl 1/1 Running 0 20s$ kubectl get svc -n openobserveNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEopenobserve ClusterIP None <none> 5080/TCP 2d18hprometheus 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 tracefrom opentelemetry.sdk.trace import TracerProviderfrom opentelemetry.sdk.resources import SERVICE_NAME, Resourcefrom opentelemetry.sdk.trace.export import BatchSpanProcessorfrom opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter# Service name is required for most backendsresource = Resource(attributes={ SERVICE_NAME: "python-service"})# create a tracer providertracer_provider = TracerProvider(resource=resource)# create an OTLP trace exporterurl = 'HTTP_Endpoint'headers = { "Authorization": "Authorization"}exporter = OTLPSpanExporter(endpoint=url, headers=headers)# create a span processor to send spans to the exporterspan_processor = BatchSpanProcessor(exporter)# add the span processor to the tracer providertracer_provider.add_span_processor(span_processor)# set the tracer provider as the global providertrace.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技术圈 Prometheus链路追踪(责任编辑:探索)
爱司凯(300521.SZ)2020年度净亏损1214.64万元 不以公积金转增股本
DeeCamp2021结营:“AI+医疗”项目国际学霸夺冠,4大赛道解决现实痛点
金通灵(300091.SZ):南通科创未减持公司股份 减持计划期限届满