DatadogでOpenStackをモニターする

DatadogモニタリングをSaaSで提供しているサービスですが、OpenStackと接続出来るIntegrationが提供されています。今回はOpenStack Integrationを利用して、DatadogからOpenStackをモニターします。

Datadogについて

DatadogはSaaSベースで提供されていますモニタリングサービスです。各種アプリケーションや、サービスに対応したIntegrationが提供されており簡単にメトリックの追加を行うことが出来ます。PythonベースでIntegrationを自作する事も出来ます。

Datadogの利用開始

Datadogは以下サイトでサインアップをすると無料枠で利用出来ます。

https://www.datadoghq.com/

サインアップ後の画面を進めると、Datadog Agentのインストール画面が出てきます。利用するOSを選択して、Datadog Agentのインストール方法を確認します。CentOSであれば、ワンライナーでインストールからDatadog Agentの起動が行われます。このスクリプトはYumレポジトリの登録と、Datadog Agentのインストール後にDatadog Agentの設定を行ってくれます。Agentをインストールすると自動的にDatadogのサービスに対してデーターが送信されます。AgentのステータスはCent OSであれば以下のコマンドで確認が可能です。内部的には複数のサービスが動作しているため、こののコマンドでの正常動作の確認は必須です。

service datadog-agent info

“DatadogでOpenStackをモニターする” の続きを読む

広告
DatadogでOpenStackをモニターする

OpenStack IronicでVirtualBoxを操作する

Ironicは物理マシンと接続して、電源管理等を行うために様々な機器に対応したドライバーが提供されています。その中で、検証等に使えるVirtual Box用のドライバーも提供されています。Vitual boxが操作出来るドライバーはSSHを使ってコマンドを発行するSSHドライバーとVirtual BoxのSOAP APIに接続する2種類提供されています。

SSHドライバーについて

SSHドライバーはVirtual Boxを含む仮想化環境に対応しています。virtual box / virsh / vmware / parallels / xenserverと多種多様な仮想化環境に対応しています。SSHドライバーは仮想化基盤にSSHで入ってコマンドを発行して操作するためにSSHのホスト側の機能が必要です。例えばVirtual BoxであればVBoxManageコマンド、VMware(ESXi)であればvim-cmdコマンド、virshであればvirshコマンドで操作を行います。

https://github.com/openstack/ironic/blob/master/ironic/drivers/modules/ssh.py

Virtual Boxドライバー

SSHのサーバーを立てれない場合の為に、Virtual Boxが提供しているWeb Serviceを使うドライバーも提供されています。これはKiloで提供されました。これを使えばMACやWindowsでVirtual Boxを動作させて手軽にIronicの試験が出来るようになります。今回はRDOのLiberty版を利用して、両方のドライバーの使い方を解説します。

http://docs.openstack.org/developer/ironic/drivers/vbox.html

“OpenStack IronicでVirtualBoxを操作する” の続きを読む

OpenStack IronicでVirtualBoxを操作する

GoでOpenStackを操作する

OpenStackを操作するGoのSDKとして、OpenStackコミュニティ側にGoのSDKがあります。現在は残念ながら開発は止まっているようです。その代わりにRackspaceが開発を行っているGopher CloudがOpenStack用のGoのSDKとして活発に開発が行われています。

http://gophercloud.io/

今回はこのGopher Cloudを利用して、Goを使ってOpenStackの操作を行いたいと思います。

インストール

Goは以下からDownloadしてインストールを行います。主要Platformではインストーラー形式で提供されています。

https://golang.org/dl/

環境変数GOPATH配下にパッケージがインストールされるため、まずは環境変数を設定しておきます。自分で作成するのコードはsrc配下にフォルダ等を作成して配置します。githubアカウントがある場合はgithub.com配下にアカウント名でフォルダを作成するか、github側の自分のレポジトリを作ってgo getしても良いです。その後以下のコマンドでgophercloudのインストールを行います。これにより、$GOPATH/src/github.com/rackspace/gophercloud配下にコードがDownloadされます。

go get github.com/rackspace/gophercloud


認証

“GoでOpenStackを操作する” の続きを読む

GoでOpenStackを操作する

Cisco SparkのAPIを利用してみる

CiscoがリリースしているSlack的なサービスとしてCisco Sparkがあります。企業向けのCollaboration製品(電話やビデオ会議)と連携出来る特徴があります。

https://web.ciscospark.com

このCisco Sparkですが、これまではAPIは非公開で様々な連携は出来ませんでしたが、12月にAPIが公開されました。APIはREST APIで実装されています。以下に詳細の使い方が書かれていますがざっとした使い方を解説します。

https://developer.ciscospark.com/getting-started.html

Tokenについて

APIはTokenを添付して送信することで利用可能となっています。Tokenはユーザー毎の固定TokenとApplication毎に発行されるTokenがあります。2016/1/3現在は検証を行うのであればユーザー毎のTokenは期限が無く利用が容易になっています。ApplicationのTokenはOauth2を使っての発行と、2時間毎にリフレッシュ処理、60日毎に再取得が必要となります。このため、まずはユーザーTokenを使って検証してその後Application Tokenを使うことが推奨されています。ユーザーTokenは上記のCisco SparkのDeveloperサイトでログイン後、右上に表示される自分のアイコンをクリックすると取得出来ます。Tokenはリクエスト時にHeaderに添付して送信します。HeaderへのTokenの添付は、キーがAuthorizationで”Bearner “の後に取得したTokenを追加します。Pythonで書くと以下の例になります。

token = "Bearer " + TOKEN
header = {"Authorization": "%s" % token}

情報の取得(Room一覧の取得)

上記で取得したTokenを添付して、HTTPのGET Requestを発行すると各種情報を取得出来ます。以下はPythonでRoom一覧を取得する例です。-tokenで各自取得したTokenを添付します。以下のコードをgetrooms.pyと保存した場合は以下のように実行します。

# python getrooms.py -token TOKEN

import requests
import argparse


def main():
    p = argparse.ArgumentParser()
    p.add_argument("-token", default="")
    args = p.parse_args()
    token = "Bearer " + args.token

    header = {"Authorization": "%s" % token}
    requests.packages.urllib3.disable_warnings()
    get_rooms_url = "https://api.ciscospark.com/v1/rooms"

    api_response = requests.get(get_rooms_url, headers=header)
    response_json = api_response.json()
    print(response_json)

if __name__ == '__main__':
    main()

投稿(Roomの作成とメッセージの投稿)

Cisco Sparkに対してPost Messageを送信すると各種作成や、メッセージの投稿が出来ます。

Roomの作成

上記と同様にTokenを添付して、Postを送信するとRoomを作成出来ます。-tokenでTokenを添付して、-titleでルーム名を指定します。

import requests
import argparse


def main():
    p = argparse.ArgumentParser()
    p.add_argument("-token", required=True)
    p.add_argument("-title", required=True)
    args = p.parse_args()

    token = "Bearer " + args.token
    header = {"Authorization": "%s" % token}
    post_room_url = "https://api.ciscospark.com/v1/rooms"
    payload = {"title": args.title}
    api_response = requests.post(post_room_url, json=payload, headers=header, verify=False)
    response_json = api_response.json()
    print(response_json)

if __name__ == '__main__':
    main()

メッセージの投稿

HTTPのPOSTをRequestを発行すると、各種メッセージを投稿出来ます。-tokenでTokenを指定し、-roomで投稿先のルームのID、-textで送信するメッセージを指定します。

import requests
import argparse


def main():
    p = argparse.ArgumentParser()
    p.add_argument("-token", default="")
    p.add_argument("-room")
    p.add_argument("-text")
    args = p.parse_args()

    token = "Bearer " + args.token
    header = {"Authorization": "%s" % token, "content-type": "application/json"}
    post_message_url = "https://api.ciscospark.com/hydra/api/v1/messages"
    payload = {
        "roomId": args.room,
        "text": args.text
    }
    api_response = requests.post(post_message_url, json=payload, headers=header, verify=False)
    response_status = api_response.status_code
    print(response_status)

if __name__ == '__main__':
    main()

WebHookについて

登録しておくと指定のFilter(Meeting Room等)で指定のAction(Messageがポストされた等)が行われると、指定のサーバーに対してメッセージが送信されます。WebHookを受けるサーバーはGlobal IPアドレスを持っておく必要が有ります。WebHookの参照/登録/削除は今のところAPI経由でしか行えません。

WebHookの登録状況の確認

登録状況を参照するPython Scriptです。-tokenでTokenを指定します。

import argparse
import requests
import json

def main():
    p = argparse.ArgumentParser()
    p.add_argument("-token", default="")
    args = p.parse_args()

    token = "Bearer " + args.token
    header = {"Authorization": "%s" % token}
    get_webhooks_url = "https://api.ciscospark.com/v1/webhooks"
    api_response = requests.get(get_webhooks_url, headers=header)
    response_json = api_response.json()
    print(json.dumps(response_json ,sort_keys=True, indent=4))

if __name__ == '__main__':
    main()

WebHookの登録

以下はWebHookを新たに登録するScriptです。-tokenでTokenの指定、-urlでWebHookを送るURLの指定、-roomでWebHookをTriggerするルームIDを指定します。Messageが新規で投稿されるとWebhookがCisco Sparkのサービスから送信されて来ます。

import requests
import argparse

def main():
    p = argparse.ArgumentParser()
    p.add_argument("-token", default="")
    p.add_argument("-url", default="")
    p.add_argument("-room", default="")
    args = p.parse_args()

    token = "Bearer " + args.token
    header = {"Authorization": "%s" % token, "content-type": "application/json"}
    post_message_url = "https://api.ciscospark.com/v1/webhooks"
    payload = {
        "resource": "messages",
        "event": "created",
        "filter": "roomId="+args.room,
        "targetUrl": args.url,
        "name": "bot"
    }
    api_response = requests.post(post_message_url, json=payload, headers=header)
    response_status = api_response.status_code
    print(response_status)

if __name__ == '__main__':
    main()

WebHookの削除

以下は削除するScriptです。実行時に-tokenでTokenの指定、-webhookでWebhookの名前を指定します。

import requests
import argparse

def main():
    p = argparse.ArgumentParser()
    p.add_argument("-token", default="")
    p.add_argument("-webhook", default="")
    args = p.parse_args()

    token = "Bearer " + args.token
    header = {"Authorization": "%s" % token}
    delete_webhooks_url = "https://api.ciscospark.com/v1/webhooks"
    payload = {"webhookId": args.webhook}
    api_response = requests.delete(delete_webhooks_url, headers=header, verify=True, params=payload)
    print(api_response.url)
    response_status = api_response.status_code
    print(response_status)

# run main function
if __name__ == '__main__':
    main()

まとめ

Cisco SparkのAPIを利用すると簡単に各種システムと連携出来ます。上手く連携出来れば、Cisco SparkからOpenStackのインスタンスを起動等も出来るようになります。

 

Cisco SparkのAPIを利用してみる

OpenStackの監視をMackerelでやってみる

OpenStackシステムの監視を行いたい場合はZabbix等を利用するのも良いですが、SaaSの監視サービスであるMackerelを利用すると色々面倒な準備を行わずとも監視の開始が出来ます。Mackerelは標準でCPU使用率等の監視を行ってくれるのですが、OpenStackシステムに関連する項目を独自監視を行いたい場合はカスタムメトリックの投稿で簡単に行う事が出来ます。以下カスタムメトリックの投稿の方法が記述されています。

http://help-ja.mackerel.io/entry/advanced/custom-metrics

要約すると以下の3つになります。

  1. メトリックは次の形式でタブ区切りで標準出力。
    {metric name}\t{metric value}\t{epoch seconds}
  2. 名前(metric name)はドット区切りで最後の区切りの名前がグラフの値の表示名となる。最後の区切り前までが同一の場合は同一グラフとして一つのグラフに表示されます。
  3. 環境変数MACKEREL_AGENT_PLUGIN_METAが設定された時にグラフ定義を出力するとグラフの形式を定義出来る(オプション)

このMackerelでカスタムメトリックを投稿したい場合にGoはライブラリが用意されていますが、Python用は特に用意されてないため上記3点を抑えた形で自分で書くことになります。

カスタムメトリックを投稿するコード例

以下OpenStack SDKを利用して特定のプロジェクト内のサーバ数をカウントして投稿する例です。OpenStackへの接続情報はargparseを使って引数として指定出来るようにしてあります。今回はグラフの表示形式の指定は省略しています。

import argparse
import time
from openstack import connection


def main():
    p = argparse.ArgumentParser()
    p.add_argument("-authurl", default="http://localhost:5000/v2.0")
    p.add_argument("-user", default="admin")
    p.add_argument("-password", default="password")
    p.add_argument("-tenant", default="admin")
    args = p.parse_args()
    conn = connection.Connection(auth_url=args.authurl, 
                                 username=args.user,
                                 password=args.password, 
                                 project_name=args.tenant)
    server_list = []
    for server in conn.compute.servers():
        server_list += [server]
    l = map(str, ["openstack.servers", len(server_list), time.time()])
    print "\t".join(l)

if __name__ == '__main__':
    main()

Mackerelの設定

まずサーバーにMackerelのAgentをインストールします。インストール後に上記のようなコードを含んだファイルを例えば/opt/openstack.pyとして保存します。Mackerel Agentの設定ファイルである/etc/mackerel-agent/mackerel-agent.confの最終行辺りに以下を追加します。Mackerel AgentはDefaultで1分毎に指定のcommandを実行して、標準出力から値を取得してくれます。自動で生成されるためグラフの追加等の作業は必要ありません。

[plugin.metrics.openstack]
command = "python /opt/openstack.py -authurl=http://localhost:5000/v2.0 -user="admin" -password=password -tenant=admin"

まとめ

Mackerelを使うと簡単に監視メトリックの追加が可能です。OpenStackに関連した項目であれば、OpenStack SDKを使ってサーバーリストを取得して以下のようにNova等のAPIのレスポンスタイム等の監視も出来ます。

スクリーンショット 2016-01-03 8.41.15

OpenStackの監視をMackerelでやってみる