Configuring Nomad Client Metrics

Nomad Metrics is a helper service used to collect metrics data from the Nomad server and clients running on the Services and Nomad instances respectively. Metrics are collected and sent using the DogStatsD protocol and sent to the Services machine.

Nomad メトリクスサーバー

The Nomad Metrics container is run on the services host using the server flag and is installed as part of the CircleCI Server installation process, requiring no additional configuration.

Nomad メトリクスクライアント

The Nomad Metrics client is installed and run on all Nomad client instances. Nomad メトリクスクライアントをインストールおよび設定するには、AWS の起動設定を更新する必要があります。 Additionally, you will need to modify the AWS security group to ensure that UDP port 8125 is open on the Services machine. Steps for both configuration changes are explained below.

Before proceeding, you should be logged into the EC2 Service section of the AWS Console. 必ず、CircleCI Server の実行に使用する領域にログインしてください。

Updating the Services machine Security Group

  1. 左のサイドバーで、[Instances (インスタンス)] グループの下にある [Instances (インスタンス)] リンクを選択します。

  2. Services Box のインスタンスを選択します。 [name (名前)] タグは通常、circleci_services のように表示されています。

  3. ページ下部の [description (説明)] ボックスで、[Security Groups (セキュリティグループ)] セクションの隣にあるユーザーセキュリティグループのリンクを選択します。 通常、*_users_sg のように表示されています。

  4. これにより、[Security Groups (セキュリティグループ)] ページに移動し、ユーザーセキュリティグループが強調表示されます。 ページ下部の [description (説明)] ボックスで、[Inbound (インバウンド)] タブを選択してから [Edit (編集)] ボタンを選択します。

  5. [Add a Rule (ルールを追加する)] ボタンを選択します。 ドロップダウンから [Custom UDP Rule (カスタム UDP のルール)] を選択します。 [Port Range (ポートの範囲)] フィールドに「8125」と入力します。

  6. [source (ソース)] フィールドには、いくつかのオプションが用意されています。 VPC とサブネットの設定を考慮してオプションを選択してください。 一般的なシナリオを以下に示します。

    1. (推奨) Nomad クライアントサブネットからのトラフィックを許可します。 通常は、ポート 4647 または 3001 に使用されるエントリに一致させます。 たとえば、10.0.0.0/24 などです。

    2. UDP ポート 8125 へのすべてのトラフィックで 0.0.0.0/0 を使用することを許可します。

  7. [Save (保存する)] ボタンを押します。

AWS 起動設定の更新

前提条件

AWS EC2 起動設定 の ID
  1. 左のサイドバーで [Auto Scaling Groups (Auto Scaling グループ)] (ASG) リンクを選択します。

  2. Locate the ASG with a name tag similar to`*_nomad_clients_asg`

  3. 起動設定名が ASG 名の隣に表示されます (例:terraform-20180814231555427200000001)。

AWS EC2 Services Box のプライベート IP アドレス
  1. 左のサイドバーで、[Instances (インスタンス)] グループの下にある [Instances (インスタンス)] リンクを選択します。

  2. Services Box のインスタンスを選択します。 [name (名前)] タグは通常、circleci_services のように表示されています。

  3. ページ下部の [description (説明)] ボックスに表示されているプライベート IP アドレスをメモします。

起動設定の更新

  1. 左のサイドバーで、[Auto Scaling] の下にある [Launch Configurations (起動設定)] リンクを選択します。 前の手順で取得した起動設定を選択します。

  2. ページ下部の [description (説明)] ボックスで、[Copy launch configuration (起動設定をコピーする)] ボタンを選択します。

  3. Once the configuration page opens, select 3. Configure details link located at the top of the page.

  4. [Name (名前)] フィールドを nomad-builder-with-metrics-lc-DATE などのわかりやすい名前で更新します。

  5. [Advanced Details (詳細情報)] ドロップダウンを選択します。

  6. 下のテキストフィールドから [User data (ユーザーデータ)] に起動設定スクリプトをコピー&ペーストします。

  7. *重要:*10行目に Services Box のプライベート IP アドレスを入力してください (例:export SERVICES_PRIVATE_IP="192.168.1.2")。

  8. Select the Skip to review button and then the Create launch configuration button.

#!/bin/bash

set -exu

export http_proxy=""
export https_proxy=""
export no_proxy=""
export aws_instance_metadata_url="http://169.254.169.254"
export PUBLIC_IP="$(curl $aws_instance_metadata_url/latest/meta-data/public-ipv4)"
export PRIVATE_IP="$(curl $aws_instance_metadata_url/latest/meta-data/local-ipv4)"
export DEBIAN_FRONTEND=noninteractive
UNAME="$(uname -r)"
export CONTAINER_NAME="nomad_metrics"
export CONTAINER_IMAGE="circleci/nomad-metrics:0.1.198-5f5befe"
export SERVICES_PRIVATE_IP=""
export NOMAD_METRICS_PORT="8125"

echo "-------------------------------------------"
echo "     Performing System Updates"
echo "-------------------------------------------"
apt-get update && apt-get -y upgrade

echo "--------------------------------------"
echo "        Installing NTP"
echo "--------------------------------------"
apt-get install -y ntp

# Use AWS NTP config for EC2 instances and default for non-AWS
if [ -f /sys/hypervisor/uuid ] && [ `head -c 3 /sys/hypervisor/uuid` == ec2 ]; then
cat <<EOT > /etc/ntp.conf
driftfile /var/lib/ntp/ntp.drift
disable monitor

restrict default ignore
restrict 127.0.0.1 mask 255.0.0.0
restrict 169.254.169.123 nomodify notrap

server 169.254.169.123 prefer iburst
EOT
else
  echo "USING DEFAULT NTP CONFIGURATION"
fi

service ntp restart

echo "--------------------------------------"
echo "        Installing Docker"
echo "--------------------------------------"
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get install -y "linux-image-$UNAME"
apt-get update
apt-get -y install docker-ce=5:18.09.9~3-0~ubuntu-xenial

# force docker to use userns-remap to mitigate CVE 2019-5736
apt-get -y install jq
mkdir -p /etc/docker
[ -f /etc/docker/daemon.json ] || echo '{}' > /etc/docker/daemon.json
tmp=$(mktemp)
cp /etc/docker/daemon.json /etc/docker/daemon.json.orig
jq '.["userns-remap"]="default"' /etc/docker/daemon.json > "$tmp" && mv "$tmp" /etc/docker/daemon.json

sudo echo 'export http_proxy="${http_proxy}"' >> /etc/default/docker
sudo echo 'export https_proxy="${https_proxy}"' >> /etc/default/docker
sudo echo 'export no_proxy="${no_proxy}"' >> /etc/default/docker
sudo service docker restart
sleep 5

echo "--------------------------------------"
echo " Populating /etc/circleci/public-ipv4"
echo "--------------------------------------"
if ! (echo $PUBLIC_IP | grep -qP "^[\d.]+$")
then
  echo "Setting the IPv4 address below in /etc/circleci/public-ipv4."
  echo "This address will be used in builds with \"Rebuild with SSH\"."
  mkdir -p /etc/circleci
  echo $PRIVATE_IP | tee /etc/circleci/public-ipv4
fi

echo "--------------------------------------"
echo "         Installing nomad"
echo "--------------------------------------"
apt-get install -y zip
curl -o nomad.zip https://releases.hashicorp.com/nomad/0.9.3/nomad_0.9.3_linux_amd64.zip
unzip nomad.zip
mv nomad /usr/bin

echo "--------------------------------------"
echo "      Creating config.hcl"
echo "--------------------------------------"
export INSTANCE_ID="$(curl $aws_instance_metadata_url/latest/meta-data/instance-id)"
mkdir -p /etc/nomad
cat <<EOT > /etc/nomad/config.hcl
log_level = "DEBUG"
name = "$INSTANCE_ID"
data_dir = "/opt/nomad"
datacenter = "default"
advertise {
    http = "$PRIVATE_IP"
    rpc = "$PRIVATE_IP"
    serf = "$PRIVATE_IP"
}
client {
    enabled = true
    # Expecting to have DNS record for nomad server(s)
    servers = ["$SERVICES_PRIVATE_IP:4647"]
    node_class = "linux-64bit"
    options = {"driver.raw_exec.enable" = "1"}
}

telemetry {
    publish_node_metrics = true
    statsd_address = "$SERVICES_PRIVATE_IP:8125"
}
EOT

echo "--------------------------------------"
echo "      Creating nomad.conf"
echo "--------------------------------------"
cat <<EOT > /etc/systemd/system/nomad.service
[Unit]
Description="nomad"
[Service]
Restart=always
RestartSec=30
TimeoutStartSec=1m
ExecStart=/usr/bin/nomad agent -config /etc/nomad/config.hcl
[Install]
WantedBy=multi-user.target
EOT

echo "--------------------------------------"
echo "   Creating ci-privileged network"
echo "--------------------------------------"
docker network create --driver=bridge --opt com.docker.network.bridge.name=ci-privileged ci-privileged

echo "--------------------------------------"
echo "      Starting Nomad service"
echo "--------------------------------------"
service nomad restart

echo "--------------------------------------"
echo "      Setting up Nomad metrics"
echo "--------------------------------------"
docker pull $CONTAINER_IMAGE
docker rm -f $CONTAINER_NAME || true

docker run -d --name $CONTAINER_NAME \
    --rm \
    --net=host \
    --userns=host \
    $CONTAINER_IMAGE \
    start --nomad-uri=http://localhost:4646 --statsd-host=$SERVICES_PRIVATE_IP --statsd-port=$NOMAD_METRICS_PORT --client

Auto Scaling グループの更新

  1. 左のサイドバーで [Auto Scaling Groups (Auto Scaling グループ)] (ASG) リンクを選択します。

  2. Select the ASG with a name tag similar to *_nomad_clients_asg.

  3. In the description box at the bottom, select the Edit button.

  4. ドロップダウンから、新たに作成した起動設定を選択します。

  5. [Save (保存する)] ボタンを押します。

  6. この時点で、古い Nomad クライアントインスタンスはシャットダウンを開始し、 Nomad メトリクスを実行する新しい Nomad クライアントに置き換えられます。

StatsD メトリクス

Metrics sent via StatsD will be updated every 10s.

--server

終了状態 (completedead) にあるジョブの数は、通常、Nomad がその状態からジョブをガベージコレクションするまで増えていきます。
名前 タイプ お問い合わせ内容

circle.nomad.server_agent.poll_failure

ゲージ

Nomad エージェントの最後のポーリングが失敗した場合は 1、そうでない場合は 0 が返されます。 このゲージは、Nomad メトリクスが --client モードと --server モードで同時に動作しているときに、circle.nomad.client_agent.poll_failure からは独立して設定されます。

circle.nomad.server_agent.jobs.pending

ゲージ

クラスタ全体の保留中のジョブの総数を返します。

circle.nomad.server_agent.jobs.running

ゲージ

クラスタ全体の実行中のジョブの総数を返します。

circle.nomad.server_agent.jobs.complete

ゲージ

クラスタ全体の完了したジョブの総数を返します。

circle.nomad.server_agent.jobs.dead

ゲージ

クラスタ全体で停止しているジョブの総数を返します。

--client

名前 タイプ お問い合わせ内容

circle.nomad.client_agent.poll_failure

ゲージ

Nomad エージェントの最後のポーリングが失敗した場合は 1、そうでない場合は 0 が返されます。

circle.nomad.client_agent.resources.total.cpu

ゲージ

(以下の説明を参照してください)

circle.nomad.client_agent.resources.used.cpu

ゲージ

(以下の説明を参照してください)

circle.nomad.client_agent.resources.available.cpu

ゲージ

(以下の説明を参照してください)

circle.nomad.client_agent.resources.total.memory

ゲージ

(以下の説明を参照してください)

circle.nomad.client_agent.resources.used.memory

ゲージ

(以下の説明を参照してください)

circle.nomad.client_agent.resources.available.memory

ゲージ

(以下の説明を参照してください)

circle.nomad.client_agent.resources.total.disk

ゲージ

(以下の説明を参照してください)

circle.nomad.client_agent.resources.used.disk

ゲージ

(以下の説明を参照してください)

circle.nomad.client_agent.resources.available.disk

ゲージ

(以下の説明を参照してください)

circle.nomad.client_agent.resources.total.iops

ゲージ

(以下の説明を参照してください)

circle.nomad.client_agent.resources.used.iops

ゲージ

(以下の説明を参照してください)

circle.nomad.client_agent.resources.available.iops

ゲージ

(以下の説明を参照してください)

  • CPU リソースは MHz 単位で報告されます。 メモリリソースは MB 単位で報告されます。 ディスク (容量) リソースは MB 単位で報告されます。

  • リソースメトリクスは、Nomad メトリクスがポーリングするように設定されている Nomad ノードをその範囲とします。 --client モードで動作している単一の Nomad メトリクスジョブから得られた数値は、クラスタ全体を代表する数値とは_言えません_ (ただし、これらの時系列のデータを外部のメカニズムによって集計することで、クラスタ全体の傾向をつかむことはできます)。

  • circle.nomad.client_agent.resources 名前空間内のメトリクスにはすべて、DogStatsD への書き込み時に以下のタグが付けられます。

    • drain: true if the Nomad node has been marked as drained; false otherwise.

    • statusinitializingready、または down のいずれかが付けられます。



Help make this document better

This guide, as well as the rest of our docs, are open-source and available on GitHub. We welcome your contributions.