Prometheus さくらのクラウド向け Exporter 「sakuracloud_exporter」

f:id:febc_yamamoto:20190204175049p:plain

さくらのクラウド上のリソースの監視を行うためのPrometheusのExporter「sakuracloud_exporter」をリリースしました。

github.com

この記事ではsakuracloud_exporterの機能や実践的な利用例を紹介します。

もしPrometheusになじみの薄い方は以下の連載記事などをあらかじめ読んでおくことをお勧めします。

knowledge.sakura.ad.jp

sakuracloud_exporterの概要

sakuracloud_exporterPrometheusのExporterです。さくらのクラウドAPIを利用して各種メトリクスを収集します。

さくらのクラウドでのメトリクス関連API

さくらのクラウドではCPU-TIMEやディスクのread/write、NICのreceive/sendなどをAPIを通じて取得できるようになっています。
例えばCPU-TIMEであれば、GET /server/:serverid/monitorというAPIで以下のようなJSONが取得可能です。

{
  "Data": {
    "2019-02-03T14:50:00+09:00": {
      "CPU-TIME": 0.046666666667
    },
    "2019-02-03T14:55:00+09:00": {
      "CPU-TIME": 0.05
    },
    "2019-02-03T15:00:00+09:00": {
      "CPU-TIME": 0.053333333333
    },
    "2019-02-03T15:05:00+09:00": {
      "CPU-TIME": 0.05
    },
    "2019-02-03T15:10:00+09:00": {
      "CPU-TIME": 0.05
    }
  },
  "is_ok": true
}

さくらのクラウドのコントロールパネルではこれを利用した「アクティビティ」という機能が提供されていますね。

f:id:febc_yamamoto:20190204144948p:plain

sakuracloud_exporterではこれらのAPIを用いてPrometheus向けに各種メトリクスの収集/公開を行うようになっています。

sakuracloud_exporterでサポートしているメトリクス

以下のようなリソース関連のメトリクスをサポートしています。
(各メトリクスの詳細はGitHub上のREADMEに記載されています。)

さくらのクラウドのメトリクス関連APIに加え、自動バックアップの状況やクーポン残高なども取得できるようになっています。

どんなことが出来るの?

Grafanaなどのツールを組み合わせての可視化や、AlertManagerを用いてのアラート機能など、 Prometheusを活用した様々な機能が利用できるようになります。 いくつかこのExporterで出来るようになることの例を挙げてみます。

グラフ作成

まずは王道的にGrafanaなどのツールを用いて各種メトリクスをグラフ化することが可能になります。
さくらのクラウドのコントロールパネルのアクティビティ機能ではサーバごとという風にある程度決まった単位での表示しか出来ませんが、 このExporterを用いることで柔軟に対応することが可能です。

例えば複数サーバを並べて比較したり(この辺はnode_exporterで取得することが多いと思いますが)、サーバと接続されているロードバランサやルータのトラフィックも合わせて確認するといった使い方も出来ますね。

複数サーバのCPU-TIMEを並べてみた例:
f:id:febc_yamamoto:20190204150647p:plain

アラート機能

さくらのクラウドではシンプル監視で簡単なアラート機能を利用できますが、 例えばVPC内のサーバのように直接インターネット経由でアクセスできないようなサーバは監視できないといった制限があります。

そういった場合にこのExporterを利用することでさくらのクラウドAPIで取得した情報を元にアラートをあげるということが可能です。

例えば、このExporterではサーバの起動状況をsakuracloud_server_upというメトリック名で公開しています。 これを利用してサーバがシャットダウンした際にアラートをあげることができます。

AlterManagerでサーバがシャットダウンされた時にアラートをあげる例:

  - alert: server_down
    expr: sakuracloud_server_up == 0 # 起動していたら1、以外の場合は0となるため、0の時を条件にする
    for: 1m 
    labels:
      severity: page
    annotations:
      summary: "Server {{ $labels.name }}(ID:{{ $labels.id }}) down"
      description: "{{ $labels.name }} of job {{ $labels.job }} has been down for more than 1 minutes."

工夫次第で色々便利に使えると思います。

sakuracloud_exporterでサポートしているメトリクスの詳細

ここからはsakuracloud_exporterがサポートしているメトリクスについて各リソースごとに詳しくみてみます。

全体で共通的な項目

各リソースには*_infoという、末尾に_infoがつく名前のメトリクスが用意されています。 これは情報参照用のメトリクスで、常に1を返すようになっています。

PrometheusではLabelの値が変更されると違う系列とみなされるため、頻繁に変更されるような項目は各項目のLabelには入れずinfoにまとめて入れると言う形にしています。 各メトリクスの参照時に対象リソースの詳しい情報が必要になった場合に*infoを利用するのが良いでしょう。

例えばサーバのCPU-TIME用のメトリクスsakuracloud_server_cpu_timeは以下のような値を持っています。

sakuracloud_server_cpu_time{id="000000000001",instance="localhost:9542",job="sakuracloud",name="example",zone="tk1a"} 0.5

ラベルはサーバを識別するための最低限の情報しかありません。 ここにサーバのCPU数をラベルとして付与しておきたい場合、以下のようなクエリを用いて*_infoから情報を引っ張ってくる、というようなことができます。

sakuracloud_server_cpu_time * on (zone,id) group_left(cpus) sakuracloud_server_info

このクエリの結果は以下のようになります。

{cpus="2",id="000000000001",instance="localhost:9542",job="sakuracloud",name="example",zone="tk1a"} 0.5

次にリソースごとに利用可能なメトリクスを見てみます。

自動バックアップ関連

Metric Description Labels
sakuracloud_auto_backup_info 自動バックアップ情報の参照用 id, name, disk_id, max_backup_num, weekdays, tags, descriptions
sakuracloud_auto_backup_count この自動バックアップで作成されたアーカイブの現在の数 id, name, disk_id
sakuracloud_auto_backup_last_time 最終バックアップ作成日時(UnixTime) id, name, disk_id
sakuracloud_auto_backup_archive_info この自動バックアップで作成されたアーカイブ情報 id, name, disk_id, archive_id, archive_name, archive_tags, archive_description

例えばこんな感じでバックアップがちゃんと取れているか確認するのに使えると思います。

f:id:febc_yamamoto:20190204172920p:plain

クーポン関連

Metric Description Labels
sakuracloud_coupon_discount クーポン残高 id, member_id, contract_id
sakuracloud_coupon_remaining_days 有効な残日数 id, member_id, contract_id
sakuracloud_coupon_exp_date クーポン期限切れ日時(UnixTime) id, member_id, contract_id
sakuracloud_coupon_usable クーポンが利用可能(有効期限内、かつ残高が1円以上)の場合に1 id, member_id, contract_id

後ほど実践的な例としてこのクーポン情報を利用したアラートの例を扱います。

データベース関連

Metric Description Labels
sakuracloud_database_info データベース情報参照用 id, name, zone, plan, host, database_type, database_revision, database_version, web_ui, replication_enabled, replication_role, tags, description
sakuracloud_database_up 起動している場合は1 id, name, zone
sakuracloud_database_cpu_time CPU-TIME (単位:ms) id, name, zone
sakuracloud_database_memory_used メモリ使用量(単位:GB) id, name, zone
sakuracloud_database_memory_total 総メモリサイズ(単位:GB) id, name, zone
sakuracloud_database_nic_info NIC情報参照用 id, name, zone, upstream_type, upstream_id, upstream_name, ipaddress, nw_mask_len, gateway
sakuracloud_database_nic_receive NIC受信(単位: Kbps) id, name, zone
sakuracloud_database_nic_send NIC送信(単位: Kbps) id, name, zone
sakuracloud_database_disk_system_used システムディスク使用量(unit:GB) id, name, zone
sakuracloud_database_disk_system_total 総システムディスクサイズ(unit:GB) id, name, zone
sakuracloud_database_disk_backup_used バックアップディスク使用量(unit:GB) id, name, zone
sakuracloud_database_disk_backup_total 総バックアップディスクサイズ(unit:GB) id, name, zone
sakuracloud_database_binlog_used binlogのディスク使用量(unit:GB) id, name, zone
sakuracloud_database_disk_read ディスク Read (unit: KBps) id, name, zone
sakuracloud_database_disk_write ディスク Write(unit: KBps) id, name, zone
sakuracloud_database_replication_delay レプリケーション遅延時間(unit:second) id, name, zone

スイッチ+ルータ

Metric Description Labels
sakuracloud_internet_info スイッチ+ルータ情報参照用 id, name, zone, switch_id, bandwidth, tags, description
sakuracloud_internet_receive 受信(unit: Kbps) id, name, zone, switch_id
sakuracloud_internet_send 送信(unit: Kbps) id, name, zone, switch_id

ロードバランサ

Metric Description Labels
sakuracloud_loadbalancer_info ロードバランサ情報参照用 id, name, zone, plan, ha, vrid, ipaddress1, ipaddress2, gateway, nw_mask_len, tags, description
sakuracloud_loadbalancer_up 起動している場合は1 id, name, zone
sakuracloud_loadbalancer_receive NIC 受信(unit: Kbps) id, name, zone
sakuracloud_loadbalancer_send NIC 送信(unit: Kbps) id, name, zone
sakuracloud_loadbalancer_vip_info VIP情報参照用 id, name, zone, vip_index, vip, port, interval, sorry_server, description
sakuracloud_loadbalancer_vip_cps VIPごとの秒あたりのコネクション数 id, name, zone, vip_index, vip
sakuracloud_loadbalancer_server_info 実サーバ情報参照用 id, name, zone, vip_index, vip, server_index, ipaddress ,monitor, path, response_code
sakuracloud_loadbalancer_server_up 実サーバが稼働している場合は1 id, name, zone, vip_index, vip, server_index, ipaddress
sakuracloud_loadbalancer_server_connection 実サーバごとのコネクション数 id, name, zone, vip_index, vip, server_index, ipaddress
sakuracloud_loadbalancer_server_cps 実サーバごとの秒あたりのコネクション数 id, name, zone, vip_index, vip, server_index, ipaddress

モバイルゲートウェイ

Metric Description Labels
sakuracloud_mobile_gateway_info モバイルゲートウェイ 情報参照用 id, name, zone, internet_connection, inter_device_communication, tags, description
sakuracloud_mobile_gateway_up 起動している場合は1 id, name, zone
sakuracloud_mobile_gateway_nic_receive NIC 受信(unit: Kbps) id, name, zone, nic_index, ipaddress, nw_mask_len
sakuracloud_mobile_gateway_nic_send NIC 送信(unit: Kbps) id, name, zone, nic_index, ipaddress, nw_mask_len
sakuracloud_mobile_gateway_traffic_control_info トラフィックコントロール情報参照用 id, name, zone , traffic_quota_in_mb, bandwidth_limit_in_kbps, enable_email, enable_slack, slack_url, auto_traffic_shaping
sakuracloud_mobile_gateway_traffic_uplink トラフィック(UP) (unit: KB) id, name, zone
sakuracloud_mobile_gateway_traffic_downlink トラフィック(DOWN) (unit: KB) id, name, zone
sakuracloud_mobile_gateway_traffic_shaping 通信制限が行われている場合は1 id, name, zone

NFS

Metric Description Labels
sakuracloud_nfs_info NFS情報参照用 id, name, zone, plan, host, tags, description
sakuracloud_nfs_up 起動している場合は1 id, name, zone
sakuracloud_nfs_free_disk_size 空きディスク容量(unit: GB) id, name, zone
sakuracloud_nfs_nic_info NIC情報参照用 id, name, zone, upstream_id, upstream_name, ipaddress, nw_mask_len, gateway
sakuracloud_nfs_receive NIC 受信(unit: Kbps) id, name, zone
sakuracloud_nfs_send NIC 送信(unit: Kbps) id, name, zone

サーバ

Metric Description Labels
sakuracloud_server_info サーバ情報参照用 id, name, zone, cpus, disks, nics, memories, host, tags, description
sakuracloud_server_up 起動している場合は1 id, name, zone
sakuracloud_server_cpu_time CPU-TIME (unit: ms) id, name, zone
sakuracloud_server_disk_info ディスク情報参照用 id, name, zone, disk_id, disk_name, index, plan, interface, size, tags, description
sakuracloud_server_disk_read ディスク Read (unit: KBps) id, name, zone, disk_id, disk_name, index
sakuracloud_server_disk_write ディスク Write (unit: KBps) id, name, zone, disk_id, disk_name, index
sakuracloud_server_nic_info NIC情報参照用 id, name, zone, interface_id, index, upstream_type, upstream_id, upstream_name
sakuracloud_server_nic_bandwidth NIC帯域(unit: Mbps) id, name, zone, interface_id, index
sakuracloud_server_nic_receive NIC 受信(unit: Kbps) id, name, zone, interface_id, index
sakuracloud_server_nic_send NIC 送信(unit: Kbps) id, name, zone, interface_id, index

この中でもsakuracloud_server_nic_bandwidthは頑張って実装したものでなかなか便利だと思います。
さくらのクラウドではプランやサーバの搭載メモリで帯域が変わってくると言う仕様となっています。

manual.sakura.ad.jp

sakuracloud_server_nic_bandwidthはこの仕様を考慮して帯域幅を算出するようになっています。 sakuracloud_server_nic_receivesakuracloud_server_nic_sendと組み合わせて、どのくらい帯域を食っているかを見ることが可能です。

SIM

Metric Description Labels
sakuracloud_sim_info SIM情報参照用 id, name, imei_lock, registerd_date, activated_date, deactivated_date, ipaddress, simgroup_id, carriers, tags, description
sakuracloud_sim_session_up セッション中であれば1 id, name
sakuracloud_sim_current_month_traffic 当月通信量 (unit: Kbps) id, name
sakuracloud_sim_uplink Uplink トラフィック (unit: Kbps) id, name
sakuracloud_sim_downlink Downlink トラフィック (unit: Kbps) id, name

VPCルータ

Metric Description Labels
sakuracloud_vpc_router_info VPCルータ情報参照用 id, name, zone, plan, ha, vrid, vip, ipaddress1, ipaddress2, nw_mask_len, internet_connection, tags, description
sakuracloud_vpc_router_up 起動している場合1 id, name, zone
sakuracloud_vpc_router_session セッション数 id, name, zone
sakuracloud_vpc_router_dhcp_lease DHCPリースの現在の数 id, name, zone
sakuracloud_vpc_router_l2tp_session L2TP/IPsecのセッション数 id, name, zone
sakuracloud_vpc_router_pptp_session PPTPのセッション数 id, name, zone
sakuracloud_vpc_router_s2s_peer_up サイト間VPNのピアとのセッションが確立している場合に1 id, name, zone, peer_address, peer_index
sakuracloud_vpc_router_receive NIC 受信(unit: Kbps) id, name, zone, nic_index, vip, ipaddress1, ipaddress2, nw_mask_len
sakuracloud_vpc_router_send NIC 送信(unit: Kbps) id, name, zone, nic_index, vip, ipaddress1, ipaddress2, nw_mask_len

ゾーン情報

Metric Description Labels
sakuracloud_zone_info ゾーン情報参照用 id, name, description, region_id, region_name

GrafanaのDashboardのVariablesで利用したいために追加したものです。 こんな感じで使ってます。

f:id:febc_yamamoto:20190204170420p:plain

Exporter自身の情報

Metric Description Labels
sakuracloud_exporter_start_time Exporterの起動時間 -
sakuracloud_exporter_build_info Exporterのビルド情報 version, revision, goversion
sakuracloud_exporter_errors_total コレクターごとのエラー数 collector

特にsakuracloud_exporter_errors_totalは重要です。
API呼び出しで予期せぬエラーがあった場合などにこの項目の値が増えていきます。
本番環境で利用する際はこの項目も監視しておき、急激に増えた場合にアラートを出すようにしておいた方が良いでしょう。

実践的な使い方: クーポンの監視

最後に実践的な例としてクーポンの監視を行う例を紹介します。

さくらのクラウドのクーポンはイベントなどでよく配布されており、利用したとこのある方も多いと思います。
このクーポンには利用期限/金額が設定されており、利用期限をすぎたり利用額がクーポンの金額を超過した場合には実際に請求が発生してしまいます。

これを防ぐには以下のようなメトリクスを利用すればOKです。

  • sakuracloud_coupon_remaining_days: クーポン有効期限までの日数
  • sakuracloud_coupon_remaining_discount: クーポンの残高

AlertManagerでこれらの値が閾値を超えた場合にアラートを出したい場合は以下のようにします。

この例では有効期限1週間前、または残高が2000円を下回った場合にアラートをあげるようになっています。

- alert: coupon_expiration
  expr: sakuracloud_coupon_remaining_days <= 7
  labels:
    severity: page
  annotations:
    summary: "クーポン (ID:{{ $labels.id }})はあと{{ $value }}日で有効期限が切れます"
    description: "クーポン (ID:{{ $labels.id }})はあと{{ $value }}日で有効期限が切れます"

- alert: coupon_discount
  expr: sakuracloud_coupon_discount < 2000
  labels:
    severity: page
  annotations:
    summary: "アカウント({{ $labels.member_id}})のクーポン残高が2000円以下になりました。"
    description: "アカウント({{ $labels.member_id}})のクーポン残高が2000円以下になりました。"

終わりに

Prometheusとsakuracloud_exporterを使うことでさくらのクラウドの監視が手軽に行えますね。
便利だと思いますのでぜひご利用ください。

なお使い方がわからないなどの場合は以下のSlackなどに質問を投げてもらえればできる限り回答しますのでこちらもあわせてご利用ください。

slack.usacloud.jp

以上です。

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

Prometheus: Up & Running: Infrastructure and Application Performance Monitoring

Prometheus: Up & Running: Infrastructure and Application Performance Monitoring