如何通过AMI检测Asterisk拒绝呼入呼叫的情况?
解决Asterisk呼叫因分机不存在被拒的告警问题
Asterisk默认没有直接对应“呼叫因分机不存在被拒绝”的原生AMI事件,你可以通过以下几种方式实现告警触发:
方式一:日志监控+自定义AMI事件
- 先在
logger.conf中配置,将NOTICE级别的SIP/PJSIP相关日志单独输出(比如到/var/log/asterisk/sip_notice.log),方便精准监控:[logfiles] sip_notice.log => notice,notice - 编写脚本(Python/Shell均可)实时监控这个日志文件,匹配你提供的
rejected because extension not found格式的日志行。 - 匹配到目标日志后,通过AMI发送自定义事件,示例AMI指令:
Action: UserEvent UserEvent: ExtensionNotFoundAlert Caller: upstream-peer (192.168.1.1:5060) Extension: 44123123123 Context: ourcontext - 你的监控系统捕获到这个自定义AMI事件后,即可触发告警。
方式二:拨号计划兜底分机触发自定义事件
在你的目标context末尾添加兜底规则,拦截无匹配分机的呼叫并触发AMI事件:
[ourcontext] ; 现有分机配置... ; 兜底规则,匹配所有未定义的分机 exten => _X.,1,NoOp(Rejected call: Extension ${EXTEN} not found in ${CONTEXT}) same => n,UserEvent(ExtensionNotFound,CallerID=${CALLERID(all)},Extension=${EXTEN},Context=${CONTEXT}) same => n,Hangup()
当呼入分机无匹配项时,会执行这个兜底分机,触发ExtensionNotFound自定义事件,你的AMI客户端可以直接捕获该事件并告警。
方式三:CDR辅助过滤(精度较低)
呼叫被拒时,CDR记录的disposition字段会显示FAILED或NO ANSWER,但这种方式需要结合日志内容过滤才能精准定位“分机不存在”的情况,不如前两种方式直接。
注意事项
- 确保AMI用户拥有
system权限,才能发送自定义UserEvent。 - 多台服务器场景下,可以统一部署监控脚本,或用集中日志系统(如ELK)收集所有Asterisk日志,再做集中匹配告警。
内容的提问来源于stack exchange,提问作者KenD
相关产品推荐
相关产品推荐

