詳解ElasticAPM實現微服務的鏈路追蹤(NET)

前言

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安裝參考

爲了測試,我隨便找了一臺有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步驟。

1.從下載頁面下載 APM Server Windows zip 文件。

2.將 zip 文件的內容解壓縮到 C:\Program Files

3.將 apm-server-7.16.3-windows 目錄重命名爲 APM-Server

4.以管理員身份打開 PowerShell 提示符(右鍵單擊 PowerShell 圖標,然後選擇以管理員身份運行)。如果運行的是 Windows XP,則可能需要下載並安裝 PowerShell。

5.從 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。

也可以直接就引用一個整合的DLL,推薦就引用一個Elastic.Apm.NetCoreAll。

然後在Startup的Configure方法中使用 app.UseElasticApm(Configuration)。

代碼如下:

using ...
using Elastic;
using Elastic.Apm;
using Elastic.Apm.AspNetCore;
using Elastic.Apm.EntityFrameworkCore;
namespace ElasticAPMTest
{
    public class Startup
    {
        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,因爲大家都統一使用一個工具交流很方便,可以避免非常非常非常多不必要的麻煩。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章