Google Cloud Platformに戻る

Cloud Monitoring

Cloud Monitoringとは

Cloud Monitoringは、Google Cloud Platform (GCP) が提供するフルマネージドのモニタリングサービスです。GCPリソース、オンプレミス環境、他のクラウドプロバイダーからのメトリクスやイベントを収集、表示、分析、アラート設定するための統合プラットフォームを提供します。Cloud Monitoringは、システムの可用性、パフォーマンス、健全性を監視し、問題が発生する前に検出して対応するための重要なツールです。

Cloud Monitoringの主な特徴

Cloud Monitoringのアーキテクチャ

Cloud Monitoringは以下の主要コンポーネントで構成されています:

コンポーネント 説明
Monitoring API メトリクスの書き込み、読み取り、管理のためのAPI
メトリクスストア 収集したメトリクスデータを保存するためのデータベース
ダッシュボードエンジン メトリクスを視覚化するためのダッシュボードを提供
アラートエンジン メトリクスに基づいてアラートを生成
Monitoring Agent Compute EngineやKubernetesなどの環境からメトリクスを収集するエージェント
稼働時間チェッカー エンドポイントの可用性を監視するサービス

Cloud Monitoring と他のモニタリングサービスの違い

Cloud Monitoringと他のモニタリングサービスには以下のような違いがあります:

Cloud Monitoringの使用方法

Cloud Monitoringは、Google Cloud Console、gcloud CLIツール、クライアントライブラリ、またはRESTful APIを使用して利用できます。

メトリクスの表示と分析

Google Cloud Consoleのメトリクスエクスプローラーを使用して、メトリクスを表示、分析できます:

基本的なメトリクスクエリの例

resource.type="gce_instance"
metric.type="compute.googleapis.com/instance/cpu/utilization"
resource.labels.zone="us-central1-a"

高度なメトリクスクエリの例

fetch gce_instance
| metric 'compute.googleapis.com/instance/cpu/utilization'
| filter resource.zone = 'us-central1-a'
| group_by 1m, [value_utilization_mean: mean(value.utilization)]
| every 1m
| group_by [resource.instance_id],
    [value_utilization_mean_max: max(value_utilization_mean)]

ダッシュボードの作成

カスタムダッシュボードを作成して、重要なメトリクスを可視化できます:

gcloud CLIを使用したダッシュボードの作成

gcloud monitoring dashboards create \
  --config-from-file=dashboard.json

ダッシュボード設定のJSON例

{
  "displayName": "CPU使用率ダッシュボード",
  "gridLayout": {
    "widgets": [
      {
        "title": "インスタンス別CPU使用率",
        "xyChart": {
          "dataSets": [
            {
              "timeSeriesQuery": {
                "timeSeriesFilter": {
                  "filter": "resource.type=\"gce_instance\" AND metric.type=\"compute.googleapis.com/instance/cpu/utilization\"",
                  "aggregation": {
                    "perSeriesAligner": "ALIGN_MEAN",
                    "crossSeriesReducer": "REDUCE_MEAN",
                    "groupByFields": [
                      "resource.label.instance_id"
                    ]
                  }
                }
              },
              "plotType": "LINE"
            }
          ],
          "timeshiftDuration": "0s",
          "yAxis": {
            "label": "y1",
            "scale": "LINEAR"
          }
        }
      }
    ]
  }
}

アプリケーションからのメトリクス出力

アプリケーションからCloud Monitoringにカスタムメトリクスを出力するには、各言語用のクライアントライブラリを使用します:

Node.jsでのメトリクス出力例

const monitoring = require('@google-cloud/monitoring');
const client = new monitoring.MetricServiceClient();

async function writeMetric() {
  const projectId = 'my-project';
  const projectName = client.projectPath(projectId);

  const dataPoint = {
    interval: {
      endTime: {
        seconds: Date.now() / 1000
      }
    },
    value: {
      doubleValue: 123.45
    }
  };

  const timeSeriesData = {
    metric: {
      type: 'custom.googleapis.com/my_metric',
      labels: {
        environment: 'production'
      }
    },
    resource: {
      type: 'global',
      labels: {}
    },
    points: [dataPoint]
  };

  const request = {
    name: projectName,
    timeSeries: [timeSeriesData]
  };

  const result = await client.createTimeSeries(request);
  console.log('Wrote custom metric:', result);
}

writeMetric();

Pythonでのメトリクス出力例

from google.cloud import monitoring_v3
import time

client = monitoring_v3.MetricServiceClient()
project_name = f"projects/my-project"

series = monitoring_v3.TimeSeries()
series.metric.type = "custom.googleapis.com/my_metric"
series.metric.labels["environment"] = "production"

series.resource.type = "global"

point = series.points.add()
point.value.double_value = 123.45
now = time.time()
point.interval.end_time.seconds = int(now)

client.create_time_series(name=project_name, time_series=[series])

Javaでのメトリクス出力例

import com.google.api.Metric;
import com.google.api.MonitoredResource;
import com.google.cloud.monitoring.v3.MetricServiceClient;
import com.google.monitoring.v3.CreateTimeSeriesRequest;
import com.google.monitoring.v3.Point;
import com.google.monitoring.v3.ProjectName;
import com.google.monitoring.v3.TimeInterval;
import com.google.monitoring.v3.TimeSeries;
import com.google.monitoring.v3.TypedValue;
import com.google.protobuf.Timestamp;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MonitoringExample {
  public static void main(String[] args) throws Exception {
    String projectId = "my-project";
    
    try (MetricServiceClient metricServiceClient = MetricServiceClient.create()) {
      ProjectName name = ProjectName.of(projectId);
      
      Map<String, String> metricLabels = new HashMap<>();
      metricLabels.put("environment", "production");
      
      Metric metric = Metric.newBuilder()
          .setType("custom.googleapis.com/my_metric")
          .putAllLabels(metricLabels)
          .build();
      
      MonitoredResource resource = MonitoredResource.newBuilder()
          .setType("global")
          .build();
      
      long now = System.currentTimeMillis();
      TimeInterval interval = TimeInterval.newBuilder()
          .setEndTime(Timestamp.newBuilder().setSeconds(now / 1000))
          .build();
      
      TypedValue value = TypedValue.newBuilder()
          .setDoubleValue(123.45)
          .build();
      
      Point point = Point.newBuilder()
          .setInterval(interval)
          .setValue(value)
          .build();
      
      List<Point> pointList = new ArrayList<>();
      pointList.add(point);
      
      TimeSeries timeSeries = TimeSeries.newBuilder()
          .setMetric(metric)
          .setResource(resource)
          .addAllPoints(pointList)
          .build();
      
      List<TimeSeries> timeSeriesList = new ArrayList<>();
      timeSeriesList.add(timeSeries);
      
      CreateTimeSeriesRequest request = CreateTimeSeriesRequest.newBuilder()
          .setName(name.toString())
          .addAllTimeSeries(timeSeriesList)
          .build();
      
      metricServiceClient.createTimeSeries(request);
      System.out.println("Custom metric written successfully");
    }
  }
}

アラートポリシーの設定

メトリクスのしきい値に基づいてアラートポリシーを設定できます:

gcloud CLIを使用したアラートポリシーの作成

gcloud alpha monitoring policies create \
  --display-name="High CPU Usage Alert" \
  --condition-filter="metric.type=\"compute.googleapis.com/instance/cpu/utilization\" AND resource.type=\"gce_instance\"" \
  --condition-threshold-value=0.8 \
  --condition-threshold-duration=60s \
  --notification-channels="projects/my-project/notificationChannels/1234567890"

アラートポリシー設定のJSON例

{
  "displayName": "High CPU Usage Alert",
  "conditions": [
    {
      "displayName": "CPU usage above 80%",
      "conditionThreshold": {
        "filter": "metric.type=\"compute.googleapis.com/instance/cpu/utilization\" AND resource.type=\"gce_instance\"",
        "aggregations": [
          {
            "alignmentPeriod": "60s",
            "perSeriesAligner": "ALIGN_MEAN"
          }
        ],
        "comparison": "COMPARISON_GT",
        "thresholdValue": 0.8,
        "duration": "60s",
        "trigger": {
          "count": 1
        }
      }
    }
  ],
  "alertStrategy": {
    "autoClose": "604800s"
  },
  "combiner": "OR",
  "notificationChannels": [
    "projects/my-project/notificationChannels/1234567890"
  ]
}

稼働時間チェックの設定

エンドポイントの可用性を監視するための稼働時間チェックを設定できます:

gcloud CLIを使用した稼働時間チェックの作成

gcloud monitoring uptime-checks create http \
  --display-name="Website Uptime Check" \
  --uri="https://example.com" \
  --check-interval=60s \
  --timeout=10s \
  --content-matcher="substring=\"Welcome\""

メトリクスの種類と構造

Cloud Monitoringでは、様々な種類のメトリクスが収集されます:

主なメトリクスの種類

メトリクスの構造

メトリクスは以下の主要コンポーネントで構成されています:

メトリクスのJSON表現例

{
  "metric": {
    "type": "compute.googleapis.com/instance/cpu/utilization",
    "labels": {
      "instance_name": "my-instance"
    }
  },
  "resource": {
    "type": "gce_instance",
    "labels": {
      "instance_id": "1234567890123456789",
      "zone": "us-central1-a",
      "project_id": "my-project"
    }
  },
  "metricKind": "GAUGE",
  "valueType": "DOUBLE",
  "points": [
    {
      "interval": {
        "startTime": "2023-01-15T12:34:56.789Z",
        "endTime": "2023-01-15T12:34:56.789Z"
      },
      "value": {
        "doubleValue": 0.75
      }
    }
  ]
}

サービスレベル目標(SLO)

Cloud Monitoringでは、サービスの信頼性を測定するためのサービスレベル目標(SLO)を設定できます:

gcloud CLIを使用したSLOの作成

gcloud alpha monitoring slos create \
  --service=my-service \
  --display-name="API Availability" \
  --goal=0.99 \
  --rolling-period=30d \
  --request-based \
  --method="good_service_filter=metric.type=\"serviceruntime.googleapis.com/api/request_count\" AND metric.labels.response_code_class=\"2xx\"" \
  --method="bad_service_filter=metric.type=\"serviceruntime.googleapis.com/api/request_count\" AND metric.labels.response_code_class!=\"2xx\""

Cloud Monitoringのセキュリティ

Cloud Monitoringでは、メトリクスデータのセキュリティを確保するための様々な機能が提供されています:

アクセス制御

IAMを使用して、メトリクスデータへのアクセスを制御できます:

# メトリクス閲覧者ロールの付与
gcloud projects add-iam-policy-binding my-project \
  --member=user:user@example.com \
  --role=roles/monitoring.viewer

# メトリクス編集者ロールの付与
gcloud projects add-iam-policy-binding my-project \
  --member=serviceAccount:my-service-account@my-project.iam.gserviceaccount.com \
  --role=roles/monitoring.editor

Cloud Monitoringのベストプラクティス

Cloud Monitoringを効果的に活用するためのベストプラクティス:

メトリクス設計のベストプラクティス

運用のベストプラクティス

コスト最適化のヒント

Cloud Monitoringのユースケース

Cloud Monitoringは以下のようなユースケースに適しています:

ユースケース例:マイクロサービスの監視

マイクロサービス監視のダッシュボード設定例

{
  "displayName": "マイクロサービス監視ダッシュボード",
  "gridLayout": {
    "widgets": [
      {
        "title": "サービス別リクエスト数",
        "xyChart": {
          "dataSets": [
            {
              "timeSeriesQuery": {
                "timeSeriesFilter": {
                  "filter": "resource.type=\"k8s_container\" AND metric.type=\"kubernetes.io/container/request_count\"",
                  "aggregation": {
                    "perSeriesAligner": "ALIGN_RATE",
                    "crossSeriesReducer": "REDUCE_SUM",
                    "groupByFields": [
                      "metadata.system_labels.service_name"
                    ]
                  }
                }
              },
              "plotType": "LINE"
            }
          ]
        }
      },
      {
        "title": "サービス別エラーレート",
        "xyChart": {
          "dataSets": [
            {
              "timeSeriesQuery": {
                "timeSeriesFilter": {
                  "filter": "resource.type=\"k8s_container\" AND metric.type=\"kubernetes.io/container/error_count\"",
                  "aggregation": {
                    "perSeriesAligner": "ALIGN_RATE",
                    "crossSeriesReducer": "REDUCE_SUM",
                    "groupByFields": [
                      "metadata.system_labels.service_name"
                    ]
                  }
                }
              },
              "plotType": "LINE"
            }
          ]
        }
      },
      {
        "title": "サービス別レイテンシ",
        "xyChart": {
          "dataSets": [
            {
              "timeSeriesQuery": {
                "timeSeriesFilter": {
                  "filter": "resource.type=\"k8s_container\" AND metric.type=\"kubernetes.io/container/latency\"",
                  "aggregation": {
                    "perSeriesAligner": "ALIGN_PERCENTILE_99",
                    "crossSeriesReducer": "REDUCE_MEAN",
                    "groupByFields": [
                      "metadata.system_labels.service_name"
                    ]
                  }
                }
              },
              "plotType": "LINE"
            }
          ]
        }
      }
    ]
  }
}

Cloud Monitoringとの統合サービス

Cloud Monitoringは他のGoogle Cloudサービスと統合して、より強力なソリューションを構築できます:

サービス 統合の利点
Cloud Logging ログとメトリクスを組み合わせた総合的な監視
Cloud Trace 分散トレーシングとメトリクスの関連付けによる詳細な問題診断
Error Reporting アプリケーションエラーの自動検出と集約
Cloud Profiler アプリケーションのパフォーマンスボトルネックの特定
Cloud Debugger 本番環境でのコードのデバッグ
Cloud Functions メトリクスに基づいた自動化アクションの実行
Pub/Sub メトリクスイベントに基づいたリアルタイム処理

Cloud Loggingとの統合例

ログベースのメトリクスの作成

# ログベースのカウンターメトリクスの作成
gcloud logging metrics create error-count \
  --description="Count of error log entries" \
  --filter="severity>=ERROR" \
  --metric-descriptor-type=counter

まとめ

Cloud Monitoring は、Google Cloud Platform上でのモニタリングサービスとして、様々なソースからのメトリクスやイベントを収集、表示、分析、アラート設定するための統合プラットフォームを提供します。システムの可用性、パフォーマンス、健全性を監視し、問題が発生する前に検出して対応するための重要なツールです。

Cloud Monitoringの主な利点は以下の通りです:

Cloud Monitoringを効果的に活用するには、適切なメトリクスの選択、メトリクスの標準化、ダッシュボードの階層化、アラートの最適化、SLOの設定などのベストプラクティスを適用することが重要です。また、コスト最適化のために、不要なメトリクスの収集を避け、適切なサンプリングレートを設定することも検討すべきです。