Artigo
· Set. 21, 2023 10min de leitura

Usando o Grafana com o IRIS para visualizar dados de globais de sistemas legados

Olá,

No post anterior sobre o uso do Grafana com o IRIS (https://pt.community.intersystems.com/post/usando-o-grafana-com-o-iris-a...) utilizamos classes para armazenar nossas informações. Porém sabemos que o IRIS tem uma poderosa forma de armazenamento chamada de globais, que é muito utilizada em sistemas legados.

Vamos imaginar que nosso sistema de vendas é desenvolvido utilizando este mecanismo de armazenamento. Apesar de altamente performáticas, as globais não tem um dicionário de dados ativo, o que nos traz alguns desafios, como por exemplo, conhecer o desenho da global.

Uma vez vencida esta etapa (não vamos entrar nesta questão neste artigo) podemos montar algumas classes que farão o trabalho de coletar informações e disponibiliza-las através de uma API REST e, desta forma, termos acesso através de ferramentas como o Grafana, dado a um sistema legado a capacidade de disponibilizar informações de maneira prática.

Muitos destes sistemas legados, apesar de antigos, são altamente competentes nas suas tarefas por terem sido desenvolvidos especificamente para atender aquela demanda. São em muitos casos sistemas especializados que estão em execução há muitos anos. Alguns foram modernizados tendo novas interfaces e métodos de armazenamento, porém muitos continuam utilizando interfaces a caracter e armazenando seus dados em globais.

Vamos imaginar que o nosso sistema de vendas fictício esteja neste patamar, e nossa global de pedidos tenha o seguinte desenho:

^pedido(numero_do_pedido)=cliente|data|vendedor

^pedido(numero_do_pedido,item_do_pedido)=produto|quantidade

E também temos as globais de vendedor:

^vendedor(código_do_vendedor)=nome_do_vendedor

E a global de Clientes:

^cliente(código_do_cliente)=nome_do_cliente|zona_de_venda

Podemos então montar uma rotina que gere alguns totalizadores de vendas:

auxiliar ;Rotina auxiliar do sistema de vendas - Gera totais de vendas por vendedor e zona de venda
              ;
geraTotais;
              Kill ^totais
              Set w1=""
              For
              {
                            Set w1=$Order(^pedido(w1))
                            If w1="" Quit
                            Set reg=^(w1)
                            Set vendedor=$Piece(reg,"|",3)
                            Set ^totais(1,vendedor)=$Get(^totais(1,vendedor))+1
                            Set data=$Piece(reg,"|",2)
                            Set ^totais(2,data)=$Get(^totais(2,data))+1
                            Set cliente=$Piece(reg,"|",1)
                            Set ^totais(3,cliente)=$Get(^totais(3,cliente))+1
                            Set zona=$Piece(^cliente(cliente),"|",2)
                            Set ^totais(4,zona)=$Get(^totais(4,zona))+1
              }
              Quit

Nossa rotina ao ser executada irá percorrer a global de pedidos e fará a totalização de vendas disponibilizando esta informação na global ^totais.

Uma vez que temos nossos totais gerados podemos então montar uma classe REST que vá recuperar e devolver estas informações. Vamos montar as chamadas para recuperar os totais de vendas por vendedor e zona de venda por exemplo:

Class Rest.ResumoVenda Extends %CSP.REST
{

XData UrlMap [ XMLNamespace = "https://www.intersystems.com/urlmap]
{
<Routes>
    <Route Url="/vendedor" Method="GET" Call="Vendedor" />
    <Route Url="/zona" Method="GET" Call="Zona" />
</Routes>
}

ClassMethod Vendedor() As %Status
{

                  Do ##class(%REST.Impl).%SetContentType("application/json")
                            Set w1=""
                            Set json={}
                            Set vendas=[]
                            For
                            {
                                          Set w1=$Order(^totais(1,w1))
                                          If w1="" Quit
                                          Set total=^totais(1,w1)
                                          Set item={}
                                          Set item.vendedor=$Get(^vendedor(w1))
                                          Set item.total=^totais(1,w1)
                                          Do vendas.%Push(item)
                            }
                            Set json.lista=vendas
                            Write json.%ToJSON()
                            Quit 1
}

ClassMethod Zona() As %Status
{
                            Do ##class(%REST.Impl).%SetContentType("application/json")
                            Set w1=""
                            Set json={}
                            Set zonas=[]
                            For
                            {
                                          Set w1=$Order(^totais(4,w1))
                                          If w1="" Quit
                                          Set total=^totais(4,w1)
                                          Set item={}
                                          Set item.zona=$Get(^zona(w1))
                                          Set item.total=^totais(4,w1)
                                          Do zonas.%Push(item)
                            }
                            Set json.lista=zonas
                            Write json.%ToJSON()
                            Quit 1
}

}

Para maiores detalhes sobre como montar uma classe REST e disponibiliza-la no IRIS veja o documento https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GREST_csprest

Uma vez que nossa API esteja publicada podemos consumi-la e ver as informações disponibilizadas para vendedor e zona de venda:

Fig. 1 – Consulta ao serviço para verificar dados de Vendedor

Fig. 2 – Consulta ao serviço para verificar dados de Zona de Vendas

Agora podemos ir no Grafana e criar um data source para consumir nossa API (para mais informações sobre o Grafana acesse grafana.com) Abra o Grafana e crie um datasorce do tipo Infinity (no post anterior mencionado no inicio deste texto temos exemplo de como criar este tipo de data source).

Crie um novo dashboard e informe o datasource do tipo Infinity criado. Configure o data source informando a URL completa da API (/vendedor e /zona). Crie um componente como um gráfico de pizza e configure conforme desejado.

Fig.3 – Configuração do gráfico de Zona de Venda no dashboard do Grafana

 

Você pode ter diversos componentes em um dashboard. Então podemos incluir mais um gráfico:

Fig.4 – Configuração do gráfico de Vendas por Vendedores no dashboard do Grafana

Com isso podemos disponibilizar um dashboard com diversas informações. Utilizando os recursos do Grafana podemos ter refresh das informações, rearrumar os gráficos em ordem diferente, aumentar ou diminuir o tamanho dos elementos e muito mais:

Fig.5 – Dashboard com os dois gráficos no Grafana

Assim podemos dar sobrevida a sistemas legados, dando a eles capacidade de comunicação com outras aplicações, disponibilizando as informações armazenadas de forma fácil e reutilizando códigos já desenvolvidos no próprio sistema.

Bons códigos para todos nós!

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