让我们通过HTTP API来迁移Grafana仪表板,即使有一些小问题也没关系

概括来说

你好。我是nntsugu。

我昨天写了一篇关于在我喜欢的Grafana社区仪表盘——Node Exporter Server Metrics上添加图表来显示文件描述符使用量的帖子。
这是我昨天的帖子。

    • 行の繰り返しはRow Options > のRepeat forで設定できる

 

    列の繰り返しはPanel titleをクリック > Edit > General > Templating > Repeat Panelで設定できる

我想表达的是这个故事并不是基于直觉。

说到这次的话题,大家是如何进行Grafana仪表板的迁移呢?
我经常在观察生产环境的数据指标时,会在生产环境中添加新的面板。
不论好坏,我有一种将上述操作应用到验证环境或负载测试环境的需求。

如果想要在另一个环境或组织中反映某个已扩展的仪表盘,方法是什么?

    • GUIで対象DashboardをExportして、GUIで反映したい先にImportする

 

    GUIで対象DashboardをExportして、HTTP API – Dashbouard APIで反映したい先にCreateする

我会在接下来的内容中详细说明后一点。Grafana有一个HTTP API文档,但由于记录的过于简略或有错误,所以存在一些困难点。希望这能对那些即将执行同样操作的人提供一些帮助。

最近的版本中似乎没有批量导出Dashboard的功能。
而且HTTP API中似乎也没有与导出相关的功能。
如果有了解的人,请告知,我将不胜感激。

没性懒惰地谈论Grafana吧。嗯,无所谓啦。

前提 tí)

    Grafana 4.6.1以降で試しました。

绊倒点

使用Grafana的HTTP API时可能会遇到的困难点。
因为它相对来说并不容易察觉,所以我首先写下来。

摘要1. HTTP API文档的阅读方法:认证篇

在调用HTTP API时需要身份验证信息。
有两种身份验证方法,需要根据API的要求选择使用。

– 需要管理员权限的内容:使用管理员用户的ID / 密码进行基本身份验证
– 不需要管理员权限的内容:使用API_TOKEN(※)进行Bearer身份验证

请参阅2. API Token的获取章节,了解如何获取API_TOKEN。

如果使用了错误的身份验证方法,将会出现以下的”Permission denied”错误。

$ curl -H "Authorization: Bearer ${API_TOKEN}" -X PUT --insecure -H "Content-Type: application/json" -d '{
   "name":"AkaiR"
 }' http://localhost:3000/api/orgs/${ORGID}

{"message":"Permission denied"}

管理者API中有解释,但每个API的示例请求说明写得不一致且可能有错误,因此开始时可能会感到困惑。
上述的更新组织API需要使用基本认证,但文档中写的是Bearer认证。
http://docs.grafana.org/http_api/org/#update-current-organisation

实际上,在Grafana的问题中,有一些用户询问API无法正常工作的原因是由于错误的身份验证。

辨識認證方法的方式

查看例子请求的授权

Authorization: Basic hogefugaもしくは記載なし ならBasic認証(リクエストにAdminの認証情報 ex. -u admin:secret を含める)

記載なしサンプル: Global Users

Basic認証サンプル: Search Users

Authorization: Bearer hogefuga ならAPI_TOKENでのBearer認証(リクエストに-H “Authorization: Bearer ${API_TOKEN}”を含める)

サンプル: Create / Update dashboard

上記の見分け方で上手くいかない場合 ドキュメントの記載が間違っている可能性大。ドキュメントにある以外の認証方法を試してみると◎

サンプル: Update current Organisation : ドキュメントの記載はAuthorization: Bearerだが、Basic認証でないとPermission deniedとなる

在使用GUI导出的JSON文件不能直接在HTTP API – Dashboard API中使用时会遇到问题。

通过GUI导出的仪表盘JSON无法直接使用于HTTP API。需要将其放入仪表盘对象中。

{ "dashboard":
  ###ここにExportしたJSONのを入れる###
}

在创建Dashboard时,强制将以下内容用dashboard对象进行封装。

sed -ie '1s/^/\{\"dashboard\"\:/' ${_DASHBOARD_JSON}
echo '}' >> ${_DASHBOARD_JSON}

如果比较导出的JSON和文档,就会明白。。虽然说是明白,但很容易忽略。

创建仪表盘的步骤(HTTP API)

1. 启动Grafana

我們使用Grafana官方的Docker映像來自https://hub.docker.com/r/grafana/grafana/。

sudo docker run \
  -d \
  -p 3000:3000 \
  --name=grafana \
  -e "GF_SECURITY_ADMIN_PASSWORD=secret" \
  grafana/grafana

在使用像Docker Hub这样的公共仓库的Docker镜像时,尽可能选择官方或者有公开Dockerfile的镜像。
使用不受信的镜像是危险的,可能导致比特币被挖矿等问题。

GF_SECURITY_ADMIN_PASSWORD是用于登录Grafana GUI的管理员用户密码。在将来使用API时也会使用它。

在Docker启动后,你可以在http://localhost:3000/上看到Grafana GUI的登录界面。使用登录ID admin和设置为GF_SECURITY_ADMIN_PASSWORD的密码值进行登录,确保能够成功登录。

获取API Token

获取和保存API令牌

_CREDENTIAL_FOR_ADMIN='admin:secret' #(A)
ORGID=1 #(B)
API_TOKEN=`curl -X POST -H "Content-Type: application/json" -d '{"name":"apikeycurl", "role": "Admin"}' http://admin:secret@localhost:3000/api/auth/keys | jq -r ' .key '`
echo ${API_TOKEN} >> ~/.token #(C)
    • (A)_CREDENTIAL_FOR_ADMINにはadminユーザのID:Passwordを設定します。

 

    • (B)ORGIDは決め打ちにしています。1はデフォルトで作られるMain Org.のID。複数のOrganizationを作成する場合はCreate Organisation APIあたりでOrganizationを追加し、適切ORGIDなものを指定してください。

 

    (C)適当な場所に保存しておきます。ちゃんと運用する場合はちゃんとセキュアな保存場所に保存してくださいね。Vaultとか、k8sのSecretとか。

根据个人喜好,可以更改组织名称。

curl -u ${_CREDENTIAL_FOR_ADMIN} -X PUT --insecure -H "Content-Type: application/json" -d '{
  "name":"AkaiR"
}' http://localhost:3000/api/orgs/${ORGID}

创建用户

curl -X POST http://${_CREDENTIAL_FOR_ADMIN}@localhost:3000/api/user/using/${ORGID} #(A)
curl -u ${_CREDENTIAL_FOR_ADMIN} -X POST --insecure -H "Content-Type: application/json" -d '{
  "name": "AkaiR",
  "email": "akair@hogefuga.jp",
  "login": "akair",
  "password": "Ak@Ir"
}' http://localhost:3000/api/admin/users #(B)
curl -u ${_CREDENTIAL_FOR_ADMIN} -X PATCH --insecure -H "Content-Type: application/json" -d '{
    "role": "Admin"
}' http://localhost:3000/api/org/users/2 #(C)
    • (A) ユーザを作成したいOrganizationに切り替えておきます

 

    • (B) ユーザを作成します

 

    (C) (B)で作成したユーザのroleを”Admin”に変更します

在这个时候,应该已经可以使用akair:Ak@Ir登录http://localhost:3000/了。组织名称也应该是AkaiR。

4. 定义数据源

本文中的“データソース”指的是数据的来源,这次我们将从Prometheus获取数据。

curl -X POST --insecure -H "Authorization: Bearer ${API_TOKEN}" -H "Content-Type: application/json" -d '{
  "name":"Prometheus",
  "type":"prometheus",
  "url":"http://prometheus_url:9090",
  "access":"proxy",
  "basicAuth":false
}' http://localhost:3000/api/datasources #(A)
    (A) prometheus_url:9090はご自身の環境のものに置き換えてください

创建仪表板

将想要移动的仪表板导出

这次,我们导出了在https://qiita.com/nntsugu/items/0973c5f4c888a3a89e53 上自定义的仪表板。

Screen Shot 2017-12-25 at 18.23.52.png
Screen Shot 2017-12-25 at 18.23.30.png

在出现的对话框中,选择”保存为文件”选项来下载JSON文件。

Screen Shot 2017-12-25 at 18.31.05.png

下載的文件

/grafana/templates/node_by_hostname.json 的路径

我們將其放置在了… qí fù le…)

使用HTTP API根据导出的仪表板JSON创建仪表板。

curl -X POST http://${_CREDENTIAL_FOR_ADMIN}@localhost:3000/api/user/using/${ORGID} #(A)
_DASHBOARD_JSON="/path/to/grafana/templates/node_by_hostname.json" #(B)
sed -ie '1s/^/\{\"dashboard\"\:/' ${_DASHBOARD_JSON} #(C)
echo '}' >> ${_DASHBOARD_JSON}
curl -X POST --insecure -H "Authorization: Bearer ${API_TOKEN}" -H "Content-Type: application/json" -d @${_DASHBOARD_JSON} http://localhost:3000/api/dashboards/db #(D)
    • (A) Dashboardを作成したいOrganizationに切り替える(1つしかないけど、明示的に切り替えたい派)

 

    • (B) ExportしたJSONファイルへのPathを指定する

 

    • (C) (B)をdashboardオブジェクトの中に入れる

 

    (D) Create dashboard APIでDashboardを作成する

确认仪表板已完成。

6-1. 登录

Screen Shot 2017-12-25 at 20.18.08.png

3. 用已创建的akair用户登录。

请确认仪表盘已完成。

Screen Shot 2017-12-25 at 20.23.19.png
Screen Shot 2017-12-06 at 15.29.29.png

辛苦了。