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
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 .
( ).
, !
: CentOS 7, APIM Gravitee 3.6, PostgreSQL 11, ElasticSearch 7.+
PostgreSQL ElasticSearch. :
multicorn11 pip, :
yum install multicorn11 python3-pip
pip-, python3 ElasticSearch:
pip3 install pg_es_fdw
, 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');
, . logreader:
GRANT USAGE on FOREIGN DATA WRAPPER multicorn TO logreader; GRANT USAGE ON FOREIGN SERVER multicorn_es TO logreader;
, logging, logreader:
CREATE SCHEMA logging AUTHORIZATION logreader;
, :
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");
, , , - .
, 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.
:
Grafana:
SELECT
name "",
value ""
FROM
metadata
WHERE
reference_id='${apis}'
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
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!