Artigo
· Jun. 27, 2022 9min de leitura

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.

Discussão (0)1
Entre ou crie uma conta para continuar