Slide 1

Slide 1 text

Prometheus の label を いいかんじに使う 〜多次元データってなんなのさ〜 2017/04/10 Prometheus Tokyo Meetup #1 sugitak

Slide 2

Slide 2 text

qiita:sugitak です ● 元・ネットワーク系 ○ Cisco ○ 無線構築 ● 自称デプロイ屋 ○ bundler, capistrano, … ● 監視も古典系出身 ○ Nagios + Cacti から開始 ○ munin, growthforecast, … ○ Zabbix ○ mackerel ● 現在は freee 社で開発者

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

Prometheus 便利い、 が…

Slide 5

Slide 5 text

便利に使うためには きちんと label を つけないといけない

Slide 6

Slide 6 text

Label

Slide 7

Slide 7 text

ホストのロール(機能)、ステージ、 Availability Zone、 等 そのデータを特徴付けるラベル をメトリックにつける

Slide 8

Slide 8 text

ラベルとは? ● ようはタグ ● Grafana でまとめて見たい単位 ○ Stage ごととか、 Role ごととか、 Service ごととか ○ データセンターごととか、ラックごととか ● Alert をまとめる単位にもなるので、きちんとつける これをきちんとつけてると、 Grafana で「このラベルのデータだけ絞り込んで見たい」と いうことができる! 絞り込みを複数のパラメータで独立してできるので「多次元」という言い方 正直わかりにくい

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

今日の話 ● ラベルの設定の仕方とクセ(入門者向け) ● Grafana で「全ホスト」を指定する方法 ● おまけ

Slide 11

Slide 11 text

Label のつけ方

Slide 12

Slide 12 text

Service Discovery されてきたホストのデータの場合 Service Discovery されてきたデータ __address__ = ”192.168.0.1:9100” __meta_ec2_tag_Role = “Web” __meta_ec2_tag_Stage = “Production” __meta_ec2_private_ip = “192.168.0.1”

Slide 13

Slide 13 text

デフォルトでは、ラベルは登録されない 使用する段階でのラベル instance = ”192.168.0.1:9100” __meta_ec2_tag_Role = “Web” __meta_ec2_tag_Stage = “Production” __meta_ec2_private_ip = “192.168.0.1” Service Discovery されてきたラベル __address__ = ”192.168.0.1:9100” __meta_ec2_tag_Role = “Web” __meta_ec2_tag_Stage = “Production” __meta_ec2_private_ip = “192.168.0.1”

Slide 14

Slide 14 text

このときの処理 life-of-a-label という記事があるのでそちらを参 照(左図も記事から引用) ● __meta から始まるタグはシステム利用 ● __(アンダースコア二つ)から始まるタグは 消される → 利用したいタグは、__ のつかない形に変換 する必要がある

Slide 15

Slide 15 text

ラベル名の変換規則を設定ファイルに書く 使用する段階でのラベル instance = ”192.168.0.1:9100” Role = “Web” Stage = “Production” Service Discovery されてきたラベル __address__ = ”192.168.0.1:9100” __meta_ec2_tag_Role = “Web” __meta_ec2_tag_Stage = “Production” __meta_ec2_private_ip = “192.168.0.1” relabel_configs: - source_labels: [__meta_ec2_tag_Role] target_label: Role - source_labels: [__meta_ec2_tag_Stage] target_label: Stage

Slide 16

Slide 16 text

変換ロジック例

Slide 17

Slide 17 text

ラベルの Best Current Practice ● ラベルはホストの属性そのものなので、変わらないものを選択する ● ラベルはカーディナリティ低いものにする ○ せいぜい10種類に収まるものだけ、ラベルとして検討する ● ラベルの種類はあまり増やしすぎない ○ メモリやCPU、ネットワーク帯域などに影響が出る https://www.robustperception.io/target-labels-are-for-life-not-just-for-christmas/ https://prometheus.io/docs/practices/naming/#labels https://prometheus.io/docs/practices/instrumentation/#do-not-overuse-labels

Slide 18

Slide 18 text

Grafana での使い方

Slide 19

Slide 19 text

Grafana の Templating 機 能を使うと、 Prometheus へ のクエリに変数を使える “$stage” というところが変数 になっている Grafana Templating と Prometheus

Slide 20

Slide 20 text

Grafana の Templating 機 能の場所。メニュー上部から 選ぶ Grafana Templating と Prometheus

Slide 21

Slide 21 text

Prometheus の “Role” label を $role として使うよという設定

Slide 22

Slide 22 text

Template の詳細設定にて “All” にチェックを入れる チェックを入れるだけで「全ホ スト指定」をできるようになる クエリは Grafana が適切に 生成してくれる。すごい。 t-yamatoya さん、ご指摘あり がとうございます!!

Slide 23

Slide 23 text

以上! alert でも tag 追加する機能があるけど、時間がないので割愛 個人的には alert で tag 追加するような場面はない( severity 除く)

Slide 24

Slide 24 text

おまけ: Grafana のグラフ表示を早くするテクニック集 点と線の数が増えれば増えるほど処理が遅くなるので 普段見るグラフはとにかくダイエットさせるのがおすすめ ● Resolution を下げる ○ よく変化するものでも 1/4 程度。あまり変化しないものは 1/10 にする ● 可能な限りアグリゲーション系関数を使う ○ なるべく個別ホストを見ない ○ 「メモリが最低になっているホスト」とか「平均」を見る ● rate より irate を使う(ただし変化の振れ幅が大きいものに限る) ● 使われていない or 文を消す ○ 公開されてる Grafana screen はいろんな環境で使えるように作られてるので、自分の環境に合わ せてチューンするといいかんじになる ● topk, bottomk を活用する ○ 高い方から k 件、低い方から k 件をグラフにしてくれる ○ min, max では問題がおきているのが一件だけなのかわからなくて困る、というときに ● 見ないグラフを消す、proactive / reactive を意識して board を分ける

Slide 25

Slide 25 text

おまけのおまけ: 情報がないときにしてること ● https://prometheus.io を読み込む ○ ややわかりにくいけど、全部読めば知りたいことのうち 70% くらいは書いてある ○ ドキュメント整備プロジェクトも開始してるので今後に期待 ● promcon の資料を見る ○ 2016 年の promcon の英語資料がかなりいい。実は公式よりも入門者向け ○ 2017 年は 8 月開催予定 ● Prometheus users ML で検索する ● 諦めてコード読む

Slide 26

Slide 26 text

Template の詳細設定にて “All” の置き換えを設定 こうすることで、 PromQL に 合う形で「全ホスト指定」をで きる テンプレート node_memory_MemAvailable{Stage=~"$stage", Role=~"$role"} Stage: All Role: All node_memory_MemAvailable{Stage=~".+", Role=~".+"} Stage: All Role: web node_memory_MemAvailable{Stage=~”.+", Role=~"web"} 修正前のスライド