Skywalking之三高級

個人專題目錄


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)控情況昂羡。

儀表盤:

image-20200224181943368.png

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ù)派敷。

追蹤:

image-20200224182350128.png

追蹤圖中顯示本次調(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:

image-20200224190822715.png

該圖中已經(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ī)則:

  1. 最近3分鐘內(nèi)服務(wù)的平均響應(yīng)時間超過1秒
  2. 最近2分鐘服務(wù)成功率低于80%
  3. 最近3分鐘90%服務(wù)響應(yīng)時間超過1秒
  4. 最近2分鐘內(nèi)服務(wù)實例的平均響應(yīng)時間超過1秒
  5. 端點平均響應(yīng)時間過去2分鐘超過1秒

規(guī)則中的參數(shù)屬性如下:

屬性 含義
metrics-name oal腳本中的度量名稱取值為oal腳本中的度量名铃辖,目前只支持longdoubleint
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ā)送厦坛,請求方法為 POSTContent-Typeapplication/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)的處理人員,提高故障處理的速度敞葛。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末誉察,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惹谐,更是在濱河造成了極大的恐慌持偏,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氨肌,死亡現(xiàn)場離奇詭異鸿秆,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)怎囚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門谬莹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桩了,你說我怎么就攤上這事附帽。” “怎么了井誉?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵蕉扮,是天一觀的道長。 經(jīng)常有香客問我颗圣,道長喳钟,這世上最難降的妖魔是什么屁使? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮奔则,結(jié)果婚禮上蛮寂,老公的妹妹穿的比我還像新娘。我一直安慰自己易茬,他們只是感情好酬蹋,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抽莱,像睡著了一般范抓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上食铐,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天匕垫,我揣著相機(jī)與錄音,去河邊找鬼虐呻。 笑死象泵,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斟叼。 我是一名探鬼主播偶惠,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼犁柜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起堂淡,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤馋缅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后绢淀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體萤悴,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年皆的,在試婚紗的時候發(fā)現(xiàn)自己被綠了覆履。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡费薄,死狀恐怖硝全,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情楞抡,我是刑警寧澤伟众,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站召廷,受9級特大地震影響凳厢,放射性物質(zhì)發(fā)生泄漏账胧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一先紫、第九天 我趴在偏房一處隱蔽的房頂上張望治泥。 院中可真熱鬧,春花似錦遮精、人聲如沸居夹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吮播。三九已至,卻和暖如春眼俊,著一層夾襖步出監(jiān)牢的瞬間意狠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工疮胖, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留环戈,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓澎灸,卻偏偏與公主長得像院塞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子性昭,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容