報警排查指引
概要說明
微信公眾平台已對外開放介面警報,當微信伺服器向開發者推送訊息失敗次數達到預定閾值時,會將警報訊息傳送到指定微信警報群(設定方式:公眾平台->開發-運維中心->介面警報),請開發者積極主動關注警報,即時解決故障,提升微信大眾號的服務品質。
為了更好地根據警報訊息尾部的實例(提供了openid及時間戳stamp)進行問題排查,開發者需要在存取層、邏輯層等每一個層級都加上包含關鍵資訊的詳細日誌,以利於快速定位問題。
警報目前有2類:
1.通用警報,所有開發者都需要注意。
2.公眾號第三方平台報警,只有在微信開放平台(open.weixin.qq.com)上申請成為公眾號第三方平台的開發者,才需要關注此警報。
下面對具體的警報做範例以及排查指引說明。
警報內容說明
警報內容描述:
a)appid:公众号appid b)昵称: 公众号昵称 c)时间:所有报警,都会提供首次发生异常的时间。(如首次发生超时的时间,首次发生回应失败的时间) d)内容:错误的具体描述 e)次数:发生失败的次数 f)错误样例:错误样例里注明了一些帮助查找问题的信息。如:首次超时开发者的IP和推送消息类型。如果是回应失败,错误样例还会注明首次回应失败时开发者的回包。
一般情況下,透過警報提供的IP,時間,訊息類型,能夠比較快速的定位到第三方發生問題的原因。
警報範例1:超時報警
Appid: wxxxxxx 昵称: WxNickName 时间: 2014-12-01 20:12:00 内容: 微信服务器向公众号推送消息或事件后,开发者5秒内没有返回 次数: 5分钟 1272次 错误样例: [IP=203.205.140.29][Event=UnSubscribe]
此警報表示:微信伺服器向開發者推送取消追蹤事件時,開發者沒有在5秒內回傳結果。在2014-12-01 20:12:00-2014-12-01 20:17:00這5分鐘內發生了1272次。其中這5分鐘內第一次發生逾時的時間是:2014-12-01 20:12:00, 開發者的IP是:203.205.140.29,事件類型是取消追蹤事件。
警報範例2:回應失敗
Appid: wxxxx 昵称: WxNickName 时间: 2014-12-01 20:12:00 内容: 微信服务器向公众号推送消息或事件后,得到的回应不合法 次数: 5分钟 1320次 错误样例: [Event=Click] [ip=58.248.9.218][response_length=10][response_content=Error 500:]
此警報表示:微信伺服器向開發者推送自訂選單點擊事件時,開發者的回傳結果不合法。在2014-12-01 20:12:00-2014-12-01 20:17:00這5分鐘內發生了1320次。其中這5分鐘內第一次發生回應失敗的時間是:2014-12-01 20:12:00, 開發者的IP是:58.248.9.218,事件類型是點選選單事件,第三方回傳的內容長度為10個字節,內容為「Error 500:」。
警報範例3:連線逾時
Appid: wxxxx 昵称: WxNickName 时间: 2015-02-04 20:13:09 内容: 微信服务器连接公众号开发者服务器时发生超时,超时时间为5秒 次数: 5分钟 7289次 错误样例: [IP=180.150.190.135][Msg=Text]
此警報表示:微信伺服器向開發者推播粉絲傳送的文字訊息時,無法連線到開發者填寫的伺服器位址。在2015-02-04 20:13:09-2015-02-04 20:18:00這5分鐘內發生了7289次,這5分鐘內第一次發生連線逾時的時間是:2015-02-04 20:13:09, 開發者的IP是:180.150.190.135,事件類型是使用者推播的訊息。
各類別警報的排查方法
1.DNS失敗
該錯誤為微信伺服器在推送訊息給開發者時,解析dns失敗。如遇到此警報,請開發者確認:
a)填写的url,域名是否有误; b) 域名是否发生变化,如过期,更新等。
如果不是以上2個問題,請聯絡微信公眾平台。
2.Dns逾時
目前不會有此錯誤。
3.連線逾時
此錯誤是微信伺服器和開發者伺服器3S內未連線成功。警報訊息會提供出首次發生連線失敗的時間和連線的IP。如遇此警報,請開發者確認:
a)该IP是否有误。 b)该IP机器是否过载,连接过多。 c)如果是第三方提供服务器托管,托管商是否有故障。 d)网络运营商是否有故障。
4.請求逾時
微信伺服器向開發者伺服器推播訊息或事件,開發者5秒內沒有回傳。請求逾時時,警報訊息會提供第一次出現請求逾時的時間,開發者IP和訊息類型。請開發者確認:
a)该IP是否有误 b)该IP是否接收到报警消息给出的该消息类型的请求 c)该请求是否处理时间过长
5.回應失敗
#開發者沒有依照wiki中的回覆訊息格式回覆訊息,或是發生網路錯誤,會警報回應失敗,警報訊息會提供第一次出現請求回應失敗的時間,開發者的IP,訊息類型以及回應的訊息內容,請開發者確認:
a)该IP是否有误 b)该IP是否发生网络错误 c)该业务处理逻辑是否没有按照wiki规范回复消息,或是进入了异常逻辑。
6.MarkFail(自動封鎖)
微信後台會即時統計開發者的失敗次數。當推播訊息給開發者發生大量失敗時,微信伺服器會自動封鎖開發者,1分鐘內不再推播任何訊息,並會傳送警報到微信群組。此警報是等級最高的警報,開發者在收到此警報時請盡快處理後台故障,恢復服務。事實上,開發者在收到此警報前,必然會收到連線逾時,請求逾時或回應失敗等警報,需要開發者即時去解決這些故障,避免被微信伺服器屏蔽,嚴重影響公眾號服務!
7.推送component_verify_ticket逾時& 8.推送component_verify_ticket失敗& 9.推送元件訊息逾時& 10.推送元件訊息失敗
以上4個警報只有公眾號第三方平台開發者會收到,其他公眾號開發者無需關注。由於公號第三方平台承載了更多的公眾號,因此公眾號第三方平台的服務品質需要更嚴格要求和報警,所以把這4個特殊的事件單獨報警。具體的問題找出方式與4,5是一樣的,這裡不在贅述。關於公眾號第三方平台的具體申請與開發實現,請前往微信開放平台(open.weixin.qq.com)
##常見問題
1.如何排除DNS失敗的問題?1.Ping测试你们MP上配置的url里的域名,确认是否能够得到正确的IP。如不能得到或者错误,请到你们的域名托管商管理系统上检查配置。 2.如1能够得到正确的IP,又有DNS失败的报警;请使用DNS服务器182.254.116.116 来再测试验证。Linux : dig @182.254.116.116 域名;windows 修改网络配置里的DNS服务器地址,然后再ping 域名。如果得到的IP不正确或者得不到,请联系微信团队。2.如何解決連線逾時問題?
1.查看是否网络环境问题。 (1)使用公众平台接口,获取到微信回调服务器的IP,https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN, (2)在你们的服务上ping 测试,检查你们服务器到微信回调用服务器的网络质量情况。如有网络问题,请联系你们的服务器提供商解决。 2.查看接入层服务器连接数,负载,nginx的配置,允许的连接个数。查看nginx错误日志是否有“Connection reset by peer”或“Connection timed out”错误日志,如有说明nginx连接数过超负载。 3.建议搭建测试工具,对系统进行心跳检查,对系统负载,连接数,处理数,处理耗时进行实时监控报警。 对于nginx配置,这里提供官方文档和一篇简单配置介绍链接,希望有帮助: http://nginx.org/en/docs/,重点关注连接数配置,日志配置等。nginx的一些重要配置参考例子如下: worker_processes 16; //CPU核数 error_log logs/error.log info; //错误日志log worker_rlimit_nofile 102400; //打开最大句柄数 events { worker_connections 102400; //允许最大连接数 } //请求日志记录,关键字段:request_time-请求总时间,upstream_response_time后端处理时 间 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$host" "$cookie_ssl_edition" ' '"$upstream_addr" "$upstream_status" "$request_time" ' '"$upstream_response_time" '; access_log logs/access.log main;3.如何解決請求逾時問題? 每個模組都需要有完整的日誌,能夠查出每個請求在每個模組的耗時信息,配合微信警報提供信息,能夠很容易的定位到是哪個伺服器出問題。常見的原因是:
1)机器负载太高,耗时增加 2)机器处理异常,消息丢失 3)机器异常,对于机器处理异常,建议尽快修复bug,对于机器异常,请尽快屏蔽有问题的机器。这里对机器负载太高,简单提供可行的解决方案。方案一:优化性能,扩容。检查负载情况(cpu,内存,io,网络,详见附录),根据具体性能瓶颈的不同,采取不同的优化方式。方案二:异步处理。如果微信服务器推送的消息来不及实时处理,可将消息先存储,先返回success给微信服务器,后台可后续再处理消息,如果需要回复用户消息,可通过调用客服消息接口API再回复用户消息。4.如何解決access_token儲存和使用問題?
經常有第三方回饋access_token造成服務中斷的問題,公眾平台排查問題發現,大部分第三方都在瘋狂刷新access_token,使得access_token超出介面頻率限製而失效。這裡提供一個較簡單的access_token 儲存和使用方案。
1)中控服务器定时(建议1小时)调用微信api,刷新access_token,将新的access_token 存入mysql(或其他存储), 2)其他工作服务器每次调用微信api时从mysql(或其他存储)获取access_token,并可在内存缓存一段时间(建议1分钟)。
公眾平台會保證在access_token刷新後,舊的access_token在5分鐘內仍能使用,以確保第三方在更新access_token時不會發生第三方調用微信api的失敗。
附錄
#附錄1:微信推播的訊息事件清單與回應格式
詳情請見:微信推播訊息與事件說明
#附錄2:檢視伺服器效能負載的常用工具
#下面對查看伺服器效能負載的常用工具做簡單介紹,詳細的工具使用請另行查閱。
1、查看CPU的效能負載
a)uptime
用於觀察伺服器整體負載,系統負載指運行佇列(1分鐘、5分鐘、15分鐘前)的平均長度, 正常情況需要小於cpu個數。
b)vmstat
vmstat是Virtual Meomory Statistics(虛擬記憶體統計)的縮寫,可監控作業系統的虛擬記憶體、進程、CPU活動。他是對系統的整體情況進行統計,通常使用vmstat 5 5(表示每隔5秒產生一次數據,產生五次)命令測試。將得到一個數據匯總他能夠反映真正的系統情況。
c)top top指令是最受歡迎Unix/Linux的效能工具之一。系統管理員可用運行top指令監視進程和Linux整體效能。
2、查看記憶體的效能負載
a)free
Linux下的free指令,可以用來查看目前系統記憶體的使用情況,它顯示系統中剩餘及已使用的實體內存和交換內存,以及共享內存和被核心使用的緩衝區。
3、查看網路的效能負載
b)netstat
Netstat是控制台指令,是一個監控TCP/IP網路的非常有用的工具,它可以顯示路由表、實際的網路連線以及每一個網路介面設備的狀態資訊。 Netstat用於顯示與IP、TCP、UDP和ICMP協定相關的統計數據,一般用於檢驗本機各連接埠的網路連線情況。
c)sar
sar(System Activity Reporter系統活動狀況報告)是目前Linux 上最全面的系統效能分析工具之一,可以從多方面對系統的活動進行報告,包括:檔案的讀寫情況、系統呼叫的使用情況、磁碟I/O、CPU效率、記憶體使用狀況、進程活動及IPC有關的活動等。本文主要以CentOS 6.3 x64系統為例,介紹sar指令。
4、查看磁碟的效能負載
a)iostat
Linux下的iostat指令,可用於報告中央處理器(CPU)統計資料與整個系統、適配器、tty 設備、磁碟和CD-ROM 的輸入/輸出統計資料。
附錄3:nginx配置與檢查指引
nginx問題的檢查方法
當出現直接逾時、處理返回慢時的警報時,nigix側的故障排查參考方法有如下: 1.檢查請求日誌狀況, tail -f logs/access.log ,看upstream_status欄位。
200:表示正常; 502/503/504:表示处理慢,或者后端down机;再看upstream_response_time返回的时间是否真的较慢,有没有上百毫秒,或更高的,有则说明是后端服务有问题。 404:表示请求的路径不存在或不对,文件不在了。需要检查你配置在公众平台上的url路径是否正确; 服务器上的文件、程序是否存在。 403:表示无权限访问。 检查一下nginx.conf 是否有特殊的访问配置。 499: 则是客户端的问题,请联系微信团队。 此错误少见。
2、檢查錯誤日誌情況,tail -f logs/error_log ,查看是否有connect() failed、Connection refused、 Connection reset by peer等error錯誤日誌,有則說明有可能nginx出現的連接數超負載等情況。
(1)查看系统的网络连接数情况确认是否有较大的链接数 # netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 解析: CLOSED //无连接是活动的或正在进行 LISTEN //服务器在等待进入呼叫 SYN_RECV //一个连接请求已经到达,等待确认 SYN_SENT //应用已经开始,打开一个连接 ESTABLISHED //正常数据传输状态/当前并发连接数 FIN_WAIT1 //应用说它已经完成 FIN_WAIT2 //另一边已同意释放 ITMED_WAIT //等待所有分组死掉 CLOSING //两边同时尝试关闭 TIME_WAIT //另一边已初始化一个释放 LAST_ACK //等待所有分组死掉 (2)查看系统的句柄配置情况,ulimit -n ,确认是否过小(小于请求数) (3)worker_rlimit_nofile、worker_connections配置项,是否过小(小于请求数)