Visualização de analíticas APIM Gravitee no Grafana

Sem dúvida, a interface do Gravitee fornece meios bastante visuais e convenientes de visualizar a operação dos gateways do Gravitee. Mas em qualquer caso, há uma necessidade de fornecer acesso a essas ferramentas para o serviço de monitoramento, proprietários ou consumidores de API, e ao mesmo tempo eles podem estar fora do ciclo fechado em que o gerenciador de API está localizado. E é sempre mais conveniente ter todas as informações disponíveis sobre várias APIs em uma tela.

Veja o que acontece nos gateways sem entrar nos detalhes da interface de usuário do Gravitee, e os administradores não perdem tempo criando usuários e separando funções e privilégios dentro do Gravitee.

O Habré já teve alguns artigos dedicados à APIM Gravitee, aqui e aqui... Portanto, em minha nota, vou sugerir que o leitor já está familiarizado com o processo de instalação / configuração do APIM Gravitee e Grafana, apenas considerarei o processo de configuração de sua integração.





Por que você não pode ir pelo caminho mais fácil?

Por padrão, o repositório para análises Gravitee é ElasticSearch. As informações são acumuladas em quatro índices distintos, com detalhamento diário:





  • gravitee-request-YYYY.MM.DD - as informações de cada solicitação são armazenadas aqui (semelhante ao access.log no nginx). Este é o nosso principal objetivo;





  • gravitee-log-YYYY.MM.DD - informações mais detalhadas sobre a solicitação já estão armazenadas aqui (desde que a depuração esteja ativada, consulte a figura abaixo). Ou seja, os cabeçalhos completos de solicitação e resposta, bem como a carga útil. Dependendo das configurações, a troca entre o consumidor e o gateway e / ou entre o gateway e o provedor de API pode ser registrada;





    Tela de ativação / desativação de registro avançado
    Tela de ativação / desativação de registro avançado
  • gravitee-monitor-YYYY.MM.DD - não estamos interessados ​​neste;





  • gravitee-health-YYYY.MM.DD - este não nos interessa.





, : ElasticSearch Grafana , .

, , .. - , . , Grafana, . Gravitee . , MongoDB PostgreSQL, . ( Grafana) - , - .





?

PostgreSQL , ElasticSearch (). , Grafana - PostgreSQL, ElasticSearch .

( ).





Esquema de interação dos módulos Gravitee
Gravitee

, !

: CentOS 7, APIM Gravitee 3.6, PostgreSQL 11, ElasticSearch 7.+





PostgreSQL ElasticSearch. :





  1. multicorn11 pip, :





    yum install multicorn11 python3-pip
          
          



  2. pip-, python3 ElasticSearch:





    pip3 install pg_es_fdw
          
          



  3. , PostgreSQL. multicorn :





    GRANT USAGE on FOREIGN DATA WRAPPER multicorn TO gatewaytest;
    GRANT USAGE ON FOREIGN SERVER multicorn_es TO gatewaytest;
          
          



     CREATE EXTENSION multicorn;
     CREATE SERVER multicorn_es FOREIGN DATA WRAPPER multicorn
      OPTIONS (wrapper 'pg_es_fdw.ElasticsearchFDW');
          
          



  4. , . logreader:





    GRANT USAGE on FOREIGN DATA WRAPPER multicorn TO logreader;
    GRANT USAGE ON FOREIGN SERVER multicorn_es TO logreader;
          
          



  5. , logging, logreader:





    CREATE SCHEMA logging AUTHORIZATION logreader;
          
          



  6. , :





    CREATE TABLE logging.requests (
      id varchar(36),
      "@timestamp" timestamp with time zone,
      api varchar(36),
      "api-response-time" int,
      application varchar(36),
      custom json,
      endpoint text,
      gateway varchar(36),
      "local-address" varchar(16),
      method int,
      path text,
      plan varchar(36),
      "proxy-latency" int,
      "remote-address" varchar(16),
      "request-content-length" int,
      "response-content-length" int,
      "response-time" int,
      sort text,
      status int,
      subscription varchar(36),
      uri text,
      query TEXT,
      score NUMERIC) PARTITION BY RANGE("@timestamp");
          
          



    , , , - .





  7. , shell- cron:





    #!/bin/sh
    
    NEWPART=${1:-$(date +'%Y.%m.%d')}
    OLDPART=$(date --date='14 days ago' +'%Y.%m.%d')
    
    curl http://gateway.corp/test
    
    psql gateway -U logreader -c "CREATE FOREIGN TABLE logging.\"requests_${NEWPART}\"
    PARTITION OF logging.requests 
      FOR VALUES FROM ('${NEWPART} 00:00:00') TO ('${NEWPART} 23:59:59')
    SERVER multicorn_es
    OPTIONS (
    	host 'els-host',
      port '9200',
      index 'gravitee-request-${NEWPART}',
      rowid_column 'id',
      query_column 'query',
      query_dsl 'false',  
      score_column 'score',
      sort_column 'sort',
      refresh 'false',
      complete_returning 'false',
      timeout '20',
      username 'elastic-ro',
      password 'Sup3rS3cr3tP@ssw0rd');"
      
      psql gateway -U gatewaydev -c "drop foreign table logging.\"requests_${OLDPART}\""
          
          



    :





    • NEWPART - , , ElasticSearch;





    • OLDPART - , , 14 ( ES Curator). , - . , , ;





    • 'curl http://gateway.corp/test', , , API. , , . ;





    • , ;





    • - .









    • TABLE logging.requests LIMIT 1;
            
            



      ,





    -[ RECORD 1 ]-----------+-------------------------------------
    id                      | 55efea8a-9c91-4a61-afea-8a9c917a6133
    @timestamp              | 2021-05-16 00:00:02.025+03
    api                     | 9db39338-1019-453c-b393-381019f53c72
    api-response-time       | 0
    application             | 1
    custom                  | {}
    endpoint                | 
    gateway                 | 7804bc6c-2b72-497f-84bc-6c2b72897fa9
    local-address           | 10.15.79.29
    method                  | 3
    path                    | 
    plan                    | 
    proxy-latency           | 2
    remote-address          | 10.15.79.27
    request-content-length  | 0
    response-content-length | 49
    response-time           | 2
    sort                    | 
    status                  | 401
    subscription            | 
    uri                     | /test
    query                   | 
    score                   | 1.0
    
          
          



, - Gravitee. , , PostgreSQL, . , : , ; ; , .

, Metadata, Grafana.





:





Seção de metadados em Gravitee
Metadata Gravitee

Grafana:





Opção para exibir metadados no Grafana
Metadata Grafana
SELECT
  name "",
  value ""
FROM
  metadata
WHERE
  reference_id='${apis}'
      
      



Opção de tela

APIs () - .





SELECT COUNT(*) AS "" FROM apis;
SELECT COUNT(*) AS "" FROM apis WHERE lifecycle_state='STARTED';
      
      



Applications, , applications





API Hits - .





SELECT
  date_trunc('minute',"@timestamp") AS time,
  apis.name,ee  Grafana


  COUNT(*)
FROM
  logging.requests al
JOIN
  apis ON al.api = apis.id
WHERE
  query='@timestamp:[$__from TO $__to]'
GROUP BY 1,2
      
      



Average response time by API - , .





SELECT
  date_trunc('minute',"@timestamp") AS time,
  apis.name,
  AVG(al."api-response-time")
FROM
  logging.requests al
JOIN
  apis ON al.api = apis.id
WHERE
  query='@timestamp:[$__from TO $__to]'
GROUP BY 1,2
      
      



Hits, by gateways, . :





SELECT
  date_trunc('minute',"@timestamp") as time,
  al."local-address",
  COUNT(*)
FROM
  logging.requests al
WHERE
  query='@timestamp:[$__from TO $__to]'
GROUP BY 1,2
      
      



Cronograma de distribuição de solicitações por gateways

A solução acima, na minha opinião subjetiva, não é de forma alguma inferior às ferramentas de visualização APIM Gravitee padrão, mas é limitada apenas pela imaginação e pelas necessidades.





Considerando que o Grafana costuma ser o objeto central da infraestrutura de monitoramento, as vantagens dessa solução são óbvias: maior cobertura, maior densidade de informações e simples customização das representações visuais.





PS

Em um futuro próximo, outro artigo está planejado sobre a integração do Gravitee com o ActiveDirectory. O processo é bastante simples, mas como sempre, existem nuances.





Críticas, desejos e sugestões construtivas são bem-vindos!








All Articles