間違いなく、Graviteeインターフェースは、Graviteeゲートウェイの操作を視覚化する非常に視覚的で便利な手段を提供します。ただし、いずれの場合も、これらのツールへのアクセスを監視サービス、API所有者、またはコンシューマーに提供する必要があります。同時に、APIマネージャーが配置されている閉ループの外側にある可能性があります。また、さまざまなAPIで利用可能なすべての情報を1つの画面に表示する方が常に便利です。
Graviteeユーザーインターフェイスの詳細に立ち入ることなく、ゲートウェイで何が起こるかを確認できます。管理者は、Gravitee内でユーザーを作成し、役割と特権を分離する時間を無駄にしません。
Habréはすでに、APIM Graviteeに捧げ記事のカップルを持っていたこことここ..。したがって、私のメモでは、読者がAPIM GraviteeとGrafanaのインストール/構成のプロセスにすでに精通していることを意味し、それらの統合を構成するプロセスのみを検討します。
なぜあなたは簡単な道を行くことができないのですか?
デフォルトでは、Gravitee分析のリポジトリはElasticSearchです。情報は4つの異なるインデックスに蓄積され、毎日の内訳が示されます。
gravitee-request-YYYY.MM.DD-各リクエストの情報がここに保存されます(nginxのaccess.logと同様)。これが私たちの主な目標です。
gravitee-log-YYYY.MM.DD-リクエストに関するより詳細な情報はすでにここに保存されています(デバッグが有効になっている場合は、下の図を参照してください)。つまり、完全な要求ヘッダーと応答ヘッダー、およびペイロードです。設定に応じて、コンシューマーとゲートウェイの間、および/またはゲートウェイとAPIプロバイダーの間の交換の両方をログに記録できます。
高度なロギングの有効化/無効化画面
gravitee-monitor-YYYY.MM.DD-これには興味がありません。
gravitee-health-YYYY.MM.DD-これは私たちには興味がありません。
, : 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
上記の解決策は、私の主観的な意見では、標準のAPIM Gravitee視覚化ツールに劣ることはありませんが、想像力とニーズによってのみ制限されます。
Grafanaは通常、監視インフラストラクチャの中心的なオブジェクトであることを考えると、このようなソリューションの利点は明らかです。つまり、カバレッジが広く、情報密度が高く、視覚的表現を簡単にカスタマイズできます。
PS
近い将来、GraviteeとActiveDirectoryの統合に関する別の記事が計画されています。プロセスは非常に単純ですが、いつものように、ニュアンスがあります。
建設的な批判、願い、提案は大歓迎です!