Usando o Grafana com o IRIS através do Infinity DataSource
Usando o Grafana com o IRIS através do Infinity DataSource
Grafana é uma aplicação web de análise de código aberto multiplataforma e visualização interativa da web. Ele fornece tabelas, gráficos e alertas para a Web quando conectado a fontes de dados suportadas. É expansível através de um sistema de plug-in. Os usuários finais podem criar painéis de monitoramento complexos usando criadores de consultas interativas, segundo a Wikipédia O Grafana pode ser baixado diretamente do seu site grafana.com.
Uma vez instalado, o Grafana se apresenta como um serviço que pode ser acessado a partir da porta 3000 do servidor onde foi instalado:
O Infinity DataSource é um plugin do Grafana que permite o acesso a diversas fontes de dados, recebendo diversos tipos de informação, tais como JSON, CSV, XML e outros. Mais informações em https://grafana.com/grafana/plugins/yesoreyeram-infinity-datasource.
Uma das formas possíveis de comunicação através do Infinity DataSource é o uso de uma API REST devolvendo um JSON. É esta a forma que vamos usar.
Vamos montar uma API REST devolvendo informações em JSON no Iris. Esta é uma tarefa bastante simples com a classe %CSP.REST.
Baseado nos dados disponibilizados pela WHO criamos uma base de casos de COVID no mundo:
Class who.globalCases Extends (%Persistent, %XML.Adaptor)
{
Property dateEvent As %Date(FORMAT = 3);
Property countryCode As %String;
Property countryName As %String;
Property region As %String;
Property newCases As %Integer;
Property cumulativeCases As %Integer;
Property newDeaths As %Integer;
Property cumulativeDeaths As %Integer;
Query buscar() As %SQLQuery(COMPILEMODE = "IMMEDIATE", CONTAINID = 1, ROWSPEC = "dateEvent:%Date, countryCode:%String, countryName:%String, region:%String, newCases:%Integer, cumulativeCases:%Integer, newDeaths:%Integer, cumulativeDeaths:%Integer", SELECTMODE = "RUNTIME") [ SqlName = buscar, SqlProc ]
{
SELECT %EXTERNAL(dateEvent) as dateEvent, countryCode, countryName, region, newCases, cumulativeCases, newDeaths, cumulativeDeaths
FROM who.globalCases
}
Query top10() As %SQLQuery(COMPILEMODE = "IMMEDIATE", CONTAINID = 1, ROWSPEC = "countryCode:%String, cumulativeDeaths:%Integer", SELECTMODE = "RUNTIME") [ SqlName = top10, SqlProc ]
{
SELECT top 10 countryCode, cumulativeDeaths
FROM who.globalCases
ORDER BY cumulativeDeaths DESC
}
}
E, baseado nesta classe de dados persistentes, criamos a classe REST:
Class who.rest Extends %CSP.REST
{
Parameter CONTENTTYPE = "application/json";
Parameter CHARSET = "utf-8";
XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
<Route Url="/test" Method="GET" Call="Test" />
<Route Url="/data" Method="GET" Call="GetData" />
<Route Url="/top" Method="GET" Call="Top" />
</Routes>
}
ClassMethod Test() As %Status
{
Set obj={
"produto": "Api Who Demo",
"versao": "1.00",
"data": ($zdt($h,3,1))
}
Write obj.%ToJSON()
Quit 1
}
ClassMethod GetData() As %Status
{
Set saida={"respostas": []
}
Set st=##class(%SQL.Statement).%New()
Set status=st.%PrepareClassQuery("who.globalCases","buscar")
Set rs=st.%Execute()
While rs.%Next()
{
Set obj = {
"dateEvent": (rs.%Get("dateEvent")),
"countryCode": (rs.%Get("countryCode")),
"countryName": (rs.%Get("countryName")),
"region": (rs.%Get("region")),
"newCases": (rs.%Get("newCases")),
"cumulativeCases": (rs.%Get("cumulativeCases")),
"newDeaths": (rs.%Get("newDeaths")),
"cumulativeDeaths": (rs.%Get("cumulativeDeaths"))
}
Do saida.respostas.%Push(obj)
}
Write saida.%ToJSON()
Quit 1
}
ClassMethod Top() As %Status
{
Set saida={"respostas": []
}
Set st=##class(%SQL.Statement).%New()
Set status=st.%PrepareClassQuery("who.globalCases","top10")
Set rs=st.%Execute()
While rs.%Next()
{
Set obj = {
"countryCode": (rs.%Get("countryCode")),
"cumulativeDeaths": (rs.%Get("cumulativeDeaths"))
}
Do saida.respostas.%Push(obj)
}
Write saida.%ToJSON()
Quit 1
}
}
Uma vez que montamos nossas classes e populamos as informações, podemos publicar a aplicação REST:
A partir deste momento podemos consumir os dados:
Agora podemos usar o Grafana para consumir estas informações.
No Grafana, entre em Configuração->Data sources:
Crie um novo DataSource do tipo Infinity:
Preencha os dados de acesso a nossa API REST:
Vá para Dashboards:
Agora clique em New Dashboard->Add a new panel. Edite a URL que aparecerá no Datasource para apontar para o caminho do nosso serviço REST:
Vá adicionando as colunas que deseja visualizar:
Podemos ir incluindo novas colunas:
E podemos dar uma visualização para os dados (Opção Overrides):
Podemos incluir outros painéis:
Podemos usar um painel existente como base para construção de outro. Clique no Panel Title->More->Duplicate. Para ajustar, clique em Panel Title->Edit:
Troque o tipo de visualização para World Map:
Mude a coluna de visualização para countryCode e o Format para Time Series:
Pronto. Temos nosso dashboard montado, apresentando dados retornados do Iris via REST:
Podemos fazer mais ajustes, como trocar o título dos painéis, fazer customizações, etc. Agora é refinar o dashboard.
A grande vantagem aqui é que qualquer origem de dados do Iris pode virar um dashboard. Podemos pegar uma aplicação legada, construir uma classe REST que vá disponibilizar as informações e publicar um dashboard com mínimo esforço.
Utilizando o barramento de integração, o Iris pode se tornar o local para centralizar a publicação de diversos dashboards que conterão dados coletados de diversos sistemas.
Podemos ainda ter uma instância de Iris que seja um mirror de outra, de Produção, criada apenas para a geração de reports.