Metricsはプログラムの健全な運用をサポートしますが、過剰なメトリクスは問題の調査、ダッシュボード表示、およびログストレージにおいて負担となります。特に、健康チェックのリクエストメトリクスのような、ほとんど意味のない指標には注意が必要です。
.NET 9 では、新しい機能が導入され、一部のエンドポイントやリクエストでHTTPメトリクスの記録を選択的に除外することができます。
以下の方法で特定のエンドポイントのメトリクス記録を除外することができます:
- Web APIコントローラー、SignalRハブ、または gRPC サービスに
[DisableHttpMetrics]
属性を追加します。 - アプリケーションの起動時にエンドポイントをマッピングするときに
DisableHttpMetrics()
を呼び出します。
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Http.HttpResults;
using OpenTelemetry.Metrics;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHealthChecks();
builder.Services.AddOpenTelemetry()
.WithMetrics(builder =>
{
builder.AddMeter("Microsoft.AspNetCore.Hosting", "Microsoft.AspNetCore.Server.Kestrel");
builder.AddView("http.server.request.duration",
new ExplicitBucketHistogramConfiguration
{
Boundaries = new double[] { 0, 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10 }
});
});
var app = builder.Build();
app.MapGet("/test", () =>
{
return "ok";
});
app.MapHealthChecks("/healthz");
app.Run();
プログラムを実行し、次のコマンドを実行します:
dotnet-counters monitor -n DisableHttpMetricsDemo --counters Microsoft.AspNetCore.Hosting
(dotnet-counters がインストールされていない場合は、以下のコマンドでインストールしてください:dotnet tool install --global dotnet-counters
)
その後、http://localhost:5189/healthz にリクエストを送信すると、次のような結果が得られます:
次に、26行目のコードを以下のように変更します:
app.MapHealthChecks("/healthz").DisableHttpMetrics();
再度トラッキングコマンドを実行し、/healthz にリクエストを送信すると、/healthz はメトリクスに含まれなくなります。
より複雑なシナリオでは、リクエストが特定のエンドポイントに直接マッピングされない場合や、動的にHTTPリクエストのメトリクス記録を除外したい場合、新しいプロパティMetricsDisabled
を含むIHttpMetricsTagsFeature
インターフェースを使用できます。
HTTPリクエストを処理する際に、MetricsDisabled
をtrue
に設定することで、そのリクエストのメトリクス記録を除外できます。
ミドルウェアを使って条件付きでHTTPリクエストのメトリクス記録を除外する具体例です。
app.Use(async (context, next) =>
{
if (context.Request.Headers.ContainsKey("x-disable-metrics"))
{
var feature = context.Features.Get<IHttpMetricsTagsFeature>();
if (feature != null)
{
feature.MetricsDisabled = true;
}
}
await next(context);
});
詳細な検証方法は上記の通りです。
(Translated by GPT)