可观测环境搭建

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)选择对应类型的数据源,分别配置 PrometheuselasticsearchZipkin数据源
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和接收端时间,保证时间一致

1 个赞

建议增加一下该功能的使用场景说明,以及展示一下UI界面内容,看得有点懵

帖子尚未完善,稍后会补充贴图

请问一下有详细的环境搭建指导文档吗?