对springboot项目实现监控

1、将springboot项目打包 jar包

2、使用命令启动
java -javaagent:"C:\Program Files\javasoft\commonSoft\skyWalking\skywalking-agent\skywalking-agent.jar" -jar SpringCloudAlibaba-Nacos-menber.jar
注意: skywalking-agent.jar的位置就是在原来解压的文件夹里,需要读取解压目录中的agent.config配置文件。配置文件需要修改下面的值。否则无法追踪请求,甚至启动报错。

# The agent namespace
agent.namespace=${SW_AGENT_NAMESPACE:kaico-member-namespace}

# The service name in UI
agent.service_name=${SW_AGENT_NAME:kaico-member}

# Backend service addresses.
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:www.kaicostudy.com:11800}

3、请求项目的接口

4、查看skyWalking的页面,可以看到请求记录
skywalking继承springboot日志 springboot集成skywalking_分布式
skywalking继承springboot日志 springboot集成skywalking_java_02skywalking继承springboot日志 springboot集成skywalking_java_03

feign整合skywalking

准备两个项目,使用feign客户端实现rpc远程调用接口。

例如这里准备了一个order项目、一个menber项目,order项目调用menber项目的getUser接口。

打成jar包运行

1、启动menber项目
修改skyWalking的agnt目录的agent.config配置文件

# The agent namespace
agent.namespace=${SW_AGENT_NAMESPACE:kaico-member-namespace}

# The service name in UI
agent.service_name=${SW_AGENT_NAME:kaico-member}

# Backend service addresses.
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:www.kaicostudy.com:11800}

启动项目命令

java -javaagent:"C:\Program Files\javasoft\commonSoft\skyWalking\skywalking-agent-menber\skywalking-agent.jar" -jar "C:\Program Files\javasoft\commonSoft\skyWalking\SpringCloudAlibaba-Nacos-menber.jar"

2、启动order项目
修改skyWalking的agnt目录的agent.config配置文件

# The agent namespace
agent.namespace=${SW_AGENT_NAMESPACE:kaico-order-namespace}

# The service name in UI
agent.service_name=${SW_AGENT_NAME:kaico-order}

# Backend service addresses.
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:www.kaicostudy.com:11800}

启动项目命令

java -javaagent:"C:\Program Files\javasoft\commonSoft\skyWalking\skywalking-agent-order\skywalking-agent.jar" -jar "C:\Program Files\javasoft\commonSoft\skyWalking\SpringCloudAlibaba-Nacos-order.jar"

调用接口后,每一次调用都会有记录。
skywalking继承springboot日志 springboot集成skywalking_jar_04

使用idea运行

将各个的项目skyWalking配置按照上面配置内容配置好,启动项目即可。
skywalking继承springboot日志 springboot集成skywalking_分布式_05

注意: 每个项目对应的agent.config配置文件的配置文件是不一样的。

项目中获取全局追踪id

所有项目都可以获取全局追踪id,配置步骤:
1、增加maven依赖

<dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>6.5.0</version>
        </dependency>

2、获取api ,Java代码

import org.apache.skywalking.apm.toolkit.trace.TraceContext;

String traceId = TraceContext.traceId(); 

skywalking继承springboot日志 springboot集成skywalking_jar_06

SkyWalking告警系统

告警功能

Skywalking每隔一段时间根据收集到的链路追踪的数据和配置的告警规则(如服务响应时间、服务响应 时间百分比)等,判断如果达到阈值则发送相应的告警信息。发送告警信息是通过调用webhook接口完 成,具体的webhook接口可以使用者自行定义,从而开发者可以在指定的webhook接口中编写各种告 警方式,比如邮件、短信等。告警的信息也可以在RocketBot中查看到。

告警的核心由一组规则驱动,这些规则定义在config/ Alarm -settings.yml文件中。 告警规则的定义分为三部分。

  • 告警规则:它们定义了应该如何触发度量警报,应该考虑什么条件。
  • Webhook:当警告触发时,回调HTTP API地址。
  • gRPChook:远程gRPC方法的主机和端口,告警触发后调用。

告警规则demo

rules:
  # Rule unique name, must be ended with `_rule`.
  endpoint_percent_rule:
    # Metrics value need to be long, double or int
    metrics-name: endpoint_percent
    threshold: 75
    op: <
    # The length of time to evaluate the metrics
    period: 10
    # How many times after the metrics match the condition, will trigger alarm
    count: 3
    # How many times of checks, the alarm keeps silence after alarm triggered, default as same as period.
    silence-period: 10
    # Specify if the rule can send notification or just as an condition of composite rule
    only-as-condition: false
    tags:
      level: WARNING
  service_percent_rule:
    metrics-name: service_percent
    # [Optional] Default, match all services in this metrics
    include-names:
      - service_a
      - service_b
    exclude-names:
      - service_c
    # Single value metrics threshold.
    threshold: 85
    op: <
    period: 10
    count: 4
    only-as-condition: false
  service_resp_time_percentile_rule:
    # Metrics value need to be long, double or int
    metrics-name: service_percentile
    op: ">"
    # Multiple value metrics threshold. Thresholds for P50, P75, P90, P95, P99.
    threshold: 1000,1000,1000,1000,1000
    period: 10
    count: 3
    silence-period: 5
    message: Percentile response time of service {name} alarm in 3 minutes of last 10 minutes, due to more than one condition of p50 > 1000, p75 > 1000, p90 > 1000, p95 > 1000, p99 > 1000
    only-as-condition: false
  meter_service_status_code_rule:
    metrics-name: meter_status_code
    exclude-labels:
      - "200"
    op: ">"
    threshold: 10
    period: 10
    count: 3
    silence-period: 5
    message: The request number of entity {name} non-200 status is more than expected.
    only-as-condition: false
composite-rules:
  comp_rule:
    # Must satisfied percent rule and resp time rule 
    expression: service_percent_rule && service_resp_time_percentile_rule
    message: Service {name} successful rate is less than 80% and P50 of response time is over 1000ms
    tags:
      level: CRITICAL

提供了一个默认值 alarm-setting.yml在我们的版本中。 它包括以下规则:

  1. 过去 3 分钟内服务平均响应时间超过 1 秒。
  2. 最后2分钟服务成功率低于80%。
  3. 过去 3 分钟内超过 1 秒的服务响应时间百分比
  4. 服务实例最近 2 分钟平均响应时间超过 1 秒,并且实例名称与正则表达式匹配。
  5. 过去 2 分钟内端点平均响应时间超过 1 秒。
  6. 过去 2 分钟内数据库访问平均响应时间超过 1 秒。
  7. 过去 2 分钟内端点关系平均响应时间超过 1 秒。

规则的key含义如下:
skywalking继承springboot日志 springboot集成skywalking_ico_07

rules:
  # 规则唯一名称,必须以'_rule'结尾.
  service_resp_time_rule:
    # 度量名称,也是OAL脚本中的度量名,目前Service, Service Instance, Endpoint的度量可以用于告警
    metrics-name: service_resp_time
    # [可选]默认,匹配此指标中的所有服务
    include-names:
      - service_a
      - service_b
    exclude-names:
      - service_c
    # 阈值,对于多种指标值的如percentile可以配置P50、P75、P90、P95、P99的阈值
    threshold: 75
    # 操作符
    op: <
    # 评估度量标准的时间长度
    period: 10
    # 度量有多少次符合告警条件后,才会触发告警
    count: 3
    # 检查多少次,告警触发后保持沉默,默认周期相同
    silence-period: 10
    # 该规则触发时,发送的通知消息
    message: Response time of service {name} is more than 50ms in 1 minutes of last 1 minutes.

Webhook 告警回调

Webhook表达的意思是,当告警发生时,将会请求的地址URL(用POST方法),警报消息将会以 application/json 格式发送出去。
消息属性如下

  • scopeId:范围。所有范围都在DefaultScopeDefine中定义。
  • name:目标范围实体名称。服务名称
  • id0:作用域实体的ID与名称匹配。使用关系范围时,它是源实体ID。
  • id1:使用关系范围时,它将是目标实体ID。否则为空。
  • ruleName:您在中配置的规则名称alarm-settings.yml。
  • alarmMessage:报警文本消息。
  • startTime:告警时间戳。
使用案例

消息案例:

[
    {
        "scopeId":1, //指的是告警的范围类型(定义常量见下文)
        "scope":"SERVICE", //指的是告警的范围类型(定义常量见下文)
        "name":"serviceA", //服务
        "id0":"123", // 作用域实体的ID与名称匹配。使用关系范围时,它是源实体ID
        "id1":"", 
        "ruleName":"service_resp_time_rule", // 规则名称
        "alarmMessage":"alarmMessage xxxx", // 告警内容
        "startTime":1560524171000 // 发生时间
    }
]

新建一个项目,提供一个接口
java实体

public class AlarmMessage {
    private int scopeId;
    private String scope;
    private String ruleName;
    private String name;
    private String id0;
    private String id1;
    private String alarmMessage;
    private long startTime;
}

Controller编写

@RestController
@RequestMapping("")
public class SkyWalkingAlarmController {
    @PostMapping("/alarm")
    public void alarm(@RequestBody List<SkyWalkingAlarm> alarms) {
        // 接收到告警后的业务处理
    }
}

skyWalking的配置修改(单独规则)
配置回调:修改alarm-settings.yml中的webhooks配置

rules:
  # Rule unique name, must be ended with `_rule`.
  service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 1
    silence-period: 5
    message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes.
  
#  Active endpoint related metrics alarm will cost more memory than service and service instance metrics alarm.
#  Because the number of endpoint is much more than service and instance.
#
#  endpoint_avg_rule:
#    metrics-name: endpoint_avg
#    op: ">"
#    threshold: 1000
#    period: 10
#    count: 2
#    silence-period: 5
#    message: Response time of endpoint {name} is more than 1000ms in 2 minutes of last 10 minutes

webhooks:
#  - http://127.0.0.1/notify/
#  - http://127.0.0.1/go-wechat/

skyWalking的配置修改(复合规则)
复合规则仅适用于针对相同实体级别的告警规则,例如都是服务级别的告警规则:service_percent_rule && service_resp_time_percentile_rule。
不可以编写不同实体级别的告警规则,例如服务级别的一个告警规则和端点级别的一个规则:service_percent_rule && endpoint_percent_rule。

复合规则主要有以下几点:

  • 规则名称:在告警信息中显示的唯一名称,必须以_rule结尾。
  • expression:指定如何组成规则,支持&&, ||, ()操作符。
  • message:该规则触发时,发送的通知消息。
rules:
  service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 2
    silence-period: 10
    message: 服务【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒
  service_sla_rule:
    metrics-name: service_sla
    op: "<"
    threshold: 8000
    period: 10
    count: 2
    silence-period: 10
    message: 服务【{name}】的成功率在最近10分钟内有2分钟低于80%
composite-rules:
  comp_rule:
    expression: service_resp_time_rule && service_sla_rule
    message: 服务【{name}】在最近10分钟内有2分钟超过1秒平均响应时间超过1秒并且成功率低于80%

skywalking继承springboot日志 springboot集成skywalking_ico_08
配置文件地址
skywalking继承springboot日志 springboot集成skywalking_jar_09

重启oap后端服务生效
到这里 skywalking产生的告警就会发送到回调接口
skywalking继承springboot日志 springboot集成skywalking_jar_10

传统项目war包整合SkyWalking

在tomcat的catalina.sh脚本第一行新增参数,skywalking-agent.jar换成自己的路径,对应的agent.config配置文件上 jar包配置规则一样。

CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/agent/skywalking-agent.jar"; export CATALINA_OPTS