報警排查指引



1474617733813453.gif##


概要說明


微信公眾平台已對外開放介面警報,當微信伺服器向開發者推送訊息失敗次數達到預定閾值時,會將警報訊息傳送到指定微信警報群(設定方式:公眾平台->開發-運維中心->介面警報),請開發者積極主動關注警報,即時解決故障,提升微信大眾號的服務品質。

為了更好地根據警報訊息尾部的實例(提供了openid及時間戳stamp)進行問題排查,開發者需要在存取層、邏輯層等每一個層級都加上包含關鍵資訊的詳細日誌,以利於快速定位問題。

警報目前有2類:

1.通用警報,所有開發者都需要注意。

QQ截图20170207153412.png

2.公眾號第三方平台報警,只有在微信開放平台(open.weixin.qq.com)上申請成為公眾號第三方平台的開發者,才需要關注此警報。

QQ截图20170207153428.png

下面對具體的警報做範例以及排查指引說明。

警報內容說明

警報內容描述:

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配置项,是否过小(小于请求数)