监控器、短信、语音计量详解
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. 计费触发条件
项目
触发条件
额外说明
监控器
启动即触发计费
部分监控器单次运行会记为多条 检测范围过长的也会增加计费量
短信
任务结果查询中,SendStatus 为 3(成功)时计费
发起「发送短信」任务本身成功与否不作为计费依据
语音、IVR 语音
任务结果查询中,存在 endDate 值且 duration > 0 时计费
发起「发送语音通知」任务本身成功与否不作为计费依据
4. 相关日志及示例
以下为与计费相关的日志摘录:
监控器
短信
发送短信 短信发送结果获取 上报任务调度计量数据
日志查看器过滤 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)
日志查看器过滤 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 秒以后)之后尝试获取
日志查看器过滤 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
各空间计量数 [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 语音
发送语音 语音发送结果获取 上报任务调度计量数据
日志查看器过滤 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)
日志查看器过滤 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 秒以后)之后尝试获取
日志查看器过滤 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
各空间计量数 [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