сообщение: Не удалось импортировать ошибку панели мониторинга при импорте существующего файла json grafana с помощью HTTP API

Я пытаюсь импортировать в Grafana существующий файл json с помощью HTTP API, он успешно читает файл json, но для каждой строки выдает ошибку command not found.

Я попытался выполнить следующую команду,

curl -X POST --insecure -H "Authorization: Bearer eyJrIjoiOWwwUmpQYUFmczhRVG1CZ1VmdTZ1VlZLTlc2ba0xUb0QiLCJuIjoia2xhIiwiaWQiOjJ9" -H "Content-Type: application/json" -d '{"dashboard":{"id": 1,"title": "tested33","tags": ["templated"],"timezone": "browser","rows": [{}],"schemaVersion": 6,"version": 0},"overwrite":false}' -d "$(/u04/my_metrics.json)"   localhost:3000/api/dashboards/db

Он читает каждую строку в файле json, но выдает ошибку

"message": "Не удалось импортировать панель мониторинга"

{
  "annotations": {
  "list": [
   {
    "builtIn": 1,
    "datasource": "-- Grafana --",
    "enable": true,
    "hide": true,
    "iconColor": "rgba(0, 211, 255, 1)",
    "name": "Annotations & Alerts",
    "type": "dashboard"
  }
 ]
},
"editable": true,
"gnetId": 1860,
"graphTooltip": 0,
"id": 35,
"iteration": 1562652036142,
"links": [],
"panels": [
 {
  "collapsed": false,
  "gridPos": {
    "h": 1,
    "w": 24,
    "x": 0,
    "y": 0
  },
  "id": 261,
  "panels": [],
  "repeat": null,
  "title": "General",
  "type": "row"
},
{
  "cacheTimeout": null,
  "colorBackground": false,
  "colorValue": false,
  "colors": [
    "rgba(245, 54, 54, 0.9)",
    "rgba(237, 129, 40, 0.89)",
    "rgba(50, 172, 45, 0.97)"
  ],
  "datasource": "Prometheus",
  "decimals": 2,
  "description": "System Load (1m avg)",
  "format": "short",
  "gauge": {
    "maxValue": 100,
    "minValue": 0,
    "show": false,
    "thresholdLabels": false,
    "thresholdMarkers": true
  },
  "gridPos": {
    "h": 3,
    "w": 4,
    "x": 0,
    "y": 1
  },
  "id": 17,
  "interval": null,
  "links": [],
  "mappingType": 1,
  "mappingTypes": [
    {
      "name": "value to text",
      "value": 1
    },
    {
      "name": "range to text",
      "value": 2
    }
  ],
  "maxDataPoints": 100,
  "maxPerRow": 12,
  "nullPointMode": "null",
  "nullText": null,
  "options": {},
  "postfix": "",
  "postfixFontSize": "50%",
  "prefix": "",
  "prefixFontSize": "50%",
  "rangeMaps": [
    {
      "from": "null",
      "text": "N/A",
      "to": "null"
    }
  ],
  "sparkline": {
    "fillColor": "rgba(31, 118, 189, 0.18)",
    "full": false,
    "lineColor": "rgb(31, 120, 193)",
    "show": false
  },
  "tableColumn": "",
  "targets": [
    {
      "expr": "node_load1{instance=~\"$node:$port\",job=~\"$job\"}",
      "hide": false,
      "intervalFactor": 1,
      "refId": "A",
      "step": 900
    }
  ],
  "thresholds": "",
  "title": "System Load (1m avg)",
  "type": "singlestat",
  "valueFontSize": "50%",
  "valueMaps": [
    {
      "op": "=",
      "text": "N/A",
      "value": "null"
    }
  ],
  "valueName": "current"
}
],
"refresh": false,
"schemaVersion": 18,
"style": "dark",
"tags": [],
"templating": {
"list": [
  {
    "allValue": null,
    "current": {
      "text": "limca",
      "value": "limca"
    },
    "datasource": "Prometheus",
    "definition": "",
    "hide": 0,
    "includeAll": false,
    "label": "Job",
    "multi": false,
    "name": "job",
    "options": [],
    "query": "label_values(node_uname_info, job)",
    "refresh": 1,
    "regex": "",
    "skipUrlSync": false,
    "sort": 1,
    "tagValuesQuery": "",
    "tags": [],
    "tagsQuery": "",
    "type": "query",
    "useTags": false
  },
  {
    "allValue": null,
    "current": {
      "text": "limca",
      "value": "limca"
    },
    "datasource": "Prometheus",
    "definition": "",
    "hide": 2,
    "includeAll": false,
    "label": "",
    "multi": false,
    "name": "name",
    "options": [],
    "query": "label_values(node_uname_info{job=~\"$job\"}, nodename)",
    "refresh": 1,
    "regex": "",
    "skipUrlSync": false,
    "sort": 1,
    "tagValuesQuery": "",
    "tags": [],
    "tagsQuery": "",
    "type": "query",
    "useTags": false
  },
  {
    "allValue": null,
    "current": {
      "text": "limca",
      "value": "limca"
    },
    "datasource": "Prometheus",
    "definition": "",
    "hide": 2,
    "includeAll": false,
    "label": "Host:",
    "multi": false,
    "name": "node",
    "options": [],
    "query": "label_values(node_uname_info{nodename=\"$name\"}, instance)",
    "refresh": 1,
    "regex": "/([^:]+):.*/",
    "skipUrlSync": false,
    "sort": 1,
    "tagValuesQuery": "",
    "tags": [],
    "tagsQuery": "",
    "type": "query",
    "useTags": false
  },
  {
    "allValue": null,
    "current": {
      "text": "9100",
      "value": "9100"
    },
    "datasource": "Prometheus",
    "definition": "",
    "hide": 0,
    "includeAll": false,
    "label": "Port",
    "multi": false,
    "name": "port",
    "options": [],
    "query": "label_values(node_uname_info{instance=~\"$node:(.*)\"}, instance)",
    "refresh": 1,
    "regex": "/[^:]+:(.*)/",
    "skipUrlSync": false,
    "sort": 3,
    "tagValuesQuery": "",
    "tags": [],
    "tagsQuery": "",
    "type": "query",
    "useTags": false
  }
]
 },
 "time": {
"from": "now-24h",
"to": "now"
 },
 "timepicker": {
"refresh_intervals": [
  "5s",
  "10s",
  "30s",
  "1m",
  "5m",
  "15m",
  "30m",
  "1h",
  "2h",
  "1d"
],
"time_options": [
  "5m",
  "15m",
  "1h",
  "6h",
  "12h",
  "24h",
  "2d",
  "7d",
  "30d"
]
},
"timezone": "browser",
"title": "importTest",
"uid": "importjson",
"version": 1
}

Просмотрите файл json один раз и помогите мне решить эту проблему.


person sivanesan1    schedule 04.07.2019    source источник
comment
Измените curl на curl -v, чтобы получить подробный вывод и прикрепить pastebin полного ответа   -  person Tarun Lalwani    schedule 08.07.2019
comment
@TarunLalwani: * О подключении () к порту localhost 3000 (# 0) * Попытка :: 1 ... * Подключено к localhost (:: 1) порту 3000 (# 0) ›POST / api / dashboards / import HTTP / 1.1 ›User-Agent: curl / 7.29.0› Host: localhost: 3000 ›Accept: /› Авторизация: Bearer eyJrIjoiOWwwUmpQYUFmczhRVG1CZ1VmdTZ1VlZLTlc2b0xUb0QiLCJuIjoia2xhIijson application / Content- jOcept-Application / Content-jOcept: ›Content- jOcept-application / Content- jOcept-application / Content-JOINT-Application /› jO-Content-Application / ›jO-JOINT-Application /› j-- Длина: 144 ›   -  person sivanesan1    schedule 08.07.2019
comment
* загрузка полностью отправлена: 144 из 144 байт ‹HTTP / 1.1 500 Внутренняя ошибка сервера‹ Cache-Control: no-cache ‹Content-Type: application / json‹ Истекает: -1 ‹Pragma: no-cache‹ X-Frame -Options: deny ‹X-Xss-Protection: 1; mode = block ‹Дата: понедельник, 8 июля 2019 г., 10:54:41 GMT‹ Content-Length: 40 ‹* Соединение №0 с локальным хостом осталось нетронутым {message: Failed to import dashboard}   -  person sivanesan1    schedule 08.07.2019
comment
я получаю вышеуказанное сообщение   -  person sivanesan1    schedule 08.07.2019
comment
Какие журналы на стороне сервера вы можете проверить?   -  person Tarun Lalwani    schedule 08.07.2019
comment
У меня возникают сомнения по поводу этой строчки Xss-Protection: 1; mode = block, у вас есть идеи, как отключить Xss-Protection в самой команде curl   -  person sivanesan1    schedule 08.07.2019
comment
Журналы не обновляются на стороне сервера для команды curl   -  person sivanesan1    schedule 08.07.2019
comment
Можете ли вы также добавить содержимое файла u04/my_metrics.json?   -  person Tarun Lalwani    schedule 08.07.2019


Ответы (3)


Вы пытаетесь импортировать панель инструментов json /u04/my_metrics.json, которая была экспортирована в пользовательском интерфейсе Grafana. Вы также должны использовать Grafana UI для импорта - https://grafana.com/docs/reference/export_import/.

Если вы хотите использовать API панели управления Grafana (https://grafana.com/docs/http_api/dashboard/), то вам нужно «экспортировать» (правильное название API - «получить панель управления») из Grafana API.

Пользовательский интерфейс Grafana и API панели управления Grafana создают разные схемы тела JSON панелей мониторинга, поэтому вы не можете легко их взаимозаменять. Теоретически вы конвертируете json в правильный формат, но вы должны быть знакомы с используемой схемой тела JSON панели инструментов.

person Jan Garaj    schedule 11.07.2019
comment
Спасибо за информацию. Как новичок, я сталкиваюсь с трудностями при получении приборной панели из api. В документации упоминалось, что мне нужно отправить запрос типа «GET / api / dashboards / uid / cIBgcSjkk HTTP / 1.1», как сформировать завиток запрос для этого и то, что 'cIBgcSjkk' в приведенной выше команде, если я прав, я думаю, мне нужно сформировать запрос что-то вроде 'curl -X GET --insecure -H Авторизация: Bearer eyJrIjoiOWwwUmpQYUFmczhRVG1CZ1VmdTZ1VlZLTlc2bai0xUb' - person sivanesan1; 12.07.2019
comment
Не могли бы вы помочь, как сформировать команду curl, чтобы получить api приборной панели - person sivanesan1; 12.07.2019
comment
Наконец, я нашел решение, я использовал экспортер API по этой ссылке github.com/hagen1778/grafana- import-export и использовал команду curl для импорта панели управления - person sivanesan1; 15.07.2019
comment
curl -XPOST -i localhost: 3000 / api / dashboards / db -u имя пользователя: пароль - -data-binary @ / jsonfilepath / my.json -H Content-Type: приложение / json - person sivanesan1; 15.07.2019

Удалите "id": 17 из json. Он начнет работать

person Mahesh Chikkanna    schedule 04.03.2020
comment
Объясните, почему это решит проблему. - person Nikolai Shevchenko; 04.03.2020
comment
Это пост-операция с использованием API, который мы делаем, и при создании. При импорте панели управления идентификатор будет сгенерирован внутри. Так что ставить не стоит. - person Mahesh Chikkanna; 10.06.2021

Мне нужно автоматизировать запуск контейнера докеров с графаной, настроенной с необходимыми панелями мониторинга, поэтому я выполняю следующие шаги:

  • Сначала я настраиваю панель мониторинга, используя в моем случае метрики, хранящиеся в Prometheus, после завершения проектирования панели мониторинга я использую опцию экспорта для отображения UID панели мониторинга (он также присутствует в URL-адресе).

введите описание изображения здесь

  • Затем я использую инструмент Postman и вызываю Grafana REST API, чтобы получить подробную информацию о панели инструментов в формате JSON через ее UID. Дополнительную информацию можно получить по следующей ссылке .

В моем случае я использую имя пользователя и пароль по умолчанию (admin / admin) и порт 3000, отображаемый при настройке контейнера Docker.

URL-адрес выглядит следующим образом:

http: // админ: админ @ локальный хост: 3000 / api / dashboards / uid / lNCIQZdGk

Как видите, он возвращает метаданные панели мониторинга в совместимом формате для импорта через Grafana REST API.

введите описание изображения здесь

В качестве последнего шага необходимо удалить свойство id JSON, чтобы избежать получения 404 при импорте, и приступить к созданию новой панели мониторинга с этой конфигурацией, присвоив ей новый идентификатор.

введите описание изображения здесь

введите описание изображения здесь

Как видите, удаление этого свойства приведет к созданию новой панели мониторинга и присвоению ей идентификатора 4.

введите описание изображения здесь

Было бы более целесообразно использовать команду CURL, подобную следующей, для автоматизации создания панели мониторинга с помощью сценария:

curl --verbose -L -s --fail -H "Accept: application/json" -H "Content-Type: application/json" -X POST -k http://admin:admin@localhost:3000/api/dashboards/db --data @/etc/grafana/dashboards/kafka_exporter_overview.json

Я поделюсь с вами скриптом, который использую для настройки дашборда и источника данных во время создания контейнера докеров:

GRAFANA_URL=${GRAFANA_URL:-http://$GF_SECURITY_ADMIN_USER:$GF_SECURITY_ADMIN_PASSWORD@localhost:3000}
#GRAFANA_URL=http://grafana-plain.k8s.playground1.aws.ad.zopa.com
DATASOURCES_PATH=${DATASOURCES_PATH:-/etc/grafana/datasources}
DASHBOARDS_PATH=${DASHBOARDS_PATH:-/etc/grafana/dashboards}

# Generic function to call the Vault API
grafana_api() {
  local verb=$1
  local url=$2
  local params=$3
  local bodyfile=$4
  local response
  local cmd

  cmd="curl --verbose -L -s --fail -H \"Accept: application/json\" -H \"Content-Type: application/json\" -X ${verb} -k ${GRAFANA_URL}${url}"
  [[ -n "${params}" ]] && cmd="${cmd} -d \"${params}\""
  [[ -n "${bodyfile}" ]] && cmd="${cmd} --data @${bodyfile}"
  echo "Running ${cmd}"
  eval ${cmd} || return 1
  return 0
}

wait_for_api() {
  while ! grafana_api GET /api/user/preferences
  do
    sleep 5
  done 
}

install_datasources() {
  local datasource

  for datasource in ${DATASOURCES_PATH}/*.json
  do
    if [[ -f "${datasource}" ]]; then
      echo "Installing datasource ${datasource}"
      if grafana_api POST /api/datasources "" "${datasource}"; then
        echo "installed ok"
      else
        echo "install failed"
      fi
    fi
  done
}

install_dashboards() {
  local dashboard

  for dashboard in ${DASHBOARDS_PATH}/*.json
  do
    if [[ -f "${dashboard}" ]]; then
      echo "Installing dashboard ${dashboard}"

      if grafana_api POST /api/dashboards/db "" "${dashboard}"; then
        echo "installed ok"
      else
        echo "install failed"
      fi

    fi
  done
}

configure_grafana() {
  wait_for_api
  install_datasources
  install_dashboards
}

echo "Running configure_grafana in the background..."
configure_grafana &
/run.sh
exit 0

Надеюсь, этот ответ может кому-то помочь.

person Sergio Sánchez Sánchez    schedule 12.09.2020