Mackerel運用を支える仕組み

marveric

ペパボでムームードメインの開発運用を担当している@pyama86です。 このエントリはMackerel Advent Calendar 2015の12月14日のエントリです。昨日は@ariarijpさんによるエントリでした。 はじめに ペパボでは従来よりサーバ監視の多くがNagiosにより行われていました。しかし昨今では、クラウドとの相性の良さからMackerelによるサーバ管理へと移行しつつあります。このエントリでは細かい管理の紹介については以前筆者がMackerel MeetUp #5で登壇した際の資料に譲り、Mackerelを大規模導入した際に起こりがちな問題を検知する仕組みを紹介します。 ロールに属していないホストを検知する 開発、検証環境ホストへのインストールを検知する 退役忘れホストを検知する オーバースペックなホストを検知する ロールに属していないホストを検知する Mackerelにおいては御存知の通りロールを軸として様々な監視、管理を行うことが出来ます。ホストをロールに所属させるにはmackerel-agent.confに定義、APIを用いて操作いずれかの作業が必要ですが、その作業の両方を行っていない場合、ロールに所属しないホストが出来てしまいます。そうなってしまった場合に、気づくにはmkrコマンドでmkr hosts | jq -r '.[] | select(.roleFullnames == null)'とするか、WEBUIから探し出すといった作業が必要になります。これを自動で検知すべくペパボでは筆者が開発したmalsh(マルシェ)というコマンドを利用しています。malshは同僚の@ryutaro_mizokamが開発しているmackerel-rbを利用して各APIの実行結果をSlackに通知することができるコマンドです。筆者の使用方法としてはwheneverと組み合わせて下記のような使い方をしています。 %w( MACKEREL_APIKEY SLACK_WEBHOOK SLACK_CHANNEL SLACK_USER ).each do |e| env e.to_sym, ENV[e] end every :day, :at => '1:00pm' do

More

Pecの最近のバージョンアップ事情

どもー。 年末になり一層イケメンに磨きがかかってきました山下です。 今回は僕が開発し、メンテナンスしているOpenStackのインスタンス作成ラッパーのPecの最近のバージョンアップについてまとめてみました。 記事を書いた時点の最新バージョンは0.8.1です。 各コマンドに指定できるホスト名が動的に 例えばこれまでは、各コマンドに渡せるホスト名は一つでFQDNでした。 $ pec status example.foo.jp Current machine status: example.foo.jp ACTIVE muumuu m1.small nova comp-node.local 10.10.10.1 これが複数渡せるようになったり、 $ pec status example.foo.jp example.bar.jp Current machine status: example.foo.jp ACTIVE muumuu m1.small nova comp-node.local 10.10.10.1 example.bar.jp ACTIVE muumuu

More

POPメールを便利にするpopperというデーモンプログラムを開発した

スクリーンショット 2015-11-04 12.05.57

POPメールとSlack,GitHubをつなげるツールを書いて運用してました。 困りごと 僕が開発・運用を行っているムームードメインは長らく運用をしてくる中で、プログラムエラーが発生した時や特定の申し込みが行われた場合にいわゆるデバッグメールで通知するという運用になっていて、お問い合わせや、不具合があった場合に、◯十万件のメールの中を本文検索をして、そのメールに含まれる情報を元に対応を行うという状況でした。 加えて、取引先システムの障害通知や、取引先からの業務問い合わせ(クレカ引き落とし調査など)もメールで通知が行われるため、それが埋もれてしまうという問題もありました。 そして、ペパボでは社内のコミュニケーションの殆どがSlackで行われていることから上記のようなメールでのインターフェースをSlackにまとめたいという欲求から開発しました。 SlackのEmail Integrationを採用しなかった理由としてはお客様の個人情報などを含む可能性があったため、外部流出を防ぐ必要があり、すべてをペパボ内で完結させています。(GHEにも対応) popperで出来ること 設定されたメールアカウントをPOP受信し、件名や本文(任意のメールヘッダ)を正規表現でマッチングさせ、Slack通知、GitHubのIssueを作成することができます。 例えば – 件名に[問い合わせ]を含む – 返信メールではない – 上記に該当した場合、Slackに通知し、Issue作成する こういったルールをToml形式でコンフィグに記述し、デーモンを起動すると指定した間隔で処理を行ってくれます。 解決できたこと メールがみんなごとになってどんどん改善が進む メールって基本的には個人で受信するものなので、小さいエラーとかのメールが来てもなかなか自分事として考えるのって難しいと思うんですね。その点、popperでSlack通知してIssue立てまでやっちゃうと、Slackで全員が同じ情報を共有できるし、そのIssueで解決まで管理することが出来るようになりました。 結果的に小さいエラーの撲滅をガンガン行うことによってムームードメインのユーザービリティを向上させることができています。 周知ワークフローを撲滅できる 例えば決済系の取引先システムの障害がムームードメインの開発メーリングリストに届いたら、それを関連する部署に通知し、調整するような業務とかがあったのですが、そういった業務もpopperが関連部署のSlackチャンネルにメンションと心あたたまるメッセージを添えて通知してくれるので、間に人が入ることなく周知できるようになりました。 使い方 まずはコンフィグを作成します $ cat /etc/popper.conf #---------------------------------- # # グローバルデフォルト値 # #---------------------------------- # 返信メールは対象にしない [default.condition] subject = ["^(?!.*Re:).+$"] [default.action.ghe] token = "************************************" url = "http://git.ghe.com" [default.action.slack] webhook_url = "https://hooks.slack.com/services/********/***********/**************************" user = "popper" channel = "#pyama_botest" mentions = ["@pyama"] #---------------------------------- # # pyama # #---------------------------------- [pyama.login] server = "mail-server.jp" user = "pyama" password = "**********" [pyama.rules.test.condition] subject

More

SerfでLvsを管理するNaminoriを書きなおした

夏休み、終わっちゃいますね。 どうも、P山です。 今年の夏休みの宿題は3つ考えていて、今日ようやく終わりました。 OpenStackのKeyPairを利用してSSHログインできるようにする fogでallowed_address_pairsをサポートする Naminoriを完成させる Naminoriは以前第2回ペパボテックカンファレンスの僕の発表で軽く触れていて、 その当時はとりあえず動くだけの状態だったのですが、ようやく書き上げました。 Naminori is Serfでlvsに動的にメンバーを追加したり、ヘルスチェックを行うrubyのライブラリです。 Serfのmember-joinやleave時のLBメンバーの追加削除、サービスがダウンしている場合に 自動でLBメンバーを削除したりすることができます。(VIPは事前に定義してください) 背景としてlvsはヘルスチェック機能がなく、サービスがダウンした場合でも パケットを割り振ってしまったりするので、そのあたりのケアをしています。 またlvsであればUDPパケットも管理できるため、 DNSなどのサービスを動的LBしたい場合に是非使ってみてください。 使い方 独自のDSLを採用しており、簡単な設定だけで使い始めることができます。 event.rb #! /usr/bin/env ruby require 'rubygems' require 'naminori' Naminori.configure do |config| # slack通知の設定 config.notifier :slack do webhook_url "https://hooks.slack.com/services/hoge/fuga/test" channel "#pyama" user

More

mackerelでログ検知を行うプラグイン macklogを作った

ども。 最近イケメンなので普段は精製水を飲んでいます、 山下です。 mackerelのプラグインとして指定したログに指定したキーワードが出力されたらCritical通知するツール書いてみました。 使い方はこんな感じ [plugin.checks.http_fatal_error] command = "macklog -f /var/log/httpd/error.log -w fatal

More

VMを作っては壊すPecというコマンドを作った。

どうも! イケメンの申し子P山です。 現在ペパボではOpenStackを用いてプライベートクラウドを絶賛構築中でして、 その中でVMををガンガン作ってガンガン壊してニヤニヤするためにコマンド作ってみました。 インストール $ gem install specific_install $ gem specific_install 'git@github.com:fog/fog.git' $ gem install pec specific_installを利用する理由はfogというgemを使用していて、 PRがmasterに取り込まれはしているのですが、 月に一回くらいのリリースのようなので、とりあえず今はgitからmasterブランチをインストールしてます。 (今時点でgem installされるfogだとSecurity Groupが適用されない) 追記 specific_installするとうまく動かないケースがあるので、その場合は抜いてください。 使い方 サンプル設定ファイルの作成と接続先の設定 pec initコマンドを実行すると対話式で接続先のAPIの設定を行ったり、 サンプルファイルが作成されます。 $ pec init Start Configure by OpenStack openstack auth_uri: http://your-api-url:35357/v2.0/tokens openstack username: pyama openstack api_key: your_password openstack tenant: your_tenant Configure Complete! create directry user_datas create configure

More

rspecのwebmockを使ってXMLRPCのテストをする時にハマったこととか。

どうも。 GW太り真っ最中、P山です。 先日XMLRPCを使用するコマンドをThorで書いていて、 rspecでwebmockを使おうとした際に、activesupportのto_xmlを使って、ハッシュから戻り値を生成すると、 XMLRPCの処理できる形式のxmlが生成されず、上手くいかなかった。 require 'active_support/core_ext/hash/conversions' require 'yaml' describe 'add' do before do stub_request(:post, "http://api-test.com/host_add").to_return( { :body => YAML.load_file('spec/fixtures/test001.yml').to_xml, :status => 200 }

More

[続編]aliasを登録するラッパーコマンド書いた

記事概要 昨日ブログに書いてたaliasを楽に登録する方法(よく使うコマンドを楽にalias登録する)だと バッチ処理には良いのだけど、 「あ、これ登録しとこう」 っていうときにフランクに登録できないので、フランクに登録出来るコマンド作った。 使い方 README.me通りインストールして頂いたら、 オプションなしだと登録されている設定が表示されます。 追加は2パターン設けていて、オプション無しだと直近に叩いたコマンドを登録出来ます。 -l

More

Rails 3.2.12から4.2.0にアップデートした

スクリーンショット 2015-01-18 15.44.34

ども。 やましもです。 今日は天神で買い物しつつ、びくドンで朝からハンバーグ食べたりしてました。 休憩がてらスタバ入って退屈だったのでRailsUpdate業に勤しんでいます。 手順 Gemfile と追記して、 bundle update で奇跡的に何もなくバージョンアップされることを期待しました。 カジュアルにrails sを実行。 まあ、この時点でいらんことやらなければよかったなんて思うわけですが、 ネットに情報あったので対応していきます。 まずは不足してるgemを追加。 Gemfile 次に、Rails4系から自動Explainがなくなったらしいので、パラメーターを削除。 * /config/environments/development.rb ここまでやってやっと、、画面が・・・・ でない♥ undefined method `set_table_name\' for TeamInformation(Table doesn\'t

More

色々スクレイピングしてGoogleスプレッドシートにぶっこむ

スクリーンショット 2014-11-09 20.32.19

弐ノ弐ハッピーアワー行ってきました。 どうも、山下です。 知ってますか?弐ノ弐のハッピーアワー。 毎日17時〜18時半まで生ビールと焼き餃子が半額なんです。 暴飲暴食な僕と宮路くんでいっても二人で4800円ですよ!!! 福岡の皆さん是非弐ノ弐ハッピーアワーお勧めです。 (普通に美味しいです) さて、今日は昼間ちょっと時間があったので、rubyでスクリプト書いてました。 解決したいこと 今ぼくはGMOペパボという会社でWEBエンジニアとして働いていて、コードは全てGitHubで管理されています。 僕達が書いたコードの本番リリースは決済システムでリリース決済が下りた後、デプロイツールで数クリックで本番にデプロイされる状況にあります。 ただ最近ちょっと悩みなのが、バグが原因でシステム停止などが起こった場合に、その時の温度感だけで 「最近不具合多くね?停止時間長くね?あいつ不具合多くね?」 なんて話になりがちであったりします。 しかし、デプロイツール非常に便利なのですが、不具合があった時にリリース回数、システム停止時間、影響顧客数などの統計を取ろうと思った時になかなか難しかったりして、数字での管理が難しい状況に有ります。 最初に考えたのはRedmineあたりで連携させてうまいことやれないかな、、、なんて検討してみたのだけど、ちょっと都合よさげなプラグインは見つけきれませんでした。 こうなると自前でAPI叩いてDBにデータぶっこんで、上モノをRailsあたりで書こうかなんて話になりがちですが、ちょっとした数字を管理したいのに稼働かけまくるのもイマイチなので、データの出力先としてGoogleスプレッドシートいんじゃね??なんて思ったわけです。 こちらGoogleからAPIも提供されていて、WEB上のスプレッドシートのセルにデータを書き込むなんてこともAPIで出来ますし、各言語のラッパーライブラリもあって結構簡単に使える感じでした。 なにより普通にExcelと機能変わらないので数字こねくり回すの非常に便利なんですね。 僕、Excelマイスターですし 書いてみた 実際仕事で使うかどうかは別にして、ペパボだとリリースは社内システムの決済が下りた後でないと実行できない運用ルールがあるので、その決済システムからデータを抜くイメージでスクレイピングスクリプトを書いてみました。 今日は社内にアクセスする環境がなかったので便宜上Amazonにログインして購入履歴をスプレッドシートに吐いてみたのです。 コードはGitHubにございます。 スクレイピングの方はシステムに合わせて書く必要がありますが、Googleスプレッドシートはこんな感じですね。 # ログイン def login(id=nil,password=nil) id ||= @@id

More