2024年10月11日金曜日

指定の期間における GCP インスタンスのネットワーク転送量を計算するスクリプト

指定の期間における GCP インスタンスのネットワーク転送量を計算するスクリプト

概要

例えば前月や当月の本日までの特定の VM におけるネットワーク転送量が知りたいケースがあるかなと思います
コンソールだと合計値が見れないのでスクリプトを作成してみました

環境

  • macOS 15.0.1
  • Python python 3.11.10
  • gcloud 491.0.0
    • google-cloud-monitoring 2.22.2
  • GCP (2024/10/08 時点)

インストール

  • pipenv install google-cloud-monitoring

認証

  • gcloud auth application-default login

集計スクリプト

前月分集計する場合は以下のようになります
プロジェクトIDとVM名の部分は適宜変更してください

from datetime import datetime, timedelta

from google.cloud import monitoring_v3


def get_network_usage(project_id, instance_name):
    now = datetime.now()
    current_month_start = datetime(now.year, now.month, 1)
    # 前月の開始日時を計算
    last_month_end = current_month_start - timedelta(
        seconds=1
    )  # 前月の終了日時(現在の月開始日の前日23:59:59)
    last_month_start = datetime(
        last_month_end.year, last_month_end.month, 1
    )  # 前月の開始日時
    print(last_month_end)
    print(last_month_start)
    # UNIX タイムスタンプに変換
    start_time = int(last_month_start.timestamp())
    end_time = int(last_month_end.timestamp())

    # クライアントの作成
    client = monitoring_v3.MetricServiceClient()

    # プロジェクト名の設定
    project_name = f"projects/{project_id}"
    # メトリックス取得期間の設定
    interval = monitoring_v3.TimeInterval(
        {
            "end_time": {"seconds": end_time},
            "start_time": {"seconds": start_time},
        }
    )
    # 取得するメトリクス情報の設定
    filter_str = (
        f'metric.type="compute.googleapis.com/instance/network/received_bytes_count" '
        # f'metric.type="compute.googleapis.com/instance/network/sent_bytes_count" '  # 送信量に関してはこちら
        f'AND metric.label.instance_name="{instance_name}"'
    )

    # メトリクスデータを取得
    results = client.list_time_series(
        name=project_name,
        filter=filter_str,
        interval=interval,
        view=monitoring_v3.ListTimeSeriesRequest.TimeSeriesView.FULL,
    )
    # 合計値を計算
    total_received_bytes = sum(
        [point.value.int64_value for ts in results for point in ts.points]
    )
    print(f"Total received bytes: {total_received_bytes / 1024 / 1024} MB")


# 例: プロジェクト ID とインスタンス ID を使って前月分のネットワーク受信量を計算
get_network_usage("project-123456", "web")

当日までの今月分の転送量

当日分までの転送量の場合は以下です
日付の計算部分だけ変更しています

from datetime import datetime

from google.cloud import monitoring_v3


def get_network_usage(project_id, instance_name):
    # 現在の UTC 日付と時刻を取得
    now = datetime.now()
    # 今月の開始日時を設定
    current_month_start = datetime(now.year, now.month, 1)
    # UNIX タイムスタンプに変換
    start_time = int(current_month_start.timestamp())
    end_time = int(now.timestamp())

    # クライアントの作成
    client = monitoring_v3.MetricServiceClient()

    # プロジェクト名の設定
    project_name = f"projects/{project_id}"
    # メトリックス取得期間の設定
    interval = monitoring_v3.TimeInterval(
        {
            "end_time": {"seconds": end_time},
            "start_time": {"seconds": start_time},
        }
    )
    # 取得するメトリクス情報の設定
    filter_str = (
        f'metric.type="compute.googleapis.com/instance/network/received_bytes_count" '
        # f'metric.type="compute.googleapis.com/instance/network/sent_bytes_count" '  # 送信量に関してはこちら
        f'AND metric.label.instance_name="{instance_name}"'
    )

    # メトリクスデータを取得
    results = client.list_time_series(
        name=project_name,
        filter=filter_str,
        interval=interval,
        view=monitoring_v3.ListTimeSeriesRequest.TimeSeriesView.FULL,
    )
    # 合計値を計算
    total_received_bytes = sum(
        [point.value.int64_value for ts in results for point in ts.points]
    )
    print(f"Total received bytes: {total_received_bytes / 1024 / 1024} MB")


# 例: プロジェクト ID とインスタンス ID を使って前月分のネットワーク受信量を計算
get_network_usage("project-123456", "web")

最後に

GCP のインスタンスが一ヶ月でどれくらいネットワーク通信をしているのか確認するのに使えると思います
具体的な取得方法は GCP 側でブラックボックスになっているのでどこにどれくらい通信したのかはわかりませんがおおよその目安として使用量がわかるかなと思います

何もしていなくても数GBの通信はしていることが確認できました

参考サイト

0 件のコメント:

コメントを投稿