标签 观测云 下的文章

观测云提供一站式云、云原生、应用及业务的可观测解决方案,日志监控器是其核心功能之一,它不仅仅是一个被动的日志收集和存储工具,更是一个主动、智能的日志分析与监控告警平台。它的设计目标是帮助开发、运维和业务团队从海量的日志数据中快速发现问题、定位根因并及时响应。日志监控器的核心价值在于将非结构化的日志数据转化为可观测的结构化信息,并通过监控和告警机制,使其成为保障系统稳定性和业务连续性的有力工具。

通知对象

观测云支持向钉钉、企业微信、飞书等渠道发送通知,使用时需要先创建通知对象。点击「监控」 -「通知对象管理」-「新建通知对象」。

图片

填写消息推送机器人的 Webhook 地址。

图片

告警策略

点击「监控」 -「告警策略管理」-「新建告警策略」。通过关联监控器与告警策略,系统可在异常发生时即时向指定对象发送通知。策略支持配置名称、描述、时区与操作权限等基础信息,并允许按告警等级、通知对象两个维度灵活定义通知规则。针对高紧急度场景可启用升级通知机制,同时支持自定义通知发送时段,以适配不同时段的业务需求。

图片

日志监控器

「监控」 -「监控器」-「新建监控器」,选择“日志检测”,依次配置“检测配置”、“事件通知”、“告警配置”。

检测配置

如下图是按主机和服务的维度,统计 5 分钟内 mall-admin 服务中状态是 error 的日志条数。

图片

当错误数大于等于 2 条时触发致命告警。

图片

事件内容

支持自定义事件通知的标题与内容。

插入日志变量

点击"变量"选择需要展示的变量名,比如 host、service。

图片

插入链接

点击“链接”插入日志查看地址,实现告警界面一键跳转到观测云。

图片

附加信息

点击"添加附加信息"选择日志字段(如 message),在告警内容中展示。

图片

点击“变量”插入 {{df_related_data.message}},建议截取前200字符避免超出告警工具长度限制。

图片

告警策略

配置告警策略后,系统将向对应对象发送通知。

图片

恢复事件

连续两个周期无异常触发恢复事件,留空则不发送。

图片

告警通知

告警触发后,事件中心关联事件的“通知”列显示企微图标即表示推送成功。

图片

在企微机器人群收到如下信息。

图片

问题排查

企微未收到告警时,请在“事件中心”查找对应事件:

  • 无事件:检查监控器DQL配置
  • 事件存在但通知列无企微图标:检查通知对象与静默期设置
  • 通知列有企微图标:可能因告警过于频繁触发Webhook限流

无事件排查

打开监控器,复制上方的 DQL。

图片

复制出来的 DQL 如下:

window("L('default')::RE(`.*`):(count(`*`)) { `service` = \"mall-admin\" AND `status` = \"error\" } BY `service`, `host`", '5m')

打开「快捷入口」 -「DQL 查询」,粘贴 DQL,去掉外层的 windows 函数,去掉转义,检测区间选择和监控器相同,点击“执行”。如果无数据则不会触发告警。

图片

背景

应用在运行过程中,开启性能分析(Profiling)通常是诊断性能瓶颈、内存泄漏和线程问题的关键手段。然而,持续开启 Profiling 会带来显著的性能开销(可能达 5%-20%),并可能生成大量数据,影响生产环境稳定性。动态开启 Profiling 允许开发或运维人员按需、实时地启动/停止数据收集,实现以下目标:

  1. 降低持续开销:仅在需要时启用,避免长期性能损耗;
  2. 精准问题定位:针对特定时段(如流量高峰或故障期间)进行分析;
  3. 在线诊断:无需重启应用即可获取生产环境实时性能快照;
  4. 灵活控制:可结合监控指标(如 CPU 飙升)自动触发,或在安全审计时手动开启。

通过动态控制,实现了观测能力与系统负载的平衡,保障了关键业务场景的效率和稳定性。

Flameshot

Flameshot 是一个基于 Sidecar 模式运行的轻量级自动性能剖析(Profiling)工具。它通过监控目标进程的资源使用情况(CPU/内存),在达到预设阈值时自动触发底层 Profiler(如 async-profiler ),从而实现无侵入的现场快照采集。

Flameshot 采用 Sidecar 容器 模式部署。它必须与业务主容器(Main Container)运行在同一个 Pod 中,并开启 PID 命名空间共享。

  1. 监控 (Monitor):Flameshot 持续轮询主容器内目标进程的资源水位。
  2. 触发 (Trigger):当满足阈值(如 CPU > 80%)或收到 HTTP API 请求时,触发采集任务。
  3. 执行 (Execute):根据配置的语言类型(目前支持 Java),调用对应的 Profiler 工具 attach 到目标进程。
  4. 收集 (Collect):生成的 Profile 文件(如 .jfr )存储于共享卷中,随后上传至数据观测中心。

观测云 datakit-operator1.7.0 版本开始支持工具 flameshots,实现动态开启应用 Profiling。

实践

当前在 K8S 环境上部署 JAVA 应用,当 CPU、内存使用率达到 20%(演示方便)则触发 Profiling 数据采集。

前提条件

  • 观测云帐号
  • K8S 环境

DataKit

DataKit 主要是用来采集数据并上报观测云。

1. 下载 & 安装

wget https://static.guance.com/datakit/datakit.yaml

2. 配置 datakit.yaml

配置 DataWay 数据网关地址

name: ENV_DATAWAY
value: https://openway.guance.com?token=tkn_xxxxx

DataKit 会默认开启主机相关采集器,这里需要追加 pyroscope

name: ENV_DEFAULT_ENABLED_INPUTS
value: cpu,disk,diskio,mem,swap,system,hostobject,net,host_processes,container,pyroscope

3. 启动

调整完配置后,启动 DataKit

root@root:~$ kubectl apply -f datakit.yaml
root@root:~$ kubectl get pods -n datakit
NAME                                READY   STATUS    RESTARTS   AGE
datakit-4zg7q                       1/1     Running   0          14h
datakit-wdtdq                       1/1     Running   0          14h

DataKit Operator

1. 下载

下载最新的 datakit-operator.yaml

wget https://static.guance.com/datakit-operator/datakit-operator.yaml

2. 配置 datakit-operator.yaml

主要调整 jsonconfig 下的 flameshots 内容,参考如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: datakit-operator-config
  namespace: datakit
data:
  jsonconfig: |-
    {
        "server_listen": "0.0.0.0:9543",
        "log_level":     "info",
        "admission_inject_v2": {
            ...
            "flameshots": [
                {
                    "namespace_selectors": ["default"],
                    "label_selectors":     [],
                    "image": "pubrepo.jiagouyun.com/datakit/flameshot:0.1.1",
                    "envs": {
                        "FLAMESHOT_DATAKIT_ADDR":     "http://datakit-service.datakit.svc:9529/profiling/v1/input",
                        "FLAMESHOT_MONITOR_INTERVAL": "1s",
                        "FLAMESHOT_PROFILING_PATH":   "/flameshot-data",
                        "FLAMESHOT_HTTP_LOCAL_IP":    "{fieldRef:status.podIP}",
                        "FLAMESHOT_HTTP_LOCAL_PORT":  "8089",
                        "FLAMESHOT_SERVICE":          "{fieldRef:metadata.labels['app']}",
                        "POD_NAME":                "{fieldRef:metadata.name}",
                        "POD_NAMESPACE":           "{fieldRef:metadata.namespace}",
                        "NODE_NAME":               "{fieldRef:spec.nodeName}",
                        "FLAMESHOT_TAGS":          "pod_name:$(POD_NAME),pod_namespace:$(POD_NAMESPACE),host:$(NODE_NAME)"
                        
                    },
                    "resources": {
                        "requests": {
                            "cpu":    "100m",
                            "memory": "128Mi"
                        },
                        "limits": {
                           "cpu":    "200m",
                           "memory": "256Mi"
                        }
                    },
                    "processes": "[{\"command\":\"java\",\"duration\":\"60s\",\"events\":\"--all\",\"language\":\"java\",\"jdk_version\":\"-\",\"tags\":[\"env:testing\",\"version:1.0.0\"],\"cpu_usage_percent\":20,\"mem_usage_percent\":20,\"mem_usage_mb\":1024}]"
                }
            ]
        },
        ...
    }

参数说明:

  • namespace_selectors: 空间选择,即哪些空间需要开启 flameshots
  • env: 配置环境变量信息
  • processes: 执行命令,如果为空,则 flameshots 不生效

processes 通用字段说明:

  • service (String): 选填,上报到观测中心的服务名称。
  • language (String): 目标进程语言。目前支持 java。
  • command (String): 匹配进程命令行的正则表达式。
  • duration (String): 单次采集时长(例如 30s1m)。注意:受限于执行超时,建议不超过 5 分钟。
  • tags (List): 自定义标签列表,建议包含 envversion 等元信息。
  • cpu_usage_percent (Int): CPU 触发阈值 (0-N)。多核环境下数值可能超过 100。
  • mem_usage_percent (Int): 内存使用率触发阈值 (0-100)。
  • mem_usage_mb (Int): 内存使用量绝对值触发阈值 (MB)。

当前配置 processes 可以实现所有 JAVA 服务,为了实践方便,当 cpu 使用率达到 20% 或内存使用率达到 20% 或内存使用值达到 1024m,则会触发执行 Profiling 操作。

"processes": "[{\"command\":\"java\",\"duration\":\"60s\",\"events\":\"--all\",\"language\":\"java\",\"jdk_version\":\"-\",\"tags\":[\"env:testing\",\"version:1.0.0\"],\"cpu_usage_percent\":20,\"mem_usage_percent\":20,\"mem_usage_mb\":1024}]"

3. 启动

root@root:~$ kubectl apply -f datakit-operator.yaml
root@root:~$ kubectl get pods -n datakit
NAME                                READY   STATUS    RESTARTS   AGE
datakit-4zg7q                       1/1     Running   0          15h
datakit-operator-849f868b78-zbcd9   1/1     Running   0          58s
datakit-wdtdq                       1/1     Running   0          15h

JAVA 应用

1. Yaml 配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-server
spec:
  selector:
    matchLabels:
      app: springboot-server
  replicas: 1
  template:
    metadata:
      labels:
        app: springboot-server
    spec:
      containers:
        - image: registry.cn-shenzhen.aliyuncs.com/lr_715377484/springboot-server:flameshots
          name: springboot-server
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort:  8080
              protocol: TCP

          securityContext:
            seccompProfile:
              type: Unconfined

2. 启动应用

root@root:~$  kubectl apply -f springboot-server.yaml
root@root:~$ kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
springboot-server-d55fc79dd-48c95   2/2     Running   0          3s

3. 查看 flameshot 执行日志

需要指定 containerName 为 -c datakit-flameshot

root@root:~$ kubectl logs -f springboot-server-d55fc79dd-48c95 -c datakit-flameshot
2026-01-15T03:55:58.090Z        ERROR        flameshot        flameshot/config.go:243        read config file failed, err:open /flameshot/flameshot.conf: no such file or directory
2026-01-15T03:55:58.092Z        INFO        flameshot        flameshot/monitor.go:78        start monitor, interval: 1s
2026-01-15T03:55:58.092Z        INFO        flameshot        flameshot/http.go:77        start http server on 10.187.217.101:8089
2026-01-15T03:55:58.092Z        INFO        flameshot        flameshot/http.go:78        profile start at /v1/profile
2026-01-15T03:55:58.092Z        INFO        flameshot        flameshot/http.go:79        prom http start at /metrics
2026-01-15T03:56:58.093Z        INFO        flameshot        flameshot/monitor.go:102        match: PID=7, name=java or cmd=java -jar app.jar

从启动日志上分析,已经找到了 java 服务,且 PID 为 7,等待触发事件

4. 触发阈值

访问应用

root@root:~$ kubectl exec -it springboot-server-d55fc79dd-48c95  -- /bin/bash 
Defaulted container "springboot-server" out of: springboot-server, datakit-flameshot
springboot-server-d55fc79dd-48c95:/home/app#
springboot-server-d55fc79dd-48c95:/home/app# curl http://localhost:8080/profiling/generator
write success!springboot-server-d55fc79dd-48c95:/home/app# 

再来看看 flameshot 执行日志,已触发了阈值 cpu_avg:36.60 且正常上报数据。

图片

之后恢复了正常,正常之后则不会再产生 Profiling 数据,除非再次触发了阈值。

观测云平台

登录观测云平台,访问「应用性能检测」-「Profling」可以查看到刚刚上报的 Profling 信息

图片

点击列表可以查看 Profling 详细信息,如 CPU 耗时、内存分配情况等,可以更深度的剖析应用代码性能损耗。

图片

阿里云 RocketMQ 4.0 介绍

阿里云 RocketMQ 4.0 产品是阿里云早期基于 Apache RocketMQ 构建的分布式消息中间件,主要面向企业级消息传递和异步解耦场景。RocketMQ 4.0 在发布时已具备高吞吐、低延迟、可扩展的核心特性,支持顺序消息、事务消息、定时/延时消息等多种能力,帮助开发者快速实现系统间的可靠通信。相比更高版本,RocketMQ 4.0 在弹性伸缩、可观测性和集成易用性方面能力有限,更多依赖人工运维和监控工具。但通过合理部署与监控,仍能够满足大多数分布式系统的消息传递需求,为业务提供基础的高可用性和可靠性保障。

观测云

观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。

采集方法

  1. 登录观测云控制台
  2. 点击【集成】菜单,选择【云账号管理】
  3. 点击【添加云账号】,选择【阿里云】,填写界面所需的信息,如之前已配置过云账号信息,则忽略此步骤
  4. 点击【测试】,测试成功后点击【保存】,如果测试失败,请检查相关配置信息是否正确,并重新测试
  5. 点击【云账号管理】列表上可以看到已添加的云账号,点击相应的云账号,进入详情页
  6. 点击云账号详情页的【集成】按钮,在未安装列表下,找到阿里云 RocketMQ 4.0,点击【安装】按钮,弹出安装界面安装即可。

图片

关键指标

Metric IdMetric NameDimensionsStatisticsUni
ReadyMessages已就绪消息量(Group)account_name,InstanceNameAverage,Maximumcount
ReadyMessagesPerGidTopic已就绪消息量(Group&Topic)account_name,InstanceNameAverage,Maximumcount
ReceiveMessageCountPerGid消费者每分钟接收消息数量(Group)account_name,InstanceNameAverage,Maximumcount/min
ReceiveMessageCountPerGidTopic消费者每分钟接收消息数量(Group&Topic)account_name,InstanceNameAverage,Maximumcount/min
ReceiveMessageCountPerInstance消费者每分钟接收消息数的数量(Instance)account_name,InstanceNameAverage,Maximumcount/min
ReceiveMessageCountPerTopic消费者每分钟接收消息的数量(Topic)account_name,InstanceNameAverage,Maximumcount/min
SendDLQMessageCountPerGid每分钟产生死信消息的数量(Group)account_name,InstanceNameAverage,Maximumcount/min
SendDLQMessageCountPerGidTopic每分钟产生死信消息的数量(Group&Topic)account_name,InstanceNameAverage,Maximumcount/min
SendMessageCountPerInstance生产者每分钟发送消息数量(Instance)account_name,InstanceNameAverage,Maximumcount/min
SendMessageCountPerTopic生产者每分钟发送消息数量(Topic)account_name,InstanceNameAverage,Maximumcount/min
ThrottledReceiveRequestsPerGid每分钟(GroupId)消费被限流次数account_name,InstanceNameAverage,Maximumcounts/min
ThrottledReceiveRequestsPerGidTopic每分钟(GroupId&Topic)消费被限流次数account_name,InstanceNameAverage,Maximumcounts/min
ThrottledReceiveRequestsPerInstance每分钟(Instance)消费被限流次数account_name,InstanceNameAverage,Maximumcounts/min
ThrottledSendRequestsPerInstance每分钟(Instance)发送被限流次数account_name,InstanceNameAverage,Maximumcounts/min
ThrottledSendRequestsPerTopic每分钟(Topic)发送被限流次数account_name,InstanceNameAverage,Maximumcounts/min

场景视图

登录观测云控制台,点击「场景」 -「新建仪表板」,输入 “阿里云 RocketMQ”, 选择 “阿里云 RocketMQ4监控视图”,点击 “确定” 即可添加视图。

图片

图片

监控器(告警)

ReadyMessagesPerGidTopic 消息堆积量异常

简要描述:消息堆积量异常通常表示某个 Group 或 Group&Topic 维度下的待消费消息数持续增加,说明消费者处理速度低于生产速度。这可能会导致消息延迟变大,甚至出现业务处理超时或丢弃风险。及时监控和处理堆积量异常,有助于发现消费性能瓶颈或消费者实例异常,保障消息系统的稳定性与业务的连续性。

图片

ReceiveMessageCountPerGid / PerTopic

简要描述:消费者接收消息速率异常通常表示某个 Group、Topic 或整个实例的消费吞吐量低于预期。这可能源于消费者宕机、线程不足、消费逻辑耗时过长或网络瓶颈。持续的消费速率下降会导致消息堆积增加,从而影响业务的实时性。监控该指标可帮助及时发现和定位消费环节的问题,确保生产与消费之间的速率平衡。

图片

总结

通过将阿里云 RocketMQ 4.0 的监控数据接入观测云,用户可实现更直观的运行监控与异常告警。观测云能够采集并展示消息堆积量、消费速率等关键指标,及时发现消费者性能瓶颈或消息延迟问题。借助智能告警与可视化视图,用户可快速定位异常、优化消费逻辑,从而提升系统稳定性与运维效率。整体而言,该方案帮助企业在传统 RocketMQ 4.0 环境下实现现代化可观测运维。

Zabbix 介绍

Zabbix 是一个开源的企业级监控解决方案,它可以监控各种网络参数,服务器健康状态,应用程序性能等,并提供灵活的告警机制和丰富的报表功能。

1、Zabbix Server

  • 核心组件,负责接收和处理所有监控数据,生成报警和报表。
  • 需要一个数据库来存储所有配置和监控数据。

2、Zabbix Agent

  • 部署在被监控的设备上,负责收集本地资源和应用数据,并发送给 Zabbix Server。
  • 支持多种操作系统,包括 Linux、Windows 和 Unix。
  • 其中 Agent 分为 Zabbix Agent 和 Zabbix Agent 2,后者是增强版 Agent,支持插件,适合大规模监控。

3、Zabbix Proxy

  • 用于分担 Zabbix Server 的负载,尤其适用于大规模分布式监控。
  • 可以在远程网络中收集数据并转发给 Zabbix Server。

4、Zabbix Web Interface

  • 基于 PHP 的 Web 界面,用于配置、管理和查看监控数据。
  • 提供用户管理、权限控制、仪表盘和报表等功能。

5、数据库

  • 存储所有的配置、监控数据、历史记录等。
  • 支持多种数据库,如 MySQL、PostgreSQL、Oracle、SQLite。

观测云

观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。

部署 DataKit

DataKit 是一个开源的、跨平台的数据收集和监控工具,由观测云开发并维护。它旨在帮助用户收集、处理和分析各种数据源,如日志、指标和事件,以便进行有效的监控和故障排查。DataKit 支持多种数据输入和输出格式,可以轻松集成到现有的监控系统中。(注意,请安装完整版 DataKit,Lite 版本 DataKit 没有 Zabbix 相关采集器。)

登录观测云控制台,在「集成」 - 「DataKit」选择对应安装方式。这里使用主机方式安装。

图片

复制一键安装命令,登陆到目标服务器执行该命令即可实现一键安装。

执行 datakit monitor 命令查看 DataKit 运行状态。

图片

指标数据采集

Zabbix API 方式(zabbix >= 5.0)

DataKit 方式

1、配置 pythond 配置文件

进入 DataKit 的配置文件目录 conf.d,进入 pythond 目录,复制 pythond.conf.samplepythond.conf, 修改如下配置:

[[inputs.pythond]]
  # Python input name
  name = 'zabbix_collect'  # required

  # System environments to run Python
  #envs = ['LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH',]
  envs = ['ZABBIX_HOST=http://127.0.0.1/zabbix', 'ZABBIX_USER=Admin', 'ZABBIX_PASSWD=zabbix', 'ZABBIX_VERSION=7.0', 'COLLECT_TYPE=api']

  # Python path(recomment abstract Python path)
  cmd = "python3" # required. python3 is recommended.

  # Python scripts relative path
  dirs = ["zabbix"]

其中 ZABBIX_HOSTZABBIX_USERZABBIX_PASSWDZABBIX_VERSION 填写实际 Zabbix 的地址用户名密码和版本。

保存并退出。

2、复制脚本

进入 DataKit 目录,进入 python.d 目录,创建 zabbix 目录,点击下方链接下载脚本到 zabbix 目录下:

https://static.guance.com/integrations/zabbix/zabbix-collecto...

3、重启 DataKit

datakit service -R

4、检查采集任务,出现 zabbix_collect 任务则说明采集任务开启成功

datakit monitor

图片

Func 方式

1、安装采集脚本

登录 Func,点击「脚本市场」,选择预装脚本市场,点击管理按钮,进入预装脚本市场的脚本列表页。在过滤搜索框中输入 ,过滤出 zabbix 采集脚本。

图片

点击安装按钮,并在弹出的确认框点击确认按钮。点击确认后,在弹出的部署对话框中输入 zabbix 的地址,用户名,密码,以及版本号。确认信息无误后,点击部署启动脚本,即可完成脚本的部署以及采集任务的创建。

图片

2、查看采集结果

登录观测云,点击「指标」 - 「指标管理」,查找 zabbix 指标,看是否采集到。

图片

Streaming 方式(zabbix >= 6.4)

该方式类似于 Prometheus 的 Remote Write,由 zabbix server 主动将数据打给 DataKit,有较高的时效性。

HTTP Server

DataKit 方式

1、配置 pythond 配置文件

进入 DataKit 的配置文件目录 conf.d,进入 python.d 目录,复制 pythond.conf.samplepythond.conf,修改如下配置:

[[inputs.pythond]]
  # Python input name
  name = 'zabbix_collect'  # required

  # System environments to run Python
  #envs = ['LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH',]
  envs = ['ZABBIX_HOST=http://127.0.0.1/zabbix', 'ZABBIX_USER=Admin', 'ZABBIX_PASSWD=zabbix', 'ZABBIX_VERSION=7.0', 'COLLECT_TYPE=stream', 'STREAM_LISTENER_PORT=8000']

  # Python path(recomment abstract Python path)
  cmd = "python3" # required. python3 is recommended.

  # Python scripts relative path
  dirs = ["zabbix"]

其中 ZABBIX_HOSTZABBIX_USERZABBIX_PASSWDZABBIX_VERSION 填写实际 Zabbix 的地址用户名密码和版本。

注意,COLLECT_TYPE 必须为 stream, 可根据需要调整 STREAM_LISTENER_PORT 的值。

保存并退出。

2、复制脚本

进入 DataKit 目录,进入 pythond 目录,创建 zabbix 目录,点击下方链接下载脚本到 zabbix 目录下:

https://static.guance.com/integrations/zabbix/zabbix-collecto...

3、重启 DataKit

datakit service -R

4、检查采集任务,出现 zabbix_collect 任务则说明采集任务开启成功

datakit monitor

图片

5、创建 Zabbix 连接器

登录 Zabbix,点击管理 -> 常规 -> 连接器,点击创建连接器,URL处输入 DataKit 的地址以及 zabbix stream 的监听端口(默认8000),信息类型选择数字和浮点数,点击添加。

图片

6、修改 zabbix_server.conf,修改 StartConnectors 为10,保存并重启 zabbix-server 服务

图片

7、验证指标采集结果

Func 方式

1、安装采集脚本

登录 Func,点击「脚本市场」,选择预装脚本市场,点击管理按钮,进入预装脚本市场的脚本列表页。在过滤搜索框中输入zabbix Stream ,过滤出zabbix Stream采集脚本。点击安装即可。

图片

2、创建URL

登录 Func,点击「管理」 - 「同步 API」(建议使用异步API)- 「新建」, 执行一栏选择刚导入脚本中的 Zabbix Receiver 方法,在参数指定中配置采集任务相关的配置,需要指定 zabbix_hostzabbix_userzabbix_passwdzabbix_version 为实际的值,base64 为 Zabbix 入参,此处填 INPUT_BY_CALLER,点击保存,并复制 url。

图片

3、创建 Zabbix 连接器

登录 Zabbix, 点击管理 -> 常规 -> 连接器,点击创建连接器,URL 处输入上一步创建的 url,信息类型选择数字和浮点数,点击添加。

图片

4、修改 zabbix_server.conf,修改 StartConnectors 为10,保存并重启 zabbix-server 服务

图片

5、验证指标采集结果

Kafka

该方式原理同 HTTP 方式消费指标数据,区别在于该方法引入了 Kafka 组件,需部署一个 HTTP 服务用于接收 Zabbix 的 stream 输出并将消息发送到 Kafka 中,详见https://git.zabbix.com/projects/ZT/repos/kafka-connector/browse,再由消费者订阅 Kafka,进行数据消费。

指标治理

Zabbix 指标数据结构

Zabbix 以主机为维度统计指标和告警。所以所有的指标必然包含主机信息。主机往往绑定一个或多个接口。

Zabbix 的指标(item key) 的形式为 key[param1,param2,param3]。其中 params 分为静态值和变量两种。

vfs.fs.size[{#FSNAME},pused]。其中 keyvfs.fs.size{#FSNAME} 是动态参数,指实际文件系统名,pused 为静态参数,指使用量。

上述采集方式中 zabbix apiStreamingZabbix Agent 2 三种采集方式均默认使用该规则进行指标映射。

建议的指标治理规则

由于 Zabbix 的数据结构跟观测云存在较大差异,为方便指标的使用与管理,结合实际企业用户的部署经验,对于 API 和 Streaming 的采集方式,我们建议 Zabbix 指标数据上传到观测云时按如下规则进行转换:

  • measurement (指标集):zabbix key 第一个 '.' 前的内容。
  • fields (指标):zabbix key + 所有静态参数。如 vfs.fs.size[{#FSNAME},pused],就会变成 vfs.fs.size.pusedsystem.cpu.load[all,avg1],就会变成system.cpu.load.all.avg1
  • tags (标签):zabbix item key 中的所有动态参数小写。同时会添加 hostip 以及 itemtags。如:vfs.fs.size[{#FSNAME},pused]tagfsname

Example:

Zabbix item keymeasurementFieldtags
vfs.dev.queue_size[{#DEVNAME}]vfsvfs.dev.queue_sizedevname
vfs.dev.read.await[{#DEVNAME}]vfsvfs.dev.read.awaitdevname
vfs.dev.read.rate[{#DEVNAME}]vfsvfs.dev.read.ratedevname
vfs.file.contents[/sys/block/{#DEVNAME}/stat]vfsvfs.file.contents._sys_blck__statdevname
vfs.file.contents["/sys/class/net/{#IFNAME}/type"]vfsvfs.file.contents._sys_class_net__typeifname
vfs.fs.inode[{#FSNAME},pfree]vfsvfs.fs.inode.pfreefsname
vfs.fs.size[{#FSNAME},pused]vfsvfs.fs.size.pusedfsname
net.if.in["{#IFNAME}",dropped]vfsnet.if.in.droppedifname
net.if.in["{#IFNAME}"]vfsnet.if.inifname

使用 Pipeline 的 reference table 实现自定义 Tag

场景:对于已有 CMDB 的客户,希望将主机的一些字段富足到指标 Tag 中。如应用、负责人信息等。

方式:使用 Pipeline 的 refertable 功能。

具体步骤:

1、使用 Func 创建一个脚本用于组装 reference table 数据,并发布。数据结构类似于:

{
"table_name": "zabbix-refer-table",
"column_name": ["itemid", "host", "ip", "itemkey"],
"column_type": ["string", "string", "string", "string"],
"row_data": [["1001", "host-1", "10.0.0.1", "vfs.fs.size"], 
    ["1002", "host-2", "10.0.0.2", "vfs.fs.size.pused"], 
    ["1003", "host-3", "10.0.0.3", "vfs.fs.size.pfree"]]
}

更多 reference table 用法,可参考:https://docs.guance.com/datakit/datakit-refer-table/

2、创建同步 API

登录 Func,点击「管理」 - 「同步 API」,点击 新建,在添加同步 API 对话框执行一栏中选择 zabbix-reference-table 获取脚本,点击确定保存脚本,并点击示例,获取请求 API。

图片

图片

3、编辑 DataKit 的配置文件

登录 DataKit 所在服务器(容器部署DataKit 参考官方文档),进入 DataKit 配置目录 /user/local/datakit/conf.d,编辑 datakit.conf 文件,修改 [pipeline] 选项下的 refer_table_url 的值为上一步复制的 Func 接口地址。DataKit 会将 refertable 数据预先加载到本地的 sqllite 中,可以根据 refer table 大小灵活选择是否使用内存模式的 sqllite。保存后重启 DataKit 生效。

图片

4、编辑 Pipeline

登录观测云,点击「管理」 - 「Pipelines」- 「新建 Pipeline」,这里给到一个参考 Pipeline,可根据实际业务情况和 refertable 数据结构灵活调整。

5、查看指标 Tag

超大数据量采集优化策略

  • 对于 Export Directory 方式,可以增加独立的高速 SSD 磁盘,增加单独的 zabbix server 用于数据导出(由于需要访问 zabbix API 和数据库,DataKit 采集 ExportDirectory 会比较占用 zabbix 资源)。调低 ExportFileSize 大小。
  • API 采集方式,可以通过分页查询,减少查询关联表,多线程查询等方式。
  • HTTP stream 方式,可以引入队列进行异步消费或使用异步方法。支持采样收集等方式。
  • 指标治理应先将映射关系生成后存入缓存或内存中,方便快速匹配。为减少 redis 读写压力可以考虑分片缓存或缓存压缩等方法。

各采集方式对比

采集方式采集原理优势劣势
Zabbix APIfunc/datakit使用python代码通过zabbix api获取指标数据。进行指标治理和映射后上传到观测云。可分布式采集,采集过程高可用便于灵活调整采集所需资源。便于指标的灵活治理和映射时效性不高,最大时延可达1minzabbix到func区间数据无法压缩,对该区间网路压力较大。通常需要在func维护采集代码,对采集代码质量要求较高,否则在进行大数据量采集时速度较慢导致时效变差或丢失数据,严重时会影响zabbix性能。
Streaming与zabbix建立网络长连接(HTTP server/Kafka)消费zabbix产生的history和event数据时效性高可分布式采集,采集过程高可用便于灵活调整采集所需资源。便于指标的灵活治理和映射zabbix到func区间数据无法压缩,对该区间网路压力较大。
Zabbix 转 Prometheus部署独立服务通过调用zabbix api将zabbix指标数据暴露成Prometheus metric接口供datakit采集集成简单,可以使用datakit现有能力。需要维护独立的转换服务。转换服务与zabbix间网络转发无压缩,对网络压力较大。无法灵活进行指标治理和映射。

总结

监控数据的集成是一个复杂的综合性工作,本文所展示方案所适用场景需相关运维工程师根据实际情况进行调整。

前言

在数字化运维与业务监控的实践中,仪表板(Dashboard)与汽车的仪表盘同等重要,它不仅是数据可视化的载体,更是团队快速定位问题、洞察数据趋势的核心工具。观测云在平台中内置了大量通用组件、云服务的仪表板模板。但如果你希望从零开始构建个性化的仪表板,又或者对自己绘制的仪表板不够满意,那么这篇文章将教授你几个小技巧,帮助你有效提升仪表板的质量。

观测云简介

观测云是一个统一实时监测平台,它提供全面的系统可观测性解决方案,帮助用户快速实现对云平台、云原生、应用及业务的监控需求。观测云的核心功能包括:基础设施监测,日志采集和分析,用户访问监测(RUM),应用性能监测(APM),服务可用性监测(拨测),安全监测,智能监控等等。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用服务的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。更多信息可以访问观测云官网:https://www.guance.com

基础仪表板的绘制

让我们进入到观测云,创建一个属于您自己的仪表板。首先,你需要找到仪表板的入口「场景」-「仪表板」,点击「新建仪表板」-「新建空白仪表板」。

图片

其次,可以从侧滑窗口中选择适合展示数据的图表类型,拖拽到左边的空白画布中。

图片

以常用的「时序图」为例,拖动到画布中即可打开「新建图表」弹窗,此时通过数据筛选控件来选择需要展示的指标。

图片

如图所示,我们已经展示了一条指标曲线,它代表的含义为:指标集为 cpu,指标名为 usage_total,按照 host 进行分组并统计 Avg 平均值,只显示 host=DESKTOP-F9E75IG 的值(过滤条件),点击右下角的保存即可。

图片

此时你已经完成了第一张图表的制作,通过一张张图表的叠加,你很快能得到一个完整的仪表板,不过它看上去有些简陋,我们需要更多技巧对仪表板的美观程度和易读性进行优化。

图片

仪表板的优化

新增标题和描述

恰当的标题能让用户第一时间知道图表展示的指标及其含义,而图表的描述能够起到有效补充说明。我个人的习惯是将图表名设置为指标的英文名,然后在「描述」中补充该指标的中文含义。如下所示:

图片

保存生效的效果如下,图表左上角将展示标题,而鼠标 hover 到帮助按钮上则会悬浮显示描述。

图片

数据单位

一部分指标在采集到观测云后没有单位,因此在绘制仪表板时需要注意补充单位。

图片

别名

图表的曲线会显示对象的名称,并且对象名称会随着分组条件的增多而变得复杂。例如下图,由于添加了 namespace,pod_name 等多个分组条件,对象名称显得很长,很不直观。好在我们可以通过配置「别名」来简化对象名称的显示。

图片

在图表配置的「别名」处,我们选择对应的指标序列,并用 {{}} 将分组条件包起来作为变量,例如下图中的分组条件 pod_name 就写为 {{pod_name}} ,效果如下所示。

图片

我们也支持用多个变量作为别名,写法为 {{分组条件1}}-{{分组条件2}} ,例如 {{namespace}}--{{pod_name}} ,效果如下图所示:

图片

现在,曲线上显示的对象名称已经比原始的名称简洁、清晰了很多。

图例

图表默认没有带上图例,除非将鼠标 hover 上去,否则无法看到什么颜色的曲线代表哪一个对象,如下图的左侧所示。而「图例」则可以将对象的名称和统计值显示到图表中,如下图的右侧所示。

图片

添加图例的方式如下,可选择将图例放置在图表的底部或者右侧,并显示单个或者统计值,将 Avg、Max、Last 一起显示出来是个不错的选择。

图片

分组

当仪表板中需要展示很多张图表时,使用「分组」来将不同含义的图表分门别类地归类就十分有必要了,这会让仪表板的显示更具有条理,用户能通过分组快速找到自己关注的图表,如下图所示。

图片

给仪表板添加分组时,只需要在侧滑菜单中找到「分组」这个图表类型,拖动到左侧画布即可。

图片

取一个有意义的分组名称,选择一个与众不同的颜色,保存即可。

图片

下图即为新创建的分组,后续添加的图表即可拖动到该分组下。

图片

锁定时间

如果你希望每次进入到仪表板,都查看到固定时间区间(例如最近1天)的数据,应该如何实现呢?

我们很容易注意到仪表板的时间控件,可以在这里固定整个仪表板的时间。

图片

如果需要将单个图表的时间进行固定,而其他图表的时间则跟随仪表板的时间控件,也很好实现。我们进入单个图表的编辑窗口,打开「高级配置」,将时间锁定为指定区间即可。

图片

配置完成后,这个图表的右上角会出现你锁定的时间区间,该时间不受仪表板整体的时间区间控制,如下图所示。

图片

视图变量

视图变量允许用户通过下拉菜单来选择特定对象的监控数据,从而根据自身需求动态筛选和分析数据。如下图所示,该仪表板包括了 Cluster、Namespace 和 Node 三个视图变量,用户可以进行自由筛选。

图片

我们首先添加一个简单的视图变量,需求是通过选择 host_ip 来过滤单台主机的数据。在仪表板中点击「添加视图变量」。

图片

图片

host_ip 是 cpu 相关指标数据的一个标签,因此我们从指标类型- CPU指标集里面选择 host_ip 作为视图变量的来源,然后将「变量名」和「显示名」都与之保持一致,保存窗口即可。

图片

此时返回仪表板,就会看到刚才添加的 host_ip 视图变量,从下拉菜单中可以筛选主机 IP。如下图所示:

图片

你可能会发现筛选结果之后,对下方的图表没有任何作用,因为我们还需要在图表中的过滤条件配置变量,使仪表板的额视图变量与图表的过滤条件进行联动。再次进入图表编辑界面,添加一个过滤条件,字段选择为 host_ip,值选择「视图变量」,如下图所示。

图片

返回仪表板,这时仪表板的视图变量 host_ip 就可以与图表中的监控对象 host_ip 进行联动了。我们可以通过下拉菜单来筛选不同的主机,从而观察不同主机的监控指标。

图片

如果是有多个视图变量,且视图变量之间有依赖关系,例如我们针对 Pod 的监控是首先选择 namespace,再选 Pod,那我们又应该如何配置呢?这就要用到「级联」的写法,让我们来再来回顾一下刚才本章开头的那张图片。选择 Cluster 后,Namespace 的值随 Cluster 的取值而联动,Node 的值又随 Namespace 的取值而联动。

图片

我们研究一下这组视图变量的写法,不难发现规律是在 show_tag_value 函数的后面跟随了一个 {key=value} 的过滤条件,其固定写法为 {key='#{value}'} ,key 和 value 都取自上一级的变量名,表示该变量随上一级变量的值而联动。如下图所示,当用户在界面上选择了 cluster_name_k8s 的值后,该值就会传入 namespace 作为过滤条件,从而实现变量联动。

图片

图片

小结

通过上面的几个小技巧,相信你已经跃跃欲试将自己的仪表板更上一层楼了。在得到令自己满意的仪表板后,你可以选择将仪表板开放给团队、配置为定时报告、投放到大屏幕、关联到日志或链路查看器中,又或者在接收到告警时一键查看这张仪表板。我们非常期待你通过仪表板来向你的团队/客户呈现数据的价值。