点击关注公众号,Java干货及时送达

作者:废物大师兄
来源:www.cnblogs.com/cjsblog/p/14075486.html

SkyWalking 是一个应用性能监控系统,特别为微服务、云原生和基于容器(Docker, Kubernetes, Mesos)体系结构而设计。

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

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

1、概念与架构

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

1.1. 架构

SkyWalking逻辑上分为四个部分:Probes(探针), Platform backend(平台后端), Storage(存储), UI

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

2、下载与安装

SkyWalking有两中版本,ES版本和非ES版。

如果我们决定采用ElasticSearch作为存储,那么就下载es版本。

https://skywalking.apache.org/downloads/
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

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

2.1. 安装ElasticSearch

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/targz.html

# 启动
./bin/elasticsearch -d -p pid
# 停止
pkill -F pid

ElasticSearch7.x需要Java 11以上的版本,但是如果你设置了环境变量JAVA_HOME的话,它会用你自己的Java版本。Java 系列面试题和答案我都整理好了,关注公众号Java技术栈,在后台回复:面试。

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

[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
[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 文件中追加以下内容:

* soft nofile 65536
* hard nofile 65536
* soft nproc  4096
* hard nproc  4096

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

ulimit -Hn
ulimit -Sn
ulimit -Hu
ulimit -Su

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

vm.max_map_count=262144

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

cluster.initial_master_nodes: ["node-1"]

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

network.host: 0.0.0.0

修改完是这样的:

至此,ElasticSearch算是启动成功了

一个节点还不够,这里用三个节点搭建一个集群

192.168.100.14 config/elasticsearch.yml

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

192.168.100.15 config/elasticsearch.yml

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

192.168.100.19 config/elasticsearch.yml

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

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

-Xms2g
-Xmx2g

依次启动三个节点

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

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

storage:selector: ${SW_STORAGE:elasticsearch7}elasticsearch7:nameSpace: ${SW_NAMESPACE:""}clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.100.14:9200,192.168.100.15:9200,192.168.100.19:9200}

2.2. 安装Agent

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

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

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

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

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

修改 agent/config/agent.config 配置文件,也可以通过命令行参数指定

主要是配置服务名称和后端服务地址

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

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

export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800

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

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

例如:

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

3、启动服务

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

server:port: 9000collector:path: /graphqlribbon:ReadTimeout: 10000# Point to all backend's restHost:restPort, split by ,listOfServers: 127.0.0.1:12800

启动服务

bin/startup.sh

或者分别依次启动

bin/oapService.sh
bin/webappService.sh

查看logs目录下的日志文件,看是否启动成功

浏览器访问 http://127.0.0.1:9000

分享:Spring Boot 学习笔记,这个太全了

4、告警

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

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

重点说下告警通知

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

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.wt.monitor</groupId><artifactId>skywalking-alarm</artifactId><version>1.0.0-SNAPSHOT</version><name>skywalking-alarm</name><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.aliyun</groupId><artifactId>alibaba-dingtalk-service-sdk</artifactId><version>1.0.1</version></dependency><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.15</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.75</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

Spring Boot 基础就不介绍了,推荐看下这个教程:

https://github.com/javastacks/spring-boot-best-practice

可选依赖(不建议引入)

<dependency<groupId>org.apache.skywalking</groupId><artifactId>server-core</artifactId><version>8.2.0</version>
</dependency>

定义告警消息实体类:

package com.wt.monitor.skywalking.alarm.domain;import lombok.Data;import java.io.Serializable;/*** @author ChengJianSheng* @date 2020/12/1*/
@Data
public class AlarmMessageDTO implements Serializable {private int scopeId;private String scope;/*** Target scope entity name*/private String name;private String id0;private String id1;private String ruleName;/*** Alarm text message*/private String alarmMessage;/*** Alarm time measured in milliseconds*/private long startTime;}

发送钉钉机器人消息:

package com.wt.monitor.skywalking.alarm.service;import com.dingtalk.api.DefaultDingTalkClient;
import com.dingtalk.api.DingTalkClient;
import com.dingtalk.api.request.OapiRobotSendRequest;
import com.taobao.api.ApiException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;/*** https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq* @author ChengJianSheng* @data 2020/12/1*/
@Slf4j
@Service
public class DingTalkAlarmService {@Value("${dingtalk.webhook}")private String webhook;@Value("${dingtalk.secret}")private String secret;public void sendMessage(String content) {try {Long timestamp = System.currentTimeMillis();String stringToSign = timestamp + "\n" + secret;Mac mac = Mac.getInstance("HmacSHA256");mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");String serverUrl = webhook + "&timestamp=" + timestamp + "&sign=" + sign;DingTalkClient client = new DefaultDingTalkClient(serverUrl);OapiRobotSendRequest request = new OapiRobotSendRequest();request.setMsgtype("text");OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();text.setContent(content);request.setText(text);client.execute(request);} catch (ApiException e) {e.printStackTrace();log.error(e.getMessage(), e);} catch (NoSuchAlgorithmException e) {e.printStackTrace();log.error(e.getMessage(), e);} catch (UnsupportedEncodingException e) {e.printStackTrace();log.error(e.getMessage(), e);} catch (InvalidKeyException e) {e.printStackTrace();log.error(e.getMessage(), e);}}
}

AlarmController.java

package com.wt.monitor.skywalking.alarm.controller;import com.alibaba.fastjson.JSON;
import com.wt.monitor.skywalking.alarm.domain.AlarmMessageDTO;
import com.wt.monitor.skywalking.alarm.service.DingTalkAlarmService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.text.MessageFormat;
import java.util.List;/*** @author ChengJianSheng* @date 2020/12/1*/
@Slf4j
@RestController
@RequestMapping("/skywalking")
public class AlarmController {@Autowiredprivate DingTalkAlarmService dingTalkAlarmService;@PostMapping("/alarm")public void alarm(@RequestBody List<AlarmMessageDTO> alarmMessageDTOList) {log.info("收到告警信息: {}", JSON.toJSONString(alarmMessageDTOList));if (null != alarmMessageDTOList) {alarmMessageDTOList.forEach(e->dingTalkAlarmService.sendMessage(MessageFormat.format("-----来自SkyWalking的告警-----\n【名称】: {0}\n【消息】: {1}\n", e.getName(), e.getAlarmMessage())));}}
}

参考文档:

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

最后,感谢阅读~

热门内容:23 种设计模式的通俗解释,看完秒懂
token多平台身份认证架构设计思路
最近 GitHub 访问很慢?
好家伙!JDK16 GA 终于发布,内置 Lombok 的功能,真的顶?
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

自从上了 SkyWalking,睡觉真香!!相关推荐

  1. 记程序员们的一次清明踏青(上):烧烤真香!

         作者:年素清      来源:码农故事汇 01 码农故事汇 燕子来时新社,梨花落后清明. 转眼到了清明佳节,远在北京的程序员老王距离家乡有万里之遥.虽然清明有三天的假期,可是如果让他坐上飞机 ...

  2. 该死!GitHub上这些C++项目真香

    在知乎上看到了个问题,说,在用github搜学习资料时,总是一些很大型且成熟的项目,根本看不懂. 做为工作近十年的经验老鸟,github上的资源非常丰富,通过github学习一定要循序渐进. 其实,不 ...

  3. 封禁华为的美国,现在不得不在5G标准制定上“恢复合作”,网友:5G真香

    十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 华为被列"实体清单"还未满一年,外媒今日却曝出消息: 美国商务部拟允许美国公司与华为合作. 这波操作的目的是什么? 根据 ...

  4. 爬一爬 iPhone 11为何嘴上说真丑,销量却真香?

    9月11号早晨,在Steve Jobs剧院举行的2019苹果秋季新品发布会之后,蹲守在发布会前的果粉们开始了自乔布斯去世之后一年一度的对苹果的群嘲.从5S的土豪金,到6的大屏幕.粗线条,iPhone7 ...

  5. 在M1芯片上跑原生Linux:编译速度比macOS还快40%,真香警告

    Alex 发自 凹非寺 量子位 | 公众号 QbitAI 现在,M1 Mac可以顺利运行原生Linux了. 专为苹果自研芯片打造的Asahi Linux项目,Alpha版本已经释出. 在Mac采用英特 ...

  6. dnf时装预览怎么打开_DNF:史上最好看时装上线,大佬已经玩疯,全服都是真香的气息...

    大家好!我是风柜君,这次又是我来给大家带来DNF游戏内外的趣事,希望各位喜欢. DNF国服将在6月18日迎来第11周年庆,而在此之前,国服在6月6日的时候已经更新了一波周年庆预热活动.这次的更新除了普 ...

  7. 史上最拉风年货?苏宁门店私人飞机开售 网友:这个真香不了吧

    还有两天就是年三十了,正是每家每户办年货的时候,一些商家也是各种活动层出不穷.但是说到最拉风的年货,恐怕要算私人飞机了. 在1月31号,上海苏宁易购浦东第一店展出了一架私人飞机"太阳之鹰&q ...

  8. java sleep方法_6种快速统计代码执行时间的方法,真香!(史上最全)

    我们在日常开发中经常需要测试一些代码的执行时间,但又不想使用向 JMH(Java Microbenchmark Harness,Java 微基准测试套件)这么重的测试框架,所以本文就汇总了一些 Jav ...

  9. ipad wifi信号测试软件,真香!平板Ipad无线投屏在电视上视频教程分享,无需装软件,支持任何显示设备...

    原标题:真香!平板Ipad无线投屏在电视上视频教程分享,无需装软件,支持任何显示设备 平板的应用绝不仅仅局限于看看电影,听听歌,画画,在商务会议场景的应用下,移动办公也不再是什么新鲜事,小伙伴们也可以 ...

最新文章

  1. FPGA之道(65)代码中的约束信息(二)乘法器的相关约束
  2. tomcat 和apache的整合的方法及配置(一)
  3. 【BUG记录】在onCreate()方法handler调用方法导致程序闪退
  4. 4万家公司没了!这个吸血房客的行业,终于要崩了?
  5. 热烈欢迎 东北鸿顺山特产品有限公司网站正式上线
  6. matlab的GUI实验——实现简单信号发生器
  7. layer弹出框,zIndex不断增加的问题
  8. Exchange Server 2013部署系列之一:部署环境介绍
  9. 使用Excel数据分析工具进行多元回归分析的方法
  10. 基于深度学习的小目标检测方法的调查和性能评估
  11. 嵌入式技术基础与实践(第4版)
  12. hapi mysql项目实战路由初始化_hapi框架搭建记录(三):Joi数据校验和Sequelize(数据迁移、填充数据)...
  13. 网页直播源码,实现界面左右滑动
  14. 以太坊源码分析(39)geth启动流程分析
  15. NER综述 | 命名实体识别的过去和现在
  16. HDU1087 噜啦啦卢
  17. 编程中的匈牙利命名法
  18. 编译出现错误,想知道为什么错误
  19. 物流软件行业Top企业概况与各地发展优劣势分析
  20. MyBatis中获取Oracle序列

热门文章

  1. Self Ogannizing Maps(SOM)自组织映射
  2. PX4如何开启本地在环仿真?如何将仿真地点定位为本地位置?你进来就对了!
  3. ora-1031解决一例
  4. Oracle数据库查看表空间是否为自增的
  5. Centos修改系统语言
  6. 从 Android 静音看正确的查bug的姿势?
  7. [记录]calculate age based on date of birth
  8. 笔记 JVM调优流程
  9. vs2010 学习Silverlight学习笔记(7):控件样式与模板
  10. [转]wxODBC(wxWidgets)中使用驱动程序方式打开数据库