Kubernetes / Linux Note / Monitoring / 运维笔记

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

Einic Yeo · 8月8日 · 2023年 · · · ·

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

指标

OpenObserve 除了支持日志之外,也支持指标数据的摄取,它支持 Prometheus 的版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!远程写入协议,这样我们就可以直接将 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:[email protected]
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 参数指定了远程写入接口地址,usernamepa版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!ssword 参数指定了管理员的邮箱和密码。

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

$kubectlapply-fprometheus.yaml
$kubectlgetpods-nopenobserve
NAMEREADYSTATUSRESTARTSAGE
openobserve-01/1Running02d18h
prometheus-756c8c78f5-kvvbl1/1Running020s
$kubectlgetsvc-nopenobserve
NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
openobserveClusterIPNone<none>5080/TCP2d18h
prometheusNodePort10.107.32.131<none>9090:31019/TCP37s

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

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

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

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

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

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

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

exporters:
prometheusremotewrite:
endpoint:"http://<oo-url>/api/org_name/prometheus/api/v1/write"
headers:
Authorization:Basicbase64_encoded_data_of(userid:password)

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

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

然后编辑 Panel,将查询语句中的instance版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!换成$instance

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

链路追踪

OpenObserve 除了支持日志和指标之外,还支持链路追踪,OpenObserve 遵循 OpenTelemetry 的追踪标准,我们可以使用通过 OpenTelemetry SDK 检测的代码将 Trace 数据发送版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!到 OpenObserve,或通过自动检测将跟踪发送到 OpenObserve。

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

fromopentelemetryimporttrace
fromopentelemetry.sdk.traceimportTracerProvider
fromopentelemetry.sdk.resourcesimportSERVICE_NAME,Resource
fromopentelemetry.sdk.trace.exportimportBatchSpanProcessor
fromopentelemetry.exporter.otlp.proto.http.trace_exporterimportOTLPSpanExporter


#Servicenameisrequiredformostbackends
resource=Resource(attributes={
SERVICE_NAME:"python-service"
})

#createatracerprovider
tracer_provider=TracerProvider(resource=resource)

#createanOTLPtraceexporter
url='HTTP_Endpoint'
headers={"Authorization":"Authorization"}

exporter=OTLPSpanExporter(endpoint=url,headers=headers)

#createaspan processortosendspanstotheexporter
span_processor=BatchSpanProcessor(exporter)

#addthespan processortothetracerprovider
tracer_provider.add_span_processor(span_processor)

#setthetracerproviderastheglobalprovider
trace.set_tracer_provider(tracer_provider)

我们只需要将HTTP_EndpointAuthorization 替换成 OpenObserve 的地址和管理员的认证信息即可。其中地址为https://url:5080/api/<orgname>/tracesAu版权声明:本文遵循 CC 4.0 BY-SA 版权协议,若要转载请务必附上原文出处链接及本声明,谢谢合作!thorizationBasic base64(userid:password)。然后运行上面的代码即可将 Trace 数据发送到 OpenObserve 中。

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

#......
exporters:#导出器,用于导出数据
jaeger:
endpoint:"jaeger:14250"#使用jaeger容器名称
tls:
insecure:true#不使用TLS

#Datasources:traces,metrics
otlphttp:
traces_endpoint:http://url:5080/api/<orgname>/traces#OpenObserve的接口地址,这里要用traces_endpoint
headers:
Authorization:Basicbase64(userid:password)#管理员的认证信息

service:#服务配置
pipelines:#管道配置
traces:#链路追踪配置
receivers:[otlp]#接收器
exporters:[otlphttp]#导出器
processors:[batch]#处理器

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

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

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

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

报警

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

  • 计划报警
  • 实时报警

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

{
"text":"Forstream{stream_name}oforganization{org_name}alert{alert_name}oftype{alert_type}isactive"
}

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

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

变量描述
stream_name流名称报警创建的流名称
org_name组织名组织名称
alert_name报警名报警名称
alert_type报警类型可以取的值 : real time 或者 scheduled

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

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

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

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

selectcount(*)asechocntFROM'K8sLogs'WHERE(_timestamp>=1691488182902275AND_timestamp<1691488242902275)LIMIT100

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

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

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

0 条回应