koukiblog

たぶんweb系の話題

StackDriver Monitoringにカスタムメトリクスを送信する

ここに書いてあることが全てなのですが、僕の理解力が低いのか送信するまでに色々手間取ったので備忘のため残しておきます。 cloud.google.com

Rubyのサンプルコードで説明していきます。 Ruby用のSDKをインストールして、スクリプトではSDKをrequireしてあるのが前提です。

gem install google-cloud-monitoring
require "google/cloud/monitoring"
メトリクスの作成

カスタムメトリクスを送信するためには、まずメトリクスの定義をStackDriverに送信する必要があります。 事前定義なしでいきなり送りつけることも可能ですが、その場合はStackDriver側で色々なデフォルト値が利用されます。メトリクスの定義は後から変更できないものが多いようなので、基本的には事前に定義しておいた方がよさそうです。

metric_client = Google::Cloud::Monitoring::Metric.new
formatted_name = Google::Cloud::Monitoring::V3::MetricServiceClient.project_path([project_id])

  label1 =   Google::Api::LabelDescriptor.new(
    key: "label_test",
    description: "カスタムメトリクスへのラベル付与テスト",
    value_type:  Google::Api::LabelDescriptor::ValueType::STRING
  )
  
  md = Google::Api::MetricDescriptor.new(
    name: "my_first_custom_metric",
    type: "custom.googleapis.com/custom_metrics_test/test_metric",
    description: "カスタムメトリクスの説明テスト",
    display_name: "はじめてのカスタムメトリクス",
    metric_kind: Google::Api::MetricDescriptor::MetricKind::GAUGE,
    value_type: Google::Api::MetricDescriptor::ValueType::INT64,
    unit: "",  
    labels: [label1]
  )
  metric_client.create_metric_descriptor(formatted_name, md)  

type(custom.googleapis.com/custom_metrics_test/test_metric)がこのメトリクスを一意に特定するkeyになります。 metrics_kind, value_typeでメトリクスの種別を定義します。

labelはメトリクスを送信するときに付与することができるラベルの定義です。この場合は"label_test"というkeyに任意の文字列を付与することができます。 MetricDescriptorインスタンスを作ってそれを送信すればokです。

上記をスクリプトを実行すると、StackDriver上にカスタムメトリクスが作成され、Metric Explorerで探して表示することができます。

次は、メトリクスの定義ができたので、そこに書き込んでみます。

  metric = Google::Api::Metric.new(
    type: "custom.googleapis.com/custom_metrics_test/test_metric",
    labels: {"label_test" => "ラベル付与テスト!!!!"}
  )
  resource = Google::Api::MonitoredResource.new(
    type: "global",
    labels: {"project_id" => @project_id}
  )
  point = Google::Monitoring::V3::Point.new(
    interval: Google::Monitoring::V3::TimeInterval.new(
      end_time: Google::Gax.time_to_timestamp(Time.now)
    ),
    value: Google::Monitoring::V3::TypedValue.new(int64_value: 123456)
  )

  ts = Google::Monitoring::V3::TimeSeries.new(
    metric: metric,
    resource: resource,
    points: [point]
  )
  time_series = [ts]

  metric_client.create_time_series(formatted_name, time_series)

メトリクスの送信は、TimeSeriesの配列を送信します。TimeSeriesにはMetric, Resource, Pointsという属性があります。

Metricは、送信するメトリクスの定義を指定します。この例では事前に定義した"custom.googleapis.com/custom_metrics_test/test_metric"を指定しています。labelを付与することができます。

Resourceは、監視対象のリソースを指定します。StackDriverで事前に規定されており、global以外にもgce_instance, gee_podなどがあります。このメトリクスを収集したリソースを指定するのがよいと思います。

Pointは、intervalとvalueという属性を含んでいます。valueが記録されるメトリクスの値です。(ここまで長かったですね。。)intervalにはstart_time,end_timeという属性があり、記録するメトリクスのtimestampを指定することができます。メトリクスのtypeでDELTA(差分)を選んだ場合はstart_time, end_time両方の指定が必要になりますが、今回の場合は、end_timeだけでよいです。利用する言語にもよるのですが、Google.ProtoBufで定義されているTimestamp型にする必要があるので注意が必要です。

ここまで成功すれば、StackDriverのコンソールにカスタムメトリクスが表示されることが確認できます。

Stackdriver-custom-metrics
Stackdriver-custom-metrics

カスタムメトリクスは有料リソースなのに注意ですが、うまく利用すれば柔軟な監視を構築することができそうです。