Sin lugar a dudas, la interfaz de Gravitee proporciona un medio bastante visual y conveniente de visualizar el funcionamiento de las puertas de enlace de Gravitee. Pero en cualquier caso, existe la necesidad de brindar acceso a estas herramientas al servicio de monitoreo, propietarios de API o consumidores, y al mismo tiempo pueden estar fuera del circuito cerrado en el que se encuentra el administrador de API. Y siempre es más conveniente tener toda la información disponible en varias API en una pantalla.
Vea lo que sucede en las puertas de enlace sin entrar en los detalles de la interfaz de usuario de Gravitee, y los administradores no pierden el tiempo creando usuarios y separando roles y privilegios dentro de Gravitee.
Habré ya tenía un par de artículos dedicados a APIM Gravitee, aquí y aquí... Por lo tanto, en mi nota, daré a entender que el lector ya está familiarizado con el proceso de instalación / configuración de APIM Gravitee y Grafana, solo consideraré el proceso de configuración de su integración.
¿Por qué no puedes seguir el camino fácil?
De forma predeterminada, el repositorio de análisis de Gravitee es ElasticSearch. La información se acumula en cuatro índices diferentes, con un desglose diario:
gravitee-request-YYYY.MM.DD : la información de cada solicitud se almacena aquí (similar a access.log en nginx). Este es nuestro principal objetivo;
gravitee-log-YYYY.MM.DD : aquí ya se almacena información más detallada sobre la solicitud (siempre que la depuración esté habilitada, consulte la figura siguiente). Es decir, los encabezados completos de solicitud y respuesta, así como la carga útil. Dependiendo de la configuración, se puede registrar tanto el intercambio entre el consumidor y la puerta de enlace y / o la puerta de enlace y el proveedor de API;
gravitee-monitor-YYYY.MM.DD - no estamos interesados en este;
gravitee-health-YYYY.MM.DD : este no nos interesa.
, : 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
La solución anterior, en mi opinión subjetiva, no es de ninguna manera inferior a las herramientas de visualización estándar de APIM Gravitee, pero está limitada solo por la imaginación y las necesidades.
Teniendo en cuenta que Grafana suele ser el objeto central de la infraestructura de monitorización, las ventajas de una solución de este tipo son obvias: cobertura más amplia, mayor densidad de información y personalización sencilla de las representaciones visuales.
PD
En un futuro próximo, está previsto otro artículo sobre la integración de Gravitee con ActiveDirectory. El proceso es bastante sencillo, pero como siempre, hay matices.
¡Las críticas constructivas, los deseos y las sugerencias son bienvenidos!