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
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 .
( ).
, !
: 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
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!