個人專題目錄
Skywalking高級
1. Rpc調(diào)用監(jiān)控
Skywalking(6.5.0)
支持的Rpc框架有以下幾種:
- Dubbo 2.5.4 -> 2.6.0
- Dubbox 2.8.4
- Apache Dubbo 2.7.0
- Motan 0.2.x -> 1.1.0
- gRPC 1.x
- Apache ServiceComb Java Chassis 0.1 -> 0.5,1.0.x
- SOFARPC 5.4.0
使用Spring Boot和Dubbo搭建一個簡單的服務(wù)提供方和服務(wù)消費方來測試Skywalking對于
Rpc調(diào)用的支持口糕。可以使用資源文件夾下已經(jīng)完成打包的skywalking_dubbo_consumer.jar
和
skywalking_dubbo_provider.jar
來進(jìn)行測試。
1.1 服務(wù)提供方
pom文件:
<?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.1.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xubh</groupId>
<artifactId>skywalking_dubbo_provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>skywalking_dubbo_provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--添加springboot和dubbo集成配置-->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
這里直接使用了dubbo-spring-boot-starter 這一dubbo與spring-boot集成的組件。
官方文檔地址:https://github.com/alibaba/dubbo-spring-boot-starter/blob/master/README
_zh.md
application.properties:
spring.application.name=skywalking_dubbo_provider
spring.dubbo.server=true
spring.dubbo.registry=N/A
server.port=8086
為了簡化環(huán)境搭建,采用了本地直接調(diào)用的方式,所以將注冊中心寫成N/A表示不注冊到注冊中
心。
IHelloService接口:
public interface IHelloService {
String hello();
}
HelloServiceImpl實現(xiàn)類:
import com.alibaba.dubbo.config.annotation.Service;
import com.itcast.api.IHelloService;
import org.springframework.stereotype.Component;
@Service(interfaceClass = IHelloService.class)
@Component
public class HelloServiceImpl implements IHelloService {
@Override
public String hello() {
return "hello skywalking";
}
}
SkywalkingDubboProviderApplication啟動類:
@SpringBootApplication
//添加dubbo生效注解
@EnableDubboConfiguration
public class SkywalkingDubboProviderApplication {
public static void main(String[] args) {
SpringApplication.run(SkywalkingDubboProviderApplication.class, args);
}
}
1.2 服務(wù)消費方
pom文件:
<?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.1.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xubh</groupId>
<artifactId>skywalking_dubbo_consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>skywalking_dubbo_consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.properties:
spring.application.name=skywalking_dubbo_consumer
server.port=8085
TestController:
@RestController
public class TestController {
@Reference(url = "dubbo://127.0.0.1:20880")
private IHelloService helloService;
@GetMapping("/hello")
public String hello(){
return helloService.hello();
}
}
采用直連而非從注冊中心獲取服務(wù)地址的方式司澎,在@Reference注解中聲明
url = "dubbo://127.0.0.1:20880"
SkywalkingDubboConsumerApplication啟動類:
@SpringBootApplication
//添加dubbo生效注解
@EnableDubboConfiguration
public class SkywalkingDubboConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SkywalkingDubboConsumerApplication.class, args);
}
}
1.3 部署方式
將skywalking_dubbo_consumer.jar 和skywalking_dubbo_provider.jar 上傳
至/usr/local/skywalking 目錄下怠噪。
復(fù)制兩份agent贤笆,防止使用的沖突。
cd /usr/local/skywalking/apache-skywalking-apm-bin/
cp -r agent agent_dubbo_provider
cp -r agent agent_dubbo_consumer
vi agent_dubbo_provider/config/agent.config
修改agent_dubbo_provider配置中的應(yīng)用名為:
# The service name in UI
agent.service_name=${SW_AGENT_NAME:dubbo_provider}
接著修改agent_dubbo_consumer:
vi agent_dubbo_consumer/config/agent.config
修改應(yīng)用名:
# The service name in UI
agent.service_name=${SW_AGENT_NAME:dubbo_consumer}
先啟動provider戈鲁,等待啟動成功丧鸯。
#切換到目錄下
cd /usr/local/skywalking
#啟動provider
java -javaagent:/usr/local/skywalking/apache-skywalking-apmbin/
agent_dubbo_provider/skywalking-agent.jar -jar
skywalking_dubbo_provider.jar &
啟動consumer蛤铜,等待啟動成功。
#啟動consumer
java -javaagent:/usr/local/skywalking/apache-skywalking-apmbin/
agent_dubbo_consumer/skywalking-agent.jar -jar
skywalking_dubbo_consumer.jar &
調(diào)用接口骡送,接口地址為:http://虛擬機(jī)IP地址:8085/hello
打開skywalking查看dubbo調(diào)用的監(jiān)控情況昂羡。
儀表盤:
dubbo_provider 和dubbo_consumer 的服務(wù)已經(jīng)出現(xiàn),同時出現(xiàn)了兩個接口分別是:
- /hello接口摔踱,是瀏覽器調(diào)用dubb_consumer的http接口
- com.xubh.api.IHelloService.hello()是dubbo_consumer調(diào)用dubbo_provider的dubbo接口
拓?fù)鋱D:
已經(jīng)表示出了一個調(diào)用的鏈路關(guān)系:
User(瀏覽器) ----> dubber_consumer ----> dubbo_provider
并且在服務(wù)的上方標(biāo)識出了每個服務(wù)代表的內(nèi)容虐先,dubbo_consumer是SpringMvc的服務(wù),而
dubbo_provider是Dubbo的服務(wù)派敷。
追蹤:
追蹤圖中顯示本次調(diào)用耗時49ms蛹批,其中dubbo接口耗時29ms,那么另外的20ms其實是SpringMVC接口的開銷篮愉,這樣就能很好的評估出每個環(huán)節(jié)的耗時時間腐芍。
2. MySql調(diào)用監(jiān)控
2.1 使用docker啟動Mysql
systemctl start docker
使用docker命令啟動mysql:
docker run -di --name=skywalking_mysql -p 33306:3306 -e
MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
MYSQL_ROOT_PASSWORD環(huán)境變量指定root的密碼為123456
在外部訪問mysql了。使用工具連接mysql试躏,端口為33306密碼為123456猪勇。創(chuàng)建數(shù)據(jù)庫skywalking。
執(zhí)行建表語句:
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
插入幾條數(shù)據(jù):
insert into `t_user`(`name`) values ('張三'),('李四'),('王五');
2.2 Spring Data JDBC訪問Mysql
創(chuàng)建一個Spring Boot工程颠蕴,集成Spring Data JDBC泣刹。可以直接使用資源文件中提供的
skywalking_mysql.jar
犀被。
pom文件:
<?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.1.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xubh</groupId>
<artifactId>skywalking_mysql</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>skywalking_mysql</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
引入了spring-boot-starter-data-jdbc ,由于使用了5.7的mysql版本椅您,所以驅(qū)動版本固定為
5.1.46。
pojo類:
@Table("t_user")
public class User {
@Id
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
添加Table注解寡键,修改表明為t_user掀泳。
dao接口:
public interface UserRepository extends CrudRepository<User, Integer> {
}
controller:
@RestController
public class MysqlController {
@Autowired
private UserRepository userRepository;
@GetMapping("/users")
public List<User> findAll(){
List<User> result = new ArrayList<>();
userRepository.findAll().forEach((user) -> {
result.add(user);
});
return result;
}
}
由于Spring Data JDBC的findAll方法返回的是一個迭代器,所以需要遍歷迭代器將數(shù)據(jù)進(jìn)行返回。
啟動類:
@SpringBootApplication
public class SkywalkingMysqlApplication {
public static void main(String[] args) {
SpringApplication.run(SkywalkingMysqlApplication.class, args);
}
}
application.properties:
spring.datasource.url=jdbc:mysql://localhost:33306/skywalking
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
server.port=8087
2.3 部署方式
將skywalking_mysql.jar 上傳至/usr/local/skywalking 目錄下员舵。
復(fù)制agent脑沿,防止使用的沖突。
cd /usr/local/skywalking/apache-skywalking-apm-bin/
cp -r agent agent_mysql
vi agent_mysql/config/agent.config
修改agent_mysql配置中的應(yīng)用名為:
# The service name in UI
agent.service_name=${SW_AGENT_NAME:skywalking_mysql}
啟動skywalking_mysql應(yīng)用马僻,等待啟動成功
#切換到目錄下
cd /usr/local/skywalking
#啟動spring boot
java -javaagent:/usr/local/skywalking/apache-skywalking-apmbin/
agent_mysql/skywalking-agent.jar -jar skywalking_mysql.jar &
調(diào)用接口捅伤,接口地址為:http://虛擬機(jī)IP地址:8087/users
打開skywalking查看mysql調(diào)用的監(jiān)控情況。
數(shù)據(jù)庫儀表盤可以看到詳細(xì)的數(shù)據(jù)庫響應(yīng)時長巫玻、吞吐量、SLA等數(shù)據(jù)祠汇。
拓?fù)鋱D:
該圖中已經(jīng)表示出了一個調(diào)用的鏈路關(guān)系:
User(瀏覽器) ----> skywalking_mysql ----> localhost:33306
并且在服務(wù)的上方標(biāo)識出了每個服務(wù)代表的內(nèi)容仍秤,skywalking_mysql是SpringMvc的服務(wù),而
localhost:33306是mysql的服務(wù)可很。
追蹤:
追蹤圖中顯示本次調(diào)用耗時5ms诗力,其中spring MVC接口耗時4ms,那么另外的1ms是調(diào)用Mysql的耗時我抠。
點擊mysql的調(diào)用苇本,可以看到詳細(xì)的sql語句〔送兀可以很好的定位問題產(chǎn)生的原因瓣窄,特別是在某些sql語句執(zhí)行慢的場景下。
3. Skywalking常用插件
3.1 配置覆蓋
使用Skywalking提供的配置覆蓋功能通過啟動命令動態(tài)指定服務(wù)名纳鼎,這樣agent只需要部署一
份即可俺夕。Skywalking支持的幾種配置方式:
系統(tǒng)配置(System properties)
使用 skywalking. + 配置文件中的配置名作為系統(tǒng)配置項來進(jìn)行覆蓋.
- agent的系統(tǒng)配置和環(huán)境與目標(biāo)應(yīng)用共享,所以加上前綴可以有效的避免沖突贱鄙。
- 通過 如下進(jìn)行agent.service_name 的覆蓋
-Dskywalking.agent.service_name=skywalking_mysql
探針配置(Agent options)
Add the properties after the agent path in JVM arguments.
-javaagent:/path/to/skywalking-agent.jar=[option1]=[value1],[option2]=[value2]
通過 如下進(jìn)行agent.service_name 的覆蓋
-javaagent:/path/to/skywalking-agent.jar=agent.service_name=skywalking_mysql
- 特殊字符
如果配置中包含分隔符( , 或者= ) , 就必須使用引號包裹起來
-javaagent:/path/to/skywalking-agent.jar=agent.ignore_suffix='.jpg,.jpeg'
系統(tǒng)環(huán)境變量(System environment variables)
由于agent.service_name配置項如下所示:
# The service name in UI
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
可以在環(huán)境變量中設(shè)置SW_AGENT_NAME的值來指定服務(wù)名劝贸。
覆蓋優(yōu)先級
探針配置 > 系統(tǒng)配置 >系統(tǒng)環(huán)境變量 > 配置文件中的值
所以啟動命令可以修改為:
java -javaagent:/usr/local/skywalking/apache-skywalking-apmbin/
agent_mysql/skywalking-agent.jar -
Dskywalking.agent.service_name=skywalking_mysql -jar skywalking_mysql.jar &
# 或
java -javaagent:/usr/local/skywalking/apache-skywalking-apmbin/
agent_mysql/skywalking-agent.jar=agent.service_name=skywalking_mysql -jar
skywalking_mysql.jar &
3.2 獲取追蹤ID
Skywalking提供我們Trace工具包,用于在追蹤鏈路時進(jìn)行信息的打印或者獲取對應(yīng)的追蹤ID逗宁。使用Spring Boot編寫一個案例映九,也可以直接使用資源下的skywalking_plugins.jar 進(jìn)行測試。
pom:
<?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.1.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.xubh</groupId>
<artifactId>skywalking_plugins</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>skywalking_plugins</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<skywalking.version>6.5.0</skywalking.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--skywalking trace工具包-->
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>${skywalking.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
PluginController:
@RestController
public class PluginController {
//獲取trace id瞎颗,可以在RocketBot追蹤中進(jìn)行查詢
@GetMapping("/getTraceId")
public String getTraceId(){
//使當(dāng)前鏈路報錯件甥,并且提示報錯信息
ActiveSpan.error(new RuntimeException("Test-Error-Throwable"));
//打印info信息
ActiveSpan.info("Test-Info-Msg");
//打印debug信息
ActiveSpan.debug("Test-debug-Msg");
return TraceContext.traceId();
}
}
使用TraceContext.traceId()可以打印出當(dāng)前追蹤的ID,方便在RocketBot中進(jìn)行搜索言缤。
ActiveSpan提供了三個方法進(jìn)行信息的打咏朗础:
error方法會將本次調(diào)用變?yōu)槭顟B(tài),同時可以打印對應(yīng)的堆棧信息和錯誤提示管挟。
info方法打印info級別的信息轿曙。
debug方法打印debug級別的信息。
部署方式
將skywalking_plugins.jar 上傳至/usr/local/skywalking 目錄下。
啟動skywalking_plugins應(yīng)用导帝,等待啟動成功守谓。
java -javaagent:/usr/local/skywalking/apache-skywalking-apmbin/
agent/skywalking-agent.jar -
Dskywalking.agent.service_name=skywalking_plugins -jar skywalking_plugins.jar &
調(diào)用接口,接口地址為:http://虛擬機(jī)IP地址:8088/getTraceId
可以看到追蹤ID已經(jīng)打印出來您单,然后我們在RocketBot上進(jìn)行搜索斋荞。
可以搜索到對應(yīng)的追蹤記錄,但是顯示調(diào)用是失敗的虐秦,這是因為使用了ActiveSpan.error方法平酿。點開追蹤的詳細(xì)信息:
異常的信息包含了以下幾個部分:
1.事件類型為error
2.調(diào)用方法時傳遞的異常類型RuntimeException
3.調(diào)用方法時傳遞的異常信息Test-Error-Throwable
4.異常堆棧
通過上述內(nèi)容,我們可以根據(jù)業(yè)務(wù)來定制調(diào)用異常時的詳細(xì)信息悦陋。除了異常信息之外蜈彼,還有info信息和debug信息也都會被打印。
3.3 過濾指定的端點
在開發(fā)過程中俺驶,有一些端點(接口)并不需要去進(jìn)行監(jiān)控幸逆,比如Swagger相關(guān)的端點。這個時候我們就
可以使用Skywalking提供的過濾插件來進(jìn)行過濾暮现。在skywalking_plugins中編寫兩個接口進(jìn)行測試:
@RestController
public class FilterController {
//此接口可以被追蹤
@GetMapping("/include")
public String include(){
return "include";
}
//此接口不可被追蹤
@GetMapping("/exclude")
public String exclude(){
return "exclude";
}
}
部署方式
將skywalking_plugins.jar 上傳至/usr/local/skywalking 目錄下还绘。
將agent中的/agent/optional-plugins/apm-trace-ignore-plugin-6.4.0.jar 插件拷貝到plugins目錄中。
cd /usr/local/skywalking/apache-skywalking-apm-bin
cp optional-plugins/apm-trace-ignore-plugin-6.4.0.jar plugins/apm-trace-ignoreplugin-
6.4.0.jar
啟動skywalking_plugins應(yīng)用栖袋,等待啟動成功拍顷。
java -javaagent:/usr/local/skywalking/apache-skywalking-apmbin/
agent/skywalking-agent.jar -
Dskywalking.agent.service_name=skywalking_plugins -
Dskywalking.trace.ignore_path=/exclude jar skywalking_plugins.jar &
這里添加-Dskywalking.trace.ignore_path=/exclude參數(shù)來標(biāo)識需要過濾哪些請求,支持Ant
Path 表達(dá)式:/path/* , /path/** , /path/?
- ? 匹配任何單字符
- 匹配0或者任意數(shù)量的字符
- ** 匹配0或者更多的目錄
調(diào)用接口塘幅,接口地址為:
http://虛擬機(jī)IP地址:8088/exclude
http://虛擬機(jī)IP地址:8088/include
在追蹤中進(jìn)行查看:
exclude接口已經(jīng)被過濾菇怀,只有include接口能被看到。
3.4 告警功能
告警功能簡介
Skywalking每隔一段時間根據(jù)收集到的鏈路追蹤的數(shù)據(jù)和配置的告警規(guī)則(如服務(wù)響應(yīng)時間晌块、服務(wù)響應(yīng)時間百分比)等爱沟,判斷如果達(dá)到閾值則發(fā)送相應(yīng)的告警信息。發(fā)送告警信息是通過調(diào)用webhook接口完
成匆背,具體的webhook接口可以使用者自行定義呼伸,從而開發(fā)者可以在指定的webhook接口中編寫各種告警方式,比如郵件钝尸、短信等括享。告警的信息也可以在RocketBot中查看到。
以下是默認(rèn)的告警規(guī)則配置珍促,位于skywalking安裝目錄下的config文件夾下alarm-settings.yml 文件
中:
# Sample alarm rules.
rules:
# Rule unique name, must be ended with `_rule`.
service_resp_time_rule:
metrics-name: service_resp_time
op: ">"
threshold: 1000
period: 10
count: 3
silence-period: 5
message: Response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes.
service_sla_rule:
# Metrics value need to be long, double or int
metrics-name: service_sla
op: "<"
threshold: 8000
# The length of time to evaluate the metrics
period: 10
# How many times after the metrics match the condition, will trigger alarm
count: 2
# How many times of checks, the alarm keeps silence after alarm triggered, default as same as period.
silence-period: 3
message: Successful rate of service {name} is lower than 80% in 2 minutes of last 10 minutes
service_p90_sla_rule:
# Metrics value need to be long, double or int
metrics-name: service_p90
op: ">"
threshold: 1000
period: 10
count: 3
silence-period: 5
message: 90% response time of service {name} is more than 1000ms in 3 minutes of last 10 minutes
service_instance_resp_time_rule:
metrics-name: service_instance_resp_time
op: ">"
threshold: 1000
period: 10
count: 2
silence-period: 5
message: Response time of service instance {name} is more than 1000ms in 2 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/
以上文件定義了默認(rèn)的4種規(guī)則:
- 最近3分鐘內(nèi)服務(wù)的平均響應(yīng)時間超過1秒
- 最近2分鐘服務(wù)成功率低于80%
- 最近3分鐘90%服務(wù)響應(yīng)時間超過1秒
- 最近2分鐘內(nèi)服務(wù)實例的平均響應(yīng)時間超過1秒
- 端點平均響應(yīng)時間過去2分鐘超過1秒
規(guī)則中的參數(shù)屬性如下:
屬性 | 含義 |
---|---|
metrics-name | oal腳本中的度量名稱取值為oal腳本中的度量名铃辖,目前只支持long 、double 和int 類 |
Rule name | 規(guī)則名稱猪叙,也是在告警信息中顯示的唯一名稱娇斩。必須以_rule 結(jié)尾仁卷,前綴可自定義 |
Include names | 該規(guī)則作用于哪些實體名稱,比如服務(wù)名犬第,終端名(可選锦积,默認(rèn)為全部) |
Exclude names | 該規(guī)則作不用于哪些實體名稱,比如服務(wù)名歉嗓,終端名(可選丰介,默認(rèn)為空) |
threshold | 閾值,與metrics-name和下面的比較符號相匹配 |
op | 比較操作符鉴分,可以設(shè)定>,<,= |
period | 多久檢查一次當(dāng)前的指標(biāo)數(shù)據(jù)是否符合告警規(guī)則哮幢,單位分鐘 |
count | 在一個Period窗口中,如果values超過Threshold值(按op)志珍,達(dá)到Count值家浇,需要發(fā)送警報 |
silence-period | 在時間N中觸發(fā)報警后,在TN -> TN + period這個階段不告警碴裙。 默認(rèn)情況下,它和Period一樣点额,這意味著相同的告警(在同一個Metrics name擁有相同的Id)在同一個Period內(nèi)只會觸發(fā)一次 |
message | 告警消息內(nèi)容 |
webhooks可以配置告警產(chǎn)生時的調(diào)用地址舔株。
Webhook可以簡單理解為是一種Web層面的回調(diào)機(jī)制,通常由一些事件觸發(fā)还棱,與代碼中的事件回調(diào)類似载慈,只不過是Web層面的。由于是Web層面的珍手,所以當(dāng)事件發(fā)生時办铡,回調(diào)的不再是代碼中的方法或函數(shù),而是服務(wù)接口琳要。例如寡具,在告警這個場景,告警就是一個事件稚补。當(dāng)該事件發(fā)生時童叠,SkyWalking就會主動去調(diào)用一個配置好的接口,該接口就是所謂的Webhook课幕。
告警功能測試代碼
SkyWalking的告警消息會通過 HTTP 請求進(jìn)行發(fā)送厦坛,請求方法為 POST
,Content-Type
為 application/json
乍惊,其JSON 數(shù)據(jù)實基于List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage進(jìn)行序列化的杜秸。JSON數(shù)據(jù)示例:
編寫告警功能接口來進(jìn)行測試,創(chuàng)建skywalking_alarm項目润绎∏说可以直接使用資源中的skywalking_alarm.jar
诞挨。
AlarmController:
@RestController
public class AlarmController {
//每次調(diào)用睡眠1.5秒,模擬超時的報警
@GetMapping("/timeout")
public String timeout(){
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "timeout";
}
}
該接口主要用于模擬超時小作,多次調(diào)用之后就可以生成告警信息亭姥。
WebHooks:
@RestController
public class WebHooks {
private List<AlarmMessage> lastList = new ArrayList<>();
@PostMapping("/webhook")
public void webhook(@RequestBody List<AlarmMessage> alarmMessageList){
lastList = alarmMessageList;
}
@GetMapping("/show")
public List<AlarmMessage> show(){
return lastList;
}
}
產(chǎn)生告警時會調(diào)用webhook接口,該接口必須是Post類型顾稀,同時接口參數(shù)使用RequestBody达罗。參數(shù)格式為:
字段說明:
- scopeId、scope:所有可用的 Scope 詳見
org.apache.skywalking.oap.server.core.source.DefaultScopeDefine
- name:目標(biāo) Scope 的實體名稱
- id0:Scope 實體的 ID
- id1:保留字段静秆,目前暫未使用
- ruleName:告警規(guī)則名稱
- alarmMessage:告警消息內(nèi)容
- startTime:告警時間粮揉,格式為時間戳
[{ "scopeId": 1, "scope": "SERVICE", "name": "serviceA", "id0": 12, "id1": 0, "ruleName": "service_resp_time_rule", "alarmMessage": "alarmMessage xxxx", "startTime": 1560524171000 }, { "scopeId": 1, "scope": "SERVICE", "name": "serviceB", "id0": 23, "id1": 0, "ruleName": "service_resp_time_rule", "alarmMessage": "alarmMessage yyy", "startTime": 1560524171000 }]
AlarmMessage:實體類用于接口告警信息。
public class AlarmMessage {
private int scopeId;
private String name;
private int id0;
private int id1;
//告警的消息
private String alarmMessage;
//告警的產(chǎn)生時間
private long startTime;
public int getScopeId() {
return scopeId;
}
public void setScopeId(int scopeId) {
this.scopeId = scopeId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId0() {
return id0;
}
public void setId0(int id0) {
this.id0 = id0;
}
public int getId1() {
return id1;
}
public void setId1(int id1) {
this.id1 = id1;
}
public String getAlarmMessage() {
return alarmMessage;
}
public void setAlarmMessage(String alarmMessage) {
this.alarmMessage = alarmMessage;
}
public long getStartTime() {
return startTime;
}
public void setStartTime(long startTime) {
this.startTime = startTime;
}
@Override
public String toString() {
return "AlarmMessage{" +
"scopeId=" + scopeId +
", name='" + name + '\'' +
", id0=" + id0 +
", id1=" + id1 +
", alarmMessage='" + alarmMessage + '\'' +
", startTime=" + startTime +
'}';
}
}
部署測試
修改告警規(guī)則配置文件抚笔,將webhook地址修改為:
webhooks:
- http://127.0.0.1:8089/webhook
然后重啟skywalking扶认。
將skywalking_alarm.jar 上傳至/usr/local/skywalking 目錄下。
啟動skywalking_alarm應(yīng)用殊橙,等待啟動成功辐宾。
java -javaagent:/usr/local/skywalking/apache-skywalking-apmbin/
agent/skywalking-agent.jar -Dskywalking.agent.service_name=skywalking_alarm
-jar skywalking_alarm.jar
不停調(diào)用接口,接口地址為:http://虛擬機(jī)IP:8089/timeout
直到出現(xiàn)告警:查看告警信息接口:http://虛擬機(jī)IP:8089/show
在生產(chǎn)中使用可以在webhook接口中對接短
信膨蛮、郵件等平臺叠纹,當(dāng)告警出現(xiàn)時能迅速發(fā)送信息給對應(yīng)的處理人員,提高故障處理的速度敞葛。