实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控

作者:吴云涛,腾讯 CSIG 高级工程师

本文描述了如何使用腾讯云大数据组件来完成实时监控系统的设计和实现,通过实时采集并分析云服务器(CVM)及其 App 应用的 CPU和内存等资源消耗数据,以短信、电话、微信消息等方式实时反馈监控告警信息,高效地保障系统稳健运行。运用云化的 Kafka、Flink、ES 等组件,大大减少了开发运维人员的投入。

1 解决方案描述

1.1 概述

本方案结合腾讯云 CKafka、流计算 Oceanus (Flink)、 Elasticsearch、Prometheus 等,通过 Filebeat 实时采集系统和应用监控数据,并传输到 CKafka,再将 CKafka 数据接入流计算 Oceanus (Flink),经过简单的业务逻辑处理输出到 Elasticsearch,最后通过 Kibana 页面查询结果。方案中利用 Promethus 监控系统指标,如流计算 Oceanus 作业运行状况,利用云 Grafana 监控 CVM 或业务应用指标。

实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控_第1张图片

1.2 方案架构

实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控_第2张图片

2 前置准备

在实现本方案前,请确保已创建并配置了相应的大数据组件。

2.1 创建私有网络VPC

私有网络(VPC)是一块您在腾讯云上自定义的逻辑隔离网络空间,在构建 CKafka、流计算 Oceanus,Elasticsearch 集群等服务时选择建议同一个 VPC。具体创建步骤请参考 帮助文档。

2.2 创建Ckafka实例

Kafka 建议选择最新的 2.4.1 版本,和 Filebeat 采集工具兼容性较好。
购买完成后,再创建Kafka topic: topic-app-info

2.3 创建流计算 Oceanus集群

流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发、无缝连接、亚秒延时、低廉成本、安全稳定等特点的企业级实时大数据分析平台。流计算 Oceanus 以实现企业数据价值最大化为目标,加速企业实时化数字化的建设进程。
在流计算 Oceanus 控制台的【集群管理】->【新建集群】页面创建集群,具体步骤请参考 帮助文档。

2.4. 创建 Elasticsearch 实例

在 Elasticsearch 控制台,点击左上角【新建】创建集群,具体步骤请参考帮助文档

2.5 创建云监控Prometheus实例

为了展示自定义系统指标,需购买 Promethus 服务。只需要自定业务指标的同学可以省略此步骤。

进入云监控控制台,点击左侧 【Prometheus 监控】,新建 Promethus 实例,具体的步骤请参考帮助文档

2.6 创建独立Grafana资源

独立的Grafana在灰度发布中,需在Grafana管理页面进行单独购买,以实现业务监控指标的展示。

2.7 安装配置Filebeat

Filebeat 是一款轻量级日志数据采集的工具,通过监控指定位置的文件收集信息。在该 VPC 下给需要监控主机信息和应用信息的云服务器上安装 Filebeat。安装方式一:下载 Filebeat 并安装。Filebeat下载地址 ;方式二:采用【Elasticsearch管理页面】–>【beats管理】中提供的Filebeat。本示例中采用了方式一。
下载到CVM中并配置Filebeat,在filebeat.yml文件中提添加如下配置项:

# 监控日志文件配置
- type: log
  enabled: true
  paths:
    - /tmp/test.log
    #- c:\programdata\elasticsearch\logs\*
# 监控数据输出项配置
output.kafka:
  version: 2.0.0                         # kafka版本号
  hosts: ["xx.xx.xx.xx:xxxx"]            # 请填写实际的IP地址+端口
  topic: 'topic-app-info'                  # 请填写实际的topic

请根据实际业务需求配置相对应的 Filebeat.yml 文件,参考 Filebeat官方文档。

注:示例选用2.4.1的 Ckafka版本,这里配置version: 2.0.0。版本对应不上可能出现“ERROR [kafka] kafka/client.go:341 Kafka (topic=topic-app-info): dropping invalid message”错误

3 方案实现

接下来通过案例介绍如何通过流计算 Oceanus 实现个性化监控。

3.1 Filebeat采集数据

  1. 进入到 Filebeat 根目录下,并启动 Filebeat 进行数据采集。示例中采集了 top 命令中显示的 CPU、内存等信息,也可以采集 jar 应用的日志、JVM 使用情况、监听端口等,详情参考Filebeat官网。
# filebeat启动
./filebeat -e -c filebeat.yml

# 监控系统信息写入test.log文件
top -d 10 >>/tmp/test.log
  1. 进入 CKafka 页面,点击左侧【消息查询】,查询对应 topic 消息,验证是否采集到数据。

Filebeat 采集到的 Kafka 的数据格式:

{
	"@timestamp": "2021-08-30T10:22:52.888Z",
	"@metadata": {
		"beat": "filebeat",
		"type": "_doc",
		"version": "7.14.0"
	},
	"input": {
		"type": "log"
	},
	"host": {
		"ip": ["xx.xx.xx.xx", "xx::xx:xx:xx:xx"],
		"mac": ["xx:xx:xx:xx:xx:xx"],
		"hostname": "xx.xx.xx.xx",
		"architecture": "x86_64",
		"os": {
			"type": "linux",
			"platform": "centos",
			"version": "7(Core)",
			"family": "redhat",
			"name": "CentOSLinux",
			"kernel": "3.10.0-1062.9.1.el7.x86_64",
			"codename": "Core"
		},
		"id": "0ea734564f9a4e2881b866b82d679dfc",
		"name": "xx.xx.xx.xx",
		"containerized": false
	},
	"agent": {
		"name": "xx.xx.xx.xx",
		"type": "filebeat",
		"version": "7.14.0",
		"hostname": "xx.xx.xx.xx",
		"ephemeral_id": "6c0922a6-17af-4474-9e88-1fc3b1c3b1a9",
		"id": "6b23463c-0654-4f8b-83a9-84ec75721311"
	},
	"ecs": {
		"version": "1.10.0"
	},
	"log": {
		"offset": 2449931,
		"file": {
			"path": "/tmp/test.log"
		}
	},
	"message": "(B[m16root0-20000S0.00.00:00.00kworker/1:0H(B[m[39;49m[K"
}

3.2 创建 Flink SQL 作业

使用流计算 Oceanus 对 CKafka 接入的数据进行加工处理,并存入 Elasticsearch。

1. 定义source

按照 Filebeat 中 json 消息的格式,构造 Flink Table Source。

 CREATE TABLE DataInput (
     `@timestamp` VARCHAR,
     `host`       ROW<id VARCHAR,ip ARRAY<VARCHAR>>,
     `log`        ROW<`offset` INTEGER,file ROW<path VARCHAR>>,
     `message`    VARCHAR
 ) WITH (
     'connector' = 'kafka',   -- 可选 'kafka','kafka-0.11'. 注意选择对应的内置  Connector
     'topic' = 'topic-app-info',  -- 替换为您要消费的 Topic
     'scan.startup.mode' = 'earliest-offset', -- 可以是 latest-offset / earliest-offset / specific-offsets / group-offsets 的任何一种
     'properties.bootstrap.servers' = '10.0.0.29:9092',  -- 替换为您的 Kafka 连接地址
     'properties.group.id' = 'oceanus_group2',  -- 必选参数, 一定要指定 Group ID
     -- 定义数据格式 (JSON 格式)
     'format' = 'json',
     'json.ignore-parse-errors' = 'true',     -- 忽略 JSON 结构解析异常
     'json.fail-on-missing-field' = 'false'   -- 如果设置为 true, 则遇到缺失字段会报错 设置为 false 则缺失字段设置为 null
 );

2. 定义sink

CREATE TABLE es_output (
    `id` VARCHAR,
    `ip` ARRAY<VARCHAR>,
    `path` VARCHAR,
    `num` INTEGER,
    `message` VARCHAR,
    `createTime` VARCHAR
) WITH (
    'connector.type' = 'elasticsearch', -- 输出到 Elasticsearch
    'connector.version' = '6',          -- 指定 Elasticsearch 的版本, 例如 '6', '7'. 
    'connector.hosts' = 'http://10.0.0.175:9200',  -- Elasticsearch 的连接地址
    'connector.index' = 'oceanus_test2',       -- Elasticsearch 的 Index 名
    'connector.document-type' = '_doc',  -- Elasticsearch 的 Document 类型
    'connector.username' = 'elastic',  
    'connector.password' = 'yourpassword', 
    'update-mode' = 'upsert',            -- 可选无主键的 'append' 模式,或有主键的 'upsert' 模式     
    'connector.key-delimiter' = '$',     -- 可选参数, 复合主键的连接字符 (默认是 _ 符号, 例如 key1_key2_key3)
    'connector.key-null-literal' = 'n/a',  -- 主键为 null 时的替代字符串,默认是 'null'
    'connector.failure-handler' = 'retry-rejected',   -- 可选的错误处理。可选择 'fail' (抛出异常)、'ignore'(忽略任何错误)、'retry-rejected'(重试)

    'connector.flush-on-checkpoint' = 'true',   -- 可选参数, 快照时不允许批量写入(flush), 默认为 true
    'connector.bulk-flush.max-actions' = '42',  -- 可选参数, 每批次最多的条数
    'connector.bulk-flush.max-size' = '42 mb',  -- 可选参数, 每批次的累计最大大小 (只支持 mb)
    'connector.bulk-flush.interval' = '60000',  -- 可选参数, 批量写入的间隔 (ms)
    'connector.connection-max-retry-timeout' = '1000',     -- 每次请求的最大超时时间 (ms)
    --'connector.connection-path-prefix' = '/v1'          -- 可选字段, 每次请求时附加的路径前缀                                                        
    'format.type' = 'json'        -- 输出数据格式, 目前只支持 'json'
);

3. 加工业务数据

INSERT INTO es_output
SELECT 
host.id as `id`,
host.ip as `ip`,
log.file.path as `path`,
log.`offset` as `num`,
message,
`@timestamp` as `createTime`
from DataInput;

4. 配置作业参数

【内置connector】选择flink-connector-elasticsearch6flink-connector-kafka

注: 根据实际版本选择

5. 查询 ES 数据

在 ES 控制台的 Kibana 页面查询数据,或者进入某台相同子网的 CVM 下,使用以下命令进行查询:

# 查询索引  username:password请替换为实际账号密码
curl -XGET -u username:password http://xx.xx.xx.xx:xxxx/oceanus_test2/_search -H 'Content-Type: application/json' -d'
{
    "query": { "match_all": {}},
    "size":  10
}
'

更多访问方式请参考 访问ES集群。

3.3 系统指标监控

本章节主要实现系统信息监控,对 Flink 作业运行状况进行监控告警。

Prometheus 是一个非常灵活的时序数据库,通常用于监控数据的存储、计算和告警。流计算 Oceanus 建议用户使用腾讯云监控提供的 Prometheus 服务,以免去部署、运维开销;同时它还支持腾讯云的通知模板,可以通过短信、电话、邮件、企业微信机器人等方式,将告警信息轻松触达不同的接收方。

监控配置

流计算 Oceanus 作业监控

除了流计算 Oceanus 控制台自带的监控信息,还可以配置目前已经支持了任务级细粒度监控、作业级监控和集群 Flink 作业列表监控。

  1. 流计算 Oceanus 作业详情页面,点击【作业参数】,在【高级参数】处添加如下配置:

    pipeline.max-parallelism: 2048
    metrics.reporters: promgateway
    metrics.reporter.promgateway.host: xx.xx.xx.xx              # Prometheus实例地址 
    metrics.reporter.promgateway.port: 9090                     # Prometheus实例端口
    metrics.reporter.promgateway.needBasicAuth: true
    metrics.reporter.promgateway.password: xxxxxxxxxxx          # Prometheus实例密码
    metrics.reporter.promgateway.interval: 10 SECONDS
    
  2. 在任一流计算 Oceanus 作业中,点击【云监控】进入云 Prometheus 实例,点击链接进入Grafana(灰度中的 Grafana 不能由此进入),导入 json 文件,详情请参见 接入Prometheus自定义监控。

实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控_第3张图片

  1. 展现出来的 Flink 任务监控效果如下,用户也可以点击【Edit】设置不同 Panel 来优化展现效果。
    实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控_第4张图片

告警配置

  1. 进入腾讯云监控界面,点击左侧【Prometheus 监控】,点击已购买的实例进入服务管理页面,点击左侧【告警策略】,点击【新建】,配置相关信息。具体操作参考 接入Prometheus自定义监控。
    实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控_第5张图片

  2. 设置告警通知。选择【选择模版】或【新建】,设置通知模版。
    实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控_第6张图片

  3. 短信通知消息
    实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控_第7张图片

3.4 业务指标监控

通过 Filebeat 采集到应用业务数据,经过流计算 Oceanus 服务进行数据的加工处理并存入 ES,利用 ES + Grafana 来实现业务数据的监控。

  1. Grafana 配置 ES 数据源。进入灰度发布中的Grafana控制台,进入刚刚创建的 Grafana 服务,找到外网地址打开并登录,Grafana 账号为 admin,登录后点击【Configuration】,点击【Add Source】,搜索elasticsearch,填写相关 ES 实例信息,添加数据源。 实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控_第8张图片

  2. 点击左侧【Dashboards】,点击【Manage】,点击右上角【New Dashboard】,新建面板,编辑面板。 实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控_第9张图片

  3. 展现效果如下:

  • 总数据量写入实时监控:对写入数据源的总数据量进行监控;
  • 数据来源实时监控:对来源于某个特定log的数据写入量进行监控;
  • 字段平均值监控:对某个字段的平均值进行监控;
  • num字段最大值监控:对num字段的最大值进行监控;

实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控_第10张图片

注:本处只做示例,无实际业务

4 总结

本方案中对系统监控指标和业务监控指标2种监控方案都进行尝试。若只需要对业务指标进行监控,可省略 Promethus 相关操作。

此外,需要注意的是:

  1. CKafka 的版本和开源版本 Kafka 并没有严格对应,方案中 CKafka2.4.1和开源 Filebeat-1.14.1版本能够调试成功。
  2. 云监控中的 Promethus 服务已经嵌入了 Grafana 监控服务。但不支持自定义数据源,该嵌入的 Grafana 只能接入 Promethus,需使用独立灰度发布的 Grafana 才能完成ES数据接入 Grafana。

流计算 Oceanus 限量秒杀专享活动火爆进行中↓↓实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控_第11张图片

实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控_第12张图片

关注“腾讯云大数据”公众号,技术交流、最新活动、服务专享一站Get~

你可能感兴趣的:(big,data)