Cloud Monitoringは、Google Cloud Platform (GCP) が提供するフルマネージドのモニタリングサービスです。GCPリソース、オンプレミス環境、他のクラウドプロバイダーからのメトリクスやイベントを収集、表示、分析、アラート設定するための統合プラットフォームを提供します。Cloud Monitoringは、システムの可用性、パフォーマンス、健全性を監視し、問題が発生する前に検出して対応するための重要なツールです。
Cloud Monitoringは以下の主要コンポーネントで構成されています:
コンポーネント | 説明 |
---|---|
Monitoring API | メトリクスの書き込み、読み取り、管理のためのAPI |
メトリクスストア | 収集したメトリクスデータを保存するためのデータベース |
ダッシュボードエンジン | メトリクスを視覚化するためのダッシュボードを提供 |
アラートエンジン | メトリクスに基づいてアラートを生成 |
Monitoring Agent | Compute EngineやKubernetesなどの環境からメトリクスを収集するエージェント |
稼働時間チェッカー | エンドポイントの可用性を監視するサービス |
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 monitoring dashboards create \
--config-from-file=dashboard.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にカスタムメトリクスを出力するには、各言語用のクライアントライブラリを使用します:
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();
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])
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 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"
{
"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 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では、様々な種類のメトリクスが収集されます:
メトリクスは以下の主要コンポーネントで構成されています:
{
"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
}
}
]
}
Cloud Monitoringでは、サービスの信頼性を測定するためのサービスレベル目標(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では、メトリクスデータのセキュリティを確保するための様々な機能が提供されています:
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は以下のようなユースケースに適しています:
{
"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は他のGoogle Cloudサービスと統合して、より強力なソリューションを構築できます:
サービス | 統合の利点 |
---|---|
Cloud Logging | ログとメトリクスを組み合わせた総合的な監視 |
Cloud Trace | 分散トレーシングとメトリクスの関連付けによる詳細な問題診断 |
Error Reporting | アプリケーションエラーの自動検出と集約 |
Cloud Profiler | アプリケーションのパフォーマンスボトルネックの特定 |
Cloud Debugger | 本番環境でのコードのデバッグ |
Cloud Functions | メトリクスに基づいた自動化アクションの実行 |
Pub/Sub | メトリクスイベントに基づいたリアルタイム処理 |
# ログベースのカウンターメトリクスの作成
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の設定などのベストプラクティスを適用することが重要です。また、コスト最適化のために、不要なメトリクスの収集を避け、適切なサンプリングレートを設定することも検討すべきです。