跳转至

查看「消息发送」函数日志

2024-09-05

本文档主要介绍观测云中消息发送任务中产生的函数日志

1. 简介

与其他 DataFlux Func 中执行的函数一样,当配置了函数日志上报至观测云后,消息发送任务的日志同样可以方便地在观测云平台查询。

有关如何配置函数日志上报到观测云,以及上报的各字段说明,请参考 手册 / 部署和维护 / 上报自观测数据

2. 查询日志

添加 service 过滤提高查询效率

在最新版中,所有 Logging 自观测数据都会额外增加 service 的 Tag,值与 Logging 中的 source 相同,用于适配 ScopeDB 的 service 分区存储。

因此,当查询 Func 的 Logging 自观测数据时,在过滤条件 source:xxxxx 的基础上增加 service:xxxxx,可以显著提高查询效率。

关键字段:

字段 类型 说明
source str 固定为 DFF_task_record_func
service str 固定为 DFF_task_record_func
func_id str 函数 ID
格式为:message_desk__api.*
workspace_uuid str 所属观测云工作空间 UUID
格式为:wksp_xxxxx
monitor_checker_ids str(JSON) 涉及监控器 ID 列表
仅限监控告警消息
格式为:[ "rul_xxxxx", "rul_yyyyy" ]
event_ids str(JSON) 涉及事件 ID 列表
仅限监控告警消息
格式为:[ "event-xxxxx", "event-yyyyy" ]
message_type enum 消息任务类型,详细见下文 X. 消息类型
exception_from str 错误来源
用户脚本:userScript
工作单元:worker
exception_type str 错误类型
如:"UserScriptException"(用户脚本错误)
exception str 具体错误
如:In User Script: WechatSendingFailure('Status Code: 200. Response: {"errcode":40058, ... <略> }')
origin_exception_type str 原始错误类型
如:"WechatSendingFailure"(微信消息发送失败)
origin_exception str 原始具体错误
如:WechatSendingFailure('Status Code: 200. Response: {"errcode":40058, ... <略> }')

如果需要查看某个工作空间的所有消息发送任务的执行日志,使用以下条件查询:

增加 service 字段提高过滤效率

Text Only
1
source:DFF_task_record_func service:DFF_task_record_func workspace_uuid:wksp_xxxxx func_id:message_desk__api.*

如果需要查看特定类型消息的日志,使用 message_type 过滤:

Text Only
1
source:DFF_task_record_func service:DFF_task_record_func func_id:message_desk__api.* message_type:mail

如果需要查看特定事件的消息日志,使用 event_ids 过滤:

Text Only
1
source:DFF_task_record_func service:DFF_task_record_func func_id:message_desk__api.* event_ids:*event-xxxxx*

使用 source 字段过滤

Text Only
1
source:DFF_task_record_func workspace_uuid:wksp_xxxxx func_id:message_desk__api.*

如果需要查看特定类型消息的日志,使用 message_type 过滤:

Text Only
1
source:DFF_task_record_func func_id:message_desk__api.* message_type:mail

如果需要查看特定事件的消息日志,使用 event_ids 过滤:

Text Only
1
source:DFF_task_record_func func_id:message_desk__api.* event_ids:*event-xxxxx*

由其他系统直接发送消息

除了「监控器告警」,其他系统也存在发送消息的情况,并会调用不同的 Func 函数进行消息发送,具体请咨询调用方使用何种方式发送

比较典型的,如 Studio 发送一般性的通知邮件等,可能会直接调用 MessageDesk 脚本集下的函数

对应日志的查询方法如下:

直接发送邮件
1
func_id:message_desk__api.send_mail

延迟发送消息

对于某些需要延迟发送的消息(如静默前通知邮件),可能会调用「观测云支持」下的消息任务函数,并指定发送时间

延迟发送消息的日志时间

需要注意的是,延迟发送消息分 3 个阶段

  1. 设置任务阶段:如在 00:00 时,用户在 UI 操作,并产生了一个在 05:00 发送消息的任务(注意:此日志时间为 00:00 而不是 05:00)

  2. 延迟消息出列阶段:当时间到达 05:00 时,系统内部会从任务池中取出上述 1. 中的任务,并启动异步发送任务

  3. 实际发送阶段:消息实际发送

「设置任务阶段」的用户 UI 操作

一般来说,延迟触发的任务来自用户的 UI 操作

具体而言,如:用户在 00:00:00 添加了一个 00:30:00 开始生效的静默规则,并指定生效前 5 分钟发送通知

那么,用户的这个「添加静默规则」的动作,就叫做「UI 操作」,时间为用户进行操作的时间 00:00:00

而延迟任务发送时间则为「00:30:00 - 5 分钟」,即 00:25:00

此外,由于 Func 只提供基础功能,而具体业务功能。具体处理(如:什么时候调用了什么函数)请咨询 Studio 侧研发

对应日志的查询方法如下:

根据日志,检查是否正确配置了延迟任务

查询时间为 UI 操作时间

添加 / 替换消息任务
1
func_id:guance__api.add_message_task

根据日志,检查延迟任务是否正确出列

查询时间为 计划发送时间

延迟任务出列日志
1
func_id:guance__api_internal.flush_delayed_message

根据「延迟消息出列阶段」中实际调用的函数 ID 查询对应日志,检查发送结果

查询时间为 计划发送时间

消息实际发送日志
1
func_id:message_desk__api.xxxxx

如涉及取消已经设置的延迟发送任务,可根据以下过滤条件搜索:

删除消息任务
1
func_id:guance__api.delete_message_task

3. 分段解读

每一行日志遵循如下格式:

时间 与上一行日志
时间差(毫秒)
任务开始至本行日志
总时间(毫秒)
所在模块 内容
[07-30 17:04:45] [+706ms] [706ms] 【函数】 调用函数:message_desk__feishu.send
具体示例
1
[07-30 17:04:45] [+706ms] [706ms] 【函数】 调用函数:message_desk__feishu.send

发送请求

记录具体消息发送的请求内容,包括地址、请求体

示例
1
2
3
4
[07-30 17:04:45] [+0ms] [707ms] 发送请求:
[07-30 17:04:45] [+0ms] [707ms] --> 请求地址:https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx
[07-30 17:04:45] [+0ms] [707ms] --> 请求内容:<请求体,略>
[07-30 17:04:45] [+0ms] [707ms] --> 超时时间:5

请求结果

记录具体消息发送的响应内容,包括状态码,响应体

如遇到发送失败,可从此处开始排查

示例
1
2
3
[07-30 17:04:46] [+388ms] [1095ms] 发送结果:
[07-30 17:04:46] [+0ms] [1095ms] --> 响应代码:200
[07-30 17:04:46] [+0ms] [1095ms] --> 响应内容:{"StatusCode":0,"StatusMessage":"success","code":0,"data":{},"msg":"success"}

4. 完整示例

每次迭代后日志内容可能有变化

由于存在新增、修改功能,或发现以往日志输出需要完善的地方

因此,每次迭代之后,日志具体内容细节可能多少都会有变动

以下是添加了解释的完整示例

在下方日志中:

# 开头的内容为说明解释,不是日志原文

同时额外加入了空行,方便阅读,日志原文中没有空行

其他内容为日志原文

日志解读
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 本次任务执行的函数 ID 及其参数列表
[07-30 17:04:45] [+706ms] [706ms] 【函数】 调用函数:message_desk__feishu.send
[07-30 17:04:45] [+0ms] [706ms] 【函数】 --> 参数:webhook = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx"
[07-30 17:04:45] [+0ms] [707ms] 【函数】 --> 参数:body = <请求体,略>
[07-30 17:04:45] [+0ms] [707ms] 【函数】 --> 参数:secret = null
[07-30 17:04:45] [+0ms] [707ms] 【函数】 --> 参数:_override_configs = null

# 发送请求
[07-30 17:04:45] [+0ms] [707ms] 发送请求:
[07-30 17:04:45] [+0ms] [707ms] --> 请求地址:https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx
[07-30 17:04:45] [+0ms] [707ms] --> 请求内容:<请求体,略>
[07-30 17:04:45] [+0ms] [707ms] --> 超时时间:5

# 发送结果
[07-30 17:04:46] [+388ms] [1095ms] 发送结果:
[07-30 17:04:46] [+0ms] [1095ms] --> 响应代码:200
[07-30 17:04:46] [+0ms] [1095ms] --> 响应内容:{"StatusCode":0,"StatusMessage":"success","code":0,"data":{},"msg":"success"}
[07-30 17:04:46] [+0ms] [1095ms] 【消息记录】 消息发送成功

# 记录 / 清除通知对象失败时间
[07-30 17:04:46] [+1ms] [1096ms] 【消息记录】 清除通知对象失败时间(notify_xxxxx)

X. 消息类型

字段 message_type 值与消息类型对照表如下:

message_type 消息类型
"mail" 邮件
"dingTalkRobot" 钉钉机器人
"feishuRobot" 飞书机器人
"wechatRobot" 企业微信机器人
"HTTPRequest" HTTP 请求
"jiguang" 极光推送
"sms" 短信
"vms" 语音
"slackIncomingWebhook" Slack Incoming Webhook
"teamsWorkflowWebhook" Teams Workflow Webhook
"googleChatWebhook" Google Chat Webhook