1 可观测介绍
可观测是什么?
可观测性(Observability)让我们可以在不了解系统内部运作逻辑的情况下,从外部理解一个系统,它使我们能够通过系统外部输出的数据来推断其内部状态。
可观测怎样了解系统?
可观测性要求系统能够发出信号,包括Trace(追踪)、Metric(指标)和Logs(日志),通过这些信号从不同角度揭示系统的运行状况。
可观测性的作用?
可观测特性可帮助进行监控性能、问题诊断和系统优化。
openUBMC借助openTelemetry、fluent-bit构建BMC可观测能力,实现指标、日志和跟踪数据的采集和管理。
1.1 可观测特性使用场景
可观测特性可帮助社区开发人员基于指标、日志和跟踪数据的可视化能力开展问题定位,例如定位组件flash写入量情况、RPC调用情况、北向接口调用链追踪信息等。
当前openUBMC可观测能力正在进行持续构建,已支持的可观测指标可参考链接。
1.2 可观测信号介绍
Metric(指标) :系统发生了什么?
指标是系统的定量数据,用于测量性能或行为,例如CPU使用率、内存消耗、请求速率或错误率。指标通常以时间序列形式呈现,用于监控系统健康状况并分析长期趋势。
Trace(追踪):问题出在哪里?
记录请求在系统中的完整路径,包括请求的起始时间、结束时间以及在各个服务或组件之间的流转情况。追踪能够帮助工程师理解请求的延迟来源、识别性能瓶颈,并调试分布式系统中的复杂问题。
Logs(日志):为什么会发生?
日志是系统或应用程序生成的事件记录,包含详细的文本信息,如错误消息、警告或调试数据。日志对于深入调查问题、审计系统行为以及满足合规性要求至关重要。
1.3 可观测架构
flowchart BT
%% 定义节点(自下而上)
App1["业务组件1"] --OTLP/gRPC--> observability
App2["业务组件2"] --OTLP/gRPC--> observability
OTEL_SDK["openTelemetry SDK"] --> App1
OTEL_SDK --> App2
observability --OTLP/HTTP--> OTelCollector["openTelemetry Collector"]
OTelCollector --logs--> Elasticsearch["Elasticsearch"]
OTelCollector --metrics--> Prometheus["Prometheus"]
OTelCollector --traces--> Zipkin["Zipkin"]
OTelCollector --traces--> Jaeger["Jaeger"]
%% 分组定义(自下而上)
subgraph BMC
subgraph observability["可观测组件"]
FluentBit["fluent-bit"]
end
App1
App2
OTEL_SDK
end
subgraph 可视化数据转发层
OTelCollector
end
subgraph 可视化后端系统
Elasticsearch
Prometheus
Zipkin
Jaeger
end
2 环境搭建
说明:如下环境搭建示例主要基于aarch64 Linux环境(OpenEuler系统),个人使用也可以通过下载对应软件的windows包进行搭建,不同操作系统仅软件包形式有差异,配置方法均相同。
2.1 准备依赖软件包
- opentelemetry-collector-contrib:用于接收BMC发送的可观测数据,同时向不同类型的后端可视化系统(Prometheus、Zipkin、Elastic等)转发可观测数据,下载地址
- Zipkin:用于接收opentelemetry-collector-contrib发送的Trace类型数据,并进行可视化呈现,下载地址
- 可选依赖:openjdk,Zipkin以Jar包形式发布,对JDK版本存在依赖,如果部署环境JDK版本较低,需要进行升级,下载地址
- Prometheus:用于接收opentelemetry-collector-contrib发送的Metric类型数据,并进行可视化呈现,下载地址
说明:不同Linux环境需要结合CPU架构选择合适的下载包,例如鲲鹏服务器部署OpenEuler系统则需要选择arm64形态软件包。如果仅个人使用,也可以选择windows软件包。
2.2 准备证书/密钥文件
BMC与后端转发层(Opentelemetry Collector)之间需要支持TLS加密,从而防止可观测数据泄漏,因此在环境搭建之前需要先准备证书。证书可通过XCA工具进行制作。
2.2.1 安装XCA
XCA是一款开源的x509证书生成工具,可用来生成BMC与OpenTelemetry Collector之间的TLS证书
下载XCA安装包
说明:如果遇到XCA 2.9.0下载过慢,可选择XCA 2.8.0或更低版本进行下载
2.2.2 新建数据库
点击左上角文件->新建数据库->设置数据库密码
2.2.3 制作CA证书
(1)创建证书
(2)来源
一定要点击应用模板扩展信息!
(3)主题
(4)扩展
证书的有效期要早于服务端以及客户端的系统时间!建议有效期的起始时间设置早一点
创建完成后应有一CA证书
2.2.4 制作SSL证书
(1)创建证书
(2)来源
(3)主题
(4)扩展
证书的有效期要早于服务端以及客户端的系统时间!建议有效期的起始时间设置早一点
创建完成后应有一CA证书签发的ssl证书
2.2.5 导出证书
(1)导出CA证书
选中CA证书->导出
(2)导出SSL证书
选中SSL证书->导出
(3)导出SSL私钥
2.2.6 最终得到的证书和密钥说明
1)可观测CA证书,用于导入openUBMC
observability_CA.crt
2)可观测openTelemetry Collector Contrib证书,用于配置Collector的cert_file参数
observability.otelcol.crt
3)可观测openTelemetry Collector Contrib私钥,用于配置Collector的key_file参数
observability.otelcol.key.pem
2.3 配置依赖软件
2.3.1 配置Prometheus
Prometheus用于接收opentelemetry-collector-contrib发送的Metric类型数据,并对其进行可视化呈现。Prometheus启动依赖配置文件(prometheus.yml)示例如下:
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["127.0.0.1:49091"] # 监听49091端口,用于接收collector发送的Metric数据
# The label name is added as a label `label_name=<label_value>` to any timeseries scraped from this config.
labels:
app: "prometheus"
启动prometheus,通过49092端口对外提供web服务
./prometheus --web.enable-otlp-receiver --web.listen-address=0.0.0.0:49092 --config.file=prometheus.yml
2.3.2 配置Zipkin
Zipkin用于接收opentelemetry-collector-contrib发送的Trace类型数据,并对其进行可视化呈现。Zipkin默认不需要额外的配置文件,如果环境上java版本满足zipkin要求,可直接启动:
java -jar /root/observability/zipkin-server-3.5.1-exec.jar
如果下载了对应版本的openJDK,则执行时指定JDK路径即可
/root/observability/jdk-17.0.1/Home/bin/java -jar /root/observability/zipkin-server-3.5.1-exec.jar
Zipkin新版本对Java版本存在依赖,需要保证Java版本满足要求。
2.3.3 配置Elasticsearch
Elasticsearch用于接收opentelemetry-collector-contrib发送的Log类型数据,能够对日志数据进行存储和分析。
说明:Elasticsearch需要以非管理员方式启动,因此部署时需要创建非管理员用户。
step1:添加普通用户
useradd elasticsearch
step2:解压elasticsearch压缩包到指定路径(例如/home/elasticsearch)
tar xvf elasticsearch-9.1.0-linux-aarch64.tar.gz -C /home/elasticsearch
step3:为elasticsearch所在目录设置权限
chown -R elasticsearch:elasticsearch /home/elasticsearch/
step4:启动elasticsearch
/home/elasticsearch/elasticsearch-9.1.0/bin/elasticsearch &
step5:elasticsearch首次启动将在控制台打印默认用户名密码,需要记录下来并用于后续opentelemetry-collector和Grafana elasticsearch数据源配置。
说明:如果未能记录下初始启动过程中的密码,也可以使用
bin/elasticsearch-reset-password -u elastic进行密码重置
初始启动过程默认密码信息打印如下,Password for the elastic user下一行即为默认密码:
✅ Elasticsearch security features have been automatically configured!
✅ Authentication is enabled and cluster connections are encrypted.
ℹ️ Password for the elastic user (reset with `bin/elasticsearch-reset-password -u elastic`):
xxxxxx
...
说明:elasticsearch默认不提供可视化界面,在ELK技术栈(Elasticsearch、Kibana、Logstash)中需要通过安装Kibana实现日志数据可视化。由于本指导中借助Grafana可视化界面进行日志分析,此处无需单独安装Kibana,因此不再介绍Kibana安装过程,有兴趣的读者可查看官方指导。
2.3.4 配置opentelemetry-collector-contrib
用于接收BMC发送的可观测数据,同时向不同类型的后端可视化系统(Prometheus、Zipkin、Elastic等)转发可观测数据。启动时依赖配置文件(otelcol-config.yaml)如下:
receivers:
otlp:
protocols:
http:
endpoint: "0.0.0.0:4318" # OTLP over HTTP
max_request_body_size: 67108864 # 64MB
tls:
cert_file: observability.otelcol.crt # collector证书
key_file: observability.otelcol.key.pem # collector密钥
processors:
# 批处理器 - 控制数据分批
batch:
send_batch_size: 1024
send_batch_max_size: 2048
timeout: 1s
# 内存限制器
memory_limiter:
limit_mib: 512
spike_limit_mib: 128
check_interval: 5s
exporters:
debug:
verbosity: detailed
prometheus:
endpoint: "127.0.0.1:49091"
namespace: "otelcol"
elasticsearch:
endpoint: "https://127.0.0.1:9200"
user: "elastic"
password: "xxxxxx" # elasticsearch初始启动过程可获取默认密码,或通过自行重置获取密码
tls:
ca_file: /home/elasticsearch/elasticsearch-9.1.0/config/certs/http_ca.crt
zipkin:
endpoint: "http://127.0.0.1:9411/api/v2/spans"
otlp/jaeger:
endpoint: https://127.0.0.1:44318
service:
pipelines:
metrics:
receivers: [otlp]
exporters: [debug, prometheus]
logs:
receivers: [otlp]
exporters: [debug, elasticsearch]
traces:
receivers: [otlp]
exporters: [debug, zipkin]
启动collector:
otelcol-contrib --config /root/observability/otelcol-config.yaml
2.3.4 一键式启动脚本
可使用如下一键式脚本拉起otelcol、Zipkin、Prometheus,使用方法:
1)将脚本保存为observability.sh
2)启动可观测服务: bash observability.sh start
3)停止可观测服务: bash observability.sh stop
注意:
1)需要按照实际情况调整脚本中对应文件路径
2)如下脚本指定了openJDK对应的java路径,如果自身环境java满足要求,可不依赖openJDK
#!/bin/bash
PROMETHEUS_PATH=/root/observability/prometheus
PROMETHEUS_CONFIG_PATH=/root/observability/prometheus.yml
OTELCOL_PATH=/root/observability/otelcol-contrib
OTELCOL_CONFIG_PATH=/root/observability/otelcol.yml
JAVA_PATH=/root/observability/jdk-17.0.1/Home/bin/java
ZIPKIN_PATH=/root/observability/zipkin-server-3.5.1-exec.jar
PID_FILE=/tmp/observability_pids.txt
start_services() {
echo "Starting OpenTelemetry Collector..."
nohup "$OTELCOL_PATH" --config "$OTELCOL_CONFIG_PATH" 2>/dev/null &
echo "$! otelcol" >> "$PID_FILE"
echo "otelcol started with PID $!"
sleep 2
echo "Starting Prometheus..."
nohup "$PROMETHEUS_PATH" --web.enable-otlp-receiver --web.listen-address=0.0.0.0:49092 --config.file="$PROMETHEUS_CONFIG_PATH" 2>/dev/null &
echo "$! prometheus" >> "$PID_FILE"
echo "Prometheus started with PID $!"
sleep 2
echo "Starting Zipkin..."
nohup "$JAVA_PATH" -jar "$ZIPKIN_PATH" 2>/dev/null &
echo "$! zipkin" >> "$PID_FILE"
echo "Zipkin started with PID $!"
echo "All observability services have been started."
}
stop_services() {
if [ ! -f "$PID_FILE" ]; then
echo "PID file not found. No services to stop."
return
fi
echo "Stopping observability services..."
while read -r pid service; do
if kill -0 "$pid" 2>/dev/null; then
kill "$pid"
echo "Stopped $service (PID: $pid)"
else
echo "$service (PID: $pid) was not running"
fi
done < "$PID_FILE"
rm -f "$PID_FILE"
echo "All observability services have been stopped."
}
case "$1" in
start)
start_services
;;
stop)
stop_services
;;
restart)
stop_services
sleep 2
start_services
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
2.4 BMC配置
点击BMC WEB页面,进入到维护诊断->可观测进行配置:
Step1:使能可观测服务
Step2:选择TLS模式(调试场景建议选择单向认证,方便配置)
Step3:配置接收端证书,即配置opentelemetry-collector-contrib的根证书,点击跳转到证书页面进行配置
Step4:配置接收端信息,即配置opentelemetry-collector-contrib服务的IP地址、端口号,同时使能该接收端
3 访问可视化系统
3.1 Zipkin查看Trace数据
可通过http://{ip}:9411方式登录Zipkin UI界面
说明:此处的ip为Zipkin部署环境的ip,由于上述配置采用全零监听,针对Linux/Windows系统对外IP即可访问(可通过ifconfig或ipconfig进行查询),如果本地环回地址未被占用,也可使用127.0.0.1进行访问
详细使用,请参考Zipkin官网
3.2 Prometheus查看Metric数据
可通过http://{ip}:49092方式登录Prometheus UI界面
说明:此处的ip为Prometheus部署环境的ip,由于上述配置采用全零监听,针对Linux/Windows系统对外IP即可访问(可通过ifconfig或ipconfig进行查询),如果本地环回地址未被占用,也可使用127.0.0.1进行访问
详细使用,请参考Prometheus官网
4 使用Grafana进行数据可视化和监控
Prometheus和Zipkin等可视化后端系统虽然提供了自身的webui进行数据可视化呈现,但是功能相对简单,可使用功能更强大的Grafana进行数据可视化和监控。
Grafana提供多样化的数据看板能力和告警功能,支持对接多种类型的数据源。
Grafana本身不存储数据,数据由Prometheus、Zipkin等可视化后端系统承载。
openuBMC使用Grafana时整体架构如下:
flowchart BT
%% 定义节点(自下而上)
App1["业务组件1"] --OTLP/gRPC--> observability
App2["业务组件2"] --OTLP/gRPC--> observability
OTEL_SDK["openTelemetry SDK"] --> App1
OTEL_SDK --> App2
observability --OTLP/HTTP--> OTelCollector["openTelemetry Collector"]
OTelCollector --logs--> Elasticsearch["Elasticsearch"]
OTelCollector --metrics--> Prometheus["Prometheus"]
OTelCollector --traces--> Zipkin["Zipkin"]
OTelCollector --traces--> Jaeger["Jaeger"]
Elasticsearch --> Grafana
Prometheus --> Grafana
Zipkin --> Grafana
Jaeger --> Grafana
Grafana --告警推送--> 告警接收端
%% 分组定义(自下而上)
subgraph BMC
subgraph observability["可观测组件"]
FluentBit["fluent-bit"]
end
App1
App2
OTEL_SDK
end
subgraph 可视化数据转发层
OTelCollector
end
subgraph 可视化后端系统
Elasticsearch
Prometheus
Zipkin
Jaeger
end
subgraph Grafana
Elasticsearch数据源
Prometheus数据源
Zipkin数据源
Jaeger数据源
仪表盘
告警规则
end
subgraph 告警接收端
end
4.1 安装Grafana
1)下载Grafana,下载地址
2)设置语言为中文(可选)
进入conf目录下,编辑defaults.ini文件如下字段:
default_language = zh-Hans
3)启动Grafana
运行bin目录下grafana-server即可
./bin/grafana-server &
4)登录Grafana WEB UI
默认端口号为3000,默认用户名和密码均为admin
http://{ip}:3000
说明:此处的ip为Grafana 部署环境的ip,由于上述配置采用全零监听,针对Linux/Windows系统对外IP即可访问(可通过ifconfig或ipconfig进行查询),如果本地环回地址未被占用,也可使用127.0.0.1进行访问
详细使用,请参考Grafana官网
可以通过如下一键式脚本同时启动:Prometheus、openTelemetry Collector、Zipkin、Grafana,使用方法:
1)将脚本保存为observability.sh
2)启动可观测服务: bash observability.sh start
3)停止可观测服务: bash observability.sh stop
注意:
1)需要按照实际情况调整脚本中对应文件路径
2)如下脚本指定了openJDK对应的java路径,如果自身环境java满足要求,可不依赖openJDK
#!/bin/bash
PROMETHEUS_PATH=/root/observability/prometheus
PROMETHEUS_CONFIG_PATH=/root/observability/prometheus.yml
OTELCOL_PATH=/root/observability/otelcol-contrib
OTELCOL_CONFIG_PATH=/root/observability/otelcol.yml
JAVA_PATH=/root/observability/jdk-17.0.1/Home/bin/java
ZIPKIN_PATH=/root/observability/zipkin-server-3.5.1-exec.jar
GRAFANA_HOME_PATH=/root/observability/grafana/
GRAFANA_PATH=/root/observability/grafana/bin/grafana-server
PID_FILE=/tmp/observability_pids.txt
start_services() {
echo "Starting OpenTelemetry Collector..."
nohup "$OTELCOL_PATH" --config "$OTELCOL_CONFIG_PATH" 2>/dev/null &
echo "$! otelcol" >> "$PID_FILE"
echo "otelcol started with PID $!"
sleep 2
echo "Starting Prometheus..."
nohup "$PROMETHEUS_PATH" --web.enable-otlp-receiver --web.listen-address=0.0.0.0:49092 --config.file="$PROMETHEUS_CONFIG_PATH" 2>/dev/null &
echo "$! prometheus" >> "$PID_FILE"
echo "Prometheus started with PID $!"
sleep 2
echo "Starting Zipkin..."
nohup "$JAVA_PATH" -jar "$ZIPKIN_PATH" 2>/dev/null &
echo "$! zipkin" >> "$PID_FILE"
echo "Zipkin started with PID $!"
sleep 2
echo "Starting Grafana..."
nohup "$GRAFANA_PATH" --homepath "$GRAFANA_HOME_PATH" 2>/dev/null &
echo "$! grafana" >> "$PID_FILE"
echo "Grafana started with PID $!"
echo "All observability services have been started."
}
stop_services() {
if [ ! -f "$PID_FILE" ]; then
echo "PID file not found. No services to stop."
return
fi
echo "Stopping observability services..."
while read -r pid service; do
if kill -0 "$pid" 2>/dev/null; then
kill "$pid"
echo "Stopped $service (PID: $pid)"
else
echo "$service (PID: $pid) was not running"
fi
done < "$PID_FILE"
rm -f "$PID_FILE"
echo "All observability services have been stopped."
}
case "$1" in
start)
start_services
;;
stop)
stop_services
;;
restart)
stop_services
sleep 2
start_services
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
4.2 配置数据源
登录到Grafana WEB UI之后,配置数据源
1)点击连接 → 数据源
2)点击右上角 ** 添加数据源**
3)选择对应类型的数据源,分别配置 Prometheus、 elasticsearch、 Zipkin数据源
4)在Connection位置配置数据源URL,例如 http://{ip}:{port}/
4.3 创建仪表盘
登录到Grafana WEB UI之后,可配置仪表盘
1)点击仪表板
2)选择 新建 → 新建仪表板
3)点击 + 添加可视化
可自定义仪表盘,也可以导入官方提供的模板( Grafana dashboards | Grafana Labs)
更多仪表盘配置可参考官方说明 Dashboards | Grafana documentation
4.4 配置告警
官方提供了详细的告警功能介绍,这里不再进行赘述,可参考官方手册( Grafana Alerting | Grafana documentation)进行配置
常见问题(FAQ)
-
Q:配置完成后服务已启动,但是无法访问
A:可能由于防火墙原因,可先关闭防火墙
systemctl stop firewalld -
Q:BMC与数据接收端(Collector、Prometheus、Zipkin等)通信正常,但是可视化平台的WEB UI上无法查询到数据
A:可能是BMC时间、数据接收端(Collector、Prometheus、Zipkin等)所在系统的时间不一致,需要校正BMC和接收端时间,保证时间一致




















