[廚餘回收] 防止 Azure Application Insights 吃掉我太多錢

Application Insights 是 Azure 上一個很好用的監控、診斷、收集日誌的服務,不過它不便宜,它的不便宜來自於搭配的 Log Analytics 服務,如果採用隨用隨付,每 GB 的資料量就要價 $4.03 鎂,而且 Application Insights 預設又什麼模組都幫我們打開,有一些模組其實我們可以暫時關掉省一點錢。

Application Insights Modules

如果我們想知道 Application Insights 有支援哪些模組?我們可以從 ApplicationInsightsServiceOptions Settings 這張表裡面得知,夯不啷噹十幾個模組,而且幾乎預設是全部打開的。

  • PerformanceCounterCollectionModule
  • RequestTrackingTelemetryModule
  • EventCounterCollectionModule
  • DependencyTrackingTelemetryModule
  • AppServicesHeartbeatTelemetryModule
  • AzureInstanceMetadataTelemetryModule
  • QuickPulseMetricStream(LiveMetrics)
  • AdaptiveSampling
  • Heartbeat
  • AutoCollectedMetricExtractor
  • RequestCollectionOptions.TrackExceptions
  • DiagnosticsTelemetryModule

Data Volume Trends

如果我們想知道哪些模組耗費的資料量最多?我們可以到 Application Insights 的管理介面,找到「Usage and estimated costs」有一個「This query」的超連結。

點下去之後,就會跳到一個資料表的查詢介面,預設會帶入一組查詢語句,幫我們列出統計的資料量,方便我們來去判斷特定模組耗費的資料量,不過它預設是用每天幾 GB 的單位來呈現,我們可以自己調整想要的呈現單位,我在這邊就把它改成每小時幾 MB。

關閉不要的模組

我這邊是用 ASP.NET Core 當範例,首先安裝 Microsoft.ApplicationInsights.AspNetCore 套件,接著在 Startup.cs 的 ConfigureServices() 方法中,加入 services.AddApplicationInsightsTelemetry(Action<ApplicationInsightsServiceOptions> options) 這個擴充方法,然後在裡面指定 Application Insights 服務的 Instrumentation Key,或是 Connection String 也可以。

public class Startup
{
    // ...

    public void ConfigureServices(IServiceCollection services)
    {
        // ...

        services.AddApplicationInsightsTelemetry(
            options =>
                {
                    options.InstrumentationKey = "Instrumentation Key";
                    
                    // OR
                    options.ConnectionString = "Connection String";
                });
    }

    // ...
}

再來看我們是要只啟動需要的模組,還是關閉資料量比較大的模組,都可以在方法裡面做設定。

public class Startup
{
    // ...

    public void ConfigureServices(IServiceCollection services)
    {
        // ...

        services.AddApplicationInsightsTelemetry(
            options =>
                {
                    // ...

                    options.EnablePerformanceCounterCollectionModule = false;
                    options.EnableEventCounterCollectionModule = false;
                    options.EnableDependencyTrackingTelemetryModule = false;
                });
    }

    // ...
}

還有一個設定的方式是從 appsettings.json 下手,我們新增一個名為 ApplicationInsights 的 Section,對應的設定名稱跟 ApplicationInsightsServiceOptions 的屬性名稱一樣。

{
  "...": "...",
  "ApplicationInsights": {
    "InstrumentationKey": "Instrumentation Key",
    "ConnectionString": "Connection String",
    "EnablePerformanceCounterCollectionModule": false,
    "EnableEventCounterCollectionModule": false,
    "EnableDependencyTrackingTelemetryModule": false 
  } 
}
InstrumentationKey 及 ConnectionString 則一設定即可

然後在 ConfigureServices() 方法中改加入 services.AddApplicationInsightsTelemetry(IConfiguration configuration) 這個擴充方法就可以了,這也是官方推薦的設定方式

public class Startup
{
    // ...

    public void ConfigureServices(IServiceCollection services)
    {
        // ...

        services.AddApplicationInsightsTelemetry(this.Configuration);
    }

    // ...
}

關掉想關的模組之後,過一段時間再來看統計圖表,沒意外的話應該不會再有相關的資料量記錄。

傳統 ASP.NET 應用程式,請參考 Configure Application Insights for your ASP.NET website。 Azure Functions 應用程式,請參考 host.json reference for Azure Functions 2.x and later - applicationInsights

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學