一、简介

1.1、APM系统

APM(Application Performance Monitoring)系统是一种用于监控和管理应用程序性能的工具。它可以帮助开发人员和运维团队实时监控应用程序的性能指标、识别潜在的性能问题,并提供性能优化建议。

APM系统可以帮助用户及时发现和解决应用程序的性能问题,提升用户体验和系统稳定性。它可以应用于各种类型的应用程序,包括Web应用、移动应用、微服务架构等。

1.2、SkyWalking 简介

SkyWalking是一个开源的应用性能监控(APM)系统,用于监控和管理分布式系统的性能。它提供了实时的性能指标、事务追踪、服务依赖分析等功能,帮助开发人员和运维团队快速定位和解决性能问题。

SkyWalking的核心功能包括:

  1. 分布式追踪:SkyWalking可以追踪分布式系统中的请求流程,记录每个请求经过的服务和组件,以及请求在每个组件中的耗时情况。通过分析追踪数据,可以了解系统中各个组件之间的调用关系和性能瓶颈,帮助开发人员快速定位和解决问题。

  2. 实时监控:SkyWalking提供实时的性能监控指标,包括各个服务的请求量、响应时间、错误率等。通过监控数据,可以及时发现系统的性能问题,并进行调优和优化。

  3. 服务依赖分析:SkyWalking可以分析系统中各个服务之间的依赖关系,包括调用关系和数据流向。通过可视化的方式展示服务之间的依赖关系,可以帮助开发人员理解系统的架构和流程,从而更好地进行系统设计和优化。

  4. 告警和报警:SkyWalking可以设置各种告警规则,当系统出现异常或性能下降时,可以及时发送告警通知。这样可以帮助运维人员快速响应和解决问题,保证系统的稳定性和可靠性。

  5. 数据可视化:SkyWalking提供丰富的数据可视化功能,可以将监控数据以图表的形式展示,帮助用户更直观地了解系统的性能和运行情况。同时,还可以根据需求自定义仪表盘,将关键指标集中展示,方便用户监控和管理系统。

二、快速入门

2.1、下载、启动

前提:要有java环境

下载链接: https://skywalking.apache.org/downloads/

我这边使用9.3版本的apm项目
在这里插入图片描述
还要再下载 agent,skywalking apm是服务端,agent才是真正监控应用的探针。

这里是监控java服务,所以下载的是java agent,如果是前端可以下载 javaScript

在这里插入图片描述

还需要再下载elasticsearch,用于存储记录

下载链接: https://www.elastic.co/cn/downloads/elasticsearch

1、启动apm系统:

window直接进入apm项目里面bin目录下的startup.bat文件,linux 则执行 sh startup.sh
在这里插入图片描述
可以修改启动端口:进入webapp目录下,修改yml文件,修改即可,默认8080
在这里插入图片描述

启动后访问 http://localhost:8080,没改端口的话默认8080

在这里插入图片描述
skywalking会默认使用端口:

  • 11800:探针和Skywalking通讯的gRPC端口,这个服务连接skywalking用
  • 12800:UI视图程序和Skywalking通讯的HTTP端口
  • 8080:可视化视图UI服务的启动端口

2、启动agent:

在我们自己的项目上,注意是我们自己开发的项目,不是skywalking的,在启动参数上加上配置:

指定到agent的jar包的位置

-javaagent:D:\code\tool\skywalking-agent\skywalking-agent.jar
-Dskywalking.agent.service_name=skywalking-service
-Dskywalking.collector.backend_service=127.0.0.1:11800

-javaagent:指定skywalking中的agent中的skywalking-agent.jar的路径
-Dskywalking.agent.service_name:指定在skywalking中的服务名称,一般是微服务的spring.application.name
-Dskywalking.collector.backend_service:指定oap服务绑定的地址,由于陈某这里是本地,并且oap服务默认的端口是11800,因此只需要配置为127.0.0.1:11800

如我在idea上添加VM options配置

在这里插入图片描述

项目启动完毕,再次刷新http://localhost:8080/,apm项目,就可以看到服务注册进来了
在这里插入图片描述
微服务启动就是,每个服务也都写上那个配置即可,需要更换名称。

如果报下面错误,则可以将classpath更换成JAR manifest
在这里插入图片描述

在这里插入图片描述

2.2、界面认识

在这里插入图片描述

点击服务名称,可进入更详细的监控界面

在这里插入图片描述

  1. 概览(Overview):提供整体系统的概览信息,包括各个服务的调用量、成功率、延迟等指标的总览。

  2. 实例(Instance):查询和监控系统中的实例,可以查看每个实例的性能指标、调用情况等信息。

  3. 端点(Endpoint):查询和监控系统中的端点(API、方法等),可以查看每个端点的调用量、成功率、延迟等指标。

  4. 拓扑(Topology):展示系统中各个服务之间的调用关系和依赖关系,可以帮助理解系统的架构和调用流程。

  5. 链路追踪(Trace):查询和监控系统中的请求链路,可以查看每个请求的详细信息,包括调用链路、耗时、异常等。

  6. 链路追踪分析(Trace Profiling):对链路追踪数据进行分析和优化,可以查看每个请求的性能瓶颈、调用路径等信息。

  7. eBPF Profiling:使用eBPF技术对系统进行性能分析和优化,可以查看系统的运行状态、资源使用情况等。

  8. 日志(Log):查询和监控系统的日志信息,可以查看系统的日志记录、异常信息等。

在这里插入图片描述
Topology 鼠标放上去即可看到每个链路的耗时。
在这里插入图片描述Trace 可以追踪每个节点的信息和耗时
在这里插入图片描述在这里插入图片描述还有很多界面,大家自己点点,可以监控很多有用的信息

在这里插入图片描述
微服务使用,路由追踪,需要找到自己项目的gateway版本,在optional-plugins的两个jar包复制到plugins里面,在路由追踪才会显示网关

在这里插入图片描述

三、持久化存储

SkyWalking在默认配置下使用了内存存储(Memory Storage),这意味着数据存储在内存中,并且在重启SkyWalking服务后会丢失。这种配置适用于开发和测试环境,但不适合生产环境。

如果您希望在重启后保留数据,您可以配置SkyWalking使用持久化存储(Persistent Storage),例如使用Elasticsearch、MySQL等数据库作为存储后端。通过将数据存储在持久化存储中,即使在重启SkyWalking服务后,数据也能够得到保留。

我这边存储在Elasticsearch7.10.2,不演示es的下载启动,es启动会有两个默认端口,

在这里插入图片描述
验证es启动成功
在这里插入图片描述更改skywalking-apm项目config下的application.yml,更换使用存储连接方式,如果使用mysql,需要将mysql数据库驱动包拷贝到 oap-libs 目录下才可以

在这里插入图片描述
重启下服务即可

四、告警通知

可以通过修改config文件夹下的alarm-settings.yml文件来配置告警通知。

配置规则:

  1. metrics-name:要监控的指标名称,可以是系统预定义的指标名称,也可以是自定义的指标名称。
  2. op:触发告警的条件操作符,可以是>(大于)、>=(大于等于)、<(小于)、<=(小于等于)等。
  3. threshold:触发告警的阈值,当指标的值满足条件时,触发告警。
  4. period:触发告警的时间窗口大小,单位为分钟。在这个时间窗口内,指标的值会被收集和计算。
  5. count:触发告警的次数阈值,当指标的值在时间窗口内连续超过这个次数时,触发告警。
  6. silence-period:告警的静默期,单位为分钟。在这个静默期内,如果指标的值再次触发告警,不会重复发送告警通知。
  7. message:告警通知的消息内容,可以自定义告警通知的文本信息。

自带配置翻译:

# 示例告警规则
rules:
  # 服务响应时间告警规则
  service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 3
    silence-period: 5
    message: 服务 {name} 的响应时间在过去的10分钟内超过1000毫秒的次数达到3次。

  # 服务SLA告警规则
  service_sla_rule:
    metrics-name: service_sla
    op: "<"
    threshold: 8000
    period: 10
    count: 2
    silence-period: 3
    message: 服务 {name} 的成功率在过去的10分钟内低于80%的次数达到2次。

  # 服务响应时间百分位数告警规则
  service_resp_time_percentile_rule:
    metrics-name: service_percentile
    op: ">"
    threshold: 1000,1000,1000,1000,1000
    period: 10
    count: 3
    silence-period: 5
    message: 服务 {name} 的百分位数响应时间在过去的10分钟内超过1000毫秒的次数达到3次,其中包括p50 > 1000, p75 > 1000, p90 > 1000, p95 > 1000, p99 > 1000。

  # 服务实例响应时间告警规则
  service_instance_resp_time_rule:
    metrics-name: service_instance_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 2
    silence-period: 5
    message: 服务实例 {name} 的响应时间在过去的10分钟内超过1000毫秒的次数达到2次。

  # 数据库访问响应时间告警规则
  database_access_resp_time_rule:
    metrics-name: database_access_resp_time
    threshold: 1000
    op: ">"
    period: 10
    count: 2
    message: 数据库访问 {name} 的响应时间在过去的10分钟内超过1000毫秒的次数达到2次。

  # 端点关系响应时间告警规则
  endpoint_relation_resp_time_rule:
    metrics-name: endpoint_relation_resp_time
    threshold: 1000
    op: ">"
    period: 10
    count: 2
    message: 端点关系 {name} 的响应时间在过去的10分钟内超过1000毫秒的次数达到2次。

webhooks:
  # 配置Webhooks的URL,告警的时候,可以调用下面的接口去告警
  - http://127.0.0.1/notify/
  - http://127.0.0.1/go-wechat/

自定义告警接口:

将下面的接口写在 webhooks下即可。

在这里插入图片描述

在这里插入图片描述

五、自定义追踪-细粒度追踪service方法

1、引入依赖:

   <dependency>
      <groupId>org.apache.skywalking</groupId>
      <artifactId>apm-toolkit-trace</artifactId>
      <version>${skywalking.version}</version>
   </dependency>

${skywalking.version} 和你当前使用的SkyWalking版本保持一致

2、注解配置

先在项目中引入依赖,然后再对应的方法上新增上注解。这里我们通过@Tag获取了name,address,token以及traceId参数。

@Trace
@Tags({@Tag(key = "name",value = "arg[0]"),
        @Tag(key = "token",value = "returnedObj.token"),
        @Tag(key = "address",value = "arg[1]"),
        @Tag(key = "traceId",value = "returnedObj.traceId")})
public User doSkyWalkingPluginsV2(String name, String address, int id){
    CachaUser cachaUser = new CachaUser();
    cachaUser.setName(name);
    cachaUser.setAddress(address);
    cachaUser.setId(id);
    String token = TokenUtils.getToken(cachaUser);
    User user = new User();
    user.setAge("18");
    user.setName(name);
    user.setToken(token);
    user.setTraceId(TraceContext.traceId());
    return user;
}

配置完成后,启动服务。通过postman远程调用服务,在skywalking服务页面可以看到,我们trace的doSkyWalkingPluginsV2方法也被收集到了,方法耗时也能一目了然。
在这里插入图片描述
点击方法查看详情,name,address,token以及traceId参数也都全部被统计收集上来了。

在这里插入图片描述

六、skywalking监控MySQL

在这里插入图片描述

需要安装 mysqld_exporter. 和 OpenTelemetry Collector

6.1、安装mysqld_exporter

下载链接: https://prometheus.io/download/

在这里插入图片描述
解压:tar -zxvf mysqld_exporter-0.15.1.linux-amd64.tar.gz

新建连接数据库配置文件

# 1、编辑新建配置
vim mysqld_exporter.cnf

# 2、拷贝配置
[client]
user=用户名
password=密码
host=localhost
port=3306

后台运行命令:nohup ./mysqld_exporter --config.my-cnf=mysqld_exporter.cnf &

访问测试:http://localhost:9104/metrics

6.2、安装OpenTelemetry Collector

下载链接: https://github.com/open-telemetry/opentelemetry-collector-releases/releases/tag/v0.95.0

在这里插入图片描述

解压:tar -zxvf otelcol-contrib_0.94.0_linux_386.tar.gz

新增otel-collector-config.yaml配置:

receivers:
  prometheus:
    config:
     scrape_configs:
       - job_name: 'mysql-monitoring'
         scrape_interval: 5s
         static_configs:
           - targets: ['localhost:9104'] #这里是mysqld-exporter的地址
             labels:
               host_name: showcase
processors:
  batch:

exporters:
  otlp:
    endpoint: localhost:11800 #这里是skywalking的地址
    tls:
      insecure: true
service:
  pipelines:
    metrics:
      receivers:
      - prometheus
      processors:
      - batch
      exporters:
      - otlp

后台运行命令:nohup ./otelcol-contrib --config=otel-collector-config.yaml &

OpenTelemetry Collector配置链接: https://opentelemetry.io/docs/collector/configuration/

可进入官网查看配置,例如我启动的时候报8888端口被使用了,查看官网添加配置,更改掉8888端口

在这里插入图片描述

service:
  telemetry:
    logs:
      level: DEBUG
      initial_fields:
        service: my-instance
    metrics:
      level: detailed
      address: 0.0.0.0:7777

运行后刷新skywalking即可,记得要看是否有错误日志。

七、skywalking监控Linux

需要安装 node_exporter. 和 OpenTelemetry Collector(上例一样)

7.1、安装node_exporter

下载链接: https://prometheus.io/download/

在这里插入图片描述

解压:tar -zxvf node_exporter-1.7.0.linux-amd64.tar.gz

后台运行命令:nohup ./node_exporter > nodeout.file 2>&1 &

访问测试:http://localhost:9100/metrics

修改otel-collector-config.yaml配置:

receivers:
  prometheus:
    config:
      scrape_configs:
        - job_name: "vm-monitoring" # make sure to use this in the vm.yaml to filter only VM metrics
          scrape_interval: 10s
          static_configs:
            - targets: ['ip:9100'] # 这里是主机服务器的采集地址
        - job_name: 'mysql-monitoring'
          scrape_interval: 5s
          static_configs:
            - targets: ['ip:9104'] #这里是mysqld-exporter的地址
              labels:
                host_name: showcase

processors:
  batch:

exporters:
  otlp:
    endpoint: ip:11800 # 这里是OAP Server address
    tls:
      insecure: true

service:
  pipelines:
    metrics:
      receivers: [prometheus]
      processors: [batch]
      exporters: [otlp]

更改后重新启动OpenTelemetry Collector

监控效果
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐