前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第三方平台告警接入、翻译、关联恢复

第三方平台告警接入、翻译、关联恢复

作者头像
Zabbix
发布2021-09-29 16:02:19
1.6K0
发布2021-09-29 16:02:19
举报
文章被收录于专栏:Zabbix中国官方Zabbix中国官方
感谢宏时数据技术经理王军投稿!

第1章 简介


1.1 说明

本文档描述了如何通过SNMPTT,将中兴云桌面以及中兴云桌面存储SnmpTrap告警接入Zabbix,并对产生的告警汉化翻译,通过Zabbix标签功能实现自动关联恢复告警。

1.2 环境

组件

版本

描述

RedHat

7.5

操作系统版本

SNMPTT

1.4.2

SNMP Trap Translator处理SNMPTRAP

zabbix

5.0.5

zabbix 5.0.5

net-snmp

5.7.2

提供snmptrapd服务

ZXCLOUD

7.01.01.P878

中心云桌面应用平台

中兴云桌面平台

第2章 接入中兴云桌面平台SNMPTRAP


2.1 导入ZTE桌面平台MIB

net-snmp组件默认只提供了通用的MIB文件,第三方私有MIB文件需要自行导入并配置搜索解析。

1. 创建自定义MIB目录

代码语言:javascript
复制
# mkdir /usr/share/snmp/mibs/ZTE/
# ls -l /usr/share/snmp/mibs/ZTE/
total 60
-rw-r--r-- 1 root root   907 Feb  9  2012 ZTE-IRP-MIB
-rw-r--r-- 1 root root 46864 Mar 23  2012 zxcomc-snmp-alarmirp-mib-v1.1.txt
-rw-r--r-- 1 root root  2962 Feb  9  2012 zxcomc-snmp-csirp-mib.txt
-rw-r--r-- 1 root root   907 Feb  9  2012 zxcomc-snmp-irp-common-mib.txt

2. 配置net-snmp加载自定义mib

代码语言:javascript
复制
#查看系统snmp模块默认加载配置路径
# net-snmp-config --snmpconfpath

#自定义第三方mib搜索目录
# cat /usr/local/net-snmp/snmp.conf 
mibdirs +/usr/share/snmp/mibs/ZTE

#测试自定义地示范mib搜索是否正常
# snmptranslate -Dinit_mib .1.3 2>&1 |grep MIBDIR
# snmptranslate -On ZTE-ALARM-IRP-MIB::alarmCleared

解析第三方MIB

2.2 转换MIB文件

MIB(SNMPTRAP)文件中定义了各种SNMPTRAP的通知信息,SNMPTT中可以使用工具snmpttconvertmib将所有包含snmp trap/notification信息的mib文件转换成相应的snmptt.conf.<vendor>文件,来实现SNMPTRAP信息的解析。

转换mib命令格式:

代码语言:javascript
复制
# snmpttconvertmib --in=path-to-mib --out=output-file-name –net_snmp_perl

提示: 转换结果会追加到output-file-name定义的文件中

由于snmpttconvertmib不支持批量转换,可能需要通过脚本来进行批量转换。

代码语言:javascript
复制
# for f in $(grep -l -i "notification" ./*);do snmpttconvertmib -in="$f" -out=/tmp/snmptt.conf.zte --net_snmp_perl;done;

mib转换结果报告

初始化转换后的配置文件

代码语言:javascript
复制
# sed  -r -i "s/^(FORMAT)/\1 ZBXTRAP \$aA/g" snmptt.conf.zte
# grep "FORMAT" snmptt.conf.zte
  

FORMAT行语法($aA会解析成IP)

每个 FORMAT 行都需要添加ZBXTRAP,否则ZABBIX无法解析,关于SNMPTT更多用法,请参考官方文档

2.3 追加新增conf配置

将自定义转换的conf文件追加到SNMPTT配置文件中

代码语言:javascript
复制
# vim /etc/snmp/snmptt.ini
[TrapFiles]
# A list of snmptt.conf files (this is NOT the snmptrapd.conf file).  The COMPLETE path 
# and filename.  Ex: '/etc/snmp/snmptt.conf'
snmptt_conf_files = <<END
/etc/snmp/snmptt.conf
/etc/snmp/snmptt.conf.zte
END

2.4 重启SNMPTT

代码语言:javascript
复制
# systemctl restart snmptt

2.5 创建ZTE云桌面SNMPTRAP监控模板

SNMPTRAP模板

提示:为了能够很快看到效果,创建了“snmptrap[]”不过滤任何关键字的监控项

2.6 创建监控实例

创建SNMPTRAP实例

关联监控模板

提示:主机名称要和snmptt.conf.zte中定义的内置变量$aA保持一致

2.7 查看最新数据

SNMPTRAP最新数据

至此,就完成了如何通过SNMPTT将第三方平台的SNMPTRAP信息集成到Zabbix的操作步骤。


在实际环境中,由于某些需求或者通过转换后的规则,SNMPTRAP信息可读性依然不高。例如:TRAP信息是全英文或者应用平台对TRAP信息进行了编码。

经过编码的SNMPTRAP信息

通过SNMPTT规则配置文件的EXECPREXEC属性,可以实现SNMPTRAP信息的汉化翻译或者解码(在应用案例中实现)等。根据MIB或转换后配置文件的描述,可以看出最新数据中的trap信息属于平台组件之间的心跳探测信息。

ZTE云桌面平台心跳TRAP信息描述

2.8 汉化翻译SNMPTRAP

1. 编辑配置文件,汉化相关oid信息

代码语言:javascript
复制
# vim /etc/snmp/snmptt.conf.zte
EVENT heartbeatNotification .1.3.6.1.4.1.3902.4101.4.2.1.1 "Status Events" Normal
FORMAT ZBXTRAP $aA "中兴云桌面平台-NMS系统与北向网管心跳检查,heartbeatNotification:$1"
SDESC

2. 重启SNMPTT

代码语言:javascript
复制
# systemctl restart snmptt

3. 查看汉化后的信息

经过翻译的信息

4. 创建触发器

根据trap描述,心跳trap设置值0代表不发送心跳trap。设置值超过300不生效。如果没有最新数据则代表心跳异常,触发告警。

5. 触发SNMPTRAP告警

心跳异常告警

2.9 修改SNMPTRAP日志级别

1. 通过snmpttconvertmib工具转换后的trap日志事件,格式如下:

代码语言:javascript
复制
EVENT event_name event_OID "category" severity

FORMAT format_string

[EXEC command_string]

[NODES sources_list]

[MATCH [MODE=[or | and]] | [$n:[!][(    ) | n | n-n | > n]

[SDESC]
[EDESC]

通过修改severity,可以将需要关注的日志级别调高,例如:Critical,然后通过触发器函数regexp ()匹配对应严重性级别的日志。例如:

代码语言:javascript
复制
EVENT heartbeatNotification .1.3.6.1.4.1.3902.4101.4.2.1.1 "Status Events" Critical
FORMAT ZBXTRAP $aA "中兴云桌面平台-NMS系统与北向网管心跳检查,$N:$1"

2. 创建指定事件级别触发器

创建指定事件类型的严重性触发器

3. 按照事件严重性触发告警

按照事件严重性触发告警

至此,完成了通过修改SNMPPT配置规则,来实现SNMPTRAP事件的汉化翻译和事件级别的调整。

2.10 SNMPTRAP恢复事件关联

对于周期性的SNMPTRAP信息,例如:平台组件之间的心跳TRAP。不存在恢复事件,只能通过有无数据来判断是否正常,实现告警恢复。

对于平台故障alarmNew信息,例如:磁盘读写异常,主机离线等。如果连续出现多条告警,新的TRAP事件就会将上一条TRAP事件信息冲掉,导致上一条告警被恢复。

如何防止事件被恢复或者通过相关恢复事件自动恢复?

1. 防止事件被恢复

如果事件严重性较高,或者由于特定需求不允许被恢复。可以通过创建模板或者主机宏变量**{$TRAPCONTORL}=1来实现。

防止事件被恢复

最新数据

不允许被恢复的事件

2. 通过恢复事件自动恢复已触发的告警

平台故障类事件和恢复事件,通常会在TRAP事件位置变量(例如:$14)中对应有一个相同alarmId。通过在Zabbix标签功能,提取事件的alarmId来实现事件的关联恢复。

代码语言:javascript
复制
# vim /etc/snmp/snmptt.conf.zte
   14: alarmId
     Syntax="OCTETSTR"
     Descr="This object represents an alarm in EMS using 
                the private format of vendor"
 15: alarmCodeName
     Syntax="OCTETSTR"
     Descr="This object represents an alarm code name"
  

第3章 应用案例


3.1 应用案例1:通过外部脚本转码翻译SNMPTRAP信息

3.1.1 案例描述

中兴云桌面snmptrap告警内容是hexstring格式并通过 “gb2312”进行编码,直接对接到zabbix中可读性很差。

通过SNMPTT中”EXEC”属性,自定义外部python脚本,将SNMPTRAP信息进行转码翻译后,再将翻译后的消息写回到SNMPTrapperFile定义的文件中,实现告警事件接入ZABBIX并提升SNMPTRAP信息可读性。

通过zabbix标签功能,提取告警信息中的alarmid,实现SNMPTRAP恢复事件关联恢复操作。

中兴云桌面告警关联恢复

3.1.2 实现步骤

1. 创建解码脚本

代码语言:javascript
复制
# cat /etc/snmp/zte/translatetraptozbx.py
#!/usr/bin/python
# -*- coding:utf-8 -*-

#version:1.0
#user:jun
#description: convert hex-string to string
#

import sys
import time

# 定义日志信息
logtime=time.strftime('%H:%M:%S %Y/%m/%d',time.localtime())
snmptrapfile="/var/log/snmptt/snmptt.log"

# 将hex转换成中文,hex to gb2312
def hex_to_ascii(hex_str):
  try:
      hex_str = hex_str.replace('Hex-STRING', '').replace(':','').replace(' ', '').replace('0x', '').replace('\t', '').replace('\n', '')
      ascii_str = hex_str.decode('hex').decode('gb2312',errors='ignore')
  #except (TypeError):
  except :
      ascii_str = 'ZBXTRAP can not translate this message'

  return ascii_str

# 获取参数:IP [SNMPTRAP OIDS],example:$aA $N $+*
if len(sys.argv) >= 4:

  ZBXTRAPHOST=sys.argv[1] 
  EVENTTYPE=sys.argv[2]
  SNMPTRAPMESSAGE=''.join(sys.argv[3:])
  KEYWORD='enterprises.3902.4101.1.3.1.3'
  if KEYWORD in SNMPTRAPMESSAGE:
      alertmessage=SNMPTRAPMESSAGE.replace('enterprises','\nenterprises').split('\n')
      eventextnumber=alertmessage[1].replace('enterprises.3902.4101.1.3.1.3','').split(':')[0]
      eventtime=alertmessage[1].replace('enterprises.3902.4101.1.3.1.3'+eventextnumber+':','')
      eventseverity=alertmessage[9].replace('enterprises.3902.4101.1.3.1.6'+eventextnumber+':','').strip()
      
      alarmid=alertmessage[14].strip()
      # 告警等级转换
      if eventseverity=='1':
          severity="critical"
      elif eventseverity=='2':
          severity="critical"
      elif eventseverity=='3':
          severity="major"
      elif eventseverity=='4':
          severity="major"
      elif eventseverity=='5':
          severity="warning"
      elif eventseverity=='6':
          severity="cleared"
      else:
          severity="unknown"


      eventtheme=hex_to_ascii(alertmessage[15].replace('enterprises.3902.4101.1.3.1.14'+eventextnumber+':','').replace(' ',''))
      eventsource=hex_to_ascii(alertmessage[16].replace('enterprises.3902.4101.1.3.1.15'+eventextnumber+':','').replace(' ',''))
      
      zbxtrapmessage=logtime+" ZBXTRAP "+ZBXTRAPHOST+" "+eventtime+"-"+ZBXTRAPHOST+" "+EVENTTYPE+",alarmuuid:"+alarmid+",severity:"+severity+" "+eventtheme+" "+eventsource
      zbxtrapmessage2=zbxtrapmessage.encode("raw_unicode_escape").decode("raw_unicode_escape").encode("utf8")
      with open(snmptrapfile,'a+') as f:
          f.write(zbxtrapmessage2)
          f.write("\n")
          f.close()
      print zbxtrapmessage2

else:
 sys.exit()

2. 定义SNMPTRAP事件类型的格式化参数

在snmptt.conf.zte配置文件中修改ztedesktopalarmNew和ztedesktopalarmClear类型事件格式化参数

代码语言:javascript
复制
# vim /etc/snmp/snmptt.conf.zte
EVENT ztedesktopalarmNew .1.3.6.1.4.1.3902.4101.1.4.1.1 "Status Events" Normal
FORMAT  $aA $N "【中兴云桌面告警】$+*"
REGEX(\n)()g
REGEX(\(unknown\))()g
REGEX(\s+)(-)g
#
EXEC /etc/snmp/zte/translatetraptozbx.py $aA $N $+*


EVENT ztedesktopalarmCleared .1.3.6.1.4.1.3902.4101.1.4.1.2 "Status Events" Normal
FORMAT  $aA $N "【中兴云桌面告警】$+*"
REGEX(\n)()g
REGEX(\(unknown\))()g
REGEX(\s+)(-)g
#
EXEC /etc/snmp/zte/translatetraptozbx.py $aA $N $+*

3. 重启SNMPTT

代码语言:javascript
复制
# systemctl restart snmptt

4. 提取TRAP事件的alarmId

云桌面的SNMPTRAP信息经过了转码脚本处理,对于同一个事件ztedesktopalarmNew(告警事件)和ztedesktopalarmClear(恢复事件)类型内容,都有一个相同的alarmuuid,提取事件信息中的alarmuuid作为标签ztedesktopalarmuuid的值。

通过正则表达式提取事件Id

5. 根据触发器标签进行事件关联恢复

对已产生的SNMPTRAP事件,如果出现恢复事件(事件类型为:ztedesktopalarmClear),则通过触发器标签来进行匹配ztedesktopalarmuuid,实现告警自动关闭。

匹配事件标签来关联恢复事件

6.实现效果

云桌面平台产生的告警

snmptt接收的告警事件内容

zabbix前端展示的告警

云桌面平台告警恢复

snmptt接收的恢复事件内容

zabbix平台显示事件已恢复

3.2 应用案例2:通过预处理翻译SNMPTRAP信息

3.2.1 案例描述

中兴云分布式存储没有完整的mib文件,只提供了snmptrap事件类型的说明,根据oid描述,创建事件匹配规则。

云存储SNMPTRAP OID描述

通过SNMPTT配置规则文件中的PREEXEC属性,将事件等级(数字)转换成英文字符,将事件告警码转换成对应的中文描述。

3.2.2 实现步骤

1. 创建事件等级映射文件

代码语言:javascript
复制
# cat /etc/snmp/zte/variablemvaluemap_zte.txt
#alarmPerceivedSeverity
ztestoragealarmSeverity-1:critical
ztestoragealarmSeverity-2:serious
ztestoragealarmSeverity-3:warning
ztestoragealarmSeverity-4:prompt
ztestoragealarmSeverity-5:notice

2. 创建事件等级转换脚本

代码语言:javascript
复制
# cat /etc/snmp/zte/getvariablestring.sh 
#!/bin/bash
LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
zte_variables_file='/etc/snmp/zte/variablemvaluemap_zte.txt'
zte_snmptt_log='/etc/snmp/zte/snmptt_preexec_zte.log'

if [ $# -ne 2 ];then
exit 2
fi

if [ -s $zte_variables ];then
value=$(grep -w "$1-$2" "$zte_variables_file"|grep -v "#"|awk -F':' '{print $2}')
if [ 'Z'"$value" != 'Z' ];then
   echo $value
else
   echo "unknown"
fi
else
echo "$LOGTIME zte variable map file is not found.File Format:<variabletype>:<variable>:<value>" >> $zte_snmptt_log
fi

#脚本需要传入两个参数:<alarmobject> <alarmseveritynumber>

3. 创建告警码说明映射文件

代码语言:javascript
复制
# cat /etc/snmp/zte/ztestorage_alarmcode.txt 
100100#服务器网络网络异常#Critical
100101#服务器网络网络断链#Critical
100102#服务器状态下电#Critical
100103#服务器状态所有存储服务离线#Critical
100104#服务器状态处于维护模式#Info
100105#服务器版本版本与集群版本不一致#Warning
100106#服务器CPU 利用率超过 80%#Warning
100107#服务器CPU 利用率超过 90%#Critical
100108#服务器内存利用率超过 80%#Warning
100109#服务器内存利用率超过 90%#Critical
100110#服务器网络带宽利用率超过 80%#Warning
100111#服务器网络带宽利用率超过 90%#Critical
100114#硬盘状态离线#Critical
100115#硬盘状态处于维护模式#Info
100116#硬盘状态IO 读写慢#Warning
100118#硬盘状态SMART 检测Critical异常#Critical
100119#硬盘已用容量超过 50%#Warning
100120#硬盘已用容量超过 80%#Critical
100121#服务MON节点时钟未同步#Critical
100122#服务MON磁盘可用空间不足#Critical
100123#服务MON服务离线#Critical
100129#服务MGR服务离线#Critical
100130#服务AGENT服务离线#Critical
100131#集群状态IO 请求异常#Critical
100132#集群状态集群与管理系统连接中断#Critical
100133#集群状态处于维护模式#Info
100136#集群已用容量超过 50%#Warning
100137#集群已用容量超过 80%#Critical
100138#存储池状态存储池不可用#Critical
100139#存储池状态存储池数据冗余度降级#Critical
100140#存储池状态存储池数据重构中#Warning
100141#存储池已用容量超过 50%#Warning
100142#存储池已用容量超过 80%#Critical
100143#共享设备已用容量超过 50%#Warning
100144#共享设备已用容量超过 80%#Critical
100145#共享设备状态共享设备状态异常#Critical
100146#License有效期不足 30 天#Warning
100147#License有效期不足 7 天#Critical
100148#证书有效期不足 30 天#Warning
100149#证书有效期不足 7 天#Critical
100150#服务器状态主机名不一致#Critical
100151#服务器状态主机名含有非法字符#Critical
100152#服务器状态集群中主机名重复#Critical

4. 创建告警码转换脚本

代码语言:javascript
复制
# cat /etc/snmp/zte/ztestorage_transalarmcode.sh
#!/bin/bash
LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
ztestorage_alarmcode='/etc/snmp/zte/ztestorage_alarmcode.txt'
ztestorage_alarmcode_log='/etc/snmp/zte/ztestorage_alarmcode.log'

if [ $# -ne 1 ];then
  exit 2
fi

if [ -s $ztestorage_alarmcode ];then
  value=$(grep -w "$1" "$ztestorage_alarmcode"|grep -v "^#"|awk -F'#' '{print $2}')
  if [ 'Z'"$value" != 'Z' ];then
     echo $value
  else
     echo "$LOGTIME zte storage alarm code is not found." >> $ztestorage_alarmcode_log
  fi
else
  echo "$LOGTIME zte storage alarm code file is not found." >> $ztestorage_alarmcode_log
fi

#脚本需要传入一个参数:<alarmcode>,输出结果为告警码中文描述。

5. 定义云存储SNMPTRAP事件类型的解析参数

代码语言:javascript
复制
# cat /etc/snmp/snmptt.conf.zte
# 新增中兴云桌面分布式存储trap信息
EVENT ztestoragealarmNew .1.3.6.1.4.1.3902.2904.1.2.1.4.1.1 "Status Events" Normal
FORMAT ZBXTRAP $ar $N "alarmuuid:$+4,severity:$p1($9),$12 $p2"
PREEXEC /etc/snmp/zte/getvariablestring.sh ztestoragealarmSeverity $9
PREEXEC /etc/snmp/zte/ztestorage_transalarmcode.sh $13
##
SDESC
.1.3.6.1.4.1.3902.2904.1.2.1.4.1.1   表示 新的告警产生
.1.3.6.1.4.1.3902.2904.1.2.1.4.1.2   表示 相应告警恢复
.1.3.6.1.4.1.3902.2904.1.2.1.3.1.6:  告警级别,分5个等级('critical': 1,'serious': 2,'warning': 3,'prompt': 4,'notice': 5)
.1.3.6.1.4.1.3902.2904.1.2.1.3.1.8:  告警内容
.1.3.6.1.4.1.3902.2904.1.2.1.3.1.10: 告警位置
.1.3.6.1.4.1.3902.2904.1.2.1.3.1.11: 告警码
.1.3.6.1.4.1.3902.2904.1.2.1.3.1.15: 告警主机hostname
EDESC


EVENT ztestoragealarmClear .1.3.6.1.4.1.3902.2904.1.2.1.4.1.2 "Status Events" Normal
FORMAT ZBXTRAP $ar $N "alarmuuid:$+4,severity:$p1($9),$12 $p2"
##
PREEXEC /etc/snmp/zte/getvariablestring.sh ztestoragealarmSeverity $9
PREEXEC /etc/snmp/zte/ztestorage_transalarmcode.sh $13
SDESC
.1.3.6.1.4.1.3902.2904.1.2.1.4.1.1   表示 新的告警产生
.1.3.6.1.4.1.3902.2904.1.2.1.4.1.2   表示 相应告警恢复
.1.3.6.1.4.1.3902.2904.1.2.1.3.1.6:  告警级别,分5个等级('critical': 1,'serious': 2,'warning': 3,'prompt': 4,'notice': 5)
.1.3.6.1.4.1.3902.2904.1.2.1.3.1.8:  告警内容
.1.3.6.1.4.1.3902.2904.1.2.1.3.1.10: 告警位置
.1.3.6.1.4.1.3902.2904.1.2.1.3.1.11: 告警码
.1.3.6.1.4.1.3902.2904.1.2.1.3.1.15: 告警主机hostname
EDESC

6. 重启SNMPTT

代码语言:javascript
复制
# systemctl restart snmptt

7. 提取TRAP事件信息的alarmId

云存储的SNMPTRAP信息经过了预处理后写入snmptt日志,对于同一个事件ztestoragealarmNew(告警事件)和ztestoragealarmClear(恢复事件)类型内容都有一个相同的alarmuuid,提取事件信息中的alarmuuid作为标签ztestoragealarmuuid的值。

通过正则表达式提取事件Id

8. 根据触发器标签进行事件关联恢复

对已产生的SNMPTRAP事件,如果出现恢复事件(事件类型为:ztestoragealarmClear),则通过触发器标签来进行匹配ztestoragealarmuuid,实现告警自动关闭。

匹配事件标签来关联恢复事件

9. 实现效果

云分存储磁盘异常

snmptt接收的告警事件内容

zabbix前端展示的告警

云分存储磁盘故障恢复

snmptt接收的恢复事件内容

zabbix平台显示事件已恢复

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Zabbix开源社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第1章 简介
    • 1.1 说明
      • 1.2 环境
        • 第2章 接入中兴云桌面平台SNMPTRAP
          • 2.1 导入ZTE桌面平台MIB
          • 2.2 转换MIB文件
          • 2.3 追加新增conf配置
          • 2.4 重启SNMPTT
          • 2.5 创建ZTE云桌面SNMPTRAP监控模板
          • 2.6 创建监控实例
          • 2.7 查看最新数据
          • 2.8 汉化翻译SNMPTRAP
          • 2.9 修改SNMPTRAP日志级别
          • 2.10 SNMPTRAP恢复事件关联
      • 第3章 应用案例
        • 3.1 应用案例1:通过外部脚本转码翻译SNMPTRAP信息
          • 3.1.1 案例描述
          • 3.1.2 实现步骤
        • 3.2 应用案例2:通过预处理翻译SNMPTRAP信息
          • 3.2.1 案例描述
          • 3.2.2 实现步骤
      相关产品与服务
      云桌面
      云桌面(Cloud Virtual Desktop,CVD),为您提供随需快捷交付的虚拟远程桌面服务。云桌面可以帮助您轻松构建安全的数字化工作空间,满足移动办公、安全开发、教育实训、在线设计等场景需求,提升业务访问的安全性和连续性。通过自适应传输协议,终端用户可以获得优质的云桌面访问体验。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档