统一监控平台之应用性能监控设计概述

前言

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

Like (0)
EBCloud的头像EBCloud
Previous 2024年4月2日 下午3:28
Next 2024年4月2日 下午3:28

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注