🏆
LambdaとPrometheusのNode Exporterでカスタムメトリクスを作成する
Node Exporterをサーバーにインストール
まずはサーバーの/tmp
ディレクトリにNode Exporterをインストールします。
wget https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz -P /tmp
/etc
ディレクトリにprometheus
ディレクトリを作成して、そちらに解凍後、解凍前のファイルを削除します。
sudo mkdir /etc/prometheus
sudo tar xfz node_exporter-1.2.2.linux-amd64.tar.gz -C /etc/prometheus/
rm /tmp/node_exporter-1.2.2.linux-amd64.tar.gz
カスタムメトリクス用のテキストファイルを格納するディレクトリも作成しておきます。
sudo mkdir /etc/prometheus/textfile
node_exporter
サービスを作成します。
sudo vi /etc/systemd/system/node_exporter.service
中身は下記の通りにします。起動時に--collector.textfile.directory
オプションを使用して、先ほど作成したディレクトリを指定します。
[Unit]
Description=node exporter
After=syslog.target network.target
[Service]
Type=simple
ExecStart=/etc/prometheus/node_exporter-1.2.2.linux-amd64/node_exporter --collector.textfile.directory=/etc/prometheus/textfile
ExecStop=/bin/kill -INT $MAINPID
Restart = always
[Install]
WantedBy=multi-user.target
保存したら変更を反映して、起動します。
sudo systemctl daemon-reload
sudo systemctl start node_exporter.service
起動しているかも確認しましょう。
systemctl status node_exporter.service
Lambdaの作成
Lambdaの作成にはServerless Frameworkを使用します。Serverless Frameworkをインストールしてください。
npm install -g serverless
プロジェクトの作成を行います。
serverless create --template aws-python3 --path custom-metrics
cd custom-metrics
serverless.yml
を下記のように変更します。
serverless.yml
service: custom-metrics
provider:
name: aws
runtime: python3.10
region: ap-northeast-1
iam:
role:
statements:
- Effect: Allow
Action:
- "ssm:SendCommand"
- "ssm:ListCommands"
- "ssm:DescribeCommands"
- "ssm:GetCommandInvocation"
Resource:
- "*"
functions:
runCommandFunction:
handler: handler.lambda_handler
events:
- schedule: rate(1 minute)
handler.py
を下記のように変更します。インスタンスIDの指定も忘れないでください。
handler.py
import boto3
def lambda_handler(event, context):
ssm_client = boto3.client('ssm')
# 実行するコマンドを指定
command = "echo random_number $RANDOM > /etc/prometheus/textfile/random_number.prom"
response = ssm_client.send_command(
InstanceIds=['i-xxxxxxxxxxxxxxxxx'], # 実行対象のEC2インスタンスのIDを指定
DocumentName='AWS-RunShellScript',
Parameters={'commands': [command]},
)
command_id = response['Command']['CommandId']
instance_id = response['Command']['InstanceIds'][0]
return {
'statusCode': 200,
'body': f'Command {command_id} sent to instance {instance_id}'
}
このコマンドで、random_numberというメトリクスを作成しています。
1分毎にランダムな数字を生成します。
echo random_number $RANDOM > /etc/prometheus/textfile/random_number.prom
*.prom
のファイルに
メトリクス名 数字
のような形式の文字列があるとNode ExporterがPrometheusのメトリクスを作成してくれます。
これでデプロイします。
serverless deploy
確認
デプロイに成功して1分以上経過したら、サーバー内で下記コマンドを実行してみてください。
curl localhost:9100/metrics
random_numberというメトリクスが取得できるようになりました。
1分後に再度確認して、値が変化しているか確認してみてください。
# HELP random_number Metric read from /etc/prometheus/textfile/random_number.prom
# TYPE random_number untyped
random_number 18351
今回はランダムな数値を生成しましたが、各自コマンドを用意して独自のカスタムメトリクスを作成してみてください。
Discussion