詳解 ElasticAPM 實現微服務的鏈路追蹤
作者 | net 架構師
出品 | 腳本之家(ID:jb51net)
前言
Elastic APM 實現鏈路追蹤,首先要引用開源的 APMAgent(APM 代理),然後將監控的信息發送到 APMServer,然後在轉存入 ElasticSearch,最後有 Kibana 展示;具體流程如下圖所示:
首先我們下載 ElasticSearch、Kibana、APM Server;可以先簡單的理解爲 ElasticSearch 是存儲數據用的,Kibana 是展示數據用的。
ElasticSearch 下載地址:
https://www.elastic.co/cn/downloads/elasticsearch
Kibana 下載地址:
https://www.elastic.co/cn/downloads/kibana
APM Server 下載地址:
https://www.elastic.co/cn/downloads/apm
在下載時需要注意,ElasticSearch、Kibana、APM Server 要下載相同的版本,相同平臺的;下圖爲下載時的注意事項。
這裏我下載的都是 window 下的安裝包,下載文件如下圖:
Elastic 免費版本支持內容
安裝 ElasticSearch
ElasticSearch 依賴於 java 的 SDK,所以需要安裝 Java 的 SDK。
java 安裝參考: https://www.cnblogs.com/kiba/p/12318306.html
爲了測試,我隨便找了一臺有 java 環境的電腦,系統是 window10,java 環境如下圖:
然後將 ElasticSearch 壓縮包解壓,找到 config\elasticsearch.yml 文件,記事本打開,修改配置如下:
cluster.name: kiba001
node.name: master
node.master: true
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
cluster.initial_master_nodes: ["kiba518"]
然後找到 bin 下面的 elasticsearch.bat,雙擊運行腳本安裝 ElasticSearch。
elasticsearch.bat 會啓動一個 CMD 窗口,該窗口將是 ElasticSearch 的宿主,即關閉了他,ElasticSearch 就會關閉。
讓 CMD 窗口運行一會,然後打開瀏覽器,輸入 http://localhost:9200 ,顯式以下畫面,說明 ES 安裝成功。因爲我是隨機找的有 java 環境的電腦安裝的,所以 ElasticSearch 雖然依賴於 JDK,但似乎對版本並不苛刻。
安裝 Kibana
與 ElasticSearch 類似,將 Kibana 壓縮包解壓,找到 bin 下面的 Kibana.bat,雙擊運行腳本安裝 Kibana。
Kibana.bat 也會啓動一個 CMD 窗口,該窗口將是 Kibana 的宿主。
讓 CMD 窗口運行一會,然後打開瀏覽器,輸入 http://localhost:5601/,顯式以下畫面,說明 kibana 安裝成功。
Config 文件夾下的 kibana.yml 是默認的配置文件,想深入研究的可以百度搜索一下這個文件的使用,這裏我沒有配置,所以使用的都是默認配置,用的請求地址也是 localhost。
修改 server.host 可以修改請求地址:
server.host: "0.0.0.0"
修改 i18n.locale 的值爲 "zh-CN" 爲,可以啓動漢化版本 kibana。
安裝 APM Server
首先解壓 APM Server 的壓縮包,如下圖:
然後在裏面找到 ApmServer 的配置文件 apm-server.ym。
將配置文件最開始的 host: “localhost:8200” 修改成 “0.0.0.0:8200”,以便讓他能允許通過 ip:端口號的方式訪問。然後增加 elasticsearch 地址配置:
apm-server:
# Defines the host and port the server is listening on. Use "unix:/path/to.sock" to listen on a unix domain socket.
host: "0.0.0.0:8200"
output.elasticsearch:
hosts: ["localhost:9200"]
#hosts: ["已安裝好的ES地址,多個之間用逗號隔開"]
效果如下:
然後運行 apm-server.exe,這裏需要注意的是 apm-server.exe 是個 window 服務,所以這裏不能雙擊運行。不過安裝包中已經有可以啓動服務的文件了——install-service-apm-server.ps1。
具體安裝 ApmServer 步驟。
-
從下載頁面下載 APM Server Windows zip 文件。
-
將 zip 文件的內容解壓縮到
C:\Program Files
。 -
將
apm-server-7.16.3-windows
目錄重命名爲APM-Server
。 -
以管理員身份打開 PowerShell 提示符(右鍵單擊 PowerShell 圖標,然後選擇以管理員身份運行)。如果運行的是 Windows XP,則可能需要下載並安裝 PowerShell。
-
從 PowerShell 提示符處,運行以下命令以將 APM Server 安裝爲 Windows 服務。
然後在彈出的頁面中輸入 Y,然後回車。
注意:如果您的系統禁用了腳本執行,則需要爲當前會話設置執行策略,以允許腳本運行。示例:
PowerShell.exe -ExecutionPolicy UnRestricted -File .\install-service-apm-server.ps1`
然後我們打開控制面板—管理工具—服務,就可以看到,我們已經安裝了一個 apm-server 的服務了。
不過他的當前狀態是未啓動,我們右鍵將服務啓動就可以了。
然後我們瀏覽 http://localhost:8200/,得到如下界面,代表 ApmServer 已經安裝成功了。
默認的日誌在:C:\ProgramData\apm-server
聯合測試
我們重新打開 Kibana——http://localhost:5601/,然後點擊 AddIntegrations。
然後點擊 ElasticAPM。
然後選擇 Windows。
然後頁面向下拉,點擊 Check APM Server status——檢測 APM Server 的狀態。
如下圖,提示了已經正確安裝了 APM Server。
APMAgent 使用
首先創建一個 NETCore 的 Web 項目,然後引入 Elastic 相關 DLL。
可以單獨引用獨立的 DLL。
-
Elastic.Apm
-
Elastic.Apm.AspNetCore
-
Elastic.Apm.EntityFrameworkCore
也可以直接就引用一個整合的 DLL,推薦就引用一個 Elastic.Apm.NetCoreAll。
- Elastic.Apm.NetCoreAll
然後在 Startup 的 Configure 方法中使用 app.UseElasticApm(Configuration)。
代碼如下:
using ...
using Elastic;
using Elastic.Apm;
using Elastic.Apm.AspNetCore;
using Elastic.Apm.EntityFrameworkCore;
namespaceElasticAPMTest
{
publicclassStartup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseElasticApm(Configuration);
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
然後 appsettings.json 修改如下:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"ElasticApm": {
"Environment": "production", // Set the service environment
"SecretToken": "",
"ServerUrl": "http://192.168.50.28:8200/", //設置前面安裝好的APM Server URL,默認端口號是8200
"LogLevel": "Error", // Log級別,
"ServiceName": "TEST1", //應用的名字
//"CaptureBody": "all",
//"CaptureBodyContentTypes": "application/x-www-form-urlencoded*, text/*, application/json*, application/xml*",
"ServiceVersion": "1.0.0.0"
//"Environment": "staging",
//"CaptureHeaders": "false",
//"TransactionSampleRate": 0.456,
//"TransactionMaxSpans": 375,
//"CaptureBody": "all",
//"CaptureBodyContentTypes": "application/x-www-form-urlencoded*, text/*, application/json*, application/xml*"
}
}
然後運行網站,如下圖:
項目運行後,第一行提示我們 ElasticAPM 收集數據是 30000 毫秒的間隔,即每 30 秒採集一次數據。
Github 參考網站,可以下載源代碼瞭解更多詳情。
查看檢測的數據
我們回到剛纔 Kibana 的頁面,繼續向下拉,如下圖(截圖已經是中文 了,因爲我已經漢化了)。
點擊【檢測代理狀態】,提示尚未從代理收到任何數據,但我的項目運行正常,所以直接點擊加載 Kibana 對象,然後啓動 APM,進入服務管理界面。
點擊 Test1,這是配置 ApmAgent 的項目,界面如下。
可以看到,他已經在檢測我的網站的訪問和吞吐量等等信息了。
點擊【指標】,還有 CPU 和內存的統計。
點擊【事務】,這裏的【時間線】就有我們請求的鏈路跟蹤,即微服務所需的鏈路跟蹤功能。
結語
如果一個公司存在 Java 團隊和 C# 團隊,我們在使用 APM 的時候,強烈建議使用 ELK,因爲大家都統一使用一個工具交流很方便,可以避免非常非常非常多不必要的麻煩。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/PllkmVjT3j52zSF2uvxjyA