Prometheus さくらのクラウド向け Exporter 「sakuracloud_exporter」
さくらのクラウド上のリソースの監視を行うためのPrometheusのExporter「sakuracloud_exporter」をリリースしました。
この記事ではsakuracloud_exporter
の機能や実践的な利用例を紹介します。
もしPrometheusになじみの薄い方は以下の連載記事などをあらかじめ読んでおくことをお勧めします。
sakuracloud_exporterの概要
sakuracloud_exporter
はPrometheusの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 }
さくらのクラウドのコントロールパネルではこれを利用した「アクティビティ」という機能が提供されていますね。
sakuracloud_exporter
ではこれらのAPIを用いてPrometheus向けに各種メトリクスの収集/公開を行うようになっています。
sakuracloud_exporter
でサポートしているメトリクス
以下のようなリソース関連のメトリクスをサポートしています。
(各メトリクスの詳細はGitHub上のREADMEに記載されています。)
さくらのクラウドのメトリクス関連APIに加え、自動バックアップの状況やクーポン残高なども取得できるようになっています。
どんなことが出来るの?
Grafanaなどのツールを組み合わせての可視化や、AlertManagerを用いてのアラート機能など、 Prometheusを活用した様々な機能が利用できるようになります。 いくつかこのExporterで出来るようになることの例を挙げてみます。
グラフ作成
まずは王道的にGrafanaなどのツールを用いて各種メトリクスをグラフ化することが可能になります。
さくらのクラウドのコントロールパネルのアクティビティ機能ではサーバごとという風にある程度決まった単位での表示しか出来ませんが、
このExporterを用いることで柔軟に対応することが可能です。
例えば複数サーバを並べて比較したり(この辺はnode_exporterで取得することが多いと思いますが)、サーバと接続されているロードバランサやルータのトラフィックも合わせて確認するといった使い方も出来ますね。
複数サーバのCPU-TIMEを並べてみた例:
アラート機能
さくらのクラウドではシンプル監視で簡単なアラート機能を利用できますが、 例えば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 |
例えばこんな感じでバックアップがちゃんと取れているか確認するのに使えると思います。
クーポン関連
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
は頑張って実装したものでなかなか便利だと思います。
さくらのクラウドではプランやサーバの搭載メモリで帯域が変わってくると言う仕様となっています。
sakuracloud_server_nic_bandwidth
はこの仕様を考慮して帯域幅を算出するようになっています。
sakuracloud_server_nic_receive
やsakuracloud_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で利用したいために追加したものです。 こんな感じで使ってます。
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などに質問を投げてもらえればできる限り回答しますのでこちらもあわせてご利用ください。
以上です。
- 作者: Mike Julian,松浦隼人
- 出版社/メーカー: オライリージャパン
- 発売日: 2019/01/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
Prometheus: Up & Running: Infrastructure and Application Performance Monitoring
- 作者: Brian Brazil
- 出版社/メーカー: O'Reilly Media
- 発売日: 2018/07/28
- メディア: ペーパーバック
- この商品を含むブログを見る