1、基本介紹
SkyWalking是一個開源的觀測平臺,官網(wǎng):Apache SkyWalking;
可監(jiān)控:分布式追蹤調(diào)用鏈 、jvm內(nèi)存變化、監(jiān)控報警、查看服務(wù)器基本配置信息。
2、SkyWalking架構(gòu)原理
在整個skywalking的系統(tǒng)中,有三個角色:
1.skywalking agent?和業(yè)務(wù)系統(tǒng)(jar)關(guān)聯(lián)在一起,負(fù)責(zé)收集各種監(jiān)控數(shù)據(jù);
2.skywalking oapservice負(fù)責(zé)處理監(jiān)控數(shù)據(jù),比如接受skywalking agent的監(jiān)控數(shù)據(jù),并存儲在數(shù)據(jù)庫中(例如elasticsearch、mysql中等);接受skywalking webapp的前端請求,從數(shù)據(jù)庫查詢數(shù)據(jù),并返回數(shù)據(jù)給前端。,Skywalking oapservice通常以集群的形式存在;
3.skywalking webapp 前端界面,用于展示數(shù)據(jù)。
2.1、skywalking 底層原理流程
1.springboot項目啟動的時候 是不需要引入任何的jar包,
2.啟動springboot項目時被skywalking skywalking-agent.jar 代理攔截,
? ? ? ? --?agent代理攔截是jdk提供的一種技術(shù);可以使啟動jar包時不需要引入任何依賴,agent就可以對java程序做業(yè)務(wù)增強(qiáng),類似AOP技術(shù),但是比AOP級別更高,agent屬于監(jiān)控整個java進(jìn)程。
3.將rpc請求數(shù)據(jù) 發(fā)送給我們的skywalking oapservice接口項目,
4.連接到我們的skywalking webapp項目展示數(shù)據(jù),
5.數(shù)據(jù)最終是可以持久化存放在 db或者es中。
? ? ? ? --?SkyWalking 默認(rèn)是將數(shù)據(jù)存入在內(nèi)存中,如果重啟SkyWalking 數(shù)據(jù)則都會丟失。
3、skywalking 環(huán)境安裝
1. 下載apache-skywalking-apm-6.5.0.tar安裝包,下載鏈接:百度網(wǎng)盤 skywalking.tar??
1.1. 下載數(shù)據(jù)庫鏈接:百度網(wǎng)盤 mysql-connector-java-8.0.16.jar??后續(xù)做數(shù)據(jù)持久化會用到。
2. 進(jìn)入到bin目錄(Windows直接雙擊啟動startup.bat / Linix則執(zhí)行startup.sh)
? ? 注:啟動startup.bat = 同時啟動oapService.bat 和 webappService.bat
3. 查看webapp管理界面 http://127.0.0.1:8080
4、skywalking-agent監(jiān)控springboot.jar包
1. 創(chuàng)建一個springboot項目,并打成jar包
2. 啟動springboot.jar包時指定agent目錄下的skywalking-agent.jar,注意skywalking-agent.jar要寫絕對路徑
啟動jar包命令:?java -javaagent:skywalking-agent.jar?-jar springboot.jar
?啟動jar包命令,同時設(shè)置服務(wù)名稱為server-member:?
java -javaagent:skywalking-agent.jar?
-Dskywalking.agent.service_name=server-member? -jar springboot.jar
4、測試訪問幾次接口,然后去SkyWalking控制臺?http://127.0.0.1:8080/ 查看效果。
4.1、如何在IDEA中使用skywalking
IDEA啟動配置:
-javaagent:D:\java\dev-tool\skywalking\apache-skywalking-apm-6.5.0\apache-skywalking-apm-bin\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=server-member
-Dskywalking.collector.backend_service=127.0.0.1:11800
IDEA啟動服務(wù)后,調(diào)用接口,然后進(jìn)入WEB頁面查看效果:
5、SkyWalking獲取全局追蹤id
-
<dependency
>
-
<groupId
>org.apache.skywalking
<
/groupId
>
-
<artifactId
>apm-toolkit-trace
<
/artifactId
>
-
<version
>
6.5.0
<
/version
>
-
<
/dependency
>
獲取?TraceContext.traceId();
-
-
@RequestMapping("/member")
-
public String
orderToMember
(@RequestParam("id") Integer id) {
-
// 獲取request對象
-
HttpServletRequest
request
= ((ServletRequestAttributes)
-
RequestContextHolder.getRequestAttributes()).getRequest();
-
getHeders(request);
-
// 獲取traceId
-
String
traceId
= TraceContext.traceId();
-
log.info(
">>traceId:{}<<", traceId);
-
Integer
j
=
1 / id;
-
return
"我是會員服務(wù):" + traceId +
"," + j;
-
}
-
-
public
static
void
getHeders
(HttpServletRequest request) {
-
//2.獲得所有頭的名稱
-
Enumeration<String> headerNames = request.getHeaderNames();
-
while (headerNames.hasMoreElements()) {
//判斷是否還有下一個元素
-
String
nextElement
= headerNames.nextElement();
//獲取headerNames集合中的請求頭
-
String
header2
= request.getHeader(nextElement);
//通過請求頭得到請求內(nèi)容
-
log.info(
"請求頭=========={}" + nextElement +
"VALUE:" + header2);
-
//System.out.println(nextElement+":"+header2);
-
}
-
}
6、SkyWalking告警功能
SkyWalking 告警功能是在6.x版本新增的,其核心由一組規(guī)則驅(qū)動,這些規(guī)則定義在SkyWalking目錄的config/alarm-settings.yml文件中。
SkyWalking告警后會調(diào)用開發(fā)者自己定義的接口,
注:自定義的接口地址配置到alarm-settings.yml的webhooks下,當(dāng)SkyWalking產(chǎn)生告警后會調(diào)用webhooks下的URL地址傳入告警信息;
alarm-settings.yml文件預(yù)先定義了一些常用的告警規(guī)則。如下:
1.過去3分鐘內(nèi)服務(wù)平均響應(yīng)時間超過1秒
2.服務(wù)成功率在過去2分鐘內(nèi)低于80%
3.服務(wù)90%響應(yīng)時間在過去3分鐘內(nèi)低于1000毫秒
4.服務(wù)實例在過去2分鐘內(nèi)的平均響應(yīng)時間超過1秒
5.端點平均響應(yīng)時間過去2分鐘超過1秒
6.1、自定義告警接口接收數(shù)據(jù)格式
-
[{
-
"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
-
}]
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:告警時間,格式為時間戳
6.2、 編寫告警接口
6.2.1、封裝報警參數(shù)的對象
-
/**
-
* 封裝報警參數(shù)的對象
-
*/
-
-
public
class
AlarmMessageDto {
-
private
int scopeId;
-
private String name;
-
private
int id0;
-
private
int id1;
-
private String alarmMessage;
-
private
long startTime;
-
-
public
int
getScopeId
() {
-
return scopeId;
-
}
-
-
public String
getName
() {
-
return name;
-
}
-
-
public
int
getId0
() {
-
return id0;
-
}
-
-
public
int
getId1
() {
-
return id1;
-
}
-
-
public String
getAlarmMessage
() {
-
return alarmMessage;
-
}
-
-
public
long
getStartTime
() {
-
return startTime;
-
}
-
-
public
void
setScopeId
(int scopeId) {
-
this.scopeId = scopeId;
-
}
-
-
public
void
setName
(String name) {
-
this.name = name;
-
}
-
-
public
void
setId0
(int id0) {
-
this.id0 = id0;
-
}
-
-
public
void
setId1
(int id1) {
-
this.id1 = id1;
-
}
-
-
public
void
setAlarmMessage
(String alarmMessage) {
-
this.alarmMessage = alarmMessage;
-
}
-
-
public
void
setStartTime
(long startTime) {
-
this.startTime = startTime;
-
}
-
}
6.2.2、提供報警接口
-
import com.mayikt.entity.AlarmMessageDto;
-
import org.springframework.web.bind.annotation.RequestBody;
-
import org.springframework.web.bind.annotation.RequestMapping;
-
import org.springframework.web.bind.annotation.RequestMethod;
-
import org.springframework.web.bind.annotation.RestController;
-
-
import java.util.ArrayList;
-
import java.util.List;
-
-
/**
-
* 報警接口
-
*/
-
@RestController
-
public
class
PoliceService {
-
-
private List<List<AlarmMessageDto>> listAlarmMessage =
new
ArrayList<>();
-
-
/**
-
* 接收告警信息
-
*
-
* @param alarmMessageList
-
*/
-
@RequestMapping(value = "/police", method = RequestMethod.POST)
-
public
void
alarm
(@RequestBody List<AlarmMessageDto> alarmMessageList) {
-
listAlarmMessage.add(alarmMessageList);
-
}
-
-
/**
-
* 打印告警信息
-
*
-
* @return
-
*/
-
@RequestMapping("/getListAlarmMessageDto")
-
public List<List<AlarmMessageDto>>
getListAlarmMessageDto
() {
-
return listAlarmMessage;
-
}
-
-
}
7、SkyWalking數(shù)據(jù)持久化
SkyWalking 默認(rèn)是將數(shù)據(jù)存入在內(nèi)存中,如果重啟SkyWalking 數(shù)據(jù)則都會丟失。
我們可以選擇將數(shù)據(jù)持久化存放在mysql、es中等。
1、打開SkyWalking目錄config/application.yml,在里邊配置Mysql的連接信息;
-
storage:
-
selector: ${SW_STORAGE:mysql} #默認(rèn)使用的H2數(shù)據(jù)庫存儲,將h2改為mysql
-
mysql: #修改mysql連接 IP端口號,數(shù)據(jù)庫
-
properties:
-
jdbcUrl: ${SW_JDBC_URL:
"jdbc:mysql://localhost:3306/swtest?serverTimezone=UTC&characterEncoding=utf-8"}
-
dataSource.user: ${SW_DATA_SOURCE_USER:root}
-
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root@
1234}
-
dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:
true}
-
dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:
250}
-
dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:
2048}
-
dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:
true}
-
metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:
5000}
2、在oap-libs/目錄中放入 mysql-connector-java-8.0.16.jar?
百度網(wǎng)盤 點擊下載
3、重啟SkyWalking,會自動在配置的Mysql庫中創(chuàng)建依賴的表結(jié)構(gòu)。文章來源:http://www.zghlxwxcb.cn/news/detail-667597.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-667597.html
1、基本介紹
SkyWalking是一個開源的觀測平臺,官網(wǎng):Apache SkyWalking;
可監(jiān)控:分布式追蹤調(diào)用鏈 、jvm內(nèi)存變化、監(jiān)控報警、查看服務(wù)器基本配置信息。
2、SkyWalking架構(gòu)原理
在整個skywalking的系統(tǒng)中,有三個角色:
1.skywalking agent?和業(yè)務(wù)系統(tǒng)(jar)關(guān)聯(lián)在一起,負(fù)責(zé)收集各種監(jiān)控數(shù)據(jù);
2.skywalking oapservice負(fù)責(zé)處理監(jiān)控數(shù)據(jù),比如接受skywalking agent的監(jiān)控數(shù)據(jù),并存儲在數(shù)據(jù)庫中(例如elasticsearch、mysql中等);接受skywalking webapp的前端請求,從數(shù)據(jù)庫查詢數(shù)據(jù),并返回數(shù)據(jù)給前端。,Skywalking oapservice通常以集群的形式存在;
3.skywalking webapp 前端界面,用于展示數(shù)據(jù)。
2.1、skywalking 底層原理流程
1.springboot項目啟動的時候 是不需要引入任何的jar包,
2.啟動springboot項目時被skywalking skywalking-agent.jar 代理攔截,
? ? ? ? --?agent代理攔截是jdk提供的一種技術(shù);可以使啟動jar包時不需要引入任何依賴,agent就可以對java程序做業(yè)務(wù)增強(qiáng),類似AOP技術(shù),但是比AOP級別更高,agent屬于監(jiān)控整個java進(jìn)程。
3.將rpc請求數(shù)據(jù) 發(fā)送給我們的skywalking oapservice接口項目,
4.連接到我們的skywalking webapp項目展示數(shù)據(jù),
5.數(shù)據(jù)最終是可以持久化存放在 db或者es中。
? ? ? ? --?SkyWalking 默認(rèn)是將數(shù)據(jù)存入在內(nèi)存中,如果重啟SkyWalking 數(shù)據(jù)則都會丟失。
3、skywalking 環(huán)境安裝
1. 下載apache-skywalking-apm-6.5.0.tar安裝包,下載鏈接:百度網(wǎng)盤 skywalking.tar??
1.1. 下載數(shù)據(jù)庫鏈接:百度網(wǎng)盤 mysql-connector-java-8.0.16.jar??后續(xù)做數(shù)據(jù)持久化會用到。
2. 進(jìn)入到bin目錄(Windows直接雙擊啟動startup.bat / Linix則執(zhí)行startup.sh)
? ? 注:啟動startup.bat = 同時啟動oapService.bat 和 webappService.bat
3. 查看webapp管理界面 http://127.0.0.1:8080
4、skywalking-agent監(jiān)控springboot.jar包
1. 創(chuàng)建一個springboot項目,并打成jar包
2. 啟動springboot.jar包時指定agent目錄下的skywalking-agent.jar,注意skywalking-agent.jar要寫絕對路徑
啟動jar包命令:?java -javaagent:skywalking-agent.jar?-jar springboot.jar
?啟動jar包命令,同時設(shè)置服務(wù)名稱為server-member:?
java -javaagent:skywalking-agent.jar?
-Dskywalking.agent.service_name=server-member? -jar springboot.jar
4、測試訪問幾次接口,然后去SkyWalking控制臺?http://127.0.0.1:8080/ 查看效果。
4.1、如何在IDEA中使用skywalking
IDEA啟動配置:
-javaagent:D:\java\dev-tool\skywalking\apache-skywalking-apm-6.5.0\apache-skywalking-apm-bin\agent\skywalking-agent.jar
-Dskywalking.agent.service_name=server-member
-Dskywalking.collector.backend_service=127.0.0.1:11800
IDEA啟動服務(wù)后,調(diào)用接口,然后進(jìn)入WEB頁面查看效果:
5、SkyWalking獲取全局追蹤id
-
<dependency
>
-
<groupId
>org.apache.skywalking
<
/groupId
>
-
<artifactId
>apm-toolkit-trace
<
/artifactId
>
-
<version
>
6.5.0
<
/version
>
-
<
/dependency
>
獲取?TraceContext.traceId();
-
-
@RequestMapping("/member")
-
public String
orderToMember
(@RequestParam("id") Integer id) {
-
// 獲取request對象
-
HttpServletRequest
request
= ((ServletRequestAttributes)
-
RequestContextHolder.getRequestAttributes()).getRequest();
-
getHeders(request);
-
// 獲取traceId
-
String
traceId
= TraceContext.traceId();
-
log.info(
">>traceId:{}<<", traceId);
-
Integer
j
=
1 / id;
-
return
"我是會員服務(wù):" + traceId +
"," + j;
-
}
-
-
public
static
void
getHeders
(HttpServletRequest request) {
-
//2.獲得所有頭的名稱
-
Enumeration<String> headerNames = request.getHeaderNames();
-
while (headerNames.hasMoreElements()) {
//判斷是否還有下一個元素
-
String
nextElement
= headerNames.nextElement();
//獲取headerNames集合中的請求頭
-
String
header2
= request.getHeader(nextElement);
//通過請求頭得到請求內(nèi)容
-
log.info(
"請求頭=========={}" + nextElement +
"VALUE:" + header2);
-
//System.out.println(nextElement+":"+header2);
-
}
-
}
6、SkyWalking告警功能
SkyWalking 告警功能是在6.x版本新增的,其核心由一組規(guī)則驅(qū)動,這些規(guī)則定義在SkyWalking目錄的config/alarm-settings.yml文件中。
SkyWalking告警后會調(diào)用開發(fā)者自己定義的接口,
注:自定義的接口地址配置到alarm-settings.yml的webhooks下,當(dāng)SkyWalking產(chǎn)生告警后會調(diào)用webhooks下的URL地址傳入告警信息;
alarm-settings.yml文件預(yù)先定義了一些常用的告警規(guī)則。如下:
1.過去3分鐘內(nèi)服務(wù)平均響應(yīng)時間超過1秒
2.服務(wù)成功率在過去2分鐘內(nèi)低于80%
3.服務(wù)90%響應(yīng)時間在過去3分鐘內(nèi)低于1000毫秒
4.服務(wù)實例在過去2分鐘內(nèi)的平均響應(yīng)時間超過1秒
5.端點平均響應(yīng)時間過去2分鐘超過1秒
6.1、自定義告警接口接收數(shù)據(jù)格式
-
[{
-
"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
-
}]
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:告警時間,格式為時間戳
6.2、 編寫告警接口
6.2.1、封裝報警參數(shù)的對象
-
/**
-
* 封裝報警參數(shù)的對象
-
*/
-
-
public
class
AlarmMessageDto {
-
private
int scopeId;
-
private String name;
-
private
int id0;
-
private
int id1;
-
private String alarmMessage;
-
private
long startTime;
-
-
public
int
getScopeId
() {
-
return scopeId;
-
}
-
-
public String
getName
() {
-
return name;
-
}
-
-
public
int
getId0
() {
-
return id0;
-
}
-
-
public
int
getId1
() {
-
return id1;
-
}
-
-
public String
getAlarmMessage
() {
-
return alarmMessage;
-
}
-
-
public
long
getStartTime
() {
-
return startTime;
-
}
-
-
public
void
setScopeId
(int scopeId) {
-
this.scopeId = scopeId;
-
}
-
-
public
void
setName
(String name) {
-
this.name = name;
-
}
-
-
public
void
setId0
(int id0) {
-
this.id0 = id0;
-
}
-
-
public
void
setId1
(int id1) {
-
this.id1 = id1;
-
}
-
-
public
void
setAlarmMessage
(String alarmMessage) {
-
this.alarmMessage = alarmMessage;
-
}
-
-
public
void
setStartTime
(long startTime) {
-
this.startTime = startTime;
-
}
-
}
6.2.2、提供報警接口
-
import com.mayikt.entity.AlarmMessageDto;
-
import org.springframework.web.bind.annotation.RequestBody;
-
import org.springframework.web.bind.annotation.RequestMapping;
-
import org.springframework.web.bind.annotation.RequestMethod;
-
import org.springframework.web.bind.annotation.RestController;
-
-
import java.util.ArrayList;
-
import java.util.List;
-
-
/**
-
* 報警接口
-
*/
-
@RestController
-
public
class
PoliceService {
-
-
private List<List<AlarmMessageDto>> listAlarmMessage =
new
ArrayList<>();
-
-
/**
-
* 接收告警信息
-
*
-
* @param alarmMessageList
-
*/
-
@RequestMapping(value = "/police", method = RequestMethod.POST)
-
public
void
alarm
(@RequestBody List<AlarmMessageDto> alarmMessageList) {
-
listAlarmMessage.add(alarmMessageList);
-
}
-
-
/**
-
* 打印告警信息
-
*
-
* @return
-
*/
-
@RequestMapping("/getListAlarmMessageDto")
-
public List<List<AlarmMessageDto>>
getListAlarmMessageDto
() {
-
return listAlarmMessage;
-
}
-
-
}
7、SkyWalking數(shù)據(jù)持久化
SkyWalking 默認(rèn)是將數(shù)據(jù)存入在內(nèi)存中,如果重啟SkyWalking 數(shù)據(jù)則都會丟失。
我們可以選擇將數(shù)據(jù)持久化存放在mysql、es中等。
1、打開SkyWalking目錄config/application.yml,在里邊配置Mysql的連接信息;
-
storage:
-
selector: ${SW_STORAGE:mysql} #默認(rèn)使用的H2數(shù)據(jù)庫存儲,將h2改為mysql
-
mysql: #修改mysql連接 IP端口號,數(shù)據(jù)庫
-
properties:
-
jdbcUrl: ${SW_JDBC_URL:
"jdbc:mysql://localhost:3306/swtest?serverTimezone=UTC&characterEncoding=utf-8"}
-
dataSource.user: ${SW_DATA_SOURCE_USER:root}
-
dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root@
1234}
-
dataSource.cachePrepStmts: ${SW_DATA_SOURCE_CACHE_PREP_STMTS:
true}
-
dataSource.prepStmtCacheSize: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_SIZE:
250}
-
dataSource.prepStmtCacheSqlLimit: ${SW_DATA_SOURCE_PREP_STMT_CACHE_SQL_LIMIT:
2048}
-
dataSource.useServerPrepStmts: ${SW_DATA_SOURCE_USE_SERVER_PREP_STMTS:
true}
-
metadataQueryMaxSize: ${SW_STORAGE_MYSQL_QUERY_MAX_SIZE:
5000}
2、在oap-libs/目錄中放入 mysql-connector-java-8.0.16.jar?
百度網(wǎng)盤 點擊下載
3、重啟SkyWalking,會自動在配置的Mysql庫中創(chuàng)建依賴的表結(jié)構(gòu)。
?
到了這里,關(guān)于【SkyWalking】分布式服務(wù)追蹤與調(diào)用鏈系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!