skywalking是什么
【1】skywalking是分布式系統的應用程式性能監視工具,專為微服務、云原生架構和基于容器(Docker、K8s、Mesos)架構而設計,SkyWalking 是觀察性分析平臺和應用性能管理系統,提供分布式追蹤、服務網格遙測分析、度量聚合和可視化一體化解決方案,
【2】主要流程為 采集資料——》傳輸資料——》存盤資料——》分析資料——》監控報警 ,
Skywalking整體架構
【1】圖示:

【2】整個架構分成四部分:
1.上部分Agent :負責從應用中,收集鏈路資訊,發送給 SkyWalking OAP 服務器;
2.下部分 SkyWalking OAP :負責接收Agent發送的Tracing資料資訊,然后進行分析(Analysis Core),存盤到外部存盤器(Storage),最終提供查詢(Query)功能;
3.右部分Storage:Tracing資料存盤,目前支持ES、MySQL、Sharding Sphere、TiDB、H2多種存盤器,目前采用較多的是ES,主要考慮是SkyWalking開發團隊自己的生產環境采用ES為主;
4.左部分SkyWalking UI:負責提供控制臺,查看鏈路等等;
SkyWalking中三個概念【搭建的話可以看 skywalking的搭建筆記】
【1】服務(Service) :表示對請求提供相同行為的一系列或一組作業負載,在使用Agent時,可以定義服務的名字;
【2】服務實體(Service Instance) :上述的一組作業負載中的每一個作業負載稱為一個實體, 一個服務實體實際就是作業系統上的一個真實行程;
【3】端點(Endpoint) :對于特定服務所接收的請求路徑, 如HTTP的URI路徑和gRPC服務的類名 + 方法簽名;
SkyWalking的簡單使用
【1】通過jar包方式接入
1)編輯startup.sh腳本啟動
#!/bin/sh # SkyWalking Agent配置 export SW_AGENT_NAME=springboot-skywalking-demo #Agent名字,一般使用`spring.application.name` export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 #配置 Collector 地址, export SW_AGENT_SPAN_LIMIT=2000 #配置鏈路的最大Span數量,默認為 300, export JAVA_AGENT=-javaagent:/root/skywalking-agent/skywalking-agent.jar java $JAVA_AGENT -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar #jar啟動
2)java命令啟動
java -javaagent:/root/skywalking-agent/skywalking-agent.jar
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
-DSW_AGENT_NAME=springboot-skywalking-demo -jar springboot-skywalking-demo-0.0.1-SNAPSHOT.jar
3)在IDEA中使用Skywalking
在運行的程式配置jvm引數 -javaagent:E:\SpringCloudAlibaba\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar -DSW_AGENT_NAME=springboot-skywalking-demo -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800
【2】自定義SkyWalking鏈路追蹤【希望對專案中的業務方法,實作鏈路追蹤,方便我們排查問題】
1)引入依賴
<!-- SkyWalking 工具類 --> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace</artifactId> <version>8.11.0</version> </dependency>
2)在業務方法中可以TraceContext獲取到traceId
@RequestMapping("/list")
public List<User> list(){
//TraceContext可以系結key-value
TraceContext.putCorrelation("name", "fox");
Optional<String> op = TraceContext.getCorrelation("name");
log.info("name = {} ", op.get());
//獲取追蹤的traceId
String traceId = TraceContext.traceId();
log.info("traceId = {} ", traceId);
return userService.list();
}
3)注解@Trace將方法加入追蹤鏈路
4)注解@Tags或@Tag為追蹤鏈路增加其他額外的資訊,比如記錄引數和回傳資訊,實作方式:在方法上增加@Tag或者@Tags,示例:
@Trace @Tag(key = "list", value = "https://www.cnblogs.com/chafry/p/returnedObj") public List<User> list(){ return userMapper.list(); } @Trace @Tags({@Tag(key = "param", value = "https://www.cnblogs.com/chafry/p/arg[0]"), @Tag(key = "user", value = "https://www.cnblogs.com/chafry/p/returnedObj")}) public User getById(Integer id){ return userMapper.getById(id); }
SkyWalking的資料持久化
【1】基于mysql持久化
1)修改config目錄下的application.yml
storage: #選擇使用mysql 默認使用h2,不會持久化,重啟skyWalking之前的資料會丟失 selector: ${SW_STORAGE:mysql} #使用mysql作為持久化存盤的倉庫 mysql: properties: #資料庫連接地址 創建swtest資料庫 jdbcUrl: ${SW_JDBC_URL:"jdbc:mysql://1ocalhost:3306/swtest"} #用戶名 dataSource.user: ${SW_DATA_SOURCE_USER:root} #密碼 dataSource.password: ${SW_DATA_SOURCE_PASSWORD:root}
2)添加mysql資料驅動包到oap-libs目錄下【注意:需要添加mysql資料驅動包,因為在lib目錄下是沒有mysql資料驅動包的,所以修改完配置啟動是會報錯,啟動失敗的,】
3)啟動Skywalking【查看swtest資料庫,可以看到生成了很多表,那么就代表成功了】
【2】基于elasticsearch持久化
1)修改config目錄下的application.yml
storage: selector: ${SW_STORAGE:elasticsearch} //指定ES作為存盤 elasticsearch: nameSpace: ${SW_NAMESPACE:"myProject-"} //指定命名空間,用于生成索引前綴 clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200} //配置集群節點,當然可以采用負載均衡【然后把負載均衡的服務器ip與埠寫入】,但也可以把節點都寫進去 user: ${SW_ES_USER:"myes"} //es的用戶名 password: ${SW_ES_PASSWORD:"123456"} //es的密碼
2)啟動Skywalking服務
啟動時會向elasticsearch中創建大量的index索參考于持久化資料,啟動應用程式,查看追蹤資料是否已經持久化到elasticsearch的索引中,然后重啟skywalking,驗證追蹤資料會不會丟失
Skywalking告警通知
【1】skywalking告警的核心由一組規則驅動,這些規則定義在config/alarm-settings.yml檔案中,告警規則的定義分為三部分:
1.告警規則:它們定義了應該如何觸發度量警報,應該考慮什么條件; 2.網路鉤子(Webhook}:當警告觸發時,哪些服務終端需要被通知; 3.gRPC鉤子:遠程gRPC方法的主機和埠,告警觸發后呼叫;
【2】skywalking發行版中提供了默認的alarm-setting.yml檔案,包括一些規則,每個規則有英文注釋,
1)可以根據注釋得知每個規則的作用:
# 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 #在最近10分鐘的3分鐘內服務平均回應時間超過1000ms 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 #最近10分鐘內,服務成功率在2分鐘內低于80% message: Successful rate of service {name} is lower than 80% in 2 minutes of last 10 minutes service_resp_time_percentile_rule: # Metrics value need to be long, double or int metrics-name: service_percentile op: ">" 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 service_instance_resp_time_rule: metrics-name: service_instance_resp_time op: ">" threshold: 1000 period: 10 count: 2 silence-period: 5 #服務實體的回應時間在過去10分鐘的2分鐘內超過1000ms message: Response time of service instance {name} is more than 1000ms in 2 minutes of last 10 minutes database_access_resp_time_rule: metrics-name: database_access_resp_time threshold: 1000 op: ">" period: 10 count: 2 #資料庫訪問{name}的回應時間在過去10分鐘的2分鐘內超過1000ms message: Response time of database access {name} is more than 1000ms in 2 minutes of last 10 minutes endpoint_relation_resp_time_rule: metrics-name: endpoint_relation_resp_time threshold: 1000 op: ">" period: 10 count: 2 #端點關系{name}的回應時間在過去10分鐘的2分鐘內超過1000ms message: Response time of endpoint relation {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/
2)引數說明:
metrics-name:度量名稱,也是OAL腳本中的度量名,默認配置中可以用于告警的度量有:服務,實體,端點,服務關系,實體關系,端點關系,它只支持long,double和int型別, op:運算子, threshold:閾值, period:多久告警規則需要被檢查一下,這是一個時間視窗,與后端部署環境時間相匹配, count:在一個周期視窗中,如果按op計算超過閾值的次數達到count,則發送告警 silence-period:在時間N中觸發報警后,在N -> N + silence-period這段時間內不告警, message:該規則觸發時,發送的通知訊息,
【3】實作回呼介面
@RequestMapping("/notify")
public String notify(@RequestBody Object obj){
//TODO 告警資訊,給技術負責人發短信,釘釘訊息,郵件,微信通知等
System.err.println(obj.toString());
return "notify successfully";
}
【4】接入第三方告警,如對接釘釘(官方還提供了其他第三方的對接,檔案地址:https://github.com/apache/skywalking/blob/master/docs/en/setup/backend/backend-alarm.md)
dingtalkHooks: textTemplate: |- { "msgtype": "text", "text": { "content": "Apache SkyWalking Alarm: \n %s." } } webhooks: - url: https://oapi.dingtalk.com/robot/send?access_token=dummy_token secret: dummysecret
【5】Webhook回呼通知
SkyWalking告警Webhook回呼要求接收方是一個Web容器(比如tomcat服務),告警的訊息會通過HTTP請求進行發送, 請求方法為POST, Content-Type為application/json, JSON格式基于List<org.apache.skywalking.oap.server.core.alarm.AlarmMessage>的集合物件資料, 集合中的每個AlarmMessage包含以下資訊:
scopeId. 所有可用的Scope,參考:org.apache.skywalking.oap.server.core.source.DefaultScopeDefine; name. 目標 Scope 的物體名稱; id0. Scope 物體的 ID; id1. 未使用; ruleName. 在 alarm-settings.yml 中配置的規則名; alarmMessage. 報警訊息內容; startTime. 告警時間, 位于當前時間與 UTC 1970/1/1 之間;
skywalking是分布式系統的應用程式性能監視工具,專為微服務、云原生架構和基于容器(Docker、K8s、Mesos)架構而設計,SkyWalking 是觀察性分析平臺和應用性能管理系統,提供分布式追蹤、服務網格遙測分析、度量聚合和可視化一體化解決方案,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521777.html
標籤:Java
上一篇:golang中的鎖競爭問題
