はじめに
このページでは、.NET における OpenTelemetry の始め方を紹介します。
アプリケーションを自動的に計装する方法をお探しの場合は、こちらのガイドを参照してください。
シンプルな .NET アプリケーションに対して計装を行い、トレース、メトリクス、ログをコンソールに出力する方法を学ぶことができます。
前提条件
以下がローカルにインストールされていることを確認してください。
- .NET SDK 8+
アプリケーション例
次の例では、基本的な ASP.NET Core の Minimal API アプリケーションを使用しています。 ASP.NET Core の Minimal API を使用していなくても問題ありません。 OpenTelemetry .NET は他のフレームワークでも利用できます。 対応しているフレームワーク用ライブラリの一覧については、レジストリをご覧ください。
より詳しい例については、examples をご覧ください。
HTTP サーバーを作成して起動する
まず、dotnet-simple という新しいディレクトリに環境をセットアップします。
そのディレクトリ内で、次のコマンドを実行してください。
dotnet new web
同じディレクトリ内で、Program.cs の内容を次のコードに置き換えてください。
using System.Globalization;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
string HandleRollDice([FromServices]ILogger<Program> logger, string? player)
{
var result = RollDice();
if (string.IsNullOrEmpty(player))
{
logger.LogInformation("Anonymous player is rolling the dice: {result}", result);
}
else
{
logger.LogInformation("{player} is rolling the dice: {result}", player, result);
}
return result.ToString(CultureInfo.InvariantCulture);
}
int RollDice()
{
return Random.Shared.Next(1, 7);
}
app.MapGet("/rolldice/{player?}", HandleRollDice);
app.Run();
Properties サブディレクトリ内で、launchSettings.json の内容を次のように置き換えてください。
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:8080",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
次のコマンドでアプリケーションをビルドして実行し、ウェブブラウザーで http://localhost:8080/rolldice を開いて正しく動作していることを確認してください。
dotnet build
dotnet run
計装
次に、テレメトリーを生成する OpenTelemetry の NuGet パッケージをインストールしてセットアップします。
パッケージを追加する
dotnet add package OpenTelemetry.Extensions.Hosting dotnet add package OpenTelemetry.Instrumentation.AspNetCore dotnet add package OpenTelemetry.Exporter.ConsoleOpenTelemetry のコードをセットアップする
Program.cs で、次の行を
var builder = WebApplication.CreateBuilder(args); var app = builder.Build();次のように置き換えてください。
using OpenTelemetry.Logs; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; using OpenTelemetry.Trace; var builder = WebApplication.CreateBuilder(args); const string serviceName = "roll-dice"; builder.Logging.AddOpenTelemetry(options => { options .SetResourceBuilder( ResourceBuilder.CreateDefault() .AddService(serviceName)) .AddConsoleExporter(); }); builder.Services.AddOpenTelemetry() .ConfigureResource(resource => resource.AddService(serviceName)) .WithTracing(tracing => tracing .AddAspNetCoreInstrumentation() .AddConsoleExporter()) .WithMetrics(metrics => metrics .AddAspNetCoreInstrumentation() .AddConsoleExporter()); var app = builder.Build();アプリケーションをもう一度実行します。
dotnet rundotnet runの出力を確認してください。別のターミナルから、
curlを使ってリクエストを送信します。curl localhost:8080/rolldice約30秒後、サーバープロセスを停止します。
この時点で、サーバーとクライアントからのトレースとログの出力が表示されるはずです。 次のような内容が出力されます(読みやすくするために出力は折り返しています)。
トレースとログ
LogRecord.Timestamp: 2023-10-23T12:13:30.2704325Z
LogRecord.TraceId: 324333ec3bbca04ba7f4be4bf3618cb1
LogRecord.SpanId: e7d3814e31e504eb
LogRecord.TraceFlags: Recorded
LogRecord.CategoryName: Program
LogRecord.Severity: Info
LogRecord.SeverityText: Information
LogRecord.Body: Anonymous player is rolling the dice: {result}
LogRecord.Attributes (Key:Value):
result: 1
OriginalFormat (a.k.a Body): Anonymous player is rolling the dice: {result}
Resource associated with LogRecord:
service.name: roll-dice
service.instance.id: f20134f3-293f-4cb2-ace3-724b5571ca9a
telemetry.sdk.name: opentelemetry
telemetry.sdk.language: dotnet
telemetry.sdk.version: 1.6.0
Activity.TraceId: 324333ec3bbca04ba7f4be4bf3618cb1
Activity.SpanId: e7d3814e31e504eb
Activity.TraceFlags: Recorded
Activity.ActivitySourceName: Microsoft.AspNetCore
Activity.DisplayName: /rolldice
Activity.Kind: Server
Activity.StartTime: 2023-10-23T12:13:30.2163005Z
Activity.Duration: 00:00:00.0585187
Activity.Tags:
net.host.name: 127.0.0.1
net.host.port: 8080
http.method: GET
http.scheme: http
http.target: /rolldice
http.url: http://127.0.0.1:8080/rolldice
http.flavor: 1.1
http.user_agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (HTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.61
http.status_code: 200
Resource associated with Activity:
service.name: roll-dice
service.instance.id: 36bfe322-51b8-4976-90fc-9186376d6ad0
telemetry.sdk.name: opentelemetry
telemetry.sdk.language: dotnet
telemetry.sdk.version: 1.6.0
また、サーバーを停止すると、収集されたすべてのメトリクスの出力が表示されるはずです(以下はサンプルの抜粋です)。
メトリクス
Export http.client.duration, Measures the duration of outbound HTTP requests., Unit: ms, Meter: OpenTelemetry.Instrumentation.Http/1.0.0.0
(2023-08-14T06:12:06.2661140Z, 2023-08-14T06:12:23.7750388Z] http.flavor: 1.1 http.method: POST http.scheme: https http.status_code: 200 net.peer.name: dc.services.visualstudio.com Histogram
Value: Sum: 1330.4766000000002 Count: 5 Min: 50.0333 Max: 465.7936
(-Infinity,0]:0
(0,5]:0
(5,10]:0
(10,25]:0
(25,50]:0
(50,75]:2
(75,100]:0
(100,250]:0
(250,500]:3
(500,750]:0
(750,1000]:0
(1000,2500]:0
(2500,5000]:0
(5000,7500]:0
(7500,10000]:0
(10000,+Infinity]:0
次のステップ
さらに詳しく知りたい方へ。
- この例を別のエクスポーターで実行して、テレメトリーデータを送信してみましょう。
- ご自身のアプリで自動計装を試してみましょう。
- 手動計装について学び、さらに多くのサンプルを試してみましょう。
- OpenTelemetry デモをご覧ください。 .NET ベースのカートサービスが含まれています。
フィードバック
このページは役に立ちましたか?
Thank you. Your feedback is appreciated!
Please let us know how we can improve this page. Your feedback is appreciated!