Visualización de análisis APIM Gravitee en Grafana

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;





    Pantalla de activación / desactivación de registro avanzado
    Pantalla de activación / desactivación de registro avanzado
  • 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 .

( ).





Esquema de interacción de los 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.





:





Sección de metadatos en Gravitee
Metadata Gravitee

Grafana:





Opción para mostrar metadatos en Grafana
Metadata Grafana
SELECT
  name "",
  value ""
FROM
  metadata
WHERE
  reference_id='${apis}'
      
      



Opción de pantalla

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
      
      



Calendario de distribución de solicitudes por pasarelas

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!








All Articles