2017-02-17 36 views
6

Я создал несколько хороших участков в графане. Я хочу отобразить некоторые из них непосредственно на панели администратора своего веб-сайта, а не заставлять пользователей переходить на панели мониторинга grafana и принуждать их к двойной аутентификации (один раз для моего сайта и один раз для grafana).Как правильно отображать графаны на панели администратора моего сайта?

Один из вариантов: enable anonymous access in grafana и использовать параметр share/embed in iframe для каждого графика в графане. Хотя он работает с gread, он кажется огромной уязвимостью, если любой, кто знает соответствующий URL, может видеть данные grafana.

Тогда я видел, что grafana имеет HTTP API, но я не вижу возможности отобразить там определенный график.

Я пробовал решение с PHP Proxy, которое добавит заголовки авторизации и подключится к grafana embed URL, если пользователь аутентифицирован на моем сайте. Однако это не работает, и это кошмар для настройки.

Окончательный вариант заключается в том, чтобы захватить png графов от grafana на стороне сервера и обслуживать их только для аутентифицированных администраторов на моем веб-сайте. Тем не менее, в этом случае я теряю весь классный материал. Графана предлагает OOTB, например, расширение/сбой временного диапазона, автоматическое обновление и т. Д.

+0

Вы смогли добиться каких-либо успехов на этом? – creimers

+0

Я сдался с встраиванием диаграмм grafana напрямую. Вместо этого в моем приложении я выставил интересные части [Graphite API] (https://graphite-api.readthedocs.io/en/latest/). Они возвращают данные метрики в json. В панели администратора приложения я обрабатываю эти данные как графики с помощью [chart.js] (http://www.chartjs.org/). Немного утомительно, потому что grafana уже делает то же самое, используя тот же API Graphite, но я не нашел способа повторно использовать его с соответствующими ограничениями. – fracz

+0

Спасибо. Хотел обойти это ... – creimers

ответ

1

Основано на this answer и this answer Я смог встроить приборную панель Grafana на свою страницу.

Положите ваш iframe:

<iframe id="dashboard"></iframe> 

А потом кормить его с содержанием графана, используя AJAX запросы как это:

<script type="text/javascript"> 
    $.ajax(
    { 
     type: 'GET', 
     url: 'http://localhost:3000/dashboard/db/your-dashboard-here', 
     contentType: 'application/json', 
     beforeSend: function(xhr, settings) { 
     xhr.setRequestHeader(
      'Authorization', 'Basic ' + window.btoa('admin:admin') 
     ); 
     }, 
     success: function(data) { 
     $('#dashboard').attr('src', 'http://localhost:3000/dashboard/db/your-dashboard-here'); 
     $('#dashboard').contents().find('html').html(data); 
     } 
    } 
); 
</script> 

запрос AJAX является обязательным, поскольку он позволяет установить заголовок с учетными данными.

В этот момент вы получаете пустой ответ от сервера Grafana из-за CORS. Что вам нужно сделать, так это включить некоторый прокси-сервер для Grafana. Существует пример конфигурации графана и Nginx контейнеров докеров с помощью докер-компоновать ниже:

version: '2.1' 
services: 
    grafana: 
    image: grafana/grafana 
    nginx: 
    image: nginx 
    volumes: 
     - ./nginx.conf:/etc/nginx/nginx.conf 
    ports: 
     - 3000:80 

Последнее, что вы должны сделать, это предоставление файла nginx.conf:

events { 
    worker_connections 1024; 
} 

http { 
# 
# Acts as a nginx HTTPS proxy server 
# enabling CORS only to domains matched by regex 
# /https?://.*\.mckinsey\.com(:[0-9]+)?)/ 
# 
# Based on: 
# * http://blog.themillhousegroup.com/2013/05/nginx-as-cors-enabled-https-proxy.html 
# * http://enable-cors.org/server_nginx.html 
# 
server { 
    listen 80; 

    location/{ 
    #if ($http_origin ~* (https?://.*\.tarunlalwani\.com(:[0-9]+)?$)) { 
    # set $cors "1"; 
    #} 
    set $cors "1"; 

    # OPTIONS indicates a CORS pre-flight request 
    if ($request_method = 'OPTIONS') { 
     set $cors "${cors}o"; 
    } 

    # Append CORS headers to any request from 
    # allowed CORS domain, except OPTIONS 
    if ($cors = "1") { 
     add_header Access-Control-Allow-Origin $http_origin always; 
     add_header Access-Control-Allow-Credentials true always; 
     proxy_pass  http://grafana:3000; 
    } 

    # OPTIONS (pre-flight) request from allowed 
    # CORS domain. return response directly 
    if ($cors = "1o") { 
     add_header 'Access-Control-Allow-Origin' '$http_origin' always; 
     add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always; 
     add_header 'Access-Control-Allow-Credentials' 'true' always; 
     add_header 'Access-Control-Allow-Headers' 'Origin,Content-Type,Accept,Authorization' always; 
     add_header Content-Length 0; 
     add_header Content-Type text/plain; 
     return 204; 
    } 

    # Requests from non-allowed CORS domains 
     proxy_pass  http://grafana:3000; 
    } 
} 

} 

Этот файл базы на условии here, но важное отличие заключается в

add_header 'Access-Control-Allow-Headers' 'Origin,Content-Type,Accept,Authorization' always;

Это указывает на то, что вы позволяете установить Authorization заголовок.

 Смежные вопросы

  • Нет связанных вопросов^_^