前言
preface
此前,统一监控平台集成了多种监控工具,如zabbix、nagios以及prometheus等,集成告警的方式也是多样化的,可以发现网络、操作系统、中间件、数据库、应用端口、应用进程、日志、url页面以及容器环境下的各种问题,并通过告警的形式及时反馈给相应的责任人。如今,随着企业中微服务应用数量的增加,服务与服务链路之间的调用关系也变得错综复杂,我们在日常的监控运维工作中也会碰到各种难题,我们的目标不再局限于应用层面仅对端口、日志以及进程的状态监控,而是找到应用本身的性能问题,于是我们进一步集成了Skywalking工具。
01
Skywalking工具介绍
Skywalking是一个国产的开源框架,2015年由吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为,2019年4月17日Apache董事会批准SkyWalking成为顶级项目,支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,跟Pinpoint一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生支持,目前增长势头强劲,社区活跃。
Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等。
Skywalking整体结构(引自官网)
Skywalking Agent:使用Javaagent做字节码植入,无侵入式的收集,并通过HTTP或者gRPC方式发送数据到Skywalking Collector。
Skywalking Collector :链路数据收集器,对agent传过来的数据进行整合分析处理并落入相关的数据存储中。其中Collector Receiver 是Skywalking在6.x提出的新的概念,负责从被监控的系统中接受指标数据。用户完全可以参照OpenTracing规范来上传自定义的监控数据。Skywalking官方提供了service-mesh、istio、zipkin的相关能力。
Storage:Skywalking的存储,时间更迭,支持以ElasticSearch、Mysql、TiDB、H2、作为存储介质进行数据存储。
02
集成设计方案
监控平台集成Skywalking整体设计
将Skywalking集成到统一监控平台,完善应用性能监控,主要考虑以下几个问题。
01
告警规则配置发下管理
1
规则特性
SkyWalking告警是由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中,规则的配置主要为以下几点:
-
规则名称:在告警信息中显示的唯一名称,必须以_rule结尾。
-
metrics-name:度量名称,也是OAL脚本中的度量名。默认配置中可以用于告警的度量有:服务,实例,端点,服务关系,实例关系,端点关系。它只支持long,double和int类型。
-
include-names:包含在此规则之内的实体名称列表。
-
exclude-names:排除在此规则以外的实体名称列表。
-
include-names-regex:提供一个正则表达式来包含实体名称。如果同时设置包含名称列表和包含名称的正则表达式,则两个规则都将生效。
-
exclude-names-regex:提供一个正则表达式来排除实体名称。如果同时设置排除名称列表和排除名称的正则表达式,则两个规则都将生效。
-
include-labels:包含在此规则之内的标签。
-
exclude-labels:排除在此规则以外的标签。
-
include-labels-regex:提供一个正则表达式来包含标签。如果同时设置包含标签列表和包含标签的正则表达式,则两个规则都将生效。
-
exclude-labels-regex:提供一个正则表达式来排除标签。如果同时设置排除标签列表和排除标签的正则表达式,则两个规则都将生效。
-
threshold:阈值。
对于多个值指标,例如percentile,阈值是一个数组。像value1 value2 value3 value4 value5这样描述。每个值可以作为度量中每个值的阈值。如果不想通过此值或某些值触发警报,则将值设置为 -。例如在percentile中,value1是P50的阈值,value2是P75的阈值,那么-,-,value3, value4, value5的意思是,没有阈值的P50和P75的percentile告警规则。
-
op:操作符,支持>, >=, <, <=, =。
-
period:多久告警规则需要被检查一下。这是一个时间窗口,与后端部署环境时间相匹配。
-
count:在一个周期窗口中,如果按op计算超过阈值的次数达到count,则发送告警。
-
only-as-condition:true或者false,指定规则是否可以发送告警,或者仅作为复合规则的条件。
-
silence-period:在时间N中触发报警后,在N -> N + silence-period这段时间内不告警。默认情况下,它和period一样,这意味着相同的告警(同一个度量名称拥有相同的Id)在同一个周期内只会触发一次。
-
message:该规则触发时,发送的通知消息。
Skywalking告警规则
2
监控平台集成方案
从Skywalking 6.5.0开始,部分Skywalking配置项支持“动态配置”——这样修改完配置后,无需重启Skywalking。
基于统一监控平台的“四件套”基础概念,即监控指标、指标实现、策略模板以及策略规则,可以设计一套针对Skywalking完善的配置规则,通过平台计算生成配置数据,将其转换成alarm-settings.yml格式后,下发至配置中心,再开启Skywalking动态加载配置功能,实时读取配置中心下发的监控配置,这样就完成了平台对于Skywalking工具的配置驱动,实现动态下发能力。
统一监控平台-Skywalking策略模板
3
驱动模块开发
考虑到监控平台此前不具备将配置数据直接下发至配置中心(Zookeeper)的能力,因此,需要设计开发告警规则驱动模块,它的主要功能是将统一监控平台计算生成的告警规则(Json),按照上文中Skywalking要求的配置格式(Yml)进行转换,并且下发至Zookeeper的default.alarm.default.alarm-settings,完成告警规则的驱动管理,实现统一监控平台随时可下发覆盖旧版本告警规则。
驱动模块开发的核心要点在于如何进行格式转换,经过调研发现Jaskson dataformat text符合我们的使用场景。jackson dataformat yaml已经纳入到jackson dataformat text里面了。这个是好几个不同的类似于加载yaml, xml文件等,这是一个用于Jackson标准文本格式数据格式后端的多模块总括项目,Dataformat后端用于支持JSON的格式替代品,使用通用的Jackson API。包含允许的格式且多种api风格(streaming, databinding, tree model)进行访问。
将统一监控平台接收过来的Json数据封装成Map,再利用jackson dataformat yaml将其转换成Yml格式,示例代码如下:
/**
* 将类对象转yaml字符串
* @param object 对象
* @return yaml字符串
*/
public static String toYaml(Object object){
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
mapper.findAndRegisterModules();
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper = new ObjectMapper(new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER));
mapper.setPropertyNamingStrategy(overidePropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES)
StringWriter stringWriter = new StringWriter();
try {
mapper.writeValue(stringWriter, object);
return stringWriter.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
值得注意的是在配置驼峰转换类型时,CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES配置与Skywalking要求的格式最为接近,为驼峰转下划线,而Skywalking配置则需要中划线,而overidePropertyNamingStrategy的原始类中无中划线配置,在实际开发过程中需要重写此类。
转换完成后将标准yml写入Zookeeper的default.alarm.default.alarm-settings中,完成下发驱动。
02
事件集成管理
1
Skywalking告警外发方式
Skywalking告警外发方式较为多样,都可以在../config/application.yml 路径下进行相关的配置,包括以下几种方式:
Skywalking自身支持的告警外发方式较为多样。
webhook:当告警触发时,被调用的服务端点列表。
gRPCHook:当告警触发时,被调用的远程gRPC方法的主机和端口。
Slack Chat Hook:当告警触发时,被调用的Slack Chat接口。
微信 Hook:当告警触发时,被调用的微信接口。
钉钉 Hook:当告警触发时,被调用的钉钉接口。
Skywalking生成的告警信息
2
外发选型与告警集成模块开发
统一监控平台的告警采集方式多样,支持不同编码格式(UTF8、GB2312)的Syslog解析,鉴于上文中Skywalking的告警形式,可以采用开发Webhook模块,进行自定义固定格式的Syslog拼接,并发送至监控服务器Syslog-ng服务,由统一监控平台的告警采集器(Syslog-Epp)对收集的Syglog文件进行采集,在Syslog告警的解析与生成过程中,会完成告警的信息丰富,如应用分类、设备IP以及服务名等。直到生成一条完整的告警进入统一监控平台的内存数据库(UMDB),便完成了Skywalking的告警接入统一监控平台,后续将由监控平台的通知模块通过E信渠道发送给对应责任人。
Skywalking-Webhook模块的开发示例代码如下:
#接收Skywalking告警并转发至Syslog-ng服务器。
@RequestMapping(value = \"/alarm\",method = RequestMethod.POST)
public void alarm(@RequestBody ListalarmMessageList){
for (AlarmMessage alarmMessage : alarmMessageList) {
String sysLogStr = alarmService.transferSysLog(alarmMessage);
if(StringUtils.isNotEmpty(sysLogStr)) {
try {
syslog.log(logLevel, sysLogStr);
logger.info(String.format(\"send syslog(%s:%s) : %s\", host, port, sysLogStr));
} catch (Exception ex) {
logger.error(\"send syslog failed\", ex);
}
}
}
syslog.flush();
}
03
Skywalking配置部署
与Agent实施
01
Skywalking相关配置
Skywalking集群的部署配置需要注意两块配置。因统一监控平台本身具备Zookeeper集群,且动态配置alarm-settings也需要读取Zookeeper节点中的告警规则数据,所以集群启动方式选Zookeeper,配置示例如下:
cluster:
selector: ${SW_CLUSTER:zookeeper}
# standalone:
# Please check your ZooKeeper is 3.5+, However, it is also compatible with ZooKeeper 3.4.x. Replace the ZooKeeper 3.5+
# library the oap-libs folder with your ZooKeeper 3.4.x library.
zookeeper:
nameSpace: ${SW_NAMESPACE:\"\"}
hostPort: ${SW_CLUSTER_ZK_HOST_PORT:ip1:2181,ip2:2181,ip3:2181}
# Retry Policy
baseSleepTimeMs: ${SW_CLUSTER_ZK_SLEEP_TIME:1000} # initial amount of time to wait between retries
maxRetries: ${SW_CLUSTER_ZK_MAX_RETRIES:3}
Skywalking的存储模式选择ES集群,相关配置如下:
storage:
selector: ${SW_STORAGE:elasticsearch7}
elasticsearch7:
nameSpace: ${SW_NAMESPACE:\"skywalking-index\"}
clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:IP:PORT,IP:PORT,IP:PORT}
protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:\"http\"}
trustStorePath: ${SW_STORAGE_ES_SSL_JKS_PATH:\"\"}
trustStorePass: ${SW_STORAGE_ES_SSL_JKS_PASS:\"\"}
02
Skywalking-Agent实施
Agent的配置文件在agent/config/agent.config中,Agent在嵌入应用启动的过程中,可以支持众多的属性参数:
Agent部分启动参数详情
为了使采集的告警信息更加完善,区分不同的服务组件与应用分类,在监控平台自身的Agent实施过程中,我们使用了servername参数,并约定格式为<应用分类代码>::<服务名>@<应用IP:port>,示范启动命令:
启动命令示范
与此同时,我们还实践了多种类型的组件与服务的agent嵌入,包括容器版本与非容器版本,并进行了记录,最终部分组件的SkyWalking展示(示例参考图)如下:
应用拓扑示例图
服务调用信息示例图
实例性能示例图
文章作者:侯 方
手绘插画:岳 媛
原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/32931.html