前言
什么是APM?全稱:Application Performance Management
可以參考這里:
現代APM體系,基本都是參考Google的Dapper(大規模分布式系統的跟蹤系統)的體系來做的。通過跟蹤請求的處理過程,來對應用系統在前后端處理、服務端調用的性能消耗進行跟蹤,關於Dapper的介紹可以看這個鏈接:Dapper,大規模分布式系統的跟蹤系統 by bigbully
作者:刀把五
鏈接:https://www.zhihu.com/question/27994350/answer/118821214
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
最早使用APM還是在攜程里面搬磚的時候,當時使用的是大宗點評網開源的dianping/cat框架.
后來到了新公司,因為歷史包袱有點多,追蹤性能問題太麻煩,用過收費的New Relic | Real-time insights for modern software ,newrelic按照CPU核數和內存來收費,實在太貴了我們就放棄了.
再后來我們調研一下市面的其他方案,看到了這個知乎討論給了不少的東西.
有什么知名的開源apm(Application Performance Management)工具嗎?
當時看到naver/pinpoint 和apache/incubator-skywalking 都很不錯.
一個是韓國搜索團隊開源的,一個是國內個人用戶開源,已經到了apache孵化器了.
於是兩個都試用了一下, 最后由於那時候馬上考慮上分表分庫組件 sharding-jdbc-dangdang, skywalking也要對應的支持,所以決定用skywalking試試.
再后來又跑路了,不好意思給那邊留下坑就沒繼續搭建看. 到了新公司PHP/Python/Java什么都寫,開始兩三個月也沒管這個.
最近不是太忙了,新公司這邊服務端API暫時被我帶成了dotnet core技術棧,233...
同時發現當前用的EF框架偶爾會因為不小心就寫出了性能很差的SQL,測試環境基本看不出來,到了生產可能就炸.
前陣子看到dalao 傾竹 把dotnet core agent寫出來了, 於是爽歪歪就開始gang了.
開始搭建skywalking
github:incubator-skywalking
當前release版本為5.0RC2,最新版本6.X正在開發中.
所以當前我這里是基於5.0 RC2來搭建的.
官方向導方案在這里:incubator-skywalking/blob/5.x/docs/README.md
中文文檔在這里:incubator-skywalking/blob/5.x/docs/README_ZH.md
我這里今天還是全程docker部署.
以下操作來自JaredTan95/skywalking-docker dalao准備的docker部署.
預備條件:
docker
elasticsearch
啟動Elasticsearch
# Elasticsearch版本要求5.x
docker run -p 9200:9200 -p 9300:9300 -e cluster.name=elasticsearch -e xpack.security.enabled=false --name=elasticsearch --restart=always -d wutang/elasticsearch-shanghai-zone
啟動好了訪問一下 http://localhost:9200 看看,看到一下的內容說明ES已經正常啟動了.
{
"name": "_PNUyiW",
"cluster_name": "elasticsearch",
"cluster_uuid": "",
"version": {
"number": "5.6.10",
"build_hash": "b727a60",
"build_date": "2018-06-06T15:48:34.860Z",
"build_snapshot": false,
"lucene_version": "6.6.1"
},
"tagline": "You Know, for Search"
}
接着使用 docker inspect elasticsearch |grep IPAddress 查看一下 elasticsearch 當前IP.
➜ ✗ docker inspect elasticsearch |grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.27.0.2",
啟動 Skywalking UI + Skywalking collector
dalao wutang的wutang/skywalking-docker已經把UI和collector打包到一個鏡像里面了,完全可以獨立安裝.
所以我這里采用的也是這個方案.
docker run -p 8080:8080 -p 10800:10800 -p 11800:11800 -p 12800:12800 -e ES_CLUSTER_NAME=elasticsearch -e ES_ADDRESSES=上一步拿到的elasticsearchIP:9300 -d wutang/skywalking-docker:5.x
啟動好了之后打開 localhost:8080,如果UI頁面沒有500/404錯誤,說明整個系統已經正常啟動了.
PS:默認賬號密碼是:admin admin,可以在docker run指定 UI_ADMIN_PASSWORD環境變量自定義密碼.
如果有錯誤的話,大概率是ES沒有連上,檢查一下ES是不是還活着,再不行就進到容器里面看日志.日志默認路徑:/apache-skywalking-apm-incubating/logs
Agent接入
當前已經有Java/C#(dotnet core)/Node.js的Agent了.
對應的話Java支持是最多的,其他兩個我看下來基本就是主流比較多的一些框架都基本有了.
對應agent框架鏈接:
dotnet core: OpenSkywalking/skywalking-netcore
node.js:OpenSkywalking/skywalking-nodejs
理論上應該遵循http://opentracing.io/ API標准的.
Java agent 主倉庫就有,直接去看release即可.
今天我們肯定是用dotnet core 啦.
dotnet core當前支持的庫和中間件有下面這些:
- ASP.NET Core
- .NET Core BCL types (HttpClient and SqlClient)
- EntityFrameworkCore
- Npgsql.EntityFrameworkCore.PostgreSQL
- Pomelo.EntityFrameworkCore.MySql
- CAP
嗯,該有的都有了.
先引入一下SkyWalking.AspNetCore的Package.
dotnet add package SkyWalking.AspNetCore --version 0.3.0
酌情新增 SkyWalking.Diagnostics.EntityFrameworkCore, SkyWalking.Diagnostics.HttpClient, SkyWalking.Diagnostics.EntityFrameworkCore.Npgsql,SkyWalking.Diagnostics.EntityFrameworkCore.Pomelo.MySql 等等...
或者直接在xxx.csproj 新增下面這些包.
<PackageReference Include="SkyWalking.AspNetCore" Version="0.3.0"/>
<PackageReference Include="SkyWalking.Diagnostics.EntityFrameworkCore" Version="0.3.0"/>
<PackageReference Include="SkyWalking.Diagnostics.HttpClient" Version="0.3.0"/>
<PackageReference Include="SkyWalking.Diagnostics.EntityFrameworkCore.Npgsql" Version="0.3.0"/>
<PackageReference Include="SkyWalking.Diagnostics.EntityFrameworkCore.Pomelo.MySql" Version="0.3.0"/>
然后在 Startup.cs的ConfigureServices 方法中添加引用
// using SkyWalking.AspNetCore;
// using SkyWalking.Diagnostics.EntityFrameworkCore;
// using SkyWalking.Diagnostics.HttpClient;
// using SkyWalking.Diagnostics.SqlClient;
services.AddSkyWalking(option =>
{
option.ApplicationCode = "my-first-api";
option.DirectServers = "127.0.0.1:11800";
// 每三秒采樣的Trace數量,-1 為全部采集
option.SamplePer3Secs = -1;
}).AddEntityFrameworkCore(c => { c.AddPomeloMysql(); })
.AddHttpClient();
接着啟動應用.
看到有類似的日志輸入,說明已經應用已經正常連接到SkyWalking了.
info: SkyWalking.Remote.GrpcApplicationService[0]
Register application instance success. [applicationInstanceId] = 31
SkyWalking.Remote.GrpcApplicationService:Information: Register application instance success. [applicationInstanceId] = 31
info: SkyWalking.Remote.GrpcApplicationService[0]
Register application instance success. [applicationInstanceId] = 31
這時候我們打開http://localhost:8080/#/monitor/dashboard
可以看到APP已經有數量了.
接着我們訪問一下已有的API/Web頁面,就能看到對應的信息了.
點一下對應的URL.
http client請求(其實是查詢ES):
Topology Map
其他的一些功能就看自己玩了.
本期結束...