アプリケーションメトリクス
このセクションでは、ワークロードによって公開されているメトリクスの洞察を得て、Amazon CloudWatchを使用してこれらのメトリクスを可視化する方法を見ていきます。これらのメトリクスの例としては以下のようなものがあります:
- Javaヒープメトリクスやデータベース接続プールのステータスなどのシステムメトリクス
- ビジネスKPIに関連するアプリケーションメトリクス
このワークショップの各コンポーネントは、特定のプログラミング言語やフレームワークに関連するライブラリを使用してPrometheusメトリクスを提供するように計装されています。ordersサービスからのこれらのメトリクスの例を次のように見ることができます:
[...]
# HELP jdbc_connections_idle Number of established but idle connections.
# TYPE jdbc_connections_idle gauge
jdbc_connections_idle{name="reader",} 10.0jdbc_connections_idle{name="writer",} 10.0[...]
# HELP watch_orders_total The number of orders placed
# TYPE watch_orders_total counter
watch_orders_total{productId="510a0d7e-8e83-4193-b483-e27e09ddc34d",} 2.0watch_orders_total{productId="808a2de1-1aaa-4c25-a9b9-6612e8f29a38",} 1.0watch_orders_total{productId="*",} 3.0このコマンドの出力は詳細ですが、このラボのためにwatch_orders_totalメトリクスに焦点を当てましょう:
watch_orders_total- アプリケーションメトリクス - 小売店を通じて何件の注文が行われた か
CloudWatchエージェントによるアプリケーションメトリクスのスクレイピング
前のセクションでは、Amazon CloudWatch Observabilityアドオンがインフラストラクチャメトリクスを収集するためにCloudWatchエージェントをデプロイしました。同じエージェントはOpenTelemetry上に構築されており、アプリケーションによって公開されたPrometheusエンドポイントをスクレイピングし、Embedded Metric Format (EMF)を使用してAmazon CloudWatchに公開することもできます。
別のコレクターをデプロイする代わりに、アプリケーションPodをスクレイピングする追加のOpenTelemetryパイプラインでアドオンの構成を拡張します。アドオンはcloudwatch-agent-cluster-scraperという名前の専用の単一レプリカDeploymentでクラスター全体のスクレイピングを実行します(ノードごとのcloudwatch-agent DaemonSetとは別です)。そのため、メトリクスは重複なく一度だけ収集されます。
以下の構成はCloudWatchエージェントにPrometheusパイプラインを追加します。この構成は~/environment/eks-workshop/modules/observability/container-insights/cwagent-prometheus/cloudwatch-agent-prometheus.yamlにあります:
otelContainerInsights:
enabled: true
agent:
otelConfig:
receivers:
prometheus/appmetrics:
config:
global:
scrape_interval: 30s
scrape_timeout: 10s
scrape_configs:
- job_name: retail-app-pods
honor_labels: true
kubernetes_sd_configs:
- role: pod
namespaces:
names: [orders]
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: pod
processors:
batch/appmetrics:
timeout: 30s
exporters:
awsemf/appmetrics:
namespace: ContainerInsights/Prometheus
log_group_name: /aws/containerinsights/eks-workshop/prometheus
dimension_rollup_option: NoDimensionRollup
resource_to_telemetry_conversion:
enabled: true
metric_declarations:
- dimensions: [[pod, productId]]
metric_name_selectors:
- ^watch_orders_total$$
service:
pipelines:
metrics/appmetrics:
receivers: [prometheus/appmetrics]
processors: [batch/appmetrics]
exporters: [awsemf/appmetrics]
この構成が何をしているかを説明します:
prometheus/appmetricsPrometheusレシーバーは、orders名前空間内でprometheus.io/scrapeアノテーションを持つPodを発見し、それらのメトリクスエンドポイントをスクレイピングします。awsemf/appmetricsEMFエクスポーターは、スクレイピングされたメトリクスをEmbedded Metric Formatに変換し、CloudWatchに送信します。metric_declarationsセクションはwatch_orders_totalメトリクスを選択し、podとproductIdのディメンションを使用してContainerInsights/Prometheus名前空間に公開します。metrics/appmetricsパイプラインは、レシーバー、プロセッサー、エクスポーターを結びつけます。/appmetricsサフィックスは、このパイプラインをアドオンが自動的に管理するパイプラインとは別に保ちます。
^watch_orders_total$$の$$は意図的なものです。CloudWatchエージェントは構成内の環境変数を展開するため、リテラルの$(Prometheusの正規表現の終端アンカー)を保持するには$$と記述する必要があります。
アドオンを更新して構成を適用し、アクティブになるまで待ちます:
クラスタースクレイパーを再起動して、新しいスクレイプジョブを取得するようにします:
スクレイパーがジョブをロードしたことを確認します:
... "msg":"Scrape job added","jobName":"retail-app-pods"
これで設定が完了しましたので、以下のスクリプトを使用して負荷ジェネレーターを実行し、ストアに注文を行い、アプリケーションメトリクスを生成します:
CloudWatchコンソールを開いて、ダッシュボードセクションに移動します:
CloudWatchコンソールを開く
ダッシュボー ドOrder-Service-Metrics-1を選択して、ダッシュボード内のパネルを確認します:

スクレイピングされたメトリクスがCloudWatchに表示されるまでに数分かかる場合があります。
「Orders by Product」パネルのタイトルにカーソルを合わせて「Edit」ボタンをクリックすることで、ダッシュボードがCloudWatchをクエリするように構成されている方法を確認できます:

このパネルを作成するために使用されたクエリはページの下部に表示されます:
SELECT COUNT(watch_orders_total) FROM "ContainerInsights/Prometheus" WHERE productId != '*' GROUP BY productId
このクエリは以下のことを行っています:
watch_orders_totalメトリクスをクエリするproductIdの値が*のメトリクスを無視する- これらのメトリクスを合計し、
productIdでグループ化する
メトリクスの観察に満足したら、以下のコマンドを使用して負荷ジェネレーターを停止できます。