LoginSignup
0
0

More than 5 years have passed since last update.

Write your blackbird plugin #001

Last updated at Posted at 2014-12-31

今回はblackbird pluginの書き方第一弾ってことで、blackbirdのデータ送信の仕組みについてお話をします!
同時にblackbird自体の起動シーケンシャルについてもお話できればなーと思ってます。

ではざっくり概要編逝きます。

plugin方式

blackbirdはデータ(各ミドルウェアのMetricなので厳密にはデータとは呼ばないかもしれませんが)の取得部分も、送信部分もplugin形式を採用しています。
取得するPluginは特定の基底クラスを継承したクラスを実装することで、Pluginとして成立します。
そのため、基本的にはsnipetレベルのPythonファイルをひとつ書くだけで実装できます。

起動シーケンシャル

全体のながれとしては、

  1. blackbirdコマンドライン(rpmでインストールすると/usr/bin/blackbird)からの起動
  2. blackbird.sr71.Blackbirdインスタンスの生成
  3. Main関数(blackbird.sr71.main)の呼び出し
  4. 設定ファイルの読み込み
  5. 取得及び送信プラグイン用にThreadを個別に作成
  6. 各Threadをkick
  7. 各ThreadがMetric用のQueueに格納及びQueueからの読み込み

というながれになってます。

2. blackbirdインスタンスの生成

blackbirdインスタンスは生成時に(__init__メソッド呼び出し時に)configのcheckを行います。
その際root config fileといいますか、blackbird --config=CONFIG_FILEのように--configオプションで指定したファイルを読み込みます。
そして、include_dirディレクティブで指定したpathを確認して、includeされる各ファイルを読み込んでいきます。
同時に、configのparseとvalidationも行っており、この段階でvalidation errorが発生した場合、起動に失敗します。

notes:

ここでいうvalidation errorとはint型を期待しているディレクティブに対してstr型が入っていたり(int()メソッドがValueErrorを吐くとも言い換えられます)、
必須のディレクティブが指定されていなかったりという具合です。

5. 各種plugin用にThreadを生成

各Threadには名前(名前自身には意味はありませんが、debug時の透過性をあげてくれたり、名前つきで起動されることで異なる設定で複数のpluginを読み込むことが可能になります)がつけられます。
Thread名にはconfig内のセクション名(後述)を用います。

ここでいうセクション名とは

[SECTION_NAME]
directive_001 = XXXXX
directive_002 = ABC012

上記のSECTION_NAMEを意味します。つまり、この場合SECTION_NAMEという名前のThreadが生成されます。

6. 各Threadをkick

blackbird.sr71.BlackbirdインスタンスがMainのプロセスとなりこのプロセスが各Threadのrunメソッドを呼び出し、runメソッドが各pluginのデータを収集するメソッドを呼び出す仕組みです。

7. 各ThreadがMetric用のQueueに格納及びQueueからの読み込み

各ThreadはMetric用(データ用)のQueueにアイテムを投げ、また、どこかにsendするplugin用のpluginはQueueからアイテムを取り出し、データを送信します。

今までの内容を図に表すとこんな感じ

------------------------------------------
| blackbird Main process                 |
------------------------------------------
  |              |              |
  -- Tharead001  -- Thread002    -- Thread003 ...

  ---------
  |-------|
  |-------|
  | Queue |
  |-------|
  |-------|
  ---------

# QueueはMainのprocess内に生成されるます

っで??

っで、結局なにが言いたいかって言うと、plugin書くだけならすげえ簡単で、データやMetricsを取得する部分を書いて、基底クラスのenqueueメソッドを呼び出してやれば基本的には終了です。
pluginの書き方の詳細については、次回で詳しく説明しますね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0