🏆

LambdaとPrometheusのNode Exporterでカスタムメトリクスを作成する

2023/08/29に公開

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