tag:crieit.net,2005:https://crieit.net/tags/Prometheus/feed
「Prometheus」の記事 - Crieit
Crieitでタグ「Prometheus」に投稿された最近の記事
2021-12-19T01:01:44+09:00
https://crieit.net/tags/Prometheus/feed
tag:crieit.net,2005:PublicArticle/17872
2021-12-19T01:01:44+09:00
2021-12-19T01:01:44+09:00
https://crieit.net/posts/aws-ecs-fargate-amp-grafana
📔 ECS Fargate のメトリクスを Prometheus Agent 使って AMP に送って Grafana で監視する
<h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1>
<p><strong>この記事は <a target="_blank" rel="nofollow noopener" href="https://qiita.com/advent-calendar/2021/aws">AWS Advent Calendar 2021</a> の 5 日目の記事です。</strong></p>
<p><a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/fargate/">Fargate</a> で Node.js アプリのメトリクスを <a target="_blank" rel="nofollow noopener" href="https://prometheus.io/blog/2021/11/16/agent/">Prometheus Agent</a> をサイドカーコンテナとして動かして、<a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/prometheus/">Amazon Managed Service for Prometheus (AMP)</a> に送信して <a target="_blank" rel="nofollow noopener" href="https://grafana.com/">Grafana</a> で見られるようにしてみました。</p>
<p>ちなみに Promethus Agent はまだ <a target="_blank" rel="nofollow noopener" href="https://prometheus.io/blog/2021/11/16/agent/#prometheus-agent-mode">実験的な機能</a> なため、<strong>実務での利用は推奨しません。</strong></p>
<p>本記事の環境構築には <a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/cdk/">AWS CDK</a> を利用しています。</p>
<h1 id="動作環境"><a href="#%E5%8B%95%E4%BD%9C%E7%92%B0%E5%A2%83">動作環境</a></h1>
<ul>
<li>Node.js v16.13.0</li>
<li>AWS CDK 2.0.0 (build 4b6ce31)</li>
<li>Prometheus 2.32.1</li>
</ul>
<h1 id="環境構築"><a href="#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89">環境構築</a></h1>
<h2 id="AWS CDK で環境構築する"><a href="#AWS+CDK+%E3%81%A7%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B">AWS CDK で環境構築する</a></h2>
<p>CDK で構築作業を進めます。まずは下記コマンドで CDK プロジェクトを作成します。使用言語は <code>TypeScript</code> を選択します。</p>
<pre><code class="bash">mkdir prometheus-agent-test && cd prometheus-agent-test
cdk init --language typescript
</code></pre>
<p>まず CDK でインフラ構築を進めていく前に、メトリクス収集テスト用の Node.js アプリを準備します。</p>
<h3 id="ECS Fargate で動かす Node.js アプリを準備する"><a href="#ECS+Fargate+%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99+Node.js+%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B">ECS Fargate で動かす Node.js アプリを準備する</a></h3>
<p><a target="_blank" rel="nofollow noopener" href="https://github.com/siimon/prom-client">prom-client</a> を利用して、Node.js のメトリクスが取得できるだけの Node.js アプリを準備します。<code>prometheus-agent-test</code> フォルダで下記コマンドを実行します。</p>
<pre><code class="bash">mkdir metrics-app && cd metrics-app
npm init -y
npm install --save prom-client
</code></pre>
<p>次に <code>metrics-app</code> フォルダ内に <code>index.js</code> を作成して下記を編集します。</p>
<pre><code class="javascript">// metrics-app/index.js
"use strict";
const http = require("http");
const server = http.createServer();
const client = require("prom-client");
const register = new client.Registry();
// 5秒間隔でメトリクスを取得する
client.collectDefaultMetrics({ register, timeout: 5 * 1000 });
server.on("request", async function (req, res) {
// /metrics にアクセスしたら、Prometheus のレポートを返す
if (req.url === "/metrics") {
res.setHeader("Content-Type", register.contentType);
const metrics = await register.metrics();
return res.end(metrics);
} else {
return res.writeHead(404, { "Content-Type": "text/plain" });
}
});
server.listen(8080);
</code></pre>
<p><code>node index.js</code> コマンドを実行して <code>http://localhost:8080/metrics</code> にアクセスしてみます。下記のように各種メトリクスが出力されている様子が確認できれば OK です。</p>
<p><img src="https://i.gyazo.com/a5feae6dba9a9f4eaecae0055dd9be9e.png" alt="Prometheus のレポートが正常に出力されている様子" /><br />
<strong>Prometheus のレポートが正常に出力されている様子</strong></p>
<p>今回は ECS 上で Node.js アプリを動作させるため、<code>Dockerfile</code> も作成します。</p>
<pre><code class="docker"># metrics-app/Dockerfile
FROM public.ecr.aws/docker/library/node:16-alpine3.12 AS builder
EXPOSE 8080
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install --max-old-space-size=4096
COPY . .
CMD [ "node", "index.js" ]
</code></pre>
<p>上記 <code>Dockerfile</code> 作成後、再び動作検証のため下記コマンドを実行してから、<code>http://localhost:8080/metrics</code> にアクセスしてみます。</p>
<pre><code class="bash">docker build -t prometheus-agent-test/metrics-app .
docker run -p 8080:8080 prometheus-agent-test/metrics-app:latest
</code></pre>
<p>先ほどと同様に <code>http://localhost:8080/metrics</code> アクセス時に各種メトリクスが出力されている様子を確認できれば OK です。</p>
<h3 id="Node.js アプリを監視する Prometheus Agent を準備する"><a href="#Node.js+%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E7%9B%A3%E8%A6%96%E3%81%99%E3%82%8B+Prometheus+Agent+%E3%82%92%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B">Node.js アプリを監視する Prometheus Agent を準備する</a></h3>
<p>まずは Prometheus 関連ファイルを配置するためのフォルダを作成します。<code>prometheus-agent-test</code> フォルダ内で下記コマンドを実行します。</p>
<pre><code class="bash">mkdir prometheus-agent && cd prometheus-agent
</code></pre>
<p>次に Prometheus の設定テンプレートファイルを作成します。テンプレートファイルは <a target="_blank" rel="nofollow noopener" href="https://atmarkit.itmedia.co.jp/ait/articles/1610/18/news008.html"><code>sed</code></a> を利用して中身の <code>__TASK_ID__</code> および <code>__REMOTE_WRITE_URL__</code> を書き換えて利用します。</p>
<pre><code class="yaml"># prometheus-agent/prometheus.tmpl.yml
global:
scrape_interval: 5s
external_labels:
monitor: "prometheus"
scrape_configs:
- job_name: "prometheus-agent-test"
static_configs:
- targets: ["localhost:8080"]
labels:
# デフォルトの localhost:8080 がインスタンスとして利用されると、
# メトリクスの判別がしづらくなるため ECS Task の ID を利用する
instance: "__TASK_ID__"
remote_write:
# AMP ワークスペース作成時に控えておいた、
# `エンドポイント - リモート書き込み URL` を設定する箇所
- url: "__REMOTE_WRITE_URL__"
sigv4:
region: ap-northeast-1
queue_config:
max_samples_per_send: 1000
max_shards: 200
capacity: 2500
</code></pre>
<p>設定ファイルの作成が完了したら、テンプレートファイルを利用して Prometheus の設定ファイルを作成し、Prometheus Agent を起動させるためのシェルスクリプトを作成します。</p>
<pre><code class="sh"># prometheus-agent/docker-entrypoint.sh
#!/bin/sh
while [ -z "$taskId" ]
do
# ECS Fargate で起動したタスク ID を取得する
taskId=$(curl --silent ${ECS_CONTAINER_METADATA_URI}/task | jq -r '.TaskARN | split("/") | .[-1]')
echo "waiting..."
sleep 1
done
echo "taskId: ${taskId}"
echo "remoteWriteUrl: ${REMOTE_WRITE_URL}"
# タスク ID `taskId` および、環境変数 `REMOTE_WRITE_URL` で、
# Prometheus のテンプレートファイル `prometheus.tmpl.yml` の内容を書き換え、
# その結果を `/etc/prometheus/prometheus.yml` に出力する
cat /etc/prometheus/prometheus.tmpl.yml | \
sed "s/__TASK_ID__/${taskId}/g" | \
sed "s>__REMOTE_WRITE_URL__>${REMOTE_WRITE_URL}>g" > /etc/prometheus/prometheus.yml
# --enable-feature=agent で Prometheus を Agent モードで起動する
# Prometheus のコンフィグファイルには上記で出力した `/etc/prometheus/prometheus.yml` を利用する
/usr/local/bin/prometheus \
--enable-feature=agent \
--config.file=/etc/prometheus/prometheus.yml \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.console.templates=/etc/prometheus/consoles
</code></pre>
<p>これで Prometheus Agent 起動のための準備は整ったため、最後に <code>Dockerfile</code> を準備します。ちなみに Prometheus Agent は <code>v2.32.0</code> 以降で利用可能です。<strong>本記事では <code>v2.32.1</code> を利用します。</strong></p>
<pre><code class="docker"># prometheus-agent/Dockerfile
FROM --platform=arm64 alpine:3.15
ADD prometheus.tmpl.yml /etc/prometheus/
RUN apk add --update --no-cache jq sed curl
# ARM64 で動作する Prometheus v2.32.1 を curl でダウンロード展開する
RUN curl -sL -O https://github.com/prometheus/prometheus/releases/download/v2.32.1/prometheus-2.32.1.linux-arm64.tar.gz
RUN tar -zxvf prometheus-2.32.1.linux-arm64.tar.gz && rm prometheus-2.32.1.linux-arm64.tar.gz
# `prometheus` コマンドを `/usr/local/bin/prometheus` に移動する
RUN mv prometheus-2.32.1.linux-arm64/prometheus /usr/local/bin/prometheus
COPY ./docker-entrypoint.sh /
RUN chmod +x /docker-entrypoint.sh
CMD ["/docker-entrypoint.sh"]
</code></pre>
<p>ここまでで CDK でインフラ整備を進めていくための下準備は完了です。</p>
<h3 id="ECS Fargate 上で Node.js アプリおよび Prometheus Agent を動作させる"><a href="#ECS+Fargate+%E4%B8%8A%E3%81%A7+Node.js+%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8A%E3%82%88%E3%81%B3+Prometheus+Agent+%E3%82%92%E5%8B%95%E4%BD%9C%E3%81%95%E3%81%9B%E3%82%8B">ECS Fargate 上で Node.js アプリおよび Prometheus Agent を動作させる</a></h3>
<p>あとは CDK で ECS Fargate 上で Node.js アプリおよび Prometheus Agent、Grafana を動作させるための環境を整備していきます。</p>
<p><code>lib/prometheus-agent-test-stack.ts</code> の内容を書き換えます。</p>
<pre><code class="typescript">// lib/prometheus-agent-test-stack.ts
import { Construct } from "constructs";
import {
Stack,
StackProps,
aws_ecs as ecs,
aws_logs as logs,
aws_aps as aps,
aws_ecs_patterns as ecs_patterns,
aws_iam as iam,
aws_elasticloadbalancingv2 as elbv2,
Duration,
CfnOutput,
} from "aws-cdk-lib";
export class PrometheusAgentTestStack extends Stack {
constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);
// Node.js アプリに ecs_patterns.ApplicationLoadBalancedFargateService を利用して ALB 経由でアクセス可能にする
const projectName = "prometheus-agent-test";
const fargateService =
new ecs_patterns.ApplicationLoadBalancedFargateService(
this,
`${projectName}-fargate-service`,
{
serviceName: `${projectName}-fargate-service`,
cpu: 256,
desiredCount: 3,
listenerPort: 80,
taskImageOptions: {
family: `${projectName}-taskdef`,
image: ecs.ContainerImage.fromAsset("metrics-app"),
containerPort: 8080,
logDriver: ecs.LogDrivers.awsLogs({
streamPrefix: `/${projectName}/metrics-app`,
logRetention: logs.RetentionDays.ONE_DAY,
}),
},
cluster: new ecs.Cluster(this, `${projectName}-cluster`, {
clusterName: `${projectName}-cluster`,
}),
memoryLimitMiB: 512,
}
);
fargateService.targetGroup.configureHealthCheck({
path: "/metrics",
timeout: Duration.seconds(8),
interval: Duration.seconds(10),
healthyThresholdCount: 2,
unhealthyThresholdCount: 4,
healthyHttpCodes: "200",
});
// 本質ではないが、Gravition2 で動作させたいために RuntimePlatform のプロパティを上書きしている
const fargateServiceTaskdef = fargateService.taskDefinition.node
.defaultChild as ecs.CfnTaskDefinition;
fargateServiceTaskdef.addPropertyOverride("RuntimePlatform", {
CpuArchitecture: "ARM64",
OperatingSystemFamily: "LINUX",
});
// AMP への書き込み権限を付与する
fargateService.taskDefinition.taskRole.addManagedPolicy(
iam.ManagedPolicy.fromAwsManagedPolicyName(
"AmazonPrometheusRemoteWriteAccess"
)
);
// (2021/12/18) Amazon Managed Service for Prometheus のワークスペースを作成して、Prometheus の remote-write URL を取得する
const apsWorkspace = new aps.CfnWorkspace(
this,
`${projectName}-prom-workspace`,
{
alias: `${projectName}-prom-workspace`,
}
);
const apsWorkspaceRemoteUrl = `${apsWorkspace.attrPrometheusEndpoint}api/v1/remote_write`;
// (2021/12/18) 本記事で頻出する "エンドポイント - リモート書き込み URL" をコンソールに出力する
new CfnOutput(this, "prom-remote-write-url", {
value: apsWorkspaceRemoteUrl,
description: "Prometheus Workspace の remote-write URL",
exportName: "PromRemoteWriteURL",
});
// AMP へメトリクス情報を送信するための Prometheus Agent コンテナを追加する
const containerName = `${projectName}-prometheus-agent`;
fargateService.taskDefinition.addContainer(containerName, {
containerName,
image: ecs.ContainerImage.fromAsset("prometheus-agent"),
memoryReservationMiB: 128,
environment: {
// (2021/12/18) CDK 経由で作成した Prometheus の remote-write URL を設定する
REMOTE_WRITE_URL: apsWorkspaceRemoteUrl,
},
logging: new ecs.AwsLogDriver({
streamPrefix: `/${projectName}/prometheus-agent`,
logRetention: logs.RetentionDays.ONE_DAY,
}),
});
// Grafana のタスク定義を作成する
const grafanaDashboardTaskDefinition = new ecs.FargateTaskDefinition(
this,
`${projectName}-grafana-taskdef`,
{
family: `${projectName}-grafana-taskdef`,
}
);
// Grafana のタスクが Prometheus Query を叩けるように権限付与する
grafanaDashboardTaskDefinition.taskRole.addManagedPolicy(
iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonPrometheusQueryAccess")
);
// Grafana のコンテナを追加する。パスプレフィクスには dashboard を設定する
const grafanaDashboardContainerName = `${projectName}-grafana-dashboard`;
grafanaDashboardTaskDefinition.addContainer(grafanaDashboardContainerName, {
containerName: grafanaDashboardContainerName,
image: ecs.ContainerImage.fromRegistry("public.ecr.aws/ubuntu/grafana"),
environment: {
AWS_SDK_LOAD_CONFIG: "true",
GF_AUTH_SIGV4_AUTH_ENABLED: "true",
GF_SERVER_SERVE_FROM_SUB_PATH: "true",
GF_SERVER_ROOT_URL: "%(protocol)s://%(domain)s/dashboard",
},
portMappings: [{ containerPort: 3000 }],
memoryLimitMiB: 512,
logging: new ecs.AwsLogDriver({
streamPrefix: `/${projectName}/grafana-dashboard`,
logRetention: logs.RetentionDays.ONE_DAY,
}),
});
const grafanaDashboardServiceName = `${projectName}-grafana-dashboard-service`;
const grafanaDashboardService = new ecs.FargateService(
this,
grafanaDashboardServiceName,
{
serviceName: grafanaDashboardServiceName,
cluster: fargateService.cluster,
taskDefinition: grafanaDashboardTaskDefinition,
desiredCount: 1,
}
);
// Grafana のタスクを ALB のターゲットグループに紐づける
fargateService.listener.addTargets(
`${projectName}-grafana-dashboard-target`,
{
priority: 1,
conditions: [elbv2.ListenerCondition.pathPatterns(["/dashboard/*"])],
healthCheck: {
path: "/dashboard/login",
interval: Duration.seconds(10),
timeout: Duration.seconds(8),
healthyThresholdCount: 2,
unhealthyThresholdCount: 3,
healthyHttpCodes: "200",
},
port: 3000,
protocol: elbv2.ApplicationProtocol.HTTP,
targets: [grafanaDashboardService],
}
);
}
}
</code></pre>
<p>その後、<code>cdk deploy</code> でインフラを構築します。</p>
<p><img src="https://i.gyazo.com/c7da0f6c6b5a57edee47ae20a8026f8f.png" alt="CDK によるインフラ構築が正常に実行された時の様子" /><br />
<strong>CDK によるインフラ構築が正常に実行された時の様子</strong></p>
<p>デプロイが正常に完了したのを確認したら、<code>Outputs</code> に出力されている <strong><code>PrometheusAgentTestStack.prometheusagenttestfargateserviceServiceURL<識別子></code> の URL 末尾に <code>/metrics</code> を付与してアクセスしてみます。</strong> 出力されている URL のフォーマットは <code>http://<識別子>.ap-northeast-1.elb.amazonaws.com</code> になります。</p>
<p>つまり、<strong><code>http://<識別子>.ap-northeast-1.elb.amazonaws.com/metrics</code> にアクセスします。</strong></p>
<p><img src="https://i.gyazo.com/c13a2b0efc3bb96e79b4f1f5a2886a8a.png" alt="ALB 経由で Node.js アプリにアクセス可能なことを確認する" /><br />
<strong>ALB 経由で Node.js アプリにアクセス可能なことを確認する</strong></p>
<p>また、<code>Outputs</code> に出力されている <strong><code>PrometheusAgentTestStack.promremotewriteurl</code> は後に利用する <code>エンドポイント - リモート書き込み URL</code> で使用するので控えておきます。</strong></p>
<p>ここまでで AWS CDK でのインフラ構築作業は完了しました。最後に Grafana で AMP のメトリクスを可視化するための作業を進めていきます。</p>
<h1 id="Grafana で Prometheus (AMP) のメトリクスを可視化する"><a href="#Grafana+%E3%81%A7+Prometheus+%28AMP%29+%E3%81%AE%E3%83%A1%E3%83%88%E3%83%AA%E3%82%AF%E3%82%B9%E3%82%92%E5%8F%AF%E8%A6%96%E5%8C%96%E3%81%99%E3%82%8B">Grafana で Prometheus (AMP) のメトリクスを可視化する</a></h1>
<p>先ほどの <code>/metrics</code> パスへのアクセス同様、<code>Outputs</code> に出力されている URL の末尾に <code>/dashboard/login</code> を付与してアクセスします。<strong>Grafana の初期ユーザおよびパスワードは <code>admin</code> となります。</strong></p>
<p>つまり、<code>http://<識別子>.ap-northeast-1.elb.amazonaws.com/dashboard/login</code> にアクセスしてみます。</p>
<p><img src="https://i.gyazo.com/fe4ea6515f54dec23234e10a93023a36.png" alt="ログインを行う" /></p>
<p>ログイン情報が正しければ、新しいパスワードを設定する画面に遷移するので新たなパスワードを入力してログインを終えます。ログイン後は、Prometheus (AMP) をデータソースとして追加するために下記の操作を行います。</p>
<p><img src="https://i.gyazo.com/599d49e4167ccc35c5d44d5df7678036.png" alt="1. 歯車アイコンをクリックして <code>Data sources</code> をクリックする" /><br />
<strong>1. 歯車アイコンをクリックして <code>Data sources</code> をクリックする</strong></p>
<p><img src="https://i.gyazo.com/e88bfc58a35deaa16a16920a5e551837.png" alt="2. <code>Add data source</code> ボタンをクリックする" /><br />
<strong>2. <code>Add data source</code> ボタンをクリックする</strong></p>
<p><img src="https://i.gyazo.com/1c8031a3182f03e20194bf0b76e66e5a.png" alt="3. データソースとして Prometheus を選択する" /><br />
<strong>3. データソースとして Prometheus を選択する</strong></p>
<p><img src="https://i.gyazo.com/1684c1fca9decb29e60bd654400fd06b.png" alt="4. Prometheus をデータソースとして追加する" /></p>
<p><img src="https://i.gyazo.com/2119361eac350044e783ed0c9280580a.png" alt="4. Prometheus をデータソースとして追加する" /></p>
<p><img src="https://i.gyazo.com/00cc7edbfc45dbd43ad3b0cccea72c7d.png" alt="4. Prometheus をデータソースとして追加する" /><br />
<strong>4. Prometheus をデータソースとして追加する</strong></p>
<p>Prometheus (AMP) に送信したメトリクスを Grafana で可視化するための準備が整ったので、実際に Grafana のダッシュボードでメトリクスを可視化してみます。手っ取り早くメトリクスを可視化するため、ダッシュボードには <a target="_blank" rel="nofollow noopener" href="https://grafana.com/grafana/dashboards/11159">NodeJS Application Dashboard</a> を利用します。</p>
<p><img src="https://i.gyazo.com/b36c0281e273e21fc9474666786281c3.png" alt="1. + アイコンをクリックして、<code>Import</code> をクリックする" /><br />
<strong>1. + アイコンをクリックして、<code>Import</code> をクリックする</strong></p>
<p><img src="https://i.gyazo.com/130718dff8b86758acb415764bd37338.png" alt="2. <code>NodeJS Application Dashboard</code> の ID を入力して <code>Load</code> ボタンをクリックする" /><br />
<strong>2. <code>NodeJS Application Dashboard</code> の ID を入力して <code>Load</code> ボタンをクリックする</strong></p>
<p><img src="https://i.gyazo.com/2aa8903f3f64d8021699cd5d4bfa9757.png" alt="3. 必要な情報を入力して <code>NodeJS Application Dashboard</code> のインポートを完了する" /><br />
<strong>3. 必要な情報を入力して <code>NodeJS Application Dashboard</code> のインポートを完了する</strong></p>
<p><img src="https://i.gyazo.com/1378b09c281da28653917ee40494dee8.png" alt="4. ダッシュボードから Prometheus のメトリクスが確認できる" /><br />
<strong>4. ダッシュボードから Node.js アプリのメトリクスが確認できる</strong></p>
<p>ここまでの手順でメトリクスの可視化は完了しましたが、負荷に応じて実際にメトリクスが変化する様子も確認してみます。<a target="_blank" rel="nofollow noopener" href="https://github.com/tsenart/vegeta">Vegeta</a> を利用して、実際に負荷をかけてみます。下記コマンドを実行します。</p>
<pre><code class="bash">echo 'GET http://<識別子>.ap-northeast-1.elb.amazonaws.com/metrics' | vegeta attack -duration=5s | vegeta report
</code></pre>
<p>その後、再び Grafana のダッシュボードを見にいきます。負荷をかけた時間帯のみグラフに変化があることを確認できるはずです。</p>
<p><img src="https://i.gyazo.com/d019d33d3e4bd321ae4d1f4bbecc6ef8.png" alt="ダッシュボードの CPU 使用率のグラフに変化があったことを確認できる" /><br />
<strong>ダッシュボードの CPU 使用率のグラフに変化があったことを確認できる</strong></p>
<h1 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h1>
<p>今回は ECS Fargate のメトリクスを Prometheus Agent で Amazon Managed Service for Prometheus (AMP) に送信し、それを Grafana で可視化する方法について紹介しました。</p>
<p>ECS のサービスでタスクを実行する場合は <a target="_blank" rel="nofollow noopener" href="https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/service-discovery.html">サービスディスカバリ</a> の利用が可能なため、Prometheus の <a target="_blank" rel="nofollow noopener" href="https://prometheus.io/docs/prometheus/latest/configuration/configuration/#dns_sd_config">サービスディスカバリの設定</a> を行うことで、単一の Prometheus で全てのコンテナのメトリクスを扱うことも可能です。</p>
<p>また Node.js アプリを作成する際に利用した <code>prom-client</code> で <a target="_blank" rel="nofollow noopener" href="https://github.com/siimon/prom-client#custom-metrics">カスタムメトリクス</a> を作成することで、監視したい項目を自由に増やすことも可能です。</p>
<p>本記事が ECS Fargate を監視する際の検討材料の 1 つとなれたら幸いです。</p>
<h1 id="参考リンク"><a href="#%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF">参考リンク</a></h1>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/fargate/">AWS Fargate(サーバーやクラスターの管理が不要なコンテナの使用)| AWS</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://prometheus.io/blog/2021/11/16/agent/">Introducing Prometheus Agent Mode, an Efficient and Cloud-Native Way for Metric Forwarding | Prometheus</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/prometheus/">Amazon Managed Service for Prometheus | フルマネージド Prometheus | Amazon Web Services</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://grafana.com/">Grafana: The open observability platform | Grafana Labs</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://aws.amazon.com/jp/cdk/">AWS クラウド開発キット – アマゾン ウェブ サービス</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/siimon/prom-client">siimon/prom-client: Prometheus client for node.js</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/tsenart/vegeta">tsenart/vegeta: HTTP load testing tool and library. It's over 9000!</a></li>
<li><a target="_blank" rel="nofollow noopener" href="https://grafana.com/grafana/dashboards/11159">NodeJS Application Dashboard dashboard for Grafana | Grafana Labs</a></li>
</ul>
nikaera