自从上了SkyWalking,睡觉真香!!!

图片来自 Pexels

创新互联公司主营赣州网站建设的网络公司,主营网站建设方案,重庆APP开发公司,赣州h5微信小程序开发搭建,赣州网站营销推广欢迎赣州等地区企业咨询

除了应用指标监控以外,它还能对分布式调用链路进行追踪。类似功能的组件还有:Zipkin、Pinpoint、CAT 等。

上几张图,看看效果,然后再一步一步搭建并使用:

概念与架构

SkyWalking 是一个开源监控平台,用于从服务和云原生基础设施收集、分析、聚合和可视化数据。

SkyWalking 提供了一种简单的方法来维护分布式系统的清晰视图,甚至可以跨云查看。它是一种现代 APM,专门为云原生、基于容器的分布式系统设计。

SkyWalking 从三个维度对应用进行监视:

  • service(服务)
  • service instance(实例)
  • endpoint(端点)

服务和实例就不多说了,端点是服务中的某个路径或者说 URI:

SkyWalking allows users to understand the topology relationship between Services and Endpoints, to view the metrics of every Service/Service Instance/Endpoint and to set alarm rules.

SkyWalking 允许用户了解服务和端点之间的拓扑关系,查看每个服务/服务实例/端点的度量,并设置警报规则。

架构如下图:

SkyWalking 逻辑上分为四个部分:

  • Probes(探针)
  • Platform backend(平台后端)
  • Storage(存储)
  • UI

这个结构就很清晰了,探针就是 Agent 负责采集数据并上报给服务端,服务端对数据进行处理和存储,UI 负责展示。

下载与安装

SkyWalking 有两中版本,ES 版本和非 ES 版。如果我们决定采用 ElasticSearch 作为存储,那么就下载 ES 版本。

 
 
 
  1. https://skywalking.apache.org/downloads/ 
  2. https://archive.apache.org/dist/skywalking/ 

如上图:

  • agent 目录将来要拷贝到各服务所在机器上用作探针。
  • bin 目录是服务启动脚本。
  • config 目录是配置文件。
  • oap-libs 目录是 oap 服务运行所需的 jar 包。
  • webapp 目录是 web 服务运行所需的 jar 包。

接下来,要选择存储了,支持的存储有:

  • H2
  • ElasticSearch 6,7
  • MySQL
  • TiDB
  • InfluxDB

作为监控系统,首先排除 H2 和 MySQL,这里推荐 InfluxDB,它本身就是时序数据库,非常适合这种场景。但是 InfluxDB 我不是很熟悉,所以这里先用 ElasticSearch7。

 
 
 
  1. https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backend-storage.md 

①安装 ElasticSearch

链接如下:

 
 
 
  1. https://www.elastic.co/guide/en/elasticsearch/reference/7.10/targz.html 
 
 
 
  1. # 启动 
  2. ./bin/elasticsearch -d -p pid 
  3. # 停止 
  4. pkill -F pid 

ElasticSearch 7.x 需要 Java 11 以上的版本,但是如果你设置了环境变量 JAVA_HOME 的话,它会用你自己的 Java 版本。

通常,启动过程中会报以下三个错误:

 
 
 
  1. [1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535] 
  2. [2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] 
  3. [3]: the default discovery settings are unsuitable for production use; at least one of [discovery.seed_hosts, discovery.seed_providers, cluster.initial_master_nodes] must be configured 

解决方法:在 /etc/security/limits.conf 文件中追加以下内容。

 
 
 
  1. * soft nofile 65536 
  2. * hard nofile 65536 
  3. * soft nproc  4096 
  4. * hard nproc  4096 

可通过以下四个命令查看修改结果:

 
 
 
  1. ulimit -Hn 
  2. ulimit -Sn 
  3. ulimit -Hu 
  4. ulimit -Su 

修改 /etc/sysctl.conf 文件,追加以下内容:

 
 
 
  1. vm.max_map_count=262144 

修改 ES 配置文件 elasticsearch.yml 取消注释,保留一个节点:

 
 
 
  1. cluster.initial_master_nodes: ["node-1"] 

为了能够 ip:port 方式访问,还需修改网络配置:

 
 
 
  1. network.host: 0.0.0.0 

修改完是这样的:

至此,ElasticSearch 算是启动成功了。一个节点还不够,这里用三个节点搭建一个集群。

192.168.100.14 config/elasticsearch.yml:

 
 
 
  1. cluster.name: my-monitor 
  2. node.name: node-1 
  3. network.host: 192.168.100.14 
  4. http.port: 9200 
  5. discovery.seed_hosts: ["192.168.100.14:9300", "192.168.100.15:9300", "192.168.100.19:9300"] 
  6. cluster.initial_master_nodes: ["node-1"] 

192.168.100.15 config/elasticsearch.yml:

 
 
 
  1. cluster.name: my-monitor 
  2. node.name: node-2 
  3. network.host: 192.168.100.15 
  4. http.port: 9200 
  5. discovery.seed_hosts: ["192.168.100.14:9300", "192.168.100.15:9300", "192.168.100.19:9300"] 
  6. cluster.initial_master_nodes: ["node-1"] 

192.168.100.19 config/elasticsearch.yml:

 
 
 
  1. cluster.name: my-monitor 
  2. node.name: node-3 
  3. network.host: 192.168.100.19 
  4. http.port: 9200 
  5. discovery.seed_hosts: ["192.168.100.14:9300", "192.168.100.15:9300", "192.168.100.19:9300"] 
  6. cluster.initial_master_nodes: ["node-1"] 

同时,建议修改三个节点 config/jvm.options:

 
 
 
  1. -Xms2g 
  2. -Xmx2g 

依次启动三个节点:

 
 
 
  1. pkill -F pid 
  2. ./bin/elasticsearch -d -p pid 

接下来,修改 skywalking下config/application.yml 中配置 es 地址即可:

 
 
 
  1. storage: 
  2.   selector: ${SW_STORAGE:elasticsearch7} 
  3.   elasticsearch7: 
  4.     nameSpace: ${SW_NAMESPACE:""} 
  5.     clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.100.14:9200,192.168.100.15:9200,192.168.100.19:9200} 

②安装 Agent

地址如下:

 
 
 
  1. https://github.com/apache/skywalking/blob/v8.2.0/docs/en/setup/service-agent/java-agent/README.md 

将 agent 目录拷贝至各服务所在的机器上:

 
 
 
  1. scp -r ./agent chengjs@192.168.100.12:~/ 

这里,我将它拷贝至各个服务目录下:

plugins 是探针用到各种插件,SkyWalking 插件都是即插即用的,可以把 optional-plugins 中的插件放到 plugins 中。

修改 agent/config/agent.config 配置文件,也可以通过命令行参数指定。主要是配置服务名称和后端服务地址:

 
 
 
  1. agent.service_name=${SW_AGENT_NAME:user-center} 
  2. collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.100.17:11800} 

当然,也可以通过环境变量或系统属性的方式来设置,例如:

 
 
 
  1. export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 

最后,在服务启动的时候用命令行参数 -javaagent 来指定探针:

 
 
 
  1. java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar -jar yourApp.jar 

例如:

 
 
 
  1. java -javaagent:./agent/skywalking-agent.jar -Dspring.profiles.active=dev -Xms512m -Xmx1024m -jar demo-0.0.1-SNAPSHOT.jar 

启动服务

修改 webapp/webapp.yml 文件,更改端口号及后端服务地址:

 
 
 
  1. server: 
  2.   port: 9000 
  3.  
  4. collector: 
  5.   path: /graphql 
  6.   ribbon: 
  7.     ReadTimeout: 10000 
  8.     # Point to all backend's restHost:restPort, split by , 
  9.     listOfServers: 127.0.0.1:12800 

启动服务:

 
 
 
  1. bin/startup.sh 

或者分别依次启动:

 
 
 
  1. bin/oapService.sh 
  2. bin/webappService.sh 

查看 logs 目录下的日志文件,看是否启动成功。浏览器访问 :

 
 
 
  1. http://127.0.0.1:9000 

告警

编辑 alarm-settings.yml 设置告警规则和通知:

 
 
 
  1. https://github.com/apache/skywalking/blob/v8.2.0/docs/en/setup/backend/backend-alarm.md 

重点说下告警通知:

为了使用钉钉机器人通知,接下来,新建一个项目:

 
 
 
  1.  
  2.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 
  3.     4.0.0 
  4.      
  5.         org.springframework.boot 
  6.         spring-boot-starter-parent 
  7.         2.4.0 
  8.           
  9.      
  10.     com.wt.monitor 
  11.     skywalking-alarm 
  12.     1.0.0-SNAPSHOT 
  13.     skywalking-alarm 
  14.  
  15.      
  16.         1.8 
  17.      
  18.  
  19.      
  20.          
  21.             org.springframework.boot 
  22.             spring-boot-starter-web 
  23.          
  24.  
  25.          
  26.             com.aliyun 
  27.             alibaba-dingtalk-service-sdk 
  28.             1.0.1 
  29.          
  30.  
  31.          
  32.             commons-codec 
  33.             commons-codec 
  34.             1.15 
  35.          
  36.  
  37.          
  38.             com.alibaba 
  39.             fastjson 
  40.             1.2.75 
  41.          
  42.  
  43.          
  44.             org.projectlombok 
  45.             lombok 
  46.             true 
  47.          
  48.      
  49.  
  50.      
  51.          
  52.              
  53.                 org.springframework.boot 
  54.                 spring-boot-maven-plugin 
  55.              
  56.          
  57.      
  58.  
  59.  

可选依赖(不建议引入):

 
 
 
  1.     org.apache.skywalking 
  2.     server-core 
  3.     8.2.0 
  4.  

定义告警消息实体类:

 
 
 
  1. package com.wt.monitor.skywalking.alarm.domain; 
  2.  
  3. import lombok.Data; 
  4.  
  5. import java.io.Serializable; 
  6.  
  7. /** 
  8.  * @author ChengJianSheng 
  9.  * @date 2020/12/1 
  10.  */ 
  11. @Data 
  12. public class AlarmMessageDTO implements Serializable { 
  13.  
  14.     private int scopeId; 
  15.  
  16.     private String scope; 
  17.  
  18.     /** 
  19.      * Target scope entity name 
  20.      */ 
  21.     private String name; 
  22.  
  23.     private String id0; 
  24.  
  25.     private String id1; 
  26.  
  27.     private String ruleName; 
  28.  
  29.     /** 
  30.      * Alarm text message 
  31.      */ 
  32.     private String alarmMessage; 
  33.  
  34.     /** 
  35.      * Alarm time measured in milliseconds 
  36.      */ 
  37.     private long startTime; 
  38.  

发送钉钉机器人消息:

 
 
 
  1. package com.wt.monitor.skywalking.alarm.service; 
  2.  
  3. import com.dingtalk.api.DefaultDingTalkClient; 
  4. import com.dingtalk.api.DingTalkClient; 
  5. import com.dingtalk.api.request.OapiRobotSendRequest; 
  6. import com.taobao.api.ApiException; 
  7. import lombok.extern.slf4j.Slf4j; 
  8. import org.apache.commons.codec.binary.Base64; 
  9. import org.springframework.beans.factory.annotation.Value; 
  10. import org.springframework.stereotype.Service; 
  11.  
  12. import javax.crypto.Mac; 
  13. import javax.crypto.spec.SecretKeySpec; 
  14. import java.io.UnsupportedEncodingException; 
  15. import java.net.URLEncoder; 
  16. import java.security.InvalidKeyException; 
  17. import java.security.NoSuchAlgorithmException; 
  18.  
  19. /** 
  20.  * https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq 
  21.  * @author ChengJianSheng 
  22.  * @data 2020/12/1 
  23.  */ 
  24. @Slf4j 
  25. @Service 
  26. public class DingTalkAlarmService { 
  27.  
  28.     @Value("${dingtalk.webhook}") 
  29.     private String webhook; 
  30.     @Value("${dingtalk.secret}") 
  31.     private String secret; 
  32.  
  33.     public void sendMessage(String content) { 
  34.         try { 
  35.             Long timestamp = System.currentTimeMillis(); 
  36.             String stringToSign = timestamp + "\n" + secret; 
  37.             Mac mac = Mac.getInstance("HmacSHA256"); 
  38.             mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256")); 
  39.             byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8")); 
  40.             String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8"); 
  41.  
  42.             String serverUrl = webhook + "×tamp=" + timestamp + "&sign=" + sign; 
  43.             DingTalkClient client = new DefaultDingTalkClient(serverUrl); 
  44.             OapiRobotSendRequest request = new OapiRobotSendRequest(); 
  45.             request.setMsgtype("text"); 
  46.             OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text(); 
  47.             text.setContent(content); 
  48.             request.setText(text); 
  49.  
  50.             client.execute(request); 
  51.         } catch (ApiException e) { 
  52.             e.printStackTrace(); 
  53.             log.error(e.getMessage(), e); 
  54.         } catch (NoSuchAlgorithmException e) { 
  55.             e.printStackTrace(); 
  56.             log.error(e.getMessage(), e); 
  57.         } catch (UnsupportedEncodingException e) { 
  58.             e.printStackTrace(); 
  59.             log.error(e.getMessage(), e); 
  60.         } catch (InvalidKeyException e) { 
  61.             e.printStackTrace(); 
  62.             log.error(e.getMessage(), e); 
  63.         } 
  64.     } 

AlarmController.java:

 
 
 
  1. package com.wt.monitor.skywalking.alarm.controller; 
  2.  
  3. import com.alibaba.fastjson.JSON; 
  4. import com.wt.monitor.skywalking.alarm.domain.AlarmMessageDTO; 
  5. import com.wt.monitor.skywalking.alarm.service.DingTalkAlarmService; 
  6. import lombok.extern.slf4j.Slf4j; 
  7. import org.springframework.beans.factory.annotation.Autowired; 
  8. import org.springframework.web.bind.annotation.PostMapping; 
  9. import org.springframework.web.bind.annotation.RequestBody; 
  10. import org.springframework.web.bind.annotation.RequestMapping; 
  11. import org.springframework.web.bind.annotation.RestController; 
  12.  
  13. import java.text.MessageFormat; 
  14. import java.util.List; 
  15.  
  16. /** 
  17.  * @author ChengJianSheng 
  18.  * @date 2020/12/1 
  19.  */ 
  20. @Slf4j 
  21. @RestController 
  22. @RequestMapping("/skywalking") 
  23. public class AlarmController { 
  24.  
  25.     @Autowired 
  26.     private DingTalkAlarmService dingTalkAlarmService; 
  27.  
  28.     @PostMapping("/alarm") 
  29.     public void alarm(@RequestBody List alarmMessageDTOList) { 
  30.        log.info("收到告警信息: {}", JSON.toJSONString(alarmMessageDTOList)); 
  31.        if (null != alarmMessageDTOList) { 
  32.            alarmMessageDTOList.forEach(e->dingTalkAlarmService.sendMessage(MessageFormat.format("-----来自SkyWalking的告警-----\n【名称】: {0}\n【消息】: {1}\n", e.getName(), e.getAlarmMessage()))); 
  33.        } 
  34.     } 

参考文档:

 
 
 
  1. https://skywalking.apache.org/ 
  2. https://skywalking.apache.org/zh/\ https://github.com/apache/skywalking/tree/v8.2.0/docs 
  3. https://archive.apache.org/dist/ 
  4. https://www.elastic.co/guide/en/elasticsearch/reference/master/index.html  
  5. https://www.elastic.co/guide/en/elasticsearch/reference/7.10/modules-discovery-bootstrap-cluster.html 
  6. https://www.elastic.co/guide/en/elasticsearch/reference/7.10/modules-discovery-hosts-providers.html 

作者:废物大师兄

编辑:陶家龙

出处:https://urlify.cn/Zfy2ia

文章标题:自从上了SkyWalking,睡觉真香!!!
文章网址:http://www.shufengxianlan.com/qtweb/news14/273864.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联