Spring Cloud 学习(32) --- APM(二) SkyWalking

SkyWalking 是有个完整的 APM 系统,被用于追踪、监控、诊断分布式系统。

SkyWalking 整体由 4 个部分组成:collectoragentwebstorage
应用级别的接入,可以使用 SDK 形式接入,也可以使用非侵入式的 Agent 形式接入。agent 将数据转化为 SkyWalking Trace 数据协议,通过 HTTP、gRPC 发送到 collectorcollector 对收集到的数据进行分析、整合,最后存储到 es 或 H2 中,一般情况下,H2 用于测试。

SkyWalking 特性

SkyWalking 主要功能

  • 分布式只追踪、上下文传输
  • 应用、实例、服务性能指标分析
  • 根源分析
  • 应用拓扑分析
  • 应用于服务依赖分析
  • 慢服务检测
  • 性能优化

SkyWalking 主要特性

  • 多语言探针、类库
  1. Java 自动探针,追踪、监控程序时,无需修改源码
  2. 社区提供多语言探针:.NET、Node.js
  • 多种后端存储:Elasticsearch、H2 等
  1. 支持 OpenTrancing:Java 自动探针和 OpenTracing API 协同工作
  • 轻量级、完善的后台聚合和分析功能
  • 现代化 Web UI
  • 日志集成
  • 应用、实例、服务的告警
  • 支持接受其他跟踪器数据格式
  1. Zipkin JSON、Thrift、Protobuf v1 和 v2 格式,由 OpenZipkin 库提供支持
  2. Jaeger 采用 Zipkin Thrift 或 JSON v1/v2 格式

SkyWalking 测试用例代码

Zuul

<dependencies>
   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
   </dependency>

   <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
   </dependency>
</dependencies>
spring:
 application:
   name:
     spring-cloud-apm-skywalking-zuul
server:
 port: 9020
eureka:
 client:
   service-url:
     defaultZone: http://localhost:8761/eureka/
zuul:
 routes:
   spring-cloud-apm-skywlaking-consumer:
     path: /client/**
     serviceId: spring-cloud-apm-skywlaking-consumer

ribbon:
 eureka:
   enabled: true
 ReadTimeout: 30000
 ConnectionTimeout: 30000
 MaxAutoRetries: 0
 MaxAutoRetriesNextServer: 1
 OkToRetryOnAllOperations: false

hystrix:
 threadpool:
   default:
     coreSize: 1000
     maxQueueSize: 1000
     queueSizeRejectionThreshold: 500

 command:
   default:
     execution:
       isolation:
         thread:
           timeoutInMilliseconds: 120001
@SpringBootApplication
@EnableDiscoveryClient
@EnableZuulProxy
public class SpringCloudApmSkywalkingZuulApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudApmSkywalkingZuulApplication.class, args);
    }

}

Consumer

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>
server:
  port: 9021
spring:
  application:
    name: spring-cloud-apm-skywlaking-consumer
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class SpringCloudApmSkywlakingConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudApmSkywlakingConsumerApplication.class, args);
    }

}



@FeignClient("spring-cloud-apm-skywalking-provider")
public interface SkyWalkingFeignService {

    @RequestMapping(value = "/get-send-info", method = RequestMethod.GET)
    String getSendInfo(@RequestParam("serviceName") String serviceName);

}


@RestController
public class SkyWalkingController {

    private final SkyWalkingFeignService feignService;

    @Autowired
    public SkyWalkingController(SkyWalkingFeignService feignService) {
        this.feignService = feignService;
    }

    @GetMapping(value = "/get-info")
    public String getInfo(){
        return feignService.getSendInfo("service");
    }

}

Provider

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
</dependencies>
server:
  port: 9022
spring:
  application:
    name: spring-cloud-apm-skywalking-provider
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class SpringCloudApmSkywalkingProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringCloudApmSkywalkingProviderApplication.class, args);
    }

    @GetMapping(value = "/get-send-info")
    public String getSendInfo(@RequestParam("serviceName") String serviceName){
        return serviceName + " --> " + "spring-cloud-apm-skywalking-provider";
    }

}

SkyWalking 安装

SkyWalking 依赖环境:

  • 被监控的应用运行在 JDK6+
  • SkyWalking collector 和 WebUI 运行在 JDK8+
  • elasticsearch 5.x(集群可能不能使用)

下载 elasticsearch_5.6.10 版本

注意:一定要用 5.x 的 elasticsearch,否则会出现版本问题!

解压安装后,进入 config/elasticsearch.yml 文件,修改 network.host0.0.0.0。elasticsearch 不允许 root 用户启动,建立新用户并赋权:

useradd es
chown -R es:es /path/to/es

切换到 es 用户,启用 es

./bin/elasticsearch

控制台报错:

[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

修改 /etc/security/limits.conf,增加如下配置:

* soft nofile 819200
* hard nofile 819200

修改 /etc/sysctl.conf,增加配置:

vm.max_map_count=655360

重新加载配置:

sysctl -p

后台启动 es: ./bin/elasticsearch -d

查看 es 日志:tail -f logs/elasticsearch.log,正常启动。

浏览器访问 elasticsearch,可见,默认的 cluster name 为 elasticsearch

elasticsearch

SkyWalking 目录结构

SkyWalking 目录结构
  • agent:探针相关
  • bin:collectorService、webappService 启动脚本,其中 startup.* 是同事启动两个脚本的合并命令
  • config:Collector 的相关配置信息
  • log:collector、web 的日志文件
  • webapp:存放 SkyWalking 展示 UI 的 jar 和配置文件

SkyWalking 的默认端口为:8080、10800、11800、12800 等,如果要修改端口,需要修改 config 目录下的 application.yml、webapp 下的 webapp.yml。

修改 config/application.yml 文件,clusterName 与 elasticsearch 的 cluster name 一致,其余采用默认设置。

application.yml

启动 SkyWalking

启动 SkyWalking:

./bin/startup.sh
启动 SkyWalking

访问 SkyWalking:


访问 SkyWalking

默认 用户名/密码 为:admin/admin

SkyWalking Dashboard

监控项目

创建目录

创建四个目录,分别对应:consumer、provider、zuul、eureka-server 四个应用,每个应用使用一个对应的 agent 进行启动,其中 agent 是 SkyWalking 的 agent 目录。

修改 agent.config 文件中 agent.application_code,这项配置代表应用。对应修改为 consumerproviderzuuleureka。将 eureka、zuul、consumer、provider 打包为 jar,上传到对应目录中。

修改 es 内存配置

elasticsearch 默认 JVM 内存为 2g,如果虚拟机内存过小,无法启动。如果略大于 JVM 内存,启动后无法启动其他组件。所以需要修稿 elasticsearch 的默认 JVM 内存。修改 $ES_HOME/config/jvm.options:

es jvm 参数

修改后重启 es、SkyWalking

使用 top 命令查看使用内存最高的应用,使用 free 命令,查看内存总用量、剩余内存。

free top 命令

依次启动四个应用

启动时需要指定 JVM 内存,防止出现内存不够的情况。
-Xms 指定最小内存,-Xmx 指定最大内存

eureka
java -javaagent:/usr/local/src/soft/eureka/agent/skywalking-agent.jar -jar /usr/local/src/soft/eureka/spring-cloud-eureka-server-simple-0.0.1-SNAPSHOT.jar -Xms256m -Xmx256m

provider
java -javaagent:/usr/local/src/soft/provider/agent/skywalking-agent.jar -jar /usr/local/src/soft/provider/spring-cloud-apm-skywalking-provider-0.0.1-SNAPSHOT.jar -Xms256m -Xmx256m

consumer
java -javaagent:/usr/local/src/soft/consumer/agent/skywalking-agent.jar -jar /usr/local/src/soft/consumer/spring-cloud-apm-skywalking-consumer-0.0.1-SNAPSHOT.jar -Xms256m -Xmx256m

zuul
java -javaagent:/usr/local/src/soft/zuul/agent/skywalking-agent.jar -jar /usr/local/src/soft/zuul/spring-cloud-apm-skywalking-zuul-0.0.1-SNAPSHOT.jar -Xms256m -Xmx256m

确认启动成功

使用 jps 命令查看启动进程:

jps

查看剩余内存是否满足正常运行:


free

验证 SkyWalking

启动成功后访问eureka: http://192.168.67.135:8761/


eureka

访问 SkyWalking:


SkyWalking

可见 4 个 app 都启动成功了。使用 zuul 访问 consumer,调用 provider:


zuul

再次查看 SkyWalking:


SkyWalking

在 service 选项卡中可以看到每个 service 的具体调用情况


service
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容