跳转至

技术分享-揭秘高效监控:K3s + Rancher Monitoring 轻松搞定 ThingsBoard 服务性能追踪

本文手把手教你如何在 K3s 集群中使用 Rancher Monitoring 来监控外部 ThingsBoard 服务的关键指标,帮助你及时发现问题,确保物联网平台稳定运行。

概述

ThingsBoard 是一款强大的开源物联网平台,擅长数据收集、处理、可视化和设备管理。在生产环境中,实时监控其运行状态是保障系统可靠性的关键。本文将一步步指导你利用 Rancher Monitoring(基于 Prometheus + Grafana)来监控 ThingsBoard 的核心性能指标,让你的监控体系更智能、更高效。

前置条件

  • 一个已就绪的 K3s 集群
  • 已安装 Rancher Monitoring(包括 Prometheus 和 Grafana)
  • ThingsBoard 服务已部署并可正常访问
  • 你拥有 kubectl 的访问权限

环境信息

为了便于说明,我们假设 ThingsBoard 服务的基本信息如下: - IP 地址:192.168.198.8 - 端口:8080 - 指标端点:/actuator/prometheus

(请根据你的实际环境替换这些参数,确保配置准确。)

步骤一:验证 ThingsBoard 指标端点

配置 Thingsboard 支持 Metrics 端点

有两种方式可以配置:

  • 使用 ENV 环境变量
# 启用指标收集
METRICS_ENABLED=true
# 指定暴露指标的类型为 Prometheus
METRICS_ENDPOINTS_EXPOSE=prometheus
  • 或使用 yaml 配置,至少保持这两个地方是跟下面一样
metrics:
  # Enable/disable actuator metrics.
  enabled: "${METRICS_ENABLED:true}"

management:
  endpoints:
    web:
      exposure:
        # Expose metrics endpoint (use value 'prometheus' to enable prometheus metrics).
        include: '${METRICS_ENDPOINTS_EXPOSE:prometheus}'

验证 Metrics 配置正确

在开始集成前,先确认 ThingsBoard 是否正确暴露了 Prometheus 兼容的指标数据。这一步能避免后续配置问题。

# 直接通过 curl 访问指标端点进行验证
curl http://192.168.198.8:8080/actuator/prometheus

# 预期输出示例(部分内容):
# # HELP jvm_memory_used_bytes The current used memory of the JVM in bytes
# # TYPE jvm_memory_used_bytes gauge
# jvm_memory_used_bytes{area="heap",} 2.47492664E8
# ...

如果输出类似 Prometheus 格式的指标数据,说明端点正常工作。否则,请检查 ThingsBoard 的配置(确保 Spring Boot Actuator 已启用并配置了 Prometheus 端点)。

步骤二:部署 ThingsBoard 服务(可选)

如果你的 ThingsBoard 尚未部署在 Kubernetes 集群内,可以参考以下 YAML 配置在 K3s 中部署 ThingsBoard(假设使用 Docker 镜像)。如果 ThingsBoard 已运行在外部(如独立服务器),可跳过此步骤,直接进入步骤三。

以下是 ThingsBoard 的示例部署 YAML 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: thingsboard
  namespace: cattle-monitoring-system
  labels:
    app: thingsboard
spec:
  replicas: 1
  selector:
    matchLabels:
      app: thingsboard
  template:
    metadata:
      labels:
        app: thingsboard
    spec:
      containers:
      - name: thingsboard
        image: thingsboard/tb-postgres:3.4.4
        ports:
        - containerPort: 8080
          name: http
        env:
        - name: TB_SERVER_PORT
          value: "8080"
        - name: SPRING_DATASOURCE_URL
          value: "jdbc:postgresql://postgres:5432/thingsboard"
        - name: SPRING_DATASOURCE_USERNAME
          value: "postgres"
        - name: SPRING_DATASOURCE_PASSWORD
          value: "postgres"
        resources:
          requests:
            memory: "512Mi"
            cpu: "500m"
          limits:
            memory: "2Gi"
            cpu: "1000m"
---
apiVersion: v1
kind: Service
metadata:
  name: thingsboard
  namespace: cattle-monitoring-system
  labels:
    app: thingsboard
spec:
  selector:
    app: thingsboard
  ports:
  - port: 8080
    targetPort: 8080
    name: http
  type: ClusterIP

说明: - 此配置假设使用 PostgreSQL 数据库,需提前部署数据库服务(如 postgres)。 - 根据你的实际需求调整镜像版本、环境变量和资源限制。 - 如果 ThingsBoard 运行在外部服务器,可忽略此部署,直接使用外部 IP。

应用配置:

kubectl apply -f thingsboard-deployment.yaml

步骤三:创建 Kubernetes Service 和 Endpoints

对于运行在外部的 ThingsBoard 服务(本例中为 192.168.198.8:8080),我们需要通过 Kubernetes 的 Service 和 Endpoints 资源将其“引入”集群服务发现系统,以便 Prometheus 抓取指标。

创建文件 thingsboard-monitoring.yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: thingsboard-metrics
  namespace: cattle-monitoring-system
  labels:
    app: thingsboard-metrics
subsets:
- addresses:
  - ip: 192.168.198.8
  ports:
  - port: 8080
    name: http-metrics
---
apiVersion: v1
kind: Service
metadata:
  name: thingsboard-metrics
  namespace: cattle-monitoring-system
  labels:
    app: thingsboard-metrics
spec:
  ports:
  - name: http-metrics
    port: 8080
    targetPort: 8080
    protocol: TCP
  type: ClusterIP

应用配置:

kubectl apply -f thingsboard-monitoring.yaml

说明:如果 ThingsBoard 部署在集群内(如步骤二),可直接使用其 Service 名称(例如 thingsboard),无需创建 Endpoints。

步骤四:配置 ServiceMonitor 资源

ServiceMonitor 是 Prometheus Operator 的自定义资源定义(CRD),用于告诉 Prometheus 如何发现并抓取指标。

创建文件 thingsboard-servicemonitor.yaml

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: thingsboard-metrics
  namespace: cattle-monitoring-system
  labels:
    app: thingsboard-metrics
spec:
  selector:
    matchLabels:
      app: thingsboard-metrics
  endpoints:
  - port: http-metrics
    path: /actuator/prometheus
    interval: 30s
    scrapeTimeout: 10s
    scheme: http
    honorLabels: true
    metricRelabelings:
    - sourceLabels: [__name__]
      regex: 'jvm_.+'
      action: keep
    - sourceLabels: [__name__]
      regex: 'process_.+'
      action: keep
    - sourceLabels: [__name__]
      regex: 'http_.+'
      action: keep

应用配置:

kubectl apply -f thingsboard-servicemonitor.yaml

说明metricRelabelings 过滤出 JVM、进程和 HTTP 相关的指标,减少数据冗余。你可根据需要调整 regex 规则。

步骤五:验证监控配置

配置完成后,验证所有组件是否正常工作。

检查资源状态

# 查看 Service 和 Endpoints
kubectl -n cattle-monitoring-system get svc,ep -l app=thingsboard-metrics

# 查看 ServiceMonitor
kubectl -n cattle-monitoring-system get servicemonitor thingsboard-metrics

验证 Prometheus 目标状态

# 端口转发到 Prometheus 服务
kubectl -n cattle-monitoring-system port-forward svc/rancher-monitoring-prometheus 9090:9090

浏览器访问 http://localhost:9090/targets,找到 thingsboard-metrics,确认状态为 UP

Thingsboard target

测试指标查询

在 Prometheus 的 Graph 界面,尝试查询以下指标: - jvm_memory_used_bytes - process_cpu_usage - http_server_requests_seconds_count

如果数据正常显示,说明指标采集成功。

步骤六:构建 Grafana 仪表板

有了指标数据,我们用 Grafana 将其可视化为直观的仪表板,提升监控体验。

访问 Grafana

# 端口转发到 Grafana 服务
kubectl -n cattle-monitoring-system port-forward svc/rancher-monitoring-grafana 3000:3000

浏览器访问 http://localhost:3000,使用默认凭据登录(用户名:admin,密码:prom-operator)。

创建 ThingsBoard 监控仪表板(自定义,适合 Grafana 高手)

  1. JVM 内存使用情况
  2. 添加 Graph 面板
  3. 查询:jvm_memory_used_bytes{area="heap"}
  4. 标题:"JVM Heap Memory Usage"
  5. 设置:单位为字节,添加警报阈值(如 80% 堆内存触发警告)。

  6. CPU 使用率

  7. 添加 Graph 面板
  8. 查询:process_cpu_usage
  9. 标题:"Process CPU Usage"
  10. 设置:显示为百分比,观察峰值趋势。

  11. HTTP 请求统计

  12. 添加 Graph 面板
  13. 查询:rate(http_server_requests_seconds_count[5m])
  14. 标题:"HTTP Request Rate"
  15. 设置:按状态码分组,突出显示 4xx/5xx 错误。

  16. 系统负载

  17. 添加 Stat 面板
  18. 查询:system_load_average_1m
  19. 标题:"System Load Average"
  20. 设置:绿色(<1),黄色(1-5),红色(>5)。

提示:保存仪表板并导出为 JSON,方便备份或分享。

可以在这里找到你所希望的 Dashboard:https://grafana.com/grafana/dashboards/?search=spring+boot

Spring Boot JVM 使用情况

使用 Thingsboard 官方 Grafana Monitoring

在官方 GitHub 仓库,可以找到:

https://github.com/thingsboard/thingsboard/tree/master/docker/monitoring/grafana/provisioning/dashboards

导入 Grafana 即可。

数据库使用状况

Thingsboard TS 使用情况

规则引擎使用统计

Thingsboard 规则引擎 使用情况

关键监控指标详解

以下是 ThingsBoard 的核心监控指标,助你快速锁定问题:

JVM 相关指标

  • jvm_memory_used_bytes:JVM 内存占用,预防内存溢出。
  • jvm_gc_memory_promoted_bytes_total:GC 提升字节数,优化内存分配。
  • jvm_gc_pause_seconds:GC 暂停时间,避免性能抖动。

系统资源指标

  • process_cpu_usage:进程 CPU 使用率,识别计算瓶颈。
  • process_start_time_seconds:进程启动时间,计算服务 uptime。
  • system_cpu_usage:系统整体 CPU 使用率。
  • system_load_average_1m:1 分钟系统负载,评估压力。

应用性能指标

  • http_server_requests_seconds_count:HTTP 请求总数,监控流量。
  • http_server_requests_seconds_sum:请求总耗时,计算平均延迟。
  • tomcat_sessions_active_current:活跃会话数,适合 Web 负载分析。

这些指标结合使用,能全面洞察 ThingsBoard 的运行状态。

故障排除指南

遇到问题?以下是常见问题及解决方法:

  1. Target 状态为 DOWN
  2. 检查网络连通性:
    kubectl -n cattle-monitoring-system run -it --rm --image=alpine network-test -- sh
    # 在 Pod 内:
    apk add curl
    curl -v http://192.168.198.8:8080/actuator/prometheus
    
  3. 确保防火墙未阻挡端口 8080。

  4. 指标数据缺失

  5. 验证 ThingsBoard 的 Actuator 配置(检查 application.yml 是否启用 Prometheus)。
  6. 确认 ServiceMonitor 的路径和端口正确。
  7. 直接 curl 指标端点,排查访问问题。

  8. 认证问题 如果 ThingsBoard 端点需要认证,在 ServiceMonitor 中添加:

    basicAuth:
      username:
        name: auth-secret
        key: username
      password:
        name: auth-secret
        key: password
    
    (需先创建包含用户名和密码的 Secret 资源。)

总结

通过本教程,你已成功将 ThingsBoard 服务(无论部署在集群内还是外部)接入 K3s 的 Rancher Monitoring 体系。核心优势包括:

  1. 统一监控:所有服务指标集中管理,运维更高效。
  2. 自动发现:Prometheus Operator 简化服务接入。
  3. 专业可视化:Grafana 仪表板让数据一目了然。
  4. 灵活扩展:方法适用于任何支持 Prometheus 指标的服务。

快去实践吧!让你的物联网平台监控更上一层楼!

参考资源