Skip to content

Instantly share code, notes, and snippets.

@kenjiskywalker
Last active December 29, 2015 17:19
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kenjiskywalker/7703670 to your computer and use it in GitHub Desktop.
Save kenjiskywalker/7703670 to your computer and use it in GitHub Desktop.

Monitoring Casual Talk in Kyoto

Monitoring Casual Talk in Kyoto

Zabbix::Senriganをつくった話をします

もくじ

課題があった
1. これはなにか
2. なにがつらいのか
3. 機能としてのZabbix
4. Zabbixは人類に扱えるものなのか
5. 毎日カジュアルに全台の全メトリクスを見たい(もしくは気になるところをサクっと見たい)

解決する
6. Zabbixのスキーマ設計を確認
7. グラフ名でまとめるしかない
8. グラフをMechanizeで取得する
9. グラフ一覧のつくりかた
10. Zabbix::Senrigan後の世界

まとめ
まとめ

課題があった

1. これは何か

Zabbixのプルダウン地獄から逃れる蜘蛛の糸


2. なにがつらいのか

再現してみよう

想像力が必要


3. 機能としてのZabbix

最高。これ以上ないと思う

3-1. メトリクスとアラートの両立
Zabbixだけでメトリクス取得とそのメトリクスの値を利用したアラートの設定ができる

3-2. 取得アイテム数値の柔軟性
その値ではなく、前回と今回の差分をアイテムとして保存できる

3-3. アラート設定の柔軟性
1週間前の同じ時間帯前後30分と比べて〜のように時空を超えて設定できる

3-4. グラフ設定の柔軟性
積算・円など設定が可能


4. Zabbixは人類に扱えるものなのか

機能が多すぎる


5. 毎日カジュアルにサーバ全台の全メトリクスを見たい

見れるようなものつくろう

解決する

6. Zabbixのスキーマ設計を確認

グラフのテーブル

CREATE TABLE `graphs` (
        `graphid`                bigint unsigned                           NOT NULL,
        `name`                   varchar(128)    DEFAULT ''                NOT NULL,
        `width`                  integer         DEFAULT '0'               NOT NULL,
        `height`                 integer         DEFAULT '0'               NOT NULL,
        `yaxismin`               double(16,4)    DEFAULT '0'               NOT NULL,
        `yaxismax`               double(16,4)    DEFAULT '0'               NOT NULL,
        `templateid`             bigint unsigned                           NULL,
        `show_work_period`       integer         DEFAULT '1'               NOT NULL,
        `show_triggers`          integer         DEFAULT '1'               NOT NULL,
        `graphtype`              integer         DEFAULT '0'               NOT NULL,
        `show_legend`            integer         DEFAULT '1'               NOT NULL,
        `show_3d`                integer         DEFAULT '0'               NOT NULL,
        `percent_left`           double(16,4)    DEFAULT '0'               NOT NULL,
        `percent_right`          double(16,4)    DEFAULT '0'               NOT NULL,
        `ymin_type`              integer         DEFAULT '0'               NOT NULL,
        `ymax_type`              integer         DEFAULT '0'               NOT NULL,
        `ymin_itemid`            bigint unsigned                           NULL,
        `ymax_itemid`            bigint unsigned                           NULL,
        `flags`                  integer         DEFAULT '0'               NOT NULL,
        PRIMARY KEY (graphid)
) ENGINE=InnoDB;

ホストのテーブル

CREATE TABLE `hosts` (
        `hostid`                 bigint unsigned                           NOT NULL,
        `proxy_hostid`           bigint unsigned                           NULL,
        `host`                   varchar(64)     DEFAULT ''                NOT NULL,
        `status`                 integer         DEFAULT '0'               NOT NULL,
        `disable_until`          integer         DEFAULT '0'               NOT NULL,
        `error`                  varchar(128)    DEFAULT ''                NOT NULL,
        `available`              integer         DEFAULT '0'               NOT NULL,
        `errors_from`            integer         DEFAULT '0'               NOT NULL,
        `lastaccess`             integer         DEFAULT '0'               NOT NULL,
        `ipmi_authtype`          integer         DEFAULT '0'               NOT NULL,
        `ipmi_privilege`         integer         DEFAULT '2'               NOT NULL,
        `ipmi_username`          varchar(16)     DEFAULT ''                NOT NULL,
        `ipmi_password`          varchar(20)     DEFAULT ''                NOT NULL,
        `ipmi_disable_until`     integer         DEFAULT '0'               NOT NULL,
        `ipmi_available`         integer         DEFAULT '0'               NOT NULL,
        `snmp_disable_until`     integer         DEFAULT '0'               NOT NULL,
        `snmp_available`         integer         DEFAULT '0'               NOT NULL,
        `maintenanceid`          bigint unsigned                           NULL,
        `maintenance_status`     integer         DEFAULT '0'               NOT NULL,
        `maintenance_type`       integer         DEFAULT '0'               NOT NULL,
        `maintenance_from`       integer         DEFAULT '0'               NOT NULL,
        `ipmi_errors_from`       integer         DEFAULT '0'               NOT NULL,
        `snmp_errors_from`       integer         DEFAULT '0'               NOT NULL,
        `ipmi_error`             varchar(128)    DEFAULT ''                NOT NULL,
        `snmp_error`             varchar(128)    DEFAULT ''                NOT NULL,
        `jmx_disable_until`      integer         DEFAULT '0'               NOT NULL,
        `jmx_available`          integer         DEFAULT '0'               NOT NULL,
        `jmx_errors_from`        integer         DEFAULT '0'               NOT NULL,
        `jmx_error`              varchar(128)    DEFAULT ''                NOT NULL,
        `name`                   varchar(64)     DEFAULT ''                NOT NULL,
        PRIMARY KEY (hostid)
) ENGINE=InnoDB;

powerd by tiqav


7. グラフ名でまとめるしかない

ホストにgraphidの情報が関連付けられていないのでグラフ名でまとめるしかない

my $sth = $dbh->prepare('SELECT graphid FROM graphs WHERE name = ? \
AND templateid IS NOT NULL');
$sth->execute($graph_name);

templateでitem付与していない場合はtemplateid IS NOT NULLは消さないとダメ
そもそもtemplateかhostかがわかるフラグがあればいい。(ありそう)

これでグラフ名毎のグラフIDは取得できることがわかった


8. グラフをMechanizeで取得する

http://temple.kenjiskywalker.org/zabbix/chart2.php?graphid=535&width=500&period=86400&stime=20131128120000

chart2.php?graphid=$graphid &width=$width &period=$period &stime=$days$time  
chart2.php?graphid=535      &width=500    &period=86400   &stime=20131128 120000  

9. グラフ一覧のつくりかた

9-1. graphs.nameで抽出したいグラフ名を指定
9-2. graphs.namegraphidが取れる
9-3. graphiidを利用してひたすらMechanizeでローカルにダウンロード
9-4. graph.nameを利用して個別ページを生成
9-5. demoのようにページが生成されるので、よしななディレクトリに放り込む


10. Zabbix::Senrigan後の世界

10-1. 職人が機械では気付かないような変化に気づきやすくなった
10-2. cpanfile置いてポータビリティ性持たせたけど敷居は高いと思う
10-3. 色々先輩たちにききながらほしいものがつくれたのは今後の役に立つ


まとめ

目を閉じたらすべてのサーバのメトリクスの情報が手に入るようにしたい

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment