跳转至

监控器、短信、语音计量详解

2026-01-30

本文档主要介绍观测云中有关监控器、短信、语音计量数据的详细处理方式

1. 前言

了解计量数据需要配合函数执行日志,与其他 DataFlux Func 中执行的函数一样,当配置了函数日志上报至观测云后,相关函数执行日志可以方便地在观测云平台查询。

有关如何配置函数日志上报到观测云,请参考 手册 / 部署和维护 / 上报自观测数据

2. 基本流程

为了减少系统间 HTTP 请求数量,所有的计量数据都遵循「触发时缓冲,定时批量上报」的模式实现。

监控器

监控器上报的计量数据为:project = "job_runs", sub_project = "monitor"

大致流程如下:

sequenceDiagram
      autonumber

    participant MONITOR as 监控器任务
    participant REDIS as Redis 计量缓存
    participant FLUSH as 计量数据定时上报任务
    participant DW as Internal DataWay

    MONITOR->>REDIS:单次缓存计量数据
    MONITOR->>REDIS:单次缓存计量数据
    MONITOR->>REDIS:单次缓存计量数据

    rect rgb(0,0,0,.05)
        FLUSH->>REDIS:批量获取计量数据
        FLUSH->>DW:批量写入指标数据
    end

短信 / 语音、IVR 语音

  • 短信的计量数据为:project = "sms"
  • 语音、IVR 语音的计量数据为:project = "vms"
sequenceDiagram
    autonumber

    participant SMS_VMS as 短信 / 语音、IVR 语音任务
    participant REDIS_RESULT as Redis 任务缓存
    participant FETCH_RESULT as 任务结果定时获取任务
    participant REDIS_METERING as Redis 计量缓存
    participant FLUSH as 计量数据定时上报任务
    participant DW as Internal DataWay

    SMS_VMS->>REDIS_RESULT:记录 Call/Biz ID
    SMS_VMS->>REDIS_RESULT:记录 Call/Biz ID
    SMS_VMS->>REDIS_RESULT:记录 Call/Biz ID

    rect rgb(0,0,0,.05)
        FETCH_RESULT->>REDIS_RESULT:查询 Call/Biz ID 结果
        FETCH_RESULT->>REDIS_METERING:【成功】单次缓存计量数据
        FETCH_RESULT->>REDIS_RESULT:删除 Call/Biz ID
    end

    rect rgb(0,0,0,.05)
        FETCH_RESULT->>REDIS_RESULT:查询 Call/Biz ID 结果
        FETCH_RESULT-->REDIS_METERING:【失败】不计量
        FETCH_RESULT->>REDIS_RESULT:删除 Call/Biz ID
    end

    rect rgb(0,0,0,.05)
        FETCH_RESULT->>REDIS_RESULT:查询 Call/Biz ID 结果
        FETCH_RESULT-->REDIS_METERING:【等待】不计量,下一轮重新检查
    end

    rect rgb(0,0,0,.05)
      FLUSH->>REDIS_METERING:批量获取计量数据
      FLUSH->>DW:批量写入指标数据
    end

3. 计费触发条件

项目 触发条件 额外说明
监控器 启动即触发计费 部分监控器单次运行会记为多条
检测范围过长的也会增加计费量
短信 任务结果查询中,SendStatus3(成功)时计费 发起「发送短信」任务本身成功与否不作为计费依据
语音、IVR 语音 任务结果查询中,存在 endDate 值且 duration > 0 时计费 发起「发送语音通知」任务本身成功与否不作为计费依据

4. 相关日志及示例

以下为与计费相关的日志摘录:

监控器

日志查看器过滤
1
source:DFF_task_record_func service:DFF_task_record_func site_name:xxxxx func_id:guance__api.custom_metric
本次任务计量数
1
2
3
4
5
6
[01-30 17:12:35] [+35ms] [35ms] 【Studio】 工作空间信息(从缓存获取):{...}
[01-30 17:12:35] [+8ms] [43ms] 【使用额度】 数据查询范围为 5 分钟,尚未超过 15 分钟,不需要额外计量
[01-30 17:12:35] [+0ms] [44ms] 【使用额度】 存在 workspace_uuid 参数,值为 wksp_xxxxx ,需要计量 1 次
[01-30 17:12:35] [+2ms] [46ms] 【函数】 调用函数:guance__api_impl.custom_check
[01-30 17:12:35] [+0ms] [46ms] 【函数】 --> 参数:kwargs = {"version":"v2"}
[01-30 17:12:35] [+0ms] [46ms] 【函数】 --> 参数:checker = "custom_metric"
日志查看器过滤
1
2
3
4
source:DFF_task_record_func service:DFF_task_record_func site_name:xxxxx func_id:guance__api_internal.flush_job_runs_billing

# 或增加以下条件,筛选存在计量的任务
billing_item_count:>0
各空间计量数
1
2
3
4
5
6
7
[01-30 17:15:00] [+54ms] [54ms] 【Studio】 获取工作空间UUID列表(共2550个)
[01-30 17:15:00] [+6ms] [61ms] 【使用额度】 存在 1607 条计量数据
[01-30 17:15:00] [+6ms] [67ms] 【使用额度】 工作空间 wksp_f9b22xxxxx 本次计数 1
[01-30 17:15:00] [+1ms] [69ms] 【使用额度】 工作空间 wksp_c76e1xxxxx 本次计数 123
[01-30 17:15:00] [+0ms] [69ms] 【使用额度】 工作空间 wksp_8679cxxxxx 本次计数 176
[01-30 17:15:00] [+2ms] [71ms] 【使用额度】 工作空间 wksp_93128xxxxx 本次计数 413
[01-30 17:15:00] [+0ms] [71ms] 【使用额度】 工作空间 wksp_14be7xxxxx 本次计数 311

短信

日志查看器过滤
1
source:DFF_task_record_func service:DFF_task_record_func site_name:xxxxx func_id:message_desk__api.send_sms
只能证明调用阿里云通讯成功
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[01-30 00:24:01] [+10ms] [10ms] 【函数】 调用函数:message_desk__sms.send
[01-30 00:24:01] [+0ms] [10ms] 【函数】 --> 参数:to = "185xxxxxxxx"
[01-30 00:24:01] [+0ms] [10ms] 【函数】 --> 参数:template_code = "SMS_xxxxxxxx"
[01-30 00:24:01] [+0ms] [10ms] 【函数】 --> 参数:template_params = {"node_info":"测试环境","node_name":"测试环境","site_name":"测试环境","workspace_name":"测试02-04空间","workspace_uuid":"wksp_xxxxx"}
[01-30 00:24:01] [+0ms] [10ms] 【函数】 --> 参数:sign_name = null
[01-30 00:24:01] [+0ms] [10ms] 【函数】 --> 参数:_override_configs = null
[01-30 00:24:01] [+0ms] [10ms] 发送请求:
[01-30 00:24:01] [+0ms] [10ms] --> 目标号码:'185xxxxxxxx'
[01-30 00:24:01] [+0ms] [10ms] --> 短信签名:观测云
[01-30 00:24:01] [+0ms] [10ms] --> 短信模板 / 参数:SMS_xxxxx / {"node_info":"测试环境","node_name":"测试环境","site_name":"测试环境","workspace_name":"测试02-04空间","workspace_uuid":"wksp_xxxxx"}
[01-30 00:24:01] [+0ms] [10ms] 调用阿里云接口:
[01-30 00:24:01] [+0ms] [10ms] --> 产品:dysms
[01-30 00:24:01] [+0ms] [10ms] --> 参数:{"Action":"SendSms","PhoneNumbers":"185xxxxxxxx","RegionId":"cn-hangzhou","SignName":"观测云","TemplateCode":"SMS_xxxxxxxx","TemplateParam":"{\"node_info\":\"测试环境\",\"node_name\":\"测试环境\",\"site_name\":\"测试环境\",\"workspace_name\":\"测试02-04空间\",\"workspace_uuid\":\"wksp_xxxxx\"}"}
[01-30 00:24:02] [+301ms] [312ms] 发送结果:
[01-30 00:24:02] [+0ms] [312ms] --> 响应代码:200
[01-30 00:24:02] [+0ms] [312ms] --> 响应内容:{"BizId":"xxxxx^0","Code":"OK","Message":"OK","RequestId":"xxxxx"}
[01-30 00:24:02] [+0ms] [312ms] 【消息记录】 消息发送成功
[01-30 00:24:02] [+0ms] [312ms] 【消息记录】 清除通知对象失败时间(185xxxxxxxx)
日志查看器过滤
1
2
3
4
source:DFF_task_record_func service:DFF_task_record_func site_name:xxxxx func_id:guance__api_internal.fetch_sms_result_and_bill

# 或增加以下条件,筛选存在 sms 计量的任务
sms_billing_count:>0
只有发送成功的才计量
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[01-30 00:25:00] [+9ms] [9ms] 【消息记录】 存在 16 条待获取的 sms 发送结果:
[01-30 00:25:00] [+0ms] [9ms] 【消息记录】 [发送记录 1/16] 消息 ID: xxxxx, 目标: 185xxxxxxxx, 工作空间 UUID: wksp_xxxxx
[01-30 00:25:00] [+0ms] [9ms] 【函数】 调用函数:guance__api_internal.fetch_sms_result_and_bill
[01-30 00:25:00] [+0ms] [9ms] 【函数】 --> 参数:to = "185xxxxxxxx"
[01-30 00:25:00] [+0ms] [9ms] 【函数】 --> 参数:biz_id = "xxxxx"
[01-30 00:25:00] [+0ms] [9ms] 【函数】 --> 参数:send_date = "20260129"
[01-30 00:25:01] [+0ms] [427ms] 调用阿里云接口:
[01-30 00:25:01] [+0ms] [427ms] --> 产品:dysms
[01-30 00:25:01] [+0ms] [427ms] --> 参数:{"Action":"QuerySendDetails","BizId":"xxxxx","CurrentPage":1,"PageSize":50,"PhoneNumber":"185xxxxxxxx","RegionId":"cn-hangzhou","SendDate":"20260130"}
[01-30 00:25:01] [+286ms] [713ms] 查询结果:
[01-30 00:25:01] [+0ms] [713ms] --> 响应代码:200
[01-30 00:25:01] [+0ms] [713ms] --> 响应内容:{"Code":"OK","Message":"OK","RequestId":"xxxxx","SmsSendDetailDTOs":{"SmsSendDetailDTO":[{"Content":"【观测云】这里是观测云告警通知,您在 测试环境 站点的工作空间 测试02-04空间 有新的故障通知,请及时登录控制台查看并安排故障处理,避免该故障影响业务运行。","ErrCode":"DELIVERED","PhoneNum":"185xxxxxxxx","ReceiveDate":"2026-01-30 00:19:10","SendDate":"2026-01-30 00:19:03","SendStatus":3,"TemplateCode":"SMS_xxxxx"}]},"TotalCount":1}
[01-30 00:25:01] [+0ms] [713ms] 【消息记录】 --> 发送结果为 success,需要计量
[01-30 00:25:01] [+0ms] [714ms] 【消息记录】 [发送记录 2/16] 消息 ID: 711525169703724097^0, 目标: 185xxxxxxxx, 工作空间 UUID: wksp_xxxxx
[01-30 00:25:01] [+0ms] [714ms] 【消息记录】 --> 发送时间为 2026-01-30 00:22:04,需要等到 2026-01-30 00:25:04(4 秒以后)之后尝试获取
日志查看器过滤
1
2
3
4
source:DFF_task_record_func service:DFF_task_record_func site_name:xxxxx func_id:guance__api_internal.flush_sms_billing

# 或增加以下条件,筛选存在计量的任务
billing_item_count:>0
各空间计量数
1
2
3
4
[01-30 00:30:00] [+54ms] [54ms] 【Studio】 获取工作空间UUID列表(共2550个)
[01-30 00:30:00] [+8ms] [62ms] 【使用额度】 存在 6 条计量数据
[01-30 00:30:00] [+3ms] [66ms] 【使用额度】 工作空间 wksp_863e8xxxxx 本次计数 3
[01-30 00:30:00] [+2ms] [69ms] 【使用额度】 工作空间 wksp_84c4axxxxx 本次计数 3

语音、IVR 语音

日志查看器过滤
1
2
source:DFF_task_record_func service:DFF_task_record_func site_name:xxxxx func_id:message_desk__api.send_vms
source:DFF_task_record_func service:DFF_task_record_func site_name:xxxxx func_id:message_desk__api.send_ivr_call
只能证明调用阿里云通讯成功
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[01-30 03:04:03] [+9ms] [9ms] 【函数】 调用函数:message_desk__vms.send
[01-30 03:04:03] [+0ms] [9ms] 【函数】 --> 参数:to = "185xxxxxxxx"
[01-30 03:04:03] [+0ms] [9ms] 【函数】 --> 参数:tts_code = "TTS_xxxxx"
[01-30 03:04:03] [+0ms] [9ms] 【函数】 --> 参数:tts_param = {"node_info":"测试环境","node_name":"测试环境","site_name":"测试环境","workspace_name":"测试02-04空间","workspace_uuid":"wksp_xxxxx"}
[01-30 03:04:03] [+0ms] [9ms] 【函数】 --> 参数:_override_configs = null
[01-30 03:04:03] [+0ms] [9ms] 发送请求:
[01-30 03:04:03] [+0ms] [9ms] --> 目标号码:'185xxxxxxxx'
[01-30 03:04:03] [+0ms] [9ms] --> 语音模板 / 参数:TTS_xxxxx / {"node_info":"测试环境","node_name":"测试环境","site_name":"测试环境","workspace_name":"测试02-04空间","workspace_uuid":"wksp_xxxxx"}
[01-30 03:04:03] [+0ms] [9ms] 调用阿里云接口:
[01-30 03:04:03] [+0ms] [9ms] --> 产品:dyvms
[01-30 03:04:03] [+0ms] [9ms] --> 参数:{"Action":"SingleCallByTts","CalledNumber":"185xxxxxxxx","TtsCode":"TTS_xxxxx","TtsParam":"{\"node_info\":\"测试环境\",\"node_name\":\"测试环境\",\"site_name\":\"测试环境\",\"workspace_name\":\"测试02-04空间\",\"workspace_uuid\":\"wksp_xxxxx\"}"}
[01-30 03:04:03] [+279ms] [289ms] 发送结果:
[01-30 03:04:03] [+0ms] [289ms] --> 响应代码:200
[01-30 03:04:03] [+0ms] [289ms] --> 响应内容:{"CallId":"xxxxx^xxxxx","Code":"OK","Message":"OK","RequestId":"xxxxx"}
[01-30 03:04:03] [+0ms] [289ms] 【消息记录】 消息发送成功
[01-30 03:04:03] [+0ms] [289ms] 【消息记录】 清除通知对象失败时间(185xxxxxxxx)
日志查看器过滤
1
2
3
4
5
source:DFF_task_record_func service:DFF_task_record_func site_name:xxxxx func_id:guance__api_internal.fetch_vms_result_and_bill
source:DFF_task_record_func service:DFF_task_record_func site_name:xxxxx func_id:guance__api_internal.fetch_ivr_call_result_and_bill

# 或增加以下条件,筛选存在 vms 计量的任务
vms_billing_count:>0
只有发送成功的才计量
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[01-30 00:09:00] [+29ms] [29ms] 【消息记录】 存在 4 条待获取的 vms 发送结果:
[01-30 00:09:00] [+0ms] [29ms] 【消息记录】 [发送记录 1/4] 消息 ID: xxxxx^xxxxx, 目标: 185xxxxxxxx, 工作空间 UUID: wksp_xxxxx
[01-30 00:09:00] [+0ms] [29ms] 【函数】 调用函数:guance__api_internal.fetch_vms_result_and_bill
[01-30 00:09:00] [+0ms] [29ms] 【函数】 --> 参数:call_id = "xxxxx^xxxxx"
[01-30 00:09:00] [+0ms] [29ms] 【函数】 --> 参数:query_date = 1769702400000
[01-30 00:09:00] [+0ms] [29ms] 调用阿里云接口:
[01-30 00:09:00] [+0ms] [29ms] --> 产品:dyvms
[01-30 00:09:00] [+0ms] [29ms] --> 参数:{"Action":"QueryCallDetailByCallId","CallId":"xxxxx^xxxxx","ProdId":11000000300006,"QueryDate":1769702400000}
[01-30 00:09:00] [+124ms] [154ms] 查询结果:
[01-30 00:09:00] [+0ms] [154ms] --> 响应代码:200
[01-30 00:09:00] [+0ms] [154ms] --> 响应内容:{"Code":"OK","Data":"{\"callId\":\"xxxxx^xxxxx\",\"endDate\":\"2026-01-30 00:03:17\",\"stateDesc\":\"用户接听\",\"callee\":\"185xxxxxxxx\",\"bStartTime\":\"2026-01-30 00:03:12\",\"gmtCreate\":\"2026-01-30 00:03:04\",\"duration\":5,\"calleeShowNumber\":\"057199900007\",\"bRingTime\":\"2026-01-30 00:03:06\",\"bEndTime\":\"2026-01-30 00:03:17\",\"state\":\"200000\",\"startDate\":\"2026-01-30 00:03:12\",\"hangupDirection\":1}","Message":"OK","RequestId":"xxxxx"}
[01-30 00:09:00] [+0ms] [154ms] 【消息记录】 --> 发送结果为 success,需要计量
[01-30 00:09:00] [+0ms] [154ms] 【消息记录】 [发送记录 2/4] 消息 ID: 155303157500^142043767500, 目标: 185xxxxxxxx, 工作空间 UUID: wksp_xxxxx
[01-30 00:09:00] [+0ms] [154ms] 调用阿里云接口:
[01-30 00:09:00] [+0ms] [154ms] --> 产品:dyvms
[01-30 00:09:00] [+0ms] [154ms] --> 参数:{"Action":"QueryCallDetailByCallId","CallId":"155303157500^142043767500","ProdId":11000000300006,"QueryDate":1769702400000}
[01-30 00:09:00] [+121ms] [276ms] 查询结果:
[01-30 00:09:00] [+0ms] [276ms] --> 响应代码:200
[01-30 00:09:00] [+0ms] [276ms] --> 响应内容:{"Code":"OK","Data":"{\"callId\":\"155303157500^142043767500\",\"duration\":0,\"calleeShowNumber\":\"057199900007\",\"endDate\":\"2026-01-30 00:02:48\",\"stateDesc\":\"用户无法接通\",\"bRingTime\":\"2026-01-30 00:02:06\",\"callee\":\"185xxxxxxxx\",\"bEndTime\":\"2026-01-30 00:02:48\",\"state\":\"200005\",\"gmtCreate\":\"2026-01-30 00:02:04\",\"startDate\":\"\"}","Message":"OK","RequestId":"xxxxx"}
[01-30 00:09:00] [+0ms] [276ms] 【消息记录】 --> 发送结果为 failure,不需要计量
[01-30 00:09:00] [+0ms] [276ms] 【消息记录】 [发送记录 3/4] 消息 ID: 155304255563^142044865563, 目标: 185xxxxxxxx, 工作空间 UUID: wksp_xxxxx
[01-30 00:09:00] [+0ms] [276ms] 【消息记录】 --> 发送时间为 2026-01-30 00:04:04,需要等到 2026-01-30 00:09:04(4 秒以后)之后尝试获取
日志查看器过滤
1
2
3
4
source:DFF_task_record_func service:DFF_task_record_func site_name:xxxxx func_id:guance__api_internal.flush_vms_billing

# 或增加以下条件,筛选存在计量的任务
billing_item_count:>0
各空间计量数
1
2
3
[01-30 00:10:00] [+48ms] [48ms] 【Studio】 获取工作空间UUID列表(共2550个)
[01-30 00:10:00] [+1ms] [49ms] 【使用额度】 存在 2 条计量数据
[01-30 00:10:00] [+2ms] [52ms] 【使用额度】 工作空间 wksp_863e8xxxxx 本次计数 2