Visualisasi analisis APIM Gravitee di Grafana

Tidak diragukan lagi, antarmuka Gravitee menyediakan cara yang cukup visual dan nyaman untuk memvisualisasikan pengoperasian gateway Gravitee. Namun dalam kasus apa pun, ada kebutuhan untuk menyediakan akses ke alat ini ke layanan pemantauan, pemilik atau konsumen API, dan pada saat yang sama mereka dapat berada di luar loop tertutup tempat pengelola API berada. Dan akan selalu lebih nyaman untuk memiliki semua informasi yang tersedia tentang berbagai API dalam satu layar.

Lihat apa yang terjadi di gateway tanpa membahas secara spesifik antarmuka pengguna Gravitee, dan administrator tidak membuang waktu untuk membuat pengguna dan memisahkan peran dan hak istimewa dalam Gravitee.

Habré sudah memiliki beberapa artikel yang didedikasikan untuk APIM Gravitee, di sini dan di sini... Oleh karena itu, dalam catatan saya, saya akan menyiratkan bahwa pembaca sudah terbiasa dengan proses pemasangan / konfigurasi APIM Gravitee dan Grafana, saya hanya akan mempertimbangkan proses konfigurasi integrasinya.





Mengapa Anda tidak bisa pergi dengan cara yang mudah?

Secara default, repositori untuk analisis Gravitee adalah ElasticSearch. Informasi tersebut diakumulasikan dalam empat indeks berbeda, dengan perincian harian:





  • gravitee-request-YYYY.MM.DD - informasi untuk setiap permintaan disimpan di sini (mirip dengan access.log di nginx). Ini adalah tujuan utama kami;





  • gravitee-log-YYYY.MM.DD - informasi lebih rinci tentang permintaan sudah disimpan di sini (asalkan debugging diaktifkan, lihat gambar di bawah). Yakni, header permintaan dan respons lengkap, serta payload. Bergantung pada pengaturan, baik pertukaran antara konsumen dan gateway dan / atau gateway dan penyedia API dapat dicatat;





    Layar mengaktifkan / menonaktifkan logging lanjutan
    Layar mengaktifkan / menonaktifkan logging lanjutan
  • gravitee-monitor-YYYY.MM.DD - kami tidak tertarik dengan yang ini;





  • gravitee-health-YYYY.MM.DD - yang satu ini tidak menarik bagi kami.





, : ElasticSearch Grafana , .

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





?

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

( ).





Skema interaksi modul 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.





:





Bagian Metadata di Gravitee
Metadata Gravitee

Grafana:





Pilihan untuk menampilkan Metadata di Grafana
Metadata Grafana
SELECT
  name "",
  value ""
FROM
  metadata
WHERE
  reference_id='${apis}'
      
      



Opsi Layar

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
      
      



Jadwal distribusi permintaan melalui gateway

Solusi di atas, menurut pendapat subjektif saya, sama sekali tidak kalah dengan alat visualisasi APIM Gravitee standar, tetapi hanya dibatasi oleh imajinasi dan kebutuhan.





Mengingat Grafana biasanya merupakan objek sentral dari infrastruktur pemantauan, keuntungan dari solusi seperti itu jelas: cakupan yang lebih luas, kepadatan informasi yang lebih tinggi dan penyesuaian sederhana dari representasi visual.





PS

Dalam waktu dekat, artikel lain direncanakan untuk mengintegrasikan Gravitee dengan ActiveDirectory. Prosesnya cukup sederhana, tetapi seperti biasa, ada beberapa nuansa.





Kami menerima kritik, keinginan, dan saran yang membangun!








All Articles