Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Grafana Dashboards as Code

2,595 views

Published on

2019.6.3
Prometheus Tokyo Meetup #2

Published in: Software
  • Be the first to comment

  • Be the first to like this

Grafana Dashboards as Code

  1. 1. Prometheus Tokyo Meetup #2 2019/6/3 Takuhiro Yoshida <takuhyos@zlab.co.jp> Grafana Dashboards as Code
  2. 2. ▶「第8章 アプリケーションを運⽤する」 + 8.2 メトリクスモニタリング ▶Kubernetes環境でのPrometheus/ Grafanaの利⽤について解説 広告⚠ + +
  3. 3. 本⽇のテーマ: Grafanaのダッシュボードをどう管理するか?
  4. 4. Dashboards as JSON
  5. 5. Dashboards as JSON{ … "panels": [ { … "id": 2, "legend": { …. } "targets": [ { "expr": "count(kube_deployment_created) by (namespace)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{namespace}}", "refId": "A" } ], … "title": "Number of deployment count by namespace", … Export Import/Provisioning
  6. 6. GitOps ☺ JSON { … }Export Commit/Push JSON { … } Import/Provisioning #
  7. 7. ▶ 監視対象が増えると同じようなグラフを作ることが多い + e.g. HTTPリクエストのリクエスト数/エラー数/レイテンシ ▶ UIでの複製が⾯倒 ▶ 後で修正を反映するのが⼤変 Duplicate 🤔
  8. 8. ▶ メタデータが多く重要な差分が分かりづらい Review 😢
  9. 9. Dashboards as Jsonnet
  10. 10. Jsonnet ▶ https://jsonnet.org/ ▶ JSON形式の設定ファイルを⽣成するためのテンプレーティング⾔語 ▶ JSON + 変数、算術演算、関数、import式など ▶ JSONのスーパーセット + 通常のJSONはJsonnetファイルとして扱える 出典: https://jsonnet.org/
  11. 11. Grafonnet ▶ https://github.com/grafana/grafonnet-lib ▶ Grafanaダッシュボードを⽣成するためのJsonnetライブラリ ▶ Grafanaのダッシュボードやパネルを表すJSONを⽣成するためのJsonnet関数を 提供 ▶ GrafanaのJSONを⽣成できる類似のツール + grafanalib + https://github.com/weaveworks/grafanalib + Python製
  12. 12. Dashboards as Jsonnet local grafana = import 'grafonnet/grafana.libsonnet'; local dashboard = grafana.dashboard; local graphPanel = grafana.graphPanel; local prometheus = grafana.prometheus; local resourcePanel(resource) = graphPanel.new( title='Number of %s count by namespace' % resource, datasource='prometheus', ).addTarget( prometheus.target( expr='count(kube_%s_created) by (namespace)' % resource, legendFormat='{{namespace}}', ) ); local gridPos = { x: 0, y: 0, w: 24, h: 8, }; dashboard.new( 'grafonnet: Kubernetes resource count', ) .addPanel(resourcePanel('deployment'), gridPos) .addPanel(resourcePanel('daemonset'), gridPos) .addPanel(resourcePanel('job'), gridPos) .addPanel(resourcePanel('cronjob'), gridPos) .addPanel(resourcePanel('pod'), gridPos) .addPanel(resourcePanel('configmap'), gridPos) .addPanel(resourcePanel('secret'), gridPos) .addPanel(resourcePanel('service'), gridPos) .addPanel(resourcePanel('endpoint'), gridPos) ▶ import式で別ファイルの関数を使える + Grafonnet(grafana.libsonnet)を利⽤ ▶ 共通部分を関数として定義可能 + PromQLの⼀部(メトリクス名、ラベル) を引数で置換 ① ① ② ② ③ ③ 例: Kubernetesのリソース数を種類ごとに表示するダッシュボード
  13. 13. GitOps ☺ Jsonnet { … } Commit/Push JSON { … } Import/Provisioning JSON { … }Generate Jsonnet { … } #
  14. 14. Duplicate ☺ local grafana = import 'grafonnet/grafana.libsonnet'; local dashboard = grafana.dashboard; local graphPanel = grafana.graphPanel; local prometheus = grafana.prometheus; local resourcePanel(resource) = graphPanel.new( title='Number of %s count by namespace' % resource, datasource='prometheus', ).addTarget( prometheus.target( expr='count(kube_%s_created) by (namespace)' % resource, legendFormat='{{namespace}}', ) ); local gridPos = { x: 0, y: 0, w: 24, h: 8, }; dashboard.new( 'grafonnet: Kubernetes resource count', ) .addPanel(resourcePanel('deployment'), gridPos) .addPanel(resourcePanel('daemonset'), gridPos) .addPanel(resourcePanel('job'), gridPos) .addPanel(resourcePanel('cronjob'), gridPos) .addPanel(resourcePanel('pod'), gridPos) .addPanel(resourcePanel('configmap'), gridPos) .addPanel(resourcePanel('secret'), gridPos) .addPanel(resourcePanel('service'), gridPos) .addPanel(resourcePanel('endpoint'), gridPos) ▶ 関数、importで共通化 ▶ 複製したグラフも⼀括修正可能
  15. 15. Review ☺ ▶ 差分も重要な部分だけでわかりやすい
  16. 16. まとめ
  17. 17. Dashboards as Code ▶ Grafanaのダッシュボードはコードで管理すると便利 + GitOps ▶ Jsonnet/Grafonnetを使うことでグラフの複製やレビュー効率を改善 + グラフや設定の共通化 + わかりやすい差分
  18. 18. ▶ Qiita + 「Dashboards-as-Code: Grafanaダッシュボードをコードから⽣成する」 + https://qiita.com/takuhiro/items/eb79ec17a667faba8be2 Thank you !

×