Prometheus の label をいいかんじに使う 〜多次元データってなんなのさ〜

54b63b9d58e185f652ab5cc91de8287e?s=47 sugitak
April 10, 2017

Prometheus の label をいいかんじに使う 〜多次元データってなんなのさ〜

【Prometheus Tokyo Meetup #1】
Prometheus は立てるのは簡単ですが、しっかり使おうとすると Label を適切に設定できるようになる必要があります。 Label について自分で調べたときにはあまりドキュメントが整理されておらず、適切な理解に到るまでにずいぶん時間を使ってしまったので、今後 prometheus を立てる人のために、私が経験したことを一通り日本語資料に落としておきます。

54b63b9d58e185f652ab5cc91de8287e?s=128

sugitak

April 10, 2017
Tweet

Transcript

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

    #1 sugitak
  2. qiita:sugitak です • 元・ネットワーク系 ◦ Cisco ◦ 無線構築 • 自称デプロイ屋

    ◦ bundler, capistrano, … • 監視も古典系出身 ◦ Nagios + Cacti から開始 ◦ munin, growthforecast, … ◦ Zabbix ◦ mackerel • 現在は freee 社で開発者
  3. None
  4. Prometheus 便利い、 が…

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

  6. Label

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

  8. ラベルとは? • ようはタグ • Grafana でまとめて見たい単位 ◦ Stage ごととか、 Role

    ごととか、 Service ごととか ◦ データセンターごととか、ラックごととか • Alert をまとめる単位にもなるので、きちんとつける これをきちんとつけてると、 Grafana で「このラベルのデータだけ絞り込んで見たい」と いうことができる! 絞り込みを複数のパラメータで独立してできるので「多次元」という言い方 正直わかりにくい
  9. None
  10. 今日の話 • ラベルの設定の仕方とクセ(入門者向け) • Grafana で「全ホスト」を指定する方法 • おまけ

  11. Label のつけ方

  12. 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”
  13. デフォルトでは、ラベルは登録されない 使用する段階でのラベル 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”
  14. このときの処理 life-of-a-label という記事があるのでそちらを参 照(左図も記事から引用) • __meta から始まるタグはシステム利用 • __(アンダースコア二つ)から始まるタグは 消される

    → 利用したいタグは、__ のつかない形に変換 する必要がある
  15. ラベル名の変換規則を設定ファイルに書く 使用する段階でのラベル 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
  16. 変換ロジック例

  17. ラベルの 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
  18. Grafana での使い方

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

    になっている Grafana Templating と Prometheus
  20. Grafana の Templating 機 能の場所。メニュー上部から 選ぶ Grafana Templating と Prometheus

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

  22. Template の詳細設定にて “All” にチェックを入れる チェックを入れるだけで「全ホ スト指定」をできるようになる クエリは Grafana が適切に 生成してくれる。すごい。

    t-yamatoya さん、ご指摘あり がとうございます!!
  23. 以上! alert でも tag 追加する機能があるけど、時間がないので割愛 個人的には alert で tag 追加するような場面はない(

    severity 除く)
  24. おまけ: Grafana のグラフ表示を早くするテクニック集 点と線の数が増えれば増えるほど処理が遅くなるので 普段見るグラフはとにかくダイエットさせるのがおすすめ • Resolution を下げる ◦ よく変化するものでも

    1/4 程度。あまり変化しないものは 1/10 にする • 可能な限りアグリゲーション系関数を使う ◦ なるべく個別ホストを見ない ◦ 「メモリが最低になっているホスト」とか「平均」を見る • rate より irate を使う(ただし変化の振れ幅が大きいものに限る) • 使われていない or 文を消す ◦ 公開されてる Grafana screen はいろんな環境で使えるように作られてるので、自分の環境に合わ せてチューンするといいかんじになる • topk, bottomk を活用する ◦ 高い方から k 件、低い方から k 件をグラフにしてくれる ◦ min, max では問題がおきているのが一件だけなのかわからなくて困る、というときに • 見ないグラフを消す、proactive / reactive を意識して board を分ける
  25. おまけのおまけ: 情報がないときにしてること • https://prometheus.io を読み込む ◦ ややわかりにくいけど、全部読めば知りたいことのうち 70% くらいは書いてある ◦

    ドキュメント整備プロジェクトも開始してるので今後に期待 • promcon の資料を見る ◦ 2016 年の promcon の英語資料がかなりいい。実は公式よりも入門者向け ◦ 2017 年は 8 月開催予定 • Prometheus users ML で検索する • 諦めてコード読む
  26. 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"} 修正前のスライド