对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的页面,可以看到请求记录
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"
调用接口后,每一次调用都会有记录。
使用idea运行
将各个的项目skyWalking配置按照上面配置内容配置好,启动项目即可。
注意: 每个项目对应的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告警系统
告警功能
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在我们的版本中。 它包括以下规则:
- 过去 3 分钟内服务平均响应时间超过 1 秒。
- 最后2分钟服务成功率低于80%。
- 过去 3 分钟内超过 1 秒的服务响应时间百分比
- 服务实例最近 2 分钟平均响应时间超过 1 秒,并且实例名称与正则表达式匹配。
- 过去 2 分钟内端点平均响应时间超过 1 秒。
- 过去 2 分钟内数据库访问平均响应时间超过 1 秒。
- 过去 2 分钟内端点关系平均响应时间超过 1 秒。
规则的key含义如下:
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%
配置文件地址
重启oap后端服务生效
到这里 skywalking产生的告警就会发送到回调接口
传统项目war包整合SkyWalking
在tomcat的catalina.sh脚本第一行新增参数,skywalking-agent.jar换成自己的路径,对应的agent.config
配置文件上 jar包配置规则一样。
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/agent/skywalking-agent.jar"; export CATALINA_OPTS