本文通过案例为您介绍如何使用实时计算完成视频核心指标监控。

背景信息

随着互联网络技术的发展,网络直播受到越来越多人的关注,特别是视频直播生态链。通过网络信号,我们在线收看体育赛事、重大活动和新闻等,真正地体验直播的乐趣。

在体验为王的时代,任何体验不佳均会导致客户群体大规模的流失。对于网站直播平台而言,需要重点关注以下几点:
  • 用户(主播和粉丝)的使用体验,重点关注系统指标包括音视频卡顿率、延迟率、丢包等情况。
  • 直播平台具有时效性,平台方更需要实时了解系统周边问题,并先于用户发现并定位问题和故障。
  • 平台运营方还应该及时跟踪和了解网站整体的客户运营情况,以及视频爆款等情况。

下面我们以某个视频直播平台方为例,讲解如何使用实时计算监控系统稳定性和平台运营情况。

业务详情

为了最大程度活跃用户社群,覆盖更多场景直播频道,最终实现平台方盈利,业务通常是这样实现的:
  • 同一个视频直播网站有多个主播。
  • 每个主播向一个频道内的用户进行广播。
  • 用户可以看到当前频道内的主播视频,并听到其声音。
  • 主播可以与频道内的多个用户进行私聊。
图 1. 业务流程
  1. 主播和粉丝各自持有直播App软件,该App软件每10秒向服务器打点。
  2. 服务器接收到打点信息会输出到本地磁盘,阿里云日志服务采集打点数据。
  3. 实时计算订阅该日志服务。
  4. 实时计算客户端视频播放情况。

业务目标

针对客户端App的监控,获取以下指标:
  • 房间故障,包括卡顿、丢帧、音视频不同步等。
  • 分地域统计数据端到端延迟平均情况。
  • 统计实时整体卡顿率(出现卡顿的在线用户数/在线总用户数*100%,通过此指标可以衡量当前卡顿影响的人群范围)。
  • 统计人均卡顿次数(在线卡顿总次数/在线用户数,通过此指标可以从卡顿频次上衡量整体的卡顿严重程度)。

最终我们希望将上述数据实时计算并写入阿里云关系型数据库RDS(Relational Database Service),并提供在线数据报表展示、大屏展示、甚至部分监控告警。

数据格式

客户端App向服务器打点日志格式如下。
字段 含义
ip 用户端IP
agent 端类型
roomid 房间号
userid 用户ID
abytes 音频码率
afcnt 音频帧数
adrop 音频丢帧数量
afts 音频时间戳
alat 音频帧端到端延迟
vbytes 视频码率
vfcnt 视频帧数
vdrop 视频丢帧数量
vfts 视频时间戳
vlat 视频帧端到端延迟
ublock 上行卡顿次数
dblock 下行卡顿次数
timestamp 打点时间戳
region 地域
日志服务内部是半结构化存储,上述数据将展现出来格式如下。
{
    "ip": "ip",
    "agent": "agent",
    "roomid": "123456789",
    "userid": "123456789",
    "abytes": "123456",
    "afcnt": "34",
    "adrop": "3",
    "afts": "1515922566",
    "alat": "123",
    "vbytes": "123456",
    "vfcnt": "34",
    "vdrop": "4",
    "vfts": "1515922566",
    "vlat": "123",
    "ublock": "1",
    "dblock": "2",
    "timestamp": "15151922566",
    "region": "hangzhou"
}         

SQL编写

  • 数据清洗
    首先在实时计算中声明源表。
    CREATE TABLE app_heartbeat_stream_source (
        ip VARCHAR,
        agent VARCHAR,
        roomid VARCHAR,
        userid VARCHAR,
        abytes VARCHAR,
        afcnt VARCHAR,
        adrop VARCHAR,
        afts VARCHAR,
        alat VARCHAR,
        vbytes VARCHAR,
        vfcnt VARCHAR,
        vdrop VARCHAR,
        vfts VARCHAR,
        vlat VARCHAR,
        ublock VARCHAR,
        dblock VARCHAR,
        `timestamp` VARCHAR,
        app_ts AS TO_TIMESTAMP(CAST(`timestamp` AS BIGINT)), --定义生成WATERMARK的字段。
        WATERMARK FOR app_ts AS withOffset(app_ts, 10000) --WATERMARK比数据时间线性增加10秒。
    ) WITH (
        type ='sls',
        endPoint ='http://cn-hangzhou-corp.sls.aliyuncs.com',
        accessId ='xxxxxxxxxxx',
        accessKey ='xxxxxxxxxxxxxxxxxxxxxxxxxxxx',
        project ='xxxx',
        logStore ='app_heartbeat_stream_source',
    );                
    源端业务为考虑业务方便,将所有的数据均处理为VARCHAR类型。为了方便后续处理,我们将上述源表进行数据清洗,清洗目标为:
    1. 格式转换。将部分VARCHAR类型转为BIGINT。
    2. 业务补充。例如,填写地域相关信息。
    CREATE VIEW view_app_heartbeat_stream AS
    SELECT
        ip,
        agent,
        CAST(roomid AS BIGINT),
        CAST(userid AS BIGINT),
        CAST(abytes AS BIGINT),
        CAST(afcnt AS BIGINT),
        CAST(adrop AS BIGINT),
        CAST(afts AS BIGINT),
        CAST(alat AS BIGINT),
        CAST(vbytes AS BIGINT),
        CAST(vfcnt AS BIGINT),
        CAST(vdrop AS BIGINT),
        CAST(vfts AS BIGINT),
        CAST(vlat AS BIGINT),
        CAST(ublock AS BIGINT),
        CAST(dblock AS BIGINT),
        app_ts,    
        region
    FROM
        app_heartbeat_stream_source;                 
  • 房间故障统计
    统计房间故障,故障包括卡顿、丢帧、音视频不同步信息,使用10分钟一个窗口进行统计。
    CREATE VIEW room_error_statistics_10min AS
    SELECT
        CAST(TUMBLE_START(app_ts, INTERVAL '10' MINUTE) as VARCHAR) as app_ts,
        roomid,
        SUM(ublock) as ublock, --统计10分钟内上行卡顿次数。
        SUM(dblock) as dblock, --统计10分钟内下行卡顿次数。
        SUM(adrop) as adrop, --统计10分钟内音频丢包次数。
        SUM(vdrop) as vdrop, --统计10分钟内视频丢包次数。
        SUM(alat) as alat, --统计10分钟内音频延迟。
        SUM(vlat) as vlat, --统计10分钟内音频延迟。
    FROM
        view_app_heartbeat_stream
    GROUP BY
        TUMBLE(app_ts, INTERVAL '10' MINUTE), roomid;                   
  • 分地域统计延迟情况
    分地域统计数据端到端延迟平均情况,每10分钟统计音频、视频平均延迟情况。
    CREATE VIEW region_lat_statistics_10min AS
    SELECT 
        CAST(TUMBLE_START(app_ts, INTERVAL '10' MINUTE) as VARCHAR) as app_ts,
        region,
        SUM(alat)/COUNT(alat) as alat,
        SUM(vlat)/COUNT(vlat) as vlat,
    FROM
        view_app_heartbeat_stream
    GROUP BY
        TUMBLE(app_ts, INTERVAL '10' MINUTE), region;               
  • 实时整体卡顿率
    统计实时整体卡顿率,即出现卡顿的在线用户数/在线总用户数*100%,通过此指标可以衡量当前卡顿影响的人群范围。
    CREATE VIEW block_total_statistics_10min AS
    SELECT
        CAST(TUMBLE_START(app_ts, INTERVAL '10' MINUTE) as VARCHAR) as app_ts,
        SUM(IF(ublock <> 0 OR dblock <> 0, 1, 0)) / CAST(COUNT(DISTINCT userid) AS DOUBLE) as block_rate, --COUNT(DISTINCT) 需要在1.4.4版本以上Blink才能支持
    FROM
        view_app_heartbeat_stream
    GROUP BY
        TUMBLE(app_ts, INTERVAL '10' MINUTE);         
  • 统计人均卡顿次数
    统计人均卡顿次数,即在线卡顿总次数/在线用户数,通过此指标可以从卡顿频次上衡量整体的卡顿严重程度。
    CREATE VIEW block_peruser_statistics_10min AS
    SELECT
        CAST(TUMBLE_START(app_ts, INTERVAL '10' MINUTE) as VARCHAR) as app_ts,
        SUM(ublock+dblock) / CAST(COUNT(DISTINCT userid) AS DOUBLE) as block_peruser, --COUNT(DISTINCT) 需要在1.4.4版本以上Blink才能支持
    FROM
        view_app_heartbeat_stream
    GROUP BY
        TUMBLE(app_ts, INTERVAL '10' MINUTE);                

Demo示例以及源代码

根据上文介绍的视频直播解决方案之视频核心指标监控,阿里云为您创建了一个包含完整链路的Demo示例,参考示例代码,您可注册上下游数据,制定自己的视频核心指标监控的解决方案。单击下载示例。使用示例时,您需要选择CSV文件上传至DataHub作为源表,RDS作为结果表来存储结果数据。