Grafana: Adicionar fonte de dados sem usar a interface do usuário da web

Criado em 15 abr. 2015  ·  40Comentários  ·  Fonte: grafana/grafana

Olá,
Só me pergunto se é possível adicionar fontes de dados 'da linha de comando ou arquivo de configuração' em vez de usar a opção 'Adicionar fonte' da interface da web ...
Eu gostaria de fazer um processo de instalação que automatiza a instalação do influxdb + instalação do grafana e cria automaticamente a fonte de dados do influxdb 'localhost' dentro do grafana. Isso é viável?
Obrigado

Comentários muito úteis

Este problema pode ser reaberto?
Eu gostaria muito de uma opção semelhante a dashboards.json para ter um diretório onde as fontes de dados desejadas podem ser definidas

Todos 40 comentários

É, por meio da API da web:

curl ' http: // localhost : 3000 / api / datasources' -X PUT --data-binary '{"nome": "teste", "tipo": "influxdb_08", "url": " http: // localhost : 8086 "," access ":" proxy "," isDefault ": true," database ":" asd "," user ":" asd "," password ":" asd "} '

O problema é que para o funcionamento acima você precisa de uma chave de API, e para criar uma chave de API, você precisa de uma IU. A solução é ser capaz de usar a api com nome de usuário / senha (por exemplo, com nome de usuário / senha de administrador)

Obrigado, vou tentar isso e ver :-)
O principal problema é que não consigo encontrar nenhum documento sobre a API da web ... talvez esteja faltando alguma coisa.

Aqui está um código Python para fazer isso, derivado da observação das solicitações http:

import requests

[ provide credential variables etc ]

grafana_url = os.path.join('http://', '%s:%u' % (grafana_host, grafana_port))
session = requests.Session()
login_post = session.post(
   os.path.join(grafana_url, 'login'),
   data=json.dumps({
      'user': grafana_user,
      'email': '',
      'password': grafana_password }),
   headers={'content-type': 'application/json'})

# Get list of datasources
datasources_get = session.get(os.path.join(grafana_url, 'api', 'datasources'))
datasources = datasources_get.json()

# Add new datasource
datasources_put = session.put(
   os.path.join(grafana_url, 'api', 'datasources'),
   data=json.dumps({
      'access': 'direct',
      'database': ifdb_database,
      'name': datasource_name,
      'password': ifdb_password,
      'type': 'influxdb_08',
      'url': 'http://%s:%u' % (ifdb_host, ifdb_port),
      'user': ifdb_user}),
      headers={'content-type': 'application/json'})

Obrigado,
Como vai fazer parte da instalação, acho que o jeito 'Curl' vai dar o jab. Mas também tentarei as coisas do python, pois podem ser úteis também. Obrigado mais uma vez, vou informá-lo :-)
cristão

Vou tentar tornar isso mais fácil no 2.1 e também fazer uma ferramenta CLI que torna a interação com a API da Web mais fácil

Olá de novo, torkedo,
Você disse "O problema é que para o funcionamento acima você precisa de uma chave de API, e para criar uma chave de API, você precisa de uma IU".
e, efetivamente, quando tento enviar esse comando curl, recebo {"message": "Access denied"}
Você poderia explicar o que quer dizer com "A solução é poder usar a api com nome de usuário / senha (por exemplo, com nome de usuário / senha de administrador)"
Obrigado...

Olá a todos,
A solução Python do PRI-mcallen funcionou bem para mim :-) Vou continuar assim.
Eu fecho o tópico.
Obrigado!!

@ PRI-mcallen Obrigado pelo script python, com base nisso eu vim com o seguinte (principalmente Bash em torno de curl com cookies / cookie-jar), pois não tenho um interpretador python em meu ambiente, onde eu precisa executar isso, talvez seja útil para outra pessoa.

Este é um verdadeiro incômodo para executar o grafana no docker. Usamos uma ferramenta de orquestração docker (maestro-ng). Temos uma imagem docker para grafana e gostaríamos de poder configurar automaticamente a fonte de dados de grafite. A ferramenta de orquestração cria um contêiner de grafite e depois um contêiner de grafana que depende dele. A ferramenta injeta o endereço do contêiner de grafite como variáveis ​​env no contêiner grafana. Queremos que o script de inicialização que é executado no contêiner grafana configure automaticamente a fonte de dados do Graphite. Costumávamos ser capazes de fazer isso usando config.js no grafana 1.9, mas agora há apenas a API HTTP (que não está documentada) para fazer isso.

@iangkent , veja o snippet python que postei acima para um exemplo de como usar a API HTTP (engenharia reversa a partir da observação das transações).

Oi

Estou testando o snippet python que @ PRI-mcallen postou em 2.1.0-pre1 e parece que algo está quebrado (porque em 2.0.2 e 2.0.3-pre1 funciona)

A resposta que estou obtendo ao adicionar a fonte de dados é

datasources_put.json ()
{u'mensagem ': u'Não encontrada'}

E a partir de toras de grafana:

2015/07/13 11:27:49 [I] Concluído / api / datasources 404 não encontrado em 1.169711ms

Tentei usar curl diretamente e mesmo comportamento (usando autenticação de cookie ou usuário / senha)

curl - usuário admin: admin \
-X PUT \
-H 'Content-Type: application / json; charset = UTF-8' \
--data-binary "{\" nome \ ": \" test4 \ ", \" isDefault \ ": \" true \ ", \" type \ ": \" influxdb_08 \ ", \" url \ ": \ " http: // localhost : 8086 \", \ "access \": \ "proxy \", \ "banco de dados \": \ "test4 \", \ "usuário \": \ "test4 \", \ "senha \ ": \" test4 \ "}" \
" http://172.16.149.149 : 3000 / api / datasources".

{"mensagem não encontrada"}

Alguém tem uma ideia sobre como solucionar ou consertar?

desde já, obrigado
Efrain

@ 3fr61n, há uma pequena alteração interrompida na API HTTP no 2.1 (está no changelog)

Fonte de dados HTTP api alteração de última hora, fonte de dados ADD agora é POST / api / datasources /, atualização agora é PUT / api / datasources /: id

Obrigado!!! está funcionando agora

No grafana 2.1 agora você pode autenticar contra a API usando autenticação básica, então você não precisa fazer o login e usar cookies para criar uma chave de API (ou para adicionar as fontes de dados)
https://github.com/grafana/grafana/issues/2218#issuecomment -117041541

curl -i -XPOST ' http: // admin: admin @ hostname : 3000 / api / datasources' --data-binary '{\ "nome \": \ "influxdb_09x \", \ "type \": \ "influxdb \ ", \" acesso \ ": \" proxy \ ", \" url \ ": \" http: // hostname : 8086 \ ", \" senha \ ": \" root \ ", \" usuário \ " : \ "root \", \ "database \": \ "cadvisor \", \ "basicAuth \": true, \ "basicAuthUser \": \ "admin \", \ "basicAuthPassword \": \ "admin \" , \ "isDefault \": true, \ "jsonData \": null} '

Estou recebendo "[{" fieldNames ": [" Nome "]," classificação ":" RequiredError "," mensagem ":" Obrigatório "}, {" fieldNames ": [" Tipo "]," classificação ":" RequeridoError "," mensagem ":" Requerido "}, {" fieldNames ": [" Acesso "]," classificação ":" RequeridoError "," mensagem ":" Requerido "}]"

Você precisa do cabeçalho ContentType application / json

curl -i -XPOST ' http: // admin: admin @ hostname : 3000 / api / datasources' --header "ContentType application / json" --data-binary '{\ "name \": \ "influxdb2 \", \ "digite \": \ "influxdb_09x \", \ "acesso \": \ "proxy \", \ "url \": \ " http: // hostname : 8086 \", \ "senha \": \ " root \ ", \" usuário \ ": \" root \ ", \" banco de dados \ ": \" cadvisor \ ", \" basicAuth \ ": true, \" basicAuthUser \ ": \" admin \ ", \" basicAuthPassword \ ": \" admin \ ", \" isDefault \ ": true, \" jsonData \ ": null} '

Ainda retornando o erro acima: /

Isso não parece certo, dois pontos faltando, -H 'Content-Type: application / json; charset = UTF-8' \

Estou usando as imagens oficiais docker graphite (hopsoft / graphite-statsd) e grafana (grafana / grafana) e o seguinte comando funcionou para mim:

curl 'http://admin:[email protected]:3000/api/datasources' -X POST -H 'Content-Type: application/json;charset=UTF-8' --data-binary '{"name":"localGraphite","type":"graphite","url":"http://192.168.99.100","access":"proxy","isDefault":true,"database":"asd"}'

No grafana 2.6 e no influxdb 0.10, o seguinte curl está funcionando corretamente:

curl 'http://admin:[email protected]:3000/api/datasources' -X POST -H 'Content-Type: application/json;charset=UTF-8' --data-binary '{"name":"influx","type":"influxdb","url":"http://localhost:8086","access":"proxy","isDefault":true,"database":"mydb","user":"admin","password":"admin"}'

você pode verificar a configuração das fontes de dados com:
curl 'http://admin:[email protected]:3000/api/datasources'

Este problema foi resolvido em março, mas existe alguma maneira de automatizar isso de uma forma mais limpa para uso no Docker?

Este problema foi resolvido em março, mas existe alguma maneira de automatizar isso de uma forma mais limpa para uso no Docker?

O que fazemos no Docker em run2.sh (já existe um run.sh em grafana/grafana ):

echo 'Starting Grafana...'
/run.sh "$@" &
AddDataSource() {
  curl 'http://localhost:3000/api/datasources' \
    -X POST \
    -H 'Content-Type: application/json;charset=UTF-8' \
    --data-binary \
    '{"name":"Prometheus","type":"prometheus","url":"http://prometheus:9090","access":"proxy","isDefault":true}'
}
until AddDataSource; do
  echo 'Configuring Grafana...'
  sleep 1
done
echo 'Done!'
wait

Mas concordo que é um design muito triste. Qualquer outro aplicativo pode ser configurado antes de iniciá-lo. Grafana você tem que começar primeiro e depois configurar. Esquisito.

Olá @torkelo , ótimo trabalho com a ferramenta Grafana!
Recebo o erro "usuário não encontrado" quando tento adicionar um usuário em uma organização usando a API Grafana usando o comando-

curl 'http: //: @: 3000 / api / orgs / 6 / users' -X POST -H 'Content-Type: application / json; charset = UTF-8' --data-binary '{"loginOrEmail": "user1", "role": "Viewer"} '

Eu inseri as credenciais de autenticação básica corretas. Alguma solução para este problema?
Obrigado!

o usuário deve existir com essa chamada de API, você pode criar um convite de usuário com a API de convite

Ou via ansible:

# Check that a page returns a status 200 and fail if the word AWESOME is not
# in the page contents.
- uri:
    url: http://localhost:3000/api/datasources/name/Prometheus
    user: admin
    password: changeme
    force_basic_auth: yes
  register: grafana_prometheus
  failed_when: false
  changed_when: false

- name: Enable Prometheus Datasource
  uri:
    url: http://localhost:3000/api/datasources
    method: POST
    user: admin
    password: changeme
    body:
      name: "Prometheus"
      type: "prometheus"
      url: "http://prometheus:9090"
      access: "proxy"
      isDefault: true
    force_basic_auth: yes
    status_code: 201
    body_format: json
  when: grafana_prometheus.status == 404

Outro curso de ação possível é escrever diretamente no banco de dados do Grafana. Normalmente inicio o Grafana para criar seu banco de dados, interrompo-o e uso o sqlite para adicionar a fonte ao banco de dados.

Para o Grafana 4.0.2, seria algo como:

cat <<EOF | sqlite3 grafana.db || echo "Failed to add data source."
INSERT INTO data_source VALUES (2,1,0,'prometheus','prometheus','proxy','http://address',NULL,NULL,NULL,0,NULL,NULL,0,'{}','2017-01-15 20:00:00','2017-01-15 20:00:00',0,'{}');
EOF

Eu faço isso usando uma CLI. ferramenta que escrevi para Grafana - wizzy https://github.com/utkarshcmu/wizzy

Este problema pode ser reaberto?
Eu gostaria muito de uma opção semelhante a dashboards.json para ter um diretório onde as fontes de dados desejadas podem ser definidas

Aqui está um pedaço do estado saltstack para ele também (muito semelhante ao código ansible acima). É muito feio, mas parece funcionar:

  http.query:
    - name: http://localhost:3000/api/datasources
    - method: POST
    - username: admin
    - password: admin
    - data: |
        {"name": "Prometheus",
        "type": "prometheus",
        "url": "http://localhost:9090",
        "access": "proxy",
        "isDefault": true}
    - header_list:
      - 'Content-Type: application/json'
    - status: 200
    - unless:
      - curl -f http://admin:admin<strong i="6">@localhost</strong>:3000/api/datasources/name/Prometheus

Por favor, reabra isso, mexer com curl e sqlite é mais chato com o docker. Apenas uma solução limpa, como o dashboard.json, seria incrível!

+1, precisamos que isso seja configurável em uma configuração estática (por exemplo, ao usar docker-compose para configurar grafana automaticamente usando uma fonte de dados influxdb)

+1 com o arquivo json, poderíamos facilmente gerar uma fonte de dados para cada índice ES direto do fantoche, em vez de executar scripts paralelos

+1

Em quinta-feira, 25 de maio de 2017 às 17:36, Anton Timofieiev [email protected]
escreveu:

+1 com o arquivo json, poderíamos facilmente gerar uma fonte de dados para cada índice ES
direto do fantoche, em vez de executar scripts paralelos

-
Você está recebendo isto porque está inscrito neste tópico.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/grafana/grafana/issues/1789#issuecomment-304026003 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/AFrnv_CDln7rDTlqZK6r_stAFiek7jaHks5r9ZHfgaJpZM4EBJaL
.

👍 com a possibilidade de consultar o cônsul para a fonte de dados (já é json)

Gostaria de saber como configuro os detalhes da pesquisa elástica (como nome do índice, nome do campo de tempo e versão) via API HTTP ou arquivo conf. Simplesmente não consigo encontrar a chave para essas configurações. Qual é o comportamento padrão? Ele cria uma fonte de dados para cada índice como @timtofan disse?

curl --user admin: admin ' http: // IPADDR : 3000 / api / datasources' -X POST -H 'Content-Type: application / json; charset = UTF-8' --data-binary '{"nome" : "test", "type": "prometheus", "url": " http: // localhost : 9090", "access": "proxy", "basicAuth": false} '

"isDefault": verdadeiro se você quiser tornar a fonte de dados padrão

Aqui está a maneira de adicionar uma fonte de dados prometheus:
curl --user admin: admin ' http: // IPADDR : 3000 / api / datasources' -X POST -H 'Content-Type: application / json; charset = UTF-8' --data-binary '{"nome" : "test", "isDefault": true, "type": "prometheus", "url": " http: // localhost : 9090", "access": "proxy", "basicAuth": false} '

Posso adicionar uma fonte de dados do arquivo de configuração para todas as organizações?
Seria muito conveniente.

Ok, eu sei que isso já está fechado, mas eu só queria compartilhar que o Grafana 5 permite definir o Dashboard a partir do código. Mais informações aqui: http://docs.grafana.org/administration/provisioning/#datasources

Esta página foi útil?
0 / 5 - 0 avaliações