Application Insights自訂過濾收集的訊息內容

Application Insights越做越強大,基本上程式內部怎樣運作,Application Insights都可以蒐集到相關資訊,不過,有時候這樣會帶來一種困惱就是在某些情境下的資訊,並不想被蒐集到Application Insights內進行分析,因為有可能造成分析錯誤或是統計資訊的誤差,舉例來說,目前發現如果在IIS中針對Web Site設定Preload功能,在Application Insights就會多一筆Request,帶出來的資訊是localhost/XXX,這樣資訊對目前數據分析並不重要,但是,又會被多記一筆Request的Count。

因此,像這種資訊就會希望不要被記錄到Application Insights中,目前,在Application Insights的Portal中似乎不能設定過濾訊息,所以,就必須從程式面著手

自訂Filter


從程式面就是需要自己訂定Filter功能,首先自己建立一個叫做TelemetryFilter的Class,並繼承ITelemetryProcessor,從官方解釋ITelemetryProcessor

讓您更直接地控制包含在遙測串流中或排除於遙測串流外的內容

所以,透過它可以獲取要送到Application Insights的檢測資訊,進而做一些篩檢或是變更等動作,繼承ITelemetryProcessor會變成如下

1
2
3
4
public void Process(ITelemetry item)
{
....
}

在這個Process中,針對遙測資訊進行處理,以剛剛案例來說,希望排除到http://localhost/XXX資訊。就可以在這處理器這樣寫

1
2
3
4
5
6
7
8
9
10
11
12
13
public void Process(ITelemetry item)
{
var request = item as RequestTelemetry;
if (request != null && request.Url != null &&
request.Url.Host.IndexOf("localhost", StringComparison.InvariantCultureIgnoreCase) >= 0)
{
return;
}
else
{
this._next.Process(item);
}
}

把Item轉型為Request Type,並抓取資料中的Url進行過濾。如果,有符合過濾條件的,就拋棄掉這個訊息不做上報的動作,如果不是,則透過Process處理收集的資訊項目。完整的寫法如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class TelemetryFilter : ITelemetryProcessor
{
private readonly ITelemetryProcessor _next;
public TelemetryFilter(ITelemetryProcessor next)
{
this._next = next;
}
public void Process(ITelemetry item)
{
var request = item as RequestTelemetry;
if (request != null && request.Url != null &&
request.Url.Host.IndexOf("localhost", StringComparison.InvariantCultureIgnoreCase) >= 0)
{
return;
}
else
{
this._next.Process(item);
}
}
}

有這樣方式,想要過濾甚麼就可自己去定義了

註冊過濾器


開發完畢後,還必須把過濾器註冊,這樣才有辦法當Application Insights啟動後,自動掛載這個過濾器。要註冊過濾器,只要在ApplicationInsights.config中設定就可以

1
2
3
<TelemetryProcessors>
<Add Type="WebApplication1.ApplicationInsights.TelemetryFilter, WebApplication1"/>
</TelemetryProcessors>

這樣就可以一個簡單的Application Insights資訊過濾器就可以運作,簡單說,這個就是AP & Application Insights訊息的中繼站,所有資訊都會先到這邊再往Azure送,換句話說要在這邊做置換資訊動作也是可以的