これは、.NET で
可観測性をテストするために設定できるシナリオの 1 つに過ぎません。
この場合、
OpenTelemetry (OTel) を使って .NET アプリケーションを簡単にテストするために
コンテナを使用します。
トレースを確認するために
Prometheus を使用してメトリックスと
Tempo (分散トレースバックエンド) を分析しますが、これはすべて Docker コンテナで実行する
Grafana で行われます。
概要
ローカルマシンに必要なのは以下の要件のみです:
GeneXus Web アプリケーションは
GeneXus 18 Upgrade 8 (.NET 8 を使用) を使用して生成されます。
まず、
[ Observability Provider ] プロパティに値 "OpenTelemetry" を設定し、任意のオブジェクトに対して [ これだけをビルド ] を実行します。これにより、CloudServices.config ファイルが以下の内容で生成され、生成されるアプリケーションに Opentelemetry SDK を使用させます。
<Service>
<Name>OPENTELEMETRY</Name>
<Type>Observability</Type>
<ClassName>GeneXus.OpenTelemetry.OpenTelemetry.OpenTelemetryProvider, GeneXus.OpenTelemetry, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</ClassName>
<Properties />
</Service>
GeneXus 側で必要な作業はこれだけです。
ローカル環境をセットアップするためのステップ バイ ステップのガイドを以下に示します:
1.
Docker にアプリケーションをデプロイします。
これによりアプリケーションをパッケージ化し、Docker イメージをビルドし、必要なときに実行できる状態にします。
デプロイフォルダの
context フォルダは以下のような構造になります。
Dockerfile と、バイナリとアプリケーションの実行に必要なすべてのリソースが入った
temp フォルダがあります。
2. 以下のファイルを
context フォルダ (Dockerfile がある場所) にコピーします。
- docker-compose.yaml
次のサービスをロードするファイルを構成します: otel-collector、tempo、prometheus、grafana、使用するアプリケーションサービス。こちらからファイルをダウンロードできます。
このファイルには以下のような項目があります。
これは Web アプリケーションの定義であり、その Dockerfile は context ディレクトリーにあります。
ここで環境変数を定義できます。
# サンプルアプリケーション
otelsampleapp:
build:
context: .
environment:
- OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
- OTEL_RESOURCE_ATTRIBUTES=service.namespace=GeneXus,service.name=sample-app,service.version=1.0.1
- OTEL_METRICS_EXPORTER=otlp
- OTEL_TRACES_EXPORTER=otlp
- OTEL_LOGS_EXPORTER=otlp,logging
- GX_LOG_OUTPUT=ConsoleAppender
- ASPNETCORE_URLS=http://*:8080
ports:
- "9999:8080"
環境変数
ASPNETCORE_URLS は .NET 8 アプリケーションで必要です。ここでは、コンテナでアプリケーションが実行される既定のポートは 8080 です。
"ports" はポートマッピングを示します。ポート 9999 でアプリケーションにローカルにアクセスできます。
OTEL の環境変数の詳細を確認するには、
こちらをクリックしてください。
- grafana-datasources.yaml
このファイルには以下の内容が含まれます:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
uid: prometheus
access: proxy
orgId: 1
url: http://prometheus:9090
basicAuth: false
isDefault: true
version: 1
editable: false
jsonData:
httpMethod: GET
exemplarTraceIdDestinations:
- name: trace_id
datasourceUid: Tempo
- name: Tempo
type: tempo
access: proxy
orgId: 1
url: http://tempo:3200
basicAuth: false
isDefault: false
version: 1
editable: false
apiVersion: 1
uid: tempo
jsonData:
httpMethod: GET
serviceMap:
datasourceUid: prometheus
まず、
docker-compose コマンドを実行して、コンテナを作成し起動します。
context フォルダでターミナルを開き、以下のコマンドを実行します:
- docker-compose up -d

これにより、必要なイメージがすべて取得され、それらすべてを含むコンテナが作成されます。
作成されたコンテナは、
Docker デスクトップを使用して確認できます。

ここでは、サンプルアプリケーションはローカルポート 9999 上で動作します。
この例では、メインオブジェクトは wwtestdata2 なので、アプリケーションには http://localhost:9999/wwtestdata2.aspx でアクセスできます。
以下の Powershell スクリプトを使用してアプリケーションに対するロードを生成することができます。
while($true)
{
Invoke-WebRequest http://localhost:9999/wwtestdata2.aspx
Start-Sleep -Milliseconds 500
}
このアプリケーションはメトリックスとトレースを OTel Collector に送信し、OTel Collector はメトリックスとトレースをそれぞれ Prometheus と Tempo に送信します。
テストの実行中に 2 分間待ってからデータを分析すると、十分なデータが生成され、エクスポートされます。
Grafana (http://localhost:3000) を開き、 [ Explore ] を選択してソースに [ Prometheus ] を選択します。
そこに、表示可能なすべてのメトリックスを含む [ Metric ] コンボボックスがあります。

Tempo データソースを使用すると、OpenTelemetry で生成されるトレースを表示できます。
ヒント: コンテナが起動に失敗した場合、以下のコマンドラインがトラブルシューティングに便利です:
docker logs <container_id> -f